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