]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/PizzeriaAgentXVSM.java
GUI fix for Tables OutOfBoundsException
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / xvsm / PizzeriaAgentXVSM.java
1 package at.ac.tuwien.sbc.valesriegler.xvsm;
2
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.DeliveryGroupData;
7 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
8 import at.ac.tuwien.sbc.valesriegler.types.GroupState;
9 import at.ac.tuwien.sbc.valesriegler.types.Table;
10 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
11 import org.mozartspaces.core.MzsConstants.RequestTimeout;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 import javax.swing.*;
16 import java.io.Serializable;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20
21 public class PizzeriaAgentXVSM extends AbstractXVSMConnector {
22         private static final Logger log = LoggerFactory.getLogger(PizzeriaAgentXVSM.class);
23         
24         public PizzeriaAgentXVSM(int port) {
25                 super(port);
26                 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED) ;
27                 freeTablesContainer = useContainer(Util.FREE_TABLES);
28                 orderDeliveredContainer = useContainer(Util.ORDER_COMPLETE) ;
29                 preparedPizzasContainer = useContainer(Util.DELIVER_PIZZAS);
30                 paymentDoneContainer = useContainer(Util.PAYMENT_DONE) ;
31                 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
32                 assignTableContainer = useContainer(Util.ASSIGN_TABLE);
33         pizzeriaInfoContainer = useContainer(Util.PIZZERIA_INFO);
34         deliveryOrderTakenContainer = useContainer(Util.DELIVERY_ORDER_TAKEN);
35         pizzeriaTableContainer = useContainer(Util.PIZZERIA_TABLE);
36         pizzeriaGroupContainer = useContainer(Util.PIZZERIA_GROUP);
37         preparedDeliveryPizzasContainer = useContainer(Util.DELIVER_DELIVERY_PIZZAS);
38         pizzeriaDeliveryContainer = useContainer(Util.PIZZERIA_DELIVERY);
39
40     }
41
42     public void listenForTablesUpdates() {
43         getDefaultBuilder("listenForTablesUpdates").setCref(pizzeriaTableContainer).setSpaceAction(new SpaceAction() {
44             @Override
45             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
46
47                 final List<Table> tables = castEntries(entries);
48
49                 final ArrayList<Table> occupiedTables = new ArrayList<>();
50                 for (Table table : tables) {
51                     if(! table.isFree()) occupiedTables.add(table);
52                 }
53
54                 SwingUtilities.invokeLater(new Runnable() {
55                     @Override
56                     public void run() {
57                         PizzeriaAgent.getInstance().getTablesModel().addItems(tables);
58                         PizzeriaAgent.getInstance().getGroupModel().removeGroupsFromTables(occupiedTables);
59                     }
60                 });
61             }
62         }).createSpaceListenerImpl();
63     }
64
65     public void listenForGroupUpdates() {
66         getDefaultBuilder("listenForGroupUpdates").setCref(pizzeriaGroupContainer).setSpaceAction(new SpaceAction() {
67             @Override
68             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
69                 final List<GroupData> groups = castEntries(entries);
70                 final List<GroupData> waitingGroups = getWaitingGroups(groups);
71                 final List<GroupData> orderedGroups = getOrderedGroups(groups);
72
73                 SwingUtilities.invokeLater(new Runnable() {
74                     @Override
75                     public void run() {
76                         PizzeriaAgent.getInstance().getGroupModel().addItems(waitingGroups);
77                         PizzeriaAgent.getInstance().getOrdersModel().addItems(orderedGroups);
78                     }
79                 });
80
81             }
82         }).createSpaceListenerImpl();
83     }
84
85     public void listenForDeliveryUpdates() {
86          getDefaultBuilder("listenForDeliveryUpdates").setCref(pizzeriaDeliveryContainer).setSpaceAction(new SpaceAction() {
87             @Override
88             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
89                 final List<DeliveryGroupData> groups = castEntries(entries);
90
91                 SwingUtilities.invokeLater(new Runnable() {
92                     @Override
93                     public void run() {
94                         PizzeriaAgent.getInstance().getDeliveryOrdersModel().addItems(groups);
95                     }
96                 });
97
98             }
99         }).createSpaceListenerImpl();
100     }
101
102     public void sendFreeTablesToContainer(List<Table> tables) {
103                 sendItemsToContainer(tables, freeTablesContainer, RequestTimeout.DEFAULT, null);
104                 sendItemsToContainer(tables, pizzeriaTableContainer, RequestTimeout.DEFAULT, null);
105         }
106
107     private List<GroupData> getOrderedGroups(List<GroupData> groups) {
108         final ArrayList<GroupData> orderedGroups = new ArrayList<>();
109         for (GroupData group : groups) {
110             if(group.getState() != GroupState.WAITING) {
111                 orderedGroups.add(group);
112             }
113         }
114         return orderedGroups;
115     }
116
117     public void initializeOrderId() {
118         sendItemsToContainer(Arrays.asList(new OrderId(0)), pizzeriaInfoContainer, RequestTimeout.DEFAULT, null);
119     }
120
121     public void notifyGroupAgent() {
122         sendItemsToContainer(Arrays.asList(new PizzeriaRegistration(port)), useContainerOfSpaceWithPort(Util.GROUP_AGENT_INFO, Util.GROUP_AGENT_PORT), RequestTimeout.DEFAULT, null);
123     }
124
125     private List<GroupData> getWaitingGroups(List<GroupData> groups) {
126         final ArrayList<GroupData> waitingGroups = new ArrayList<>();
127         for (GroupData group : groups) {
128             if (group.getState() == GroupState.WAITING) {
129                 waitingGroups.add(group);
130             }
131
132         }
133         return waitingGroups;
134     }
135 }