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