]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
[XVSM] Create initial Pizzeria Recovery support.
[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.core.TransactionReference;
13 import org.mozartspaces.notifications.Notification;
14 import org.mozartspaces.notifications.NotificationListener;
15 import org.mozartspaces.notifications.Operation;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import at.ac.tuwien.sbc.valesriegler.common.Util;
20 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
21
22 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
23         private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
24         
25         public PizzeriaAgentXVSM(int port) {
26                 super(port);
27                 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
28                 freeTablesContainer = useContainer(Util.FREE_TABLES);
29                 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
30                 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
31                 preparedPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
32                 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
33                 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
34                 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
35         pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
36         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
37     }
38
39         public void listenForOccupiedTables() {
40                 SpaceListener tablesListener = new SpaceListenerImpl(capi, tableAssignedContainer, false) {
41             @Override
42             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
43                 log.info("A new group was assigned to a table!");
44
45                 final List<Table> tables = castEntries(entries);
46                 log.info("occupied tables: " + tables.toString());
47
48                 SwingUtilities.invokeLater(new Runnable() {
49                     @Override
50                     public void run() {
51                         PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
52                         PizzeriaAgent.getInstance().getGroupModel().removeGroupsFromTables(tables);
53                     }
54                 });
55             }
56         };
57         createNotification(tablesListener, tableAssignedContainer);
58         }
59         
60         public void listenForFreeTables() {
61                 SpaceListener tablesListener = new SpaceListenerImpl(capi, freeTablesContainer, false) {
62
63             @Override
64             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
65                 log.info("A table has become free");
66
67                 final List<Table> tables = castEntries(entries);
68
69                 log.info("freetables: " + tables.toString());
70 //                final TransactionReference tx = getDefaultTransaction();
71 //                for (Table table : tables) {
72 //                    log.info("remove assigned table {}", table.getId());
73 //                    takeMatchingEntities(new Table(table.getId()), tableAssignedContainer, tx, RequestTimeout.DEFAULT, "Could not remove assigned tables");
74 //                }
75 //                capi.commitTransaction(tx);
76
77                 SwingUtilities.invokeLater(new Runnable() {
78                     @Override
79                     public void run() {
80                         PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
81                     }
82                 });
83             }
84         };
85         createNotification(tablesListener, freeTablesContainer);
86         }
87
88         public void listenForWaitingGroups() {
89                 
90         SpaceListener groupsListener = new SpaceListenerImpl(capi, assignTableContainer, false) {
91             @Override
92             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
93                 final List<GroupData> groups = castEntries(entries);
94
95                 SwingUtilities.invokeLater(new Runnable() {
96                     @Override
97                     public void run() {
98                         PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
99                     }
100                 });
101
102             }
103         };
104         createNotification(groupsListener, assignTableContainer);
105         }
106
107     public void listenForTakenDeliveryOrders() {
108         SpaceListener orderTakenListener = new SpaceListenerImpl(capi, deliveryOrderTakenContainer, false) {
109             @Override
110             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
111                 final List<DeliveryGroupData> groups = castEntries(entries);
112
113                 SwingUtilities.invokeLater(new Runnable() {
114                     @Override
115                     public void run() {
116                         PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
117                     }
118                 });
119
120             }
121         };
122         createNotification(orderTakenListener, deliveryOrderTakenContainer);
123     }
124
125 public void listenForTakenOrders() {
126
127         SpaceListener orderTakenListener = new SpaceListenerImpl(capi, orderTakenContainer, false) {
128             @Override
129             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
130                 final List<GroupData> groups = castEntries(entries);
131
132                 SwingUtilities.invokeLater(new Runnable() {
133                     @Override
134                     public void run() {
135                         PizzeriaAgent.getInstance().getOrdersModel().addItems(groups);
136                     }
137                 });
138
139             }
140         };
141         createNotification(orderTakenListener, orderTakenContainer);
142         }
143
144         public void listenForPizzasInPreparation() {
145                 SpaceListener pizzasInProgress = new SpaceListenerImpl(capi, pizzaInProgressContainer, false) {
146
147             @Override
148             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
149                 final List<Pizza> pizzas = castEntries(entries);
150
151                 log.info("{} pizzas in progress changes!", pizzas.size());
152                 for (PizzaOrder pizza : pizzas) {
153                     log.info(pizza.toString());
154                 }
155
156                 SwingUtilities.invokeLater(new Runnable() {
157                     @Override
158                     public void run() {
159                         PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
160                         PizzeriaAgent.getInstance().getDeliveryOrdersModel().updatePizzasInPreparation(pizzas);
161                     }
162                 });
163
164             }
165         };
166         createNotification(pizzasInProgress, pizzaInProgressContainer);
167         }
168
169         public void listenForDeliveredOrders() {
170                 SpaceListener deliveredOrders = new SpaceListenerImpl(capi, orderCompleteContainer, false) {
171             @Override
172             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
173                 final List<GroupData> groups = castEntries(entries);
174
175                 log.info("{} order was delivered!", groups.size());
176
177                 SwingUtilities.invokeLater(new Runnable() {
178                     @Override
179                     public void run() {
180                         PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrders(groups);
181                     }
182                 });
183             }
184         };
185         createNotification(deliveredOrders, orderCompleteContainer);
186         }
187
188         public void listenForPreparedPizzas() {
189                 SpaceListener preparedPizzasListener = new SpaceListenerImpl(capi, preparedPizzasContainer, false) {
190             @Override
191             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
192                 final List<Pizza> pizzas = castEntries(entries);
193
194                 SwingUtilities.invokeLater(new Runnable() {
195                     @Override
196                     public void run() {
197                         PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizzas);
198                         PizzeriaAgent.getInstance().getDeliveryOrdersModel().updateStatusOfPizzasDone(pizzas);
199                     }
200                 });
201
202             }
203         };
204         createNotification(preparedPizzasListener, preparedPizzasContainer);
205
206         }
207
208         public void listenForPayment() {
209                 SpaceListener isGoneListener = new SpaceListenerImpl(capi, paymentDoneContainer, false) {
210             @Override
211             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
212                 final List<GroupData> groups = castEntries(entries);
213
214                 final GroupData group = groups.get(0);
215                 log.info("Group {} is gone", group.getId());
216
217                 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
218                 SwingUtilities.invokeLater(new Runnable() {
219
220                     @Override
221                     public void run() {
222                         PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
223                         PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
224                     }
225                 });
226
227                 Table table = new Table(tableId);
228
229                 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
230             }
231         };
232         createNotification(isGoneListener, paymentDoneContainer);
233         }
234
235
236         public void sendFreeTablesToContainer(List<Table> tables) {
237                 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
238         }
239
240     public void initializeOrderId() {
241         sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
242     }
243
244     public void notifyGroupAgent() {
245         sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);
246     }
247 }