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 tablesContainer = useContainer(Util.TABLES_CONTAINER) ;
37 groupsContainer = useContainer(Util.GROUPS_CONTAINER) ;
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 hasPaidContainer = useContainer(Util.HAS_PAID) ;
45 public void listenForTables() {
46 NotificationListener tablesListener = new NotificationListener() {
48 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
49 log.info("Tables Change notified");
51 final List<Table> tables = castEntries(entries);
53 SwingUtilities.invokeLater(new Runnable() {
56 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
62 notificationMgr.createNotification(tablesContainer, tablesListener, Operation.WRITE);
63 } catch (Exception e) {
64 handleSpaceErrorAndTerminate(e);
68 public void listenForGroups() {
70 NotificationListener groupsListener = new NotificationListener() {
72 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
73 final List<GroupData> groups = castEntries(entries);
75 SwingUtilities.invokeLater(new Runnable() {
78 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
80 List<GroupData> groupsWhoHaveOrdered = new ArrayList<>();
81 for (GroupData groupData : groups) {
82 if(groupData.getState() != GroupState.NEW && groupData.getState() != GroupState.WAITING) {
83 groupsWhoHaveOrdered.add(groupData);
86 PizzeriaAgent.getInstance().getOrdersModel().addItems(groupsWhoHaveOrdered);
93 notificationMgr.createNotification(groupsContainer, groupsListener, Operation.WRITE);
94 } catch (Exception e) {
95 handleSpaceErrorAndTerminate(e);
99 public void listenForPizzasInPreparation() {
100 NotificationListener pizzasInProgress = new NotificationListener() {
102 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
103 final List<Pizza> pizzas = castEntries(entries);
105 log.info("{} pizzas in progress changes!", pizzas.size());
106 for (PizzaOrder pizza : pizzas) {
107 log.info(pizza.toString());
110 SwingUtilities.invokeLater(new Runnable() {
113 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
120 notificationMgr.createNotification(pizzaInProgressContainer, pizzasInProgress, Operation.WRITE);
121 } catch (Exception e) {
122 handleSpaceErrorAndTerminate(e);
126 public void listenForDeliveredOrders() {
127 NotificationListener deliveredOrders = 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 log.info("{} order was delivered!", groups.size());
133 if(groups.size() != 1) {
134 throw new RuntimeException("A waiter should only deliver one order at once!");
136 final GroupData group = groups.get(0);
138 SwingUtilities.invokeLater(new Runnable() {
141 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrder(group);
148 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
149 } catch (Exception e) {
150 handleSpaceErrorAndTerminate(e);
154 public void listenForPreparedPizzas() {
155 NotificationListener preparedPizzasListener = new NotificationListener() {
157 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
159 List<Pizza> pizzas = castEntries(entries);
160 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!");
162 final Pizza pizza = pizzas.get(0);
164 SwingUtilities.invokeLater(new Runnable() {
167 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizza);
175 notificationMgr.createNotification(deliverPizzasContainer, preparedPizzasListener, Operation.WRITE);
176 log.info("Created deliverPizzasContainer notification for the pizzeria");
177 } catch (Exception e) {
178 handleSpaceErrorAndTerminate(e);
182 public void listenForPayment() {
183 NotificationListener isGoneListener = new NotificationListener() {
185 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
186 final List<GroupData> groups = castEntries(entries);
188 final GroupData group = groups.get(0);
189 log.info("Group {} is gone", group.getId());
191 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
192 SwingUtilities.invokeLater(new Runnable() {
196 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
200 Table table = new Table(tableId);
202 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
206 notificationMgr.createNotification(hasPaidContainer, isGoneListener, Operation.WRITE);
207 } catch (Exception e) {
208 handleSpaceErrorAndTerminate(e);