1 package at.ac.tuwien.sbc.valesriegler.xvsm;
3 import java.io.Serializable;
5 import java.util.ArrayList;
6 import java.util.Arrays;
9 import javax.swing.SwingUtilities;
11 import at.ac.tuwien.sbc.valesriegler.common.OrderId;
12 import org.mozartspaces.capi3.AnyCoordinator;
13 import org.mozartspaces.capi3.FifoCoordinator;
14 import org.mozartspaces.capi3.LindaCoordinator;
15 import org.mozartspaces.core.MzsCoreException;
16 import org.mozartspaces.core.TransactionReference;
17 import org.mozartspaces.core.MzsConstants.RequestTimeout;
18 import org.mozartspaces.notifications.Notification;
19 import org.mozartspaces.notifications.NotificationListener;
20 import org.mozartspaces.notifications.Operation;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
24 import at.ac.tuwien.sbc.valesriegler.common.Util;
25 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
26 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
27 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
28 import at.ac.tuwien.sbc.valesriegler.types.Order;
29 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
30 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
31 import at.ac.tuwien.sbc.valesriegler.types.Table;
33 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
34 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
36 public PizzeriaAgentXVSM() {
38 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
39 freeTablesContainer = useContainer(Util.FREE_TABLES);
40 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
41 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
42 deliverPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
43 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
44 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
45 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
46 infoContainer = useContainer(Util.INFO);
49 public void listenForOccupiedTables() {
50 NotificationListener tablesListener = new NotificationListener() {
52 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
53 log.info("A new group was assigned to a table!");
55 final List<Table> tables = castEntries(entries);
57 if(tables.size() != 1) {
58 throw new RuntimeException("Only one table can get free at once!");
60 final Table table = tables.get(0);
62 SwingUtilities.invokeLater(new Runnable() {
65 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
66 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
72 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
73 log.info("Created tableAssigned notification for pizzeria!");
74 } catch (Exception e) {
75 handleSpaceErrorAndTerminate(e);
79 public void listenForFreeTables() {
80 NotificationListener tablesListener = new NotificationListener() {
82 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
83 log.info("A table has become free");
85 final List<Table> tables = castEntries(entries);
87 SwingUtilities.invokeLater(new Runnable() {
90 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
96 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
97 } catch (Exception e) {
98 handleSpaceErrorAndTerminate(e);
102 public void listenForWaitingGroups() {
104 NotificationListener groupsListener = new NotificationListener() {
106 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
107 final List<GroupData> groups = castEntries(entries);
109 SwingUtilities.invokeLater(new Runnable() {
112 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
119 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
120 } catch (Exception e) {
121 handleSpaceErrorAndTerminate(e);
125 public void listenForTakenOrders() {
127 NotificationListener orderTakenListener = new NotificationListener() {
129 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
130 final List<GroupData> groups = castEntries(entries);
132 if(groups.size() != 1) {
133 throw new RuntimeException("Only one order per table!");
135 final GroupData group = groups.get(0);
137 SwingUtilities.invokeLater(new Runnable() {
140 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
147 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
148 } catch (Exception e) {
149 handleSpaceErrorAndTerminate(e);
153 public void listenForPizzasInPreparation() {
154 NotificationListener pizzasInProgress = new NotificationListener() {
156 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
157 final List<Pizza> pizzas = castEntries(entries);
159 log.info("{} pizzas in progress changes!", pizzas.size());
160 for (PizzaOrder pizza : pizzas) {
161 log.info(pizza.toString());
164 SwingUtilities.invokeLater(new Runnable() {
167 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
174 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
175 } catch (Exception e) {
176 handleSpaceErrorAndTerminate(e);
180 public void listenForDeliveredOrders() {
181 NotificationListener deliveredOrders = new NotificationListener() {
183 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
184 final List<GroupData> groups = castEntries(entries);
186 log.info("{} order was delivered!", groups.size());
187 if(groups.size() != 1) {
188 throw new RuntimeException("A waiter should only deliver one order at once!");
190 final GroupData group = groups.get(0);
192 SwingUtilities.invokeLater(new Runnable() {
195 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
202 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
203 } catch (Exception e) {
204 handleSpaceErrorAndTerminate(e);
208 public void listenForPreparedPizzas() {
209 NotificationListener preparedPizzasListener = new NotificationListener() {
211 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
213 List<Pizza> pizzas = castEntries(entries);
214 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!");
216 final Pizza pizza = pizzas.get(0);
218 SwingUtilities.invokeLater(new Runnable() {
221 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
229 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
230 log.info("Created deliverPizzasContainer notification for the pizzeria");
231 } catch (Exception e) {
232 handleSpaceErrorAndTerminate(e);
236 public void listenForPayment() {
237 NotificationListener isGoneListener = new NotificationListener() {
239 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
240 final List<GroupData> groups = castEntries(entries);
242 final GroupData group = groups.get(0);
243 log.info("Group {} is gone", group.getId());
245 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
246 SwingUtilities.invokeLater(new Runnable() {
250 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
251 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
255 Table table = new Table(tableId);
257 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
261 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
262 } catch (Exception e) {
263 handleSpaceErrorAndTerminate(e);
267 public void sendFreeTablesToContainer(List<Table> tables) {
268 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
272 public void initializeOrderId() {
273 sendItemsToContainer(Arrays.asList(new OrderId(1)), infoContainer, RequestTimeout.DEFAULT, null);