]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
Space waiters pay and overall remaining space workflow refactoring
[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                 tablesContainer = useContainer(Util.TABLES_CONTAINER) ;
37                 groupsContainer = useContainer(Util.GROUPS_CONTAINER) ;
38                 freeTablesContainer = useContainer(Util.FREE_TABLES);
39                 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
40                 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
41                 deliverPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
42                 hasPaidContainer = useContainer(Util.HAS_PAID) ;
43         }
44
45         public void listenForTables() {
46                 NotificationListener tablesListener = new NotificationListener() {
47             @Override
48             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
49                 log.info("Tables Change notified");
50                 
51                 final List<Table> tables = castEntries(entries);
52         
53                 SwingUtilities.invokeLater(new Runnable() {
54                                         @Override
55                                         public void run() {
56                                                 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
57                                         }
58                                 });
59             }
60         };
61         try {
62                 notificationMgr.createNotification(tablesContainer, tablesListener, Operation.WRITE);
63         } catch (Exception e) {
64             handleSpaceErrorAndTerminate(e);
65         }
66         }
67
68         public void listenForGroups() {
69                 
70         NotificationListener groupsListener = new NotificationListener() {
71             @Override
72             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
73                 final List<GroupData> groups = castEntries(entries);
74                 
75                 SwingUtilities.invokeLater(new Runnable() {
76                                         @Override
77                                         public void run() {
78                                                 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
79                                                 
80                                                 List<GroupData> groupsWhoHaveOrdered = new ArrayList<>();
81                                                 for (GroupData groupData : groups) {
82                                                         if(groupData.getState() != GroupState.NEW && groupData.getState() != GroupState.WAITING) {
83                                                                 groupsWhoHaveOrdered.add(groupData);
84                                                         }
85                                                 }
86                                                 PizzeriaAgent.getInstance().getOrdersModel().addItems(groupsWhoHaveOrdered);
87                                         }
88                                 });
89                 
90             }
91         };
92           try {
93                 notificationMgr.createNotification(groupsContainer, groupsListener, Operation.WRITE);
94         } catch (Exception e) {
95            handleSpaceErrorAndTerminate(e);
96         }
97         }
98
99         public void listenForPizzasInPreparation() {
100                 NotificationListener pizzasInProgress = new NotificationListener() {
101             @Override
102             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
103                 final List<Pizza> pizzas = castEntries(entries);
104                 
105                 log.info("{} pizzas in progress changes!", pizzas.size());
106                 for (PizzaOrder pizza : pizzas) {
107                         log.info(pizza.toString());
108                                 }
109                 
110                 SwingUtilities.invokeLater(new Runnable() {
111                                         @Override
112                                         public void run() {
113                                                 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
114                                         }
115                                 });
116                 
117             }
118         };
119           try {
120                 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
121         } catch (Exception e) {
122            handleSpaceErrorAndTerminate(e);
123         }
124         }
125
126         public void listenForDeliveredOrders() {
127                 NotificationListener deliveredOrders = 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                 log.info("{} order was delivered!", groups.size());
133                 if(groups.size() != 1) {
134                         throw new RuntimeException("A waiter should only deliver one order at once!");
135                 }
136                 final GroupData group = groups.get(0);
137                            
138                 SwingUtilities.invokeLater(new Runnable() {
139                                         @Override
140                                         public void run() {
141                                                 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
142                                         }
143                                 });
144                 
145             }
146         };
147           try {
148                 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
149         } catch (Exception e) {
150            handleSpaceErrorAndTerminate(e);
151         }
152         }
153
154         public void listenForPreparedPizzas() {
155                 NotificationListener preparedPizzasListener = new NotificationListener() {
156             @Override
157             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
158                
159                List<Pizza> pizzas = castEntries(entries);
160                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!");
161                
162                final Pizza pizza = pizzas.get(0);
163                
164                SwingUtilities.invokeLater(new Runnable() {
165                                         @Override
166                                         public void run() {
167                                                 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
168                                         }
169                         });
170               
171             }
172                 };
173                 
174         try {
175                         notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
176                         log.info("Created deliverPizzasContainer notification for the pizzeria");
177                 } catch (Exception e) {
178                         handleSpaceErrorAndTerminate(e);
179                 }
180         }
181
182         public void listenForPayment() {
183                 NotificationListener isGoneListener = new NotificationListener() {
184             @Override
185             public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
186                 final List<GroupData> groups = castEntries(entries);
187           
188                 final GroupData group = groups.get(0);
189                 log.info("Group {} is gone", group.getId());
190                            
191                 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
192                 SwingUtilities.invokeLater(new Runnable() {
193                                         
194                                         @Override
195                                         public void run() {
196                                                 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
197                                         }
198                                 });
199                                 
200                                 Table table = new Table(tableId);
201                                 
202                                 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
203             }
204         };
205           try {
206                 notificationMgr.createNotification(hasPaidContainer, isGoneListener, Operation.WRITE);
207         } catch (Exception e) {
208            handleSpaceErrorAndTerminate(e);
209         }
210         }
211
212
213 }