]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
Make order ids pizzeria specific in XVSM implementation
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / xvsm / PizzeriaAgentXVSM.java
1 package at.ac.tuwien.sbc.valesriegler.xvsm;
2
3 import java.io.Serializable;
4 import java.net.URI;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.List;
8
9 import javax.swing.SwingUtilities;
10
11 import at.ac.tuwien.sbc.valesriegler.common.OrderId;
12 import org.mozartspaces.capi3.AnyCoordinator;
13 import org.mozartspaces.capi3.FifoCoordinator;
14 import org.mozartspaces.capi3.LindaCoordinator;
15 import org.mozartspaces.core.MzsCoreException;
16 import org.mozartspaces.core.TransactionReference;
17 import org.mozartspaces.core.MzsConstants.RequestTimeout;
18 import org.mozartspaces.notifications.Notification;
19 import org.mozartspaces.notifications.NotificationListener;
20 import org.mozartspaces.notifications.Operation;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 import at.ac.tuwien.sbc.valesriegler.common.Util;
25 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
26 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
27 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
28 import at.ac.tuwien.sbc.valesriegler.types.Order;
29 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
30 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
31 import at.ac.tuwien.sbc.valesriegler.types.Table;
32
33 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
34         private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
35         
36         public PizzeriaAgentXVSM() {
37                 super();
38                 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
39                 freeTablesContainer = useContainer(Util.FREE_TABLES);
40                 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
41                 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
42                 deliverPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
43                 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
44                 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
45                 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
46         infoContainer = useContainer(Util.INFO);
47         }
48
49         public void listenForOccupiedTables() {
50                 NotificationListener tablesListener = new NotificationListener() {
51             @Override
52             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
53                 log.info("A new group was assigned to a table!");
54                 
55                 final List<Table> tables = castEntries(entries);
56                 
57                 if(tables.size() != 1) {
58                         throw new RuntimeException("Only one table can get free at once!");
59                 }
60                 final Table table = tables.get(0);
61         
62                 SwingUtilities.invokeLater(new Runnable() {
63                                         @Override
64                                         public void run() {
65                                                 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
66                                                 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
67                                         }
68                                 });
69             }
70         };
71         try {
72                 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
73                 log.info("Created tableAssigned notification for pizzeria!");
74         } catch (Exception e) {
75             handleSpaceErrorAndTerminate(e);
76         }
77         }
78         
79         public void listenForFreeTables() {
80                 NotificationListener tablesListener = new NotificationListener() {
81             @Override
82             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
83                 log.info("A table has become free");
84                 
85                 final List<Table> tables = castEntries(entries);
86         
87                 SwingUtilities.invokeLater(new Runnable() {
88                                         @Override
89                                         public void run() {
90                                                 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
91                                         }
92                                 });
93             }
94         };
95         try {
96                 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
97         } catch (Exception e) {
98             handleSpaceErrorAndTerminate(e);
99         }
100         }
101
102         public void listenForWaitingGroups() {
103                 
104         NotificationListener groupsListener = new NotificationListener() {
105             @Override
106             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
107                 final List<GroupData> groups = castEntries(entries);
108                 
109                 SwingUtilities.invokeLater(new Runnable() {
110                                         @Override
111                                         public void run() {
112                                                 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
113                                         }
114                                 });
115                 
116             }
117         };
118           try {
119                 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
120         } catch (Exception e) {
121            handleSpaceErrorAndTerminate(e);
122         }
123         }
124         
125 public void listenForTakenOrders() {
126                 
127         NotificationListener orderTakenListener = new NotificationListener() {
128             @Override
129             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
130                 final List<GroupData> groups = castEntries(entries);
131                 
132                 if(groups.size() != 1) {
133                         throw new RuntimeException("Only one order per table!");
134                 }
135                 final GroupData group = groups.get(0);
136                 
137                 SwingUtilities.invokeLater(new Runnable() {
138                                         @Override
139                                         public void run() {
140                                                 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
141                                         }
142                                 });
143                 
144             }
145         };
146           try {
147                 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
148         } catch (Exception e) {
149            handleSpaceErrorAndTerminate(e);
150         }
151         }
152
153         public void listenForPizzasInPreparation() {
154                 NotificationListener pizzasInProgress = new NotificationListener() {
155             @Override
156             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
157                 final List<Pizza> pizzas = castEntries(entries);
158                 
159                 log.info("{} pizzas in progress changes!", pizzas.size());
160                 for (PizzaOrder pizza : pizzas) {
161                         log.info(pizza.toString());
162                                 }
163                 
164                 SwingUtilities.invokeLater(new Runnable() {
165                                         @Override
166                                         public void run() {
167                                                 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
168                                         }
169                                 });
170                 
171             }
172         };
173           try {
174                 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
175         } catch (Exception e) {
176            handleSpaceErrorAndTerminate(e);
177         }
178         }
179
180         public void listenForDeliveredOrders() {
181                 NotificationListener deliveredOrders = new NotificationListener() {
182             @Override
183             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
184                 final List<GroupData> groups = castEntries(entries);
185                 
186                 log.info("{} order was delivered!", groups.size());
187                 if(groups.size() != 1) {
188                         throw new RuntimeException("A waiter should only deliver one order at once!");
189                 }
190                 final GroupData group = groups.get(0);
191                            
192                 SwingUtilities.invokeLater(new Runnable() {
193                                         @Override
194                                         public void run() {
195                                                 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
196                                         }
197                                 });
198                 
199             }
200         };
201           try {
202                 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
203         } catch (Exception e) {
204            handleSpaceErrorAndTerminate(e);
205         }
206         }
207
208         public void listenForPreparedPizzas() {
209                 NotificationListener preparedPizzasListener = new NotificationListener() {
210             @Override
211             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
212                
213                List<Pizza> pizzas = castEntries(entries);
214                if(pizzas.size() != 1) throw new RuntimeException("Multiple pizzas in one notification?! That should not happen! A cook can only prepare one at the same time!");
215                
216                final Pizza pizza = pizzas.get(0);
217                
218                SwingUtilities.invokeLater(new Runnable() {
219                                         @Override
220                                         public void run() {
221                                                 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
222                                         }
223                         });
224               
225             }
226                 };
227                 
228         try {
229                         notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
230                         log.info("Created deliverPizzasContainer notification for the pizzeria");
231                 } catch (Exception e) {
232                         handleSpaceErrorAndTerminate(e);
233                 }
234         }
235
236         public void listenForPayment() {
237                 NotificationListener isGoneListener = new NotificationListener() {
238             @Override
239             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
240                 final List<GroupData> groups = castEntries(entries);
241           
242                 final GroupData group = groups.get(0);
243                 log.info("Group {} is gone", group.getId());
244                            
245                 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
246                 SwingUtilities.invokeLater(new Runnable() {
247                                         
248                                         @Override
249                                         public void run() {
250                                                 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
251                                                 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
252                                         }
253                                 });
254                                 
255                                 Table table = new Table(tableId);
256                                 
257                                 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
258             }
259         };
260           try {
261                 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
262         } catch (Exception e) {
263            handleSpaceErrorAndTerminate(e);
264         }
265         }
266
267         public void sendFreeTablesToContainer(List<Table> tables) {
268                 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
269         }
270
271
272     public void initializeOrderId() {
273         sendItemsToContainer(Arrays.asList(new OrderId(1)), infoContainer, RequestTimeout.DEFAULT, null);
274     }
275 }