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.core.TransactionReference;
13 import org.mozartspaces.notifications.Notification;
14 import org.mozartspaces.notifications.NotificationListener;
15 import org.mozartspaces.notifications.Operation;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
19 import at.ac.tuwien.sbc.valesriegler.common.Util;
20 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
22 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
23 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
25 public PizzeriaAgentXVSM(int port) {
27 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
28 freeTablesContainer = useContainer(Util.FREE_TABLES);
29 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
30 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
31 preparedPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
32 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
33 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
34 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
35 pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
36 deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
39 public void listenForOccupiedTables() {
40 SpaceListener tablesListener = new SpaceListenerImpl(capi, tableAssignedContainer, false) {
42 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
43 log.info("A new group was assigned to a table!");
45 final List<Table> tables = castEntries(entries);
46 log.info("occupied tables: " + tables.toString());
48 SwingUtilities.invokeLater(new Runnable() {
51 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
52 PizzeriaAgent.getInstance().getGroupModel().removeGroupsFromTables(tables);
57 createNotification(tablesListener, tableAssignedContainer);
60 public void listenForFreeTables() {
61 SpaceListener tablesListener = new SpaceListenerImpl(capi, freeTablesContainer, false) {
64 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
65 log.info("A table has become free");
67 final List<Table> tables = castEntries(entries);
69 log.info("freetables: " + tables.toString());
70 // final TransactionReference tx = getDefaultTransaction();
71 // for (Table table : tables) {
72 // log.info("remove assigned table {}", table.getId());
73 // takeMatchingEntities(new Table(table.getId()), tableAssignedContainer, tx, RequestTimeout.DEFAULT, "Could not remove assigned tables");
75 // capi.commitTransaction(tx);
77 SwingUtilities.invokeLater(new Runnable() {
80 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
85 createNotification(tablesListener, freeTablesContainer);
88 public void listenForWaitingGroups() {
90 SpaceListener groupsListener = new SpaceListenerImpl(capi, assignTableContainer, false) {
92 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
93 final List<GroupData> groups = castEntries(entries);
95 SwingUtilities.invokeLater(new Runnable() {
98 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
104 createNotification(groupsListener, assignTableContainer);
107 public void listenForTakenDeliveryOrders() {
108 SpaceListener orderTakenListener = new SpaceListenerImpl(capi, deliveryOrderTakenContainer, false) {
110 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
111 final List<DeliveryGroupData> groups = castEntries(entries);
113 SwingUtilities.invokeLater(new Runnable() {
116 PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
122 createNotification(orderTakenListener, deliveryOrderTakenContainer);
125 public void listenForTakenOrders() {
127 SpaceListener orderTakenListener = new SpaceListenerImpl(capi, orderTakenContainer, false) {
129 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
130 final List<GroupData> groups = castEntries(entries);
132 SwingUtilities.invokeLater(new Runnable() {
135 PizzeriaAgent.getInstance().getOrdersModel().addItems(groups);
141 createNotification(orderTakenListener, orderTakenContainer);
144 public void listenForPizzasInPreparation() {
145 SpaceListener pizzasInProgress = new SpaceListenerImpl(capi, pizzaInProgressContainer, false) {
148 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
149 final List<Pizza> pizzas = castEntries(entries);
151 log.info("{} pizzas in progress changes!", pizzas.size());
152 for (PizzaOrder pizza : pizzas) {
153 log.info(pizza.toString());
156 SwingUtilities.invokeLater(new Runnable() {
159 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
160 PizzeriaAgent.getInstance().getDeliveryOrdersModel().updatePizzasInPreparation(pizzas);
166 createNotification(pizzasInProgress, pizzaInProgressContainer);
169 public void listenForDeliveredOrders() {
170 SpaceListener deliveredOrders = new SpaceListenerImpl(capi, orderCompleteContainer, false) {
172 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
173 final List<GroupData> groups = castEntries(entries);
175 log.info("{} order was delivered!", groups.size());
177 SwingUtilities.invokeLater(new Runnable() {
180 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrders(groups);
185 createNotification(deliveredOrders, orderCompleteContainer);
188 public void listenForPreparedPizzas() {
189 SpaceListener preparedPizzasListener = new SpaceListenerImpl(capi, preparedPizzasContainer, false) {
191 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
192 final List<Pizza> pizzas = castEntries(entries);
194 SwingUtilities.invokeLater(new Runnable() {
197 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizzas);
198 PizzeriaAgent.getInstance().getDeliveryOrdersModel().updateStatusOfPizzasDone(pizzas);
204 createNotification(preparedPizzasListener, preparedPizzasContainer);
208 public void listenForPayment() {
209 SpaceListener isGoneListener = new SpaceListenerImpl(capi, paymentDoneContainer, false) {
211 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
212 final List<GroupData> groups = castEntries(entries);
214 final GroupData group = groups.get(0);
215 log.info("Group {} is gone", group.getId());
217 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
218 SwingUtilities.invokeLater(new Runnable() {
222 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
223 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
227 Table table = new Table(tableId);
229 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
232 createNotification(isGoneListener, paymentDoneContainer);
236 public void sendFreeTablesToContainer(List<Table> tables) {
237 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
240 public void initializeOrderId() {
241 sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
244 public void notifyGroupAgent() {
245 sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);