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 org.mozartspaces.core.MzsConstants.RequestTimeout;
11 import org.mozartspaces.notifications.Notification;
12 import org.mozartspaces.notifications.NotificationListener;
13 import org.mozartspaces.notifications.Operation;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
17 import at.ac.tuwien.sbc.valesriegler.common.Util;
18 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
19 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
20 import at.ac.tuwien.sbc.valesriegler.types.Pizza;
21 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
22 import at.ac.tuwien.sbc.valesriegler.types.Table;
24 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
25 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
27 public PizzeriaAgentXVSM(int port) {
29 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
30 freeTablesContainer = useContainer(Util.FREE_TABLES);
31 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
32 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
33 deliverPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
34 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
35 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
36 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
37 pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
40 public void listenForOccupiedTables() {
41 NotificationListener tablesListener = new NotificationListener() {
43 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
44 log.info("A new group was assigned to a table!");
46 final List<Table> tables = castEntries(entries);
48 if(tables.size() != 1) {
49 throw new RuntimeException("Only one table can get free at once!");
51 final Table table = tables.get(0);
53 SwingUtilities.invokeLater(new Runnable() {
56 PizzeriaAgent.getInstance().getTablesModel().addItems(Arrays.asList(table));
57 PizzeriaAgent.getInstance().getGroupModel().removeGroup(table.getGroupId());
63 notificationMgr.createNotification(tableAssignedContainer, tablesListener, Operation.WRITE);
64 log.info("Created tableAssigned notification for pizzeria!");
65 } catch (Exception e) {
66 handleSpaceErrorAndTerminate(e);
70 public void listenForFreeTables() {
71 NotificationListener tablesListener = new NotificationListener() {
73 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
74 log.info("A table has become free");
76 final List<Table> tables = castEntries(entries);
78 SwingUtilities.invokeLater(new Runnable() {
81 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
87 notificationMgr.createNotification(freeTablesContainer, tablesListener, Operation.WRITE);
88 } catch (Exception e) {
89 handleSpaceErrorAndTerminate(e);
93 public void listenForWaitingGroups() {
95 NotificationListener groupsListener = new NotificationListener() {
97 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
98 final List<GroupData> groups = castEntries(entries);
100 SwingUtilities.invokeLater(new Runnable() {
103 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
110 notificationMgr.createNotification(assignTableContainer, groupsListener, Operation.WRITE);
111 } catch (Exception e) {
112 handleSpaceErrorAndTerminate(e);
116 public void listenForTakenOrders() {
118 NotificationListener orderTakenListener = new NotificationListener() {
120 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
121 final List<GroupData> groups = castEntries(entries);
123 if(groups.size() != 1) {
124 throw new RuntimeException("Only one order per table!");
126 final GroupData group = groups.get(0);
128 SwingUtilities.invokeLater(new Runnable() {
131 PizzeriaAgent.getInstance().getOrdersModel().addItems(Arrays.asList(group));
138 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
139 } catch (Exception e) {
140 handleSpaceErrorAndTerminate(e);
144 public void listenForPizzasInPreparation() {
145 NotificationListener pizzasInProgress = new NotificationListener() {
147 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
148 final List<Pizza> pizzas = castEntries(entries);
150 log.info("{} pizzas in progress changes!", pizzas.size());
151 for (PizzaOrder pizza : pizzas) {
152 log.info(pizza.toString());
155 SwingUtilities.invokeLater(new Runnable() {
158 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
165 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
166 } catch (Exception e) {
167 handleSpaceErrorAndTerminate(e);
171 public void listenForDeliveredOrders() {
172 NotificationListener deliveredOrders = new NotificationListener() {
174 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
175 final List<GroupData> groups = castEntries(entries);
177 log.info("{} order was delivered!", groups.size());
178 if(groups.size() != 1) {
179 throw new RuntimeException("A waiter should only deliver one order at once!");
181 final GroupData group = groups.get(0);
183 SwingUtilities.invokeLater(new Runnable() {
186 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
193 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
194 } catch (Exception e) {
195 handleSpaceErrorAndTerminate(e);
199 public void listenForPreparedPizzas() {
200 NotificationListener preparedPizzasListener = new NotificationListener() {
202 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
204 List<Pizza> pizzas = castEntries(entries);
205 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!");
207 final Pizza pizza = pizzas.get(0);
209 SwingUtilities.invokeLater(new Runnable() {
212 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
220 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
221 log.info("Created deliverPizzasContainer notification for the pizzeria");
222 } catch (Exception e) {
223 handleSpaceErrorAndTerminate(e);
227 public void listenForPayment() {
228 NotificationListener isGoneListener = new NotificationListener() {
230 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
231 final List<GroupData> groups = castEntries(entries);
233 final GroupData group = groups.get(0);
234 log.info("Group {} is gone", group.getId());
236 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
237 SwingUtilities.invokeLater(new Runnable() {
241 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
242 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
246 Table table = new Table(tableId);
248 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
252 notificationMgr.createNotification(paymentDoneContainer, isGoneListener, Operation.WRITE);
253 } catch (Exception e) {
254 handleSpaceErrorAndTerminate(e);
258 public void sendFreeTablesToContainer(List<Table> tables) {
259 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
263 public void initializeOrderId() {
264 sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
267 public void notifyGroupAgent() {
268 sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);