1 package at.ac.tuwien.sbc.valesriegler.xvsm;
3 import java.io.Serializable;
4 import java.util.Arrays;
7 import javax.swing.SwingUtilities;
9 import at.ac.tuwien.sbc.valesriegler.common.OrderId;
10 import at.ac.tuwien.sbc.valesriegler.types.*;
11 import org.mozartspaces.core.MzsConstants.RequestTimeout;
12 import org.mozartspaces.notifications.Notification;
13 import org.mozartspaces.notifications.NotificationListener;
14 import org.mozartspaces.notifications.Operation;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
18 import at.ac.tuwien.sbc.valesriegler.common.Util;
19 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
21 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
22 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
24 public PizzeriaAgentXVSM(int port) {
26 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
27 freeTablesContainer = useContainer(Util.FREE_TABLES);
28 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
29 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
30 deliverPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
31 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
32 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
33 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
34 pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
35 deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
38 public void listenForOccupiedTables() {
39 NotificationListener tablesListener = new NotificationListener() {
41 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
42 log.info("A new group was assigned to a table!");
44 final List<Table> tables = castEntries(entries);
46 if(tables.size() != 1) {
47 throw new RuntimeException("Only one table can get free at once!");
49 final Table table = tables.get(0);
51 SwingUtilities.invokeLater(new Runnable() {
54 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
55 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
61 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
62 log.info("Created tableAssigned notification for pizzeria!");
63 } catch (Exception e) {
64 handleSpaceErrorAndTerminate(e);
68 public void listenForFreeTables() {
69 NotificationListener tablesListener = new NotificationListener() {
71 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
72 log.info("A table has become free");
74 final List<Table> tables = castEntries(entries);
76 SwingUtilities.invokeLater(new Runnable() {
79 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
85 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
86 } catch (Exception e) {
87 handleSpaceErrorAndTerminate(e);
91 public void listenForWaitingGroups() {
93 NotificationListener groupsListener = new NotificationListener() {
95 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
96 final List<GroupData> groups = castEntries(entries);
98 SwingUtilities.invokeLater(new Runnable() {
101 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
108 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
109 } catch (Exception e) {
110 handleSpaceErrorAndTerminate(e);
114 public void listenForTakenDeliveryOrders() {
115 NotificationListener orderTakenListener = new NotificationListener() {
117 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
118 final List<DeliveryGroupData> groups = castEntries(entries);
120 SwingUtilities.invokeLater(new Runnable() {
123 PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
130 notificationMgr.createNotification(deliveryOrderTakenContainer, orderTakenListener, Operation.WRITE);
131 } catch (Exception e) {
132 handleSpaceErrorAndTerminate(e);
136 public void listenForTakenOrders() {
138 NotificationListener orderTakenListener = new NotificationListener() {
140 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
141 final List<GroupData> groups = castEntries(entries);
143 if(groups.size() != 1) {
144 throw new RuntimeException("Only one order per table!");
146 final GroupData group = groups.get(0);
148 SwingUtilities.invokeLater(new Runnable() {
151 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
158 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
159 } catch (Exception e) {
160 handleSpaceErrorAndTerminate(e);
164 public void listenForPizzasInPreparation() {
165 NotificationListener pizzasInProgress = new NotificationListener() {
167 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
168 final List<Pizza> pizzas = castEntries(entries);
170 log.info("{} pizzas in progress changes!", pizzas.size());
171 for (PizzaOrder pizza : pizzas) {
172 log.info(pizza.toString());
175 SwingUtilities.invokeLater(new Runnable() {
178 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
185 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
186 } catch (Exception e) {
187 handleSpaceErrorAndTerminate(e);
191 public void listenForDeliveredOrders() {
192 NotificationListener deliveredOrders = new NotificationListener() {
194 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
195 final List<GroupData> groups = castEntries(entries);
197 log.info("{} order was delivered!", groups.size());
198 if(groups.size() != 1) {
199 throw new RuntimeException("A waiter should only deliver one order at once!");
201 final GroupData group = groups.get(0);
203 SwingUtilities.invokeLater(new Runnable() {
206 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
213 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
214 } catch (Exception e) {
215 handleSpaceErrorAndTerminate(e);
219 public void listenForPreparedPizzas() {
220 NotificationListener preparedPizzasListener = new NotificationListener() {
222 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
224 List<Pizza> pizzas = castEntries(entries);
225 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!");
227 final Pizza pizza = pizzas.get(0);
229 SwingUtilities.invokeLater(new Runnable() {
232 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
240 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
241 log.info("Created deliverPizzasContainer notification for the pizzeria");
242 } catch (Exception e) {
243 handleSpaceErrorAndTerminate(e);
247 public void listenForPayment() {
248 NotificationListener isGoneListener = new NotificationListener() {
250 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
251 final List<GroupData> groups = castEntries(entries);
253 final GroupData group = groups.get(0);
254 log.info("Group {} is gone", group.getId());
256 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
257 SwingUtilities.invokeLater(new Runnable() {
261 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
262 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
266 Table table = new Table(tableId);
268 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
272 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
273 } catch (Exception e) {
274 handleSpaceErrorAndTerminate(e);
279 public void sendFreeTablesToContainer(List<Table> tables) {
280 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
283 public void initializeOrderId() {
284 sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
287 public void notifyGroupAgent() {
288 sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);