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 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;
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;
31 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
32 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
34 public PizzeriaAgentXVSM() {
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);
46 public void listenForOccupiedTables() {
47 NotificationListener tablesListener = new NotificationListener() {
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!");
52 final List<Table> tables = castEntries(entries);
54 if(tables.size() != 1) {
55 throw new RuntimeException("Only one table can get free at once!");
57 final Table table = tables.get(0);
59 SwingUtilities.invokeLater(new Runnable() {
62 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
63 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
69 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
70 log.info("Created tableAssigned notification for pizzeria!");
71 } catch (Exception e) {
72 handleSpaceErrorAndTerminate(e);
76 public void listenForFreeTables() {
77 NotificationListener tablesListener = new NotificationListener() {
79 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
80 log.info("A table has become free");
82 final List<Table> tables = castEntries(entries);
84 SwingUtilities.invokeLater(new Runnable() {
87 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
93 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
94 } catch (Exception e) {
95 handleSpaceErrorAndTerminate(e);
99 public void listenForWaitingGroups() {
101 NotificationListener groupsListener = new NotificationListener() {
103 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
104 final List<GroupData> groups = castEntries(entries);
106 SwingUtilities.invokeLater(new Runnable() {
109 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
116 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
117 } catch (Exception e) {
118 handleSpaceErrorAndTerminate(e);
122 public void listenForTakenOrders() {
124 NotificationListener orderTakenListener = new NotificationListener() {
126 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
127 final List<GroupData> groups = castEntries(entries);
129 if(groups.size() != 1) {
130 throw new RuntimeException("Only one order per table!");
132 final GroupData group = groups.get(0);
134 SwingUtilities.invokeLater(new Runnable() {
137 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
144 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
145 } catch (Exception e) {
146 handleSpaceErrorAndTerminate(e);
150 public void listenForPizzasInPreparation() {
151 NotificationListener pizzasInProgress = new NotificationListener() {
153 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
154 final List<Pizza> pizzas = castEntries(entries);
156 log.info("{} pizzas in progress changes!", pizzas.size());
157 for (PizzaOrder pizza : pizzas) {
158 log.info(pizza.toString());
161 SwingUtilities.invokeLater(new Runnable() {
164 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
171 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
172 } catch (Exception e) {
173 handleSpaceErrorAndTerminate(e);
177 public void listenForDeliveredOrders() {
178 NotificationListener deliveredOrders = new NotificationListener() {
180 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
181 final List<GroupData> groups = castEntries(entries);
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!");
187 final GroupData group = groups.get(0);
189 SwingUtilities.invokeLater(new Runnable() {
192 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
199 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
200 } catch (Exception e) {
201 handleSpaceErrorAndTerminate(e);
205 public void listenForPreparedPizzas() {
206 NotificationListener preparedPizzasListener = new NotificationListener() {
208 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
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!");
213 final Pizza pizza = pizzas.get(0);
215 SwingUtilities.invokeLater(new Runnable() {
218 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
226 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
227 log.info("Created deliverPizzasContainer notification for the pizzeria");
228 } catch (Exception e) {
229 handleSpaceErrorAndTerminate(e);
233 public void listenForPayment() {
234 NotificationListener isGoneListener = new NotificationListener() {
236 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
237 final List<GroupData> groups = castEntries(entries);
239 final GroupData group = groups.get(0);
240 log.info("Group {} is gone", group.getId());
242 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
243 SwingUtilities.invokeLater(new Runnable() {
247 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
248 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
252 Table table = new Table(tableId);
254 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
258 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
259 } catch (Exception e) {
260 handleSpaceErrorAndTerminate(e);