1 package at.ac.tuwien.sbc.valesriegler.xvsm;
3 import at.ac.tuwien.sbc.valesriegler.common.OrderId;
4 import at.ac.tuwien.sbc.valesriegler.common.Util;
5 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
6 import at.ac.tuwien.sbc.valesriegler.types.*;
7 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
8 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
9 import org.mozartspaces.core.MzsConstants.RequestTimeout;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
14 import java.io.Serializable;
15 import java.util.ArrayList;
16 import java.util.Arrays;
17 import java.util.List;
19 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
20 private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
22 public PizzeriaAgentXVSM(int port) {
24 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
25 freeTablesContainer = useContainer(Util.FREE_TABLES);
26 pizzaInProgressContainer = useContainer(Util.PIZZAS_IN_PROGRESS) ;
27 orderDeliveredContainer = useContainer(Util.ORDER_COMPLETE) ;
28 preparedPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
29 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
30 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
31 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
32 pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
33 deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
34 pizzeriaTableContainer = useContainer(Util.PIZZERIA_TABLE);
35 pizzeriaGroupContainer = useContainer(Util.PIZZERIA_GROUP);
38 public void listenForOccupiedTables() {
39 SpaceListener tablesListener = getDefaultBuilder().setCref(tableAssignedContainer).setSpaceAction(new SpaceAction() {
41 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
42 log.info("A new group was assigned to a table!");
44 final List<Table> tables = castEntries(entries);
45 log.info("occupied tables: " + tables.toString());
47 SwingUtilities.invokeLater(new Runnable() {
50 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
51 PizzeriaAgent.getInstance().getGroupModel().removeGroupsFromTables(tables);
55 }).createSpaceListenerImpl();
58 public void listenForTables() {
59 SpaceListener tablesListener = getDefaultBuilder().setCref(pizzeriaTableContainer).setSpaceAction(new SpaceAction() {
61 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
62 log.info("listenForTables!!!!!");
64 final List<Table> tables = castEntries(entries);
66 final ArrayList<Table> occupiedTables = new ArrayList<>();
67 for (Table table : tables) {
68 if(! table.isFree()) occupiedTables.add(table);
70 log.info("11111111111111111111 Number of occupied Tables: {}", occupiedTables.size());
72 SwingUtilities.invokeLater(new Runnable() {
75 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
76 PizzeriaAgent.getInstance().getGroupModel().removeGroupsFromTables(occupiedTables);
80 }).createSpaceListenerImpl();
83 public void listenForGroups() {
85 SpaceListener groupsListener = getDefaultBuilder().setCref(pizzeriaGroupContainer).setSpaceAction(new SpaceAction() {
87 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
88 log.info("listenForGroups!!!!!");
90 final List<GroupData> groups = castEntries(entries);
91 final List<GroupData> waitingGroups = getWaitingGroups(groups);
92 final List<GroupData> orderedGroups = getOrderedGroups(groups);
94 SwingUtilities.invokeLater(new Runnable() {
97 PizzeriaAgent.getInstance().getGroupModel().addItems(waitingGroups);
98 PizzeriaAgent.getInstance().getOrdersModel().addItems(orderedGroups);
103 }).createSpaceListenerImpl();
106 private List<GroupData> getOrderedGroups(List<GroupData> groups) {
107 final ArrayList<GroupData> orderedGroups = new ArrayList<>();
108 for (GroupData group : groups) {
109 if(group.getState() != GroupState.WAITING) {
110 orderedGroups.add(group);
113 return orderedGroups;
116 private List<GroupData> getWaitingGroups(List<GroupData> groups) {
117 final ArrayList<GroupData> waitingGroups = new ArrayList<>();
118 for (GroupData group : groups) {
119 if (group.getState() == GroupState.WAITING) {
120 waitingGroups.add(group);
122 log.info("Fucking groupstate is {}", group.getState());
126 return waitingGroups;
129 public void listenForFreeTables() {
130 SpaceListener tablesListener = getDefaultBuilder().setCref(freeTablesContainer).setSpaceAction(new SpaceAction() {
133 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
134 log.info("A table has become free");
136 final List<Table> tables = castEntries(entries);
138 log.info("freetables: " + tables.toString());
139 // final TransactionReference tx = getDefaultTransaction();
140 // for (Table table : tables) {
141 // log.info("remove assigned table {}", table.getId());
142 // takeMatchingEntities(new Table(table.getId()), tableAssignedContainer, tx, RequestTimeout.DEFAULT, "Could not remove assigned tables");
144 // capi.commitTransaction(tx);
146 SwingUtilities.invokeLater(new Runnable() {
149 PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
153 }).createSpaceListenerImpl();
156 public void listenForWaitingGroups() {
158 SpaceListener groupsListener = getDefaultBuilder().setCref(assignTableContainer).setSpaceAction(new SpaceAction() {
160 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
161 final List<GroupData> groups = castEntries(entries);
163 SwingUtilities.invokeLater(new Runnable() {
166 PizzeriaAgent.getInstance().getGroupModel().addItems(groups);
171 }).createSpaceListenerImpl();
174 public void listenForTakenDeliveryOrders() {
175 SpaceListener orderTakenListener = getDefaultBuilder().setCref(deliveryOrderTakenContainer).setSpaceAction(new SpaceAction() {
177 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
178 final List<DeliveryGroupData> groups = castEntries(entries);
180 SwingUtilities.invokeLater(new Runnable() {
183 PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
188 }).createSpaceListenerImpl();
191 public void listenForTakenOrders() {
193 SpaceListener orderTakenListener = getDefaultBuilder().setCref(orderTakenContainer).setSpaceAction(new SpaceAction() {
195 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
196 final List<GroupData> groups = castEntries(entries);
198 SwingUtilities.invokeLater(new Runnable() {
201 PizzeriaAgent.getInstance().getOrdersModel().addItems(groups);
206 }).createSpaceListenerImpl();
209 public void listenForPizzasInPreparation() {
210 SpaceListener pizzasInProgress = getDefaultBuilder().setCref(pizzaInProgressContainer).setSpaceAction(new SpaceAction() {
213 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
214 final List<Pizza> pizzas = castEntries(entries);
216 log.info("{} pizzas in progress changes!", pizzas.size());
217 for (PizzaOrder pizza : pizzas) {
218 log.info(pizza.toString());
221 SwingUtilities.invokeLater(new Runnable() {
224 PizzeriaAgent.getInstance().getOrdersModel().updatePizzasInPreparation(pizzas);
225 PizzeriaAgent.getInstance().getDeliveryOrdersModel().updatePizzasInPreparation(pizzas);
230 }).createSpaceListenerImpl();
233 public void listenForDeliveredOrders() {
234 SpaceListener deliveredOrders = getDefaultBuilder().setCref(orderDeliveredContainer).setSpaceAction(new SpaceAction() {
236 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
237 final List<GroupData> groups = castEntries(entries);
239 log.info("{} order was delivered!", groups.size());
241 SwingUtilities.invokeLater(new Runnable() {
244 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfOrders(groups);
248 }).createSpaceListenerImpl();
251 public void listenForPreparedPizzas() {
252 SpaceListener preparedPizzasListener = getDefaultBuilder().setCref(preparedPizzasContainer).setSpaceAction(new SpaceAction() {
254 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
255 final List<Pizza> pizzas = castEntries(entries);
257 SwingUtilities.invokeLater(new Runnable() {
260 PizzeriaAgent.getInstance().getOrdersModel().updateStatusOfPizzasDone(pizzas);
261 PizzeriaAgent.getInstance().getDeliveryOrdersModel().updateStatusOfPizzasDone(pizzas);
266 }).createSpaceListenerImpl();
269 public void listenForPayment() {
270 SpaceListener isGoneListener = getDefaultBuilder().setCref(paymentDoneContainer).setSpaceAction(new SpaceAction() {
272 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
273 final List<GroupData> groups = castEntries(entries);
275 final GroupData group = groups.get(0);
276 log.info("Group {} is gone", group.getId());
278 final int tableId = PizzeriaAgent.getInstance().getTablesModel().getTableIdOfGroup(group);
279 SwingUtilities.invokeLater(new Runnable() {
283 PizzeriaAgent.getInstance().getOrdersModel().updatePaymentWaiter(group);
284 PizzeriaAgent.getInstance().getTablesModel().makeTableFree(tableId);
288 Table table = new Table(tableId);
290 sendItemsToContainer(Arrays.asList(table), freeTablesContainer, RequestTimeout.DEFAULT, null);
292 }).createSpaceListenerImpl();
296 public void sendFreeTablesToContainer(List<Table> tables) {
297 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
298 sendItemsToContainer(tables, pizzeriaTableContainer, RequestTimeout.DEFAULT, null);
301 public void initializeOrderId() {
302 sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
305 public void notifyGroupAgent() {
306 sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);