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