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.FifoCoordinator;
13 import org.mozartspaces.capi3.LindaCoordinator;
14 import org.mozartspaces.core.MzsCoreException;
15 import org.mozartspaces.core.TransactionReference;
16 import org.mozartspaces.core.MzsConstants.RequestTimeout;
17 import org.mozartspaces.notifications.Notification;
18 import org.mozartspaces.notifications.NotificationListener;
19 import org.mozartspaces.notifications.Operation;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 import at.ac.tuwien.sbc.valesriegler.common.Util;
24 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
25 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
26 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
27 import at.ac.tuwien.sbc.valesriegler.types.Order;
28 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
29 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
30 import at.ac.tuwien.sbc.valesriegler.types.Table;
32 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
33 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
35 public PizzeriaAgentXVSM() {
37 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
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 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
43 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
44 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
47 public void listenForOccupiedTables() {
48 NotificationListener tablesListener = new NotificationListener() {
50 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
51 log.info("A new group was assigned to a table!");
53 final List<Table> tables = castEntries(entries);
55 if(tables.size() != 1) {
56 throw new RuntimeException("Only one table can get free at once!");
58 final Table table = tables.get(0);
60 SwingUtilities.invokeLater(new Runnable() {
63 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
64 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
70 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
71 log.info("Created tableAssigned notification for pizzeria!");
72 } catch (Exception e) {
73 handleSpaceErrorAndTerminate(e);
77 public void listenForFreeTables() {
78 NotificationListener tablesListener = new NotificationListener() {
80 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
81 log.info("A table has become free");
83 final List<Table> tables = castEntries(entries);
85 SwingUtilities.invokeLater(new Runnable() {
88 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
94 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
95 } catch (Exception e) {
96 handleSpaceErrorAndTerminate(e);
100 public void listenForWaitingGroups() {
102 NotificationListener groupsListener = new NotificationListener() {
104 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
105 final List<GroupData> groups = castEntries(entries);
107 SwingUtilities.invokeLater(new Runnable() {
110 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
117 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
118 } catch (Exception e) {
119 handleSpaceErrorAndTerminate(e);
123 public void listenForTakenOrders() {
125 NotificationListener orderTakenListener = new NotificationListener() {
127 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
128 final List<GroupData> groups = castEntries(entries);
130 if(groups.size() != 1) {
131 throw new RuntimeException("Only one order per table!");
133 final GroupData group = groups.get(0);
135 SwingUtilities.invokeLater(new Runnable() {
138 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
145 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
146 } catch (Exception e) {
147 handleSpaceErrorAndTerminate(e);
151 public void listenForPizzasInPreparation() {
152 NotificationListener pizzasInProgress = new NotificationListener() {
154 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
155 final List<Pizza> pizzas = castEntries(entries);
157 log.info("{} pizzas in progress changes!", pizzas.size());
158 for (PizzaOrder pizza : pizzas) {
159 log.info(pizza.toString());
162 SwingUtilities.invokeLater(new Runnable() {
165 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
172 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
173 } catch (Exception e) {
174 handleSpaceErrorAndTerminate(e);
178 public void listenForDeliveredOrders() {
179 NotificationListener deliveredOrders = new NotificationListener() {
181 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
182 final List<GroupData> groups = castEntries(entries);
184 log.info("{} order was delivered!", groups.size());
185 if(groups.size() != 1) {
186 throw new RuntimeException("A waiter should only deliver one order at once!");
188 final GroupData group = groups.get(0);
190 SwingUtilities.invokeLater(new Runnable() {
193 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
200 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
201 } catch (Exception e) {
202 handleSpaceErrorAndTerminate(e);
206 public void listenForPreparedPizzas() {
207 NotificationListener preparedPizzasListener = new NotificationListener() {
209 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
211 List<Pizza> pizzas = castEntries(entries);
212 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!");
214 final Pizza pizza = pizzas.get(0);
216 SwingUtilities.invokeLater(new Runnable() {
219 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
227 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
228 log.info("Created deliverPizzasContainer notification for the pizzeria");
229 } catch (Exception e) {
230 handleSpaceErrorAndTerminate(e);
234 public void listenForPayment() {
235 NotificationListener isGoneListener = new NotificationListener() {
237 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
238 final List<GroupData> groups = castEntries(entries);
240 final GroupData group = groups.get(0);
241 log.info("Group {} is gone", group.getId());
243 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
244 SwingUtilities.invokeLater(new Runnable() {
248 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
249 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
253 Table table = new Table(tableId);
255 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
259 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
260 } catch (Exception e) {
261 handleSpaceErrorAndTerminate(e);
265 public void sendFreeTablesToContainer(List<Table> tables) {
266 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);