]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
[XVSM] Delivery in progress, Delivery done updates in UIs, Delivery logic
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / xvsm / GroupAgentXVSM.java
1 package at.ac.tuwien.sbc.valesriegler.xvsm;
2
3 import at.ac.tuwien.sbc.valesriegler.common.Util;
4 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
5 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
6 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
7 import at.ac.tuwien.sbc.valesriegler.types.Table;
8 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
9 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceListener;
10 import org.mozartspaces.core.MzsConstants.RequestTimeout;
11 import org.mozartspaces.core.MzsCoreException;
12 import org.mozartspaces.core.TransactionReference;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
15
16 import javax.swing.*;
17 import java.io.Serializable;
18 import java.net.URI;
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.Set;
22
23 import static java.lang.String.format;
24 import static java.lang.String.valueOf;
25
26 public class GroupAgentXVSM extends AbstractXVSMConnector {
27         private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
28         
29         public GroupAgentXVSM() {
30                 super(Util.GROUP_AGENT_PORT);
31         groupAgentInfoContainer = useContainer(Util.GROUP_AGENT_INFO);
32         }
33         
34         public void listenForDeliveredOrders(int port) {
35                 SpaceListener deliveredOrders = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.ORDER_COMPLETE, port)).setSpaceAction(new SpaceAction() {
36
37
38             @Override
39             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
40                 GroupData groupData = getSingleGroup(entries);
41                 final int groupId = groupData.getId();
42
43                 SwingUtilities.invokeLater(new Runnable() {
44                     @Override
45                     public void run() {
46                         GroupAgent.getInstance().getGroupModel().setGroupEating(groupId);
47                     }
48                 });
49             }
50         }).createSpaceListenerImpl();
51
52         }
53
54         public void listenForPaymentRequest(int port) {
55                 SpaceListener paymentRequest = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PAYMENT_REQUEST, port)).setSpaceAction(new SpaceAction() {
56             @Override
57             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
58                 final GroupData group = getSingleGroup(entries);
59
60                 SwingUtilities.invokeLater(new Runnable() {
61                     @Override
62                     public void run() {
63                         GroupAgent.getInstance().getGroupModel().setGroupWantsToPay(group.getId());
64                     }
65                 });
66
67             }
68
69
70         }).createSpaceListenerImpl();
71         }
72
73         public void listenForPaymentDone(int port) {
74                 SpaceListener payment = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PAYMENT_DONE, port)).setSpaceAction(new SpaceAction() {
75             @Override
76             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
77
78                 final GroupData group = getSingleGroup(entries);
79
80                 SwingUtilities.invokeLater(new Runnable() {
81                     @Override
82                     public void run() {
83                         GroupAgent.getInstance().getGroupModel().setGroupHasPaid(group.getId());
84                     }
85                 });
86
87             }
88         }).createSpaceListenerImpl();
89         }
90
91         public void listenForTableAssigned(int port) {
92                 SpaceListener tableAssignmentListener = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.TABLE_ASSIGNED, port)).setSpaceAction(new SpaceAction() {
93
94             @Override
95             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
96
97                 final List<Table> tables = castEntries(entries);
98
99                 SwingUtilities.invokeLater(new Runnable() {
100                     @Override
101                     public void run() {
102                         GroupAgent.getInstance().getGroupModel().setGroupsSitting(tables);
103                     }
104                 });
105             }
106         }).createSpaceListenerImpl();
107         }
108
109         public void listenForOrdersTaken(int port) {
110                 SpaceListener tableAssignmentListener = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.ORDER_TAKEN, port)).setSpaceAction(new SpaceAction() {
111             @Override
112             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
113                 final GroupData group = getSingleGroup(entries);
114
115                 SwingUtilities.invokeLater(new Runnable() {
116
117                     @Override
118                     public void run() {
119                         GroupAgent.getInstance().getGroupModel().setOrderTaken(group);
120                     }
121                 });
122             }
123         }).createSpaceListenerImpl();
124         }
125
126     public void listenForDeliveryOrdersTaken(int port) {
127         getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_ORDER_TAKEN, port)).setSpaceAction(new SpaceAction() {
128             @Override
129             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
130                 final List<DeliveryGroupData> groups = castEntries(entries);
131
132                 SwingUtilities.invokeLater(new Runnable() {
133
134                     @Override
135                     public void run() {
136                         GroupAgent.getInstance().getDeliveryModel().setOrdersTaken(groups);
137                     }
138                 });
139             }
140         }).createSpaceListenerImpl();
141     }
142
143     private void listenForDeliveredDeliveryOrders(int port) {
144         getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_DONE, port)).setSpaceAction(new SpaceAction() {
145             @Override
146             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
147                 final List<DeliveryGroupData> groups = castEntries(entries);
148
149                 log.info("DElivered orders!");
150
151                 SwingUtilities.invokeLater(new Runnable() {
152
153                     @Override
154                     public void run() {
155                         GroupAgent.getInstance().getDeliveryModel().setOrdersDelivered(groups);
156                     }
157                 });
158             }
159         }).createSpaceListenerImpl();
160     }
161
162     public void listenForNewPizzerias() {
163         SpaceListener newPizzeriaListener = getDefaultBuilder().setCref(groupAgentInfoContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
164
165             @Override
166             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
167                 final Set<String> pizzeriaIdentifiers = GroupAgent.getInstance().getPizzeriaIdentifiers();
168
169                 synchronized (pizzeriaIdentifiers) {
170                     final List<PizzeriaRegistration> pizzeriaRegistrations = castEntries(entries);
171                     final List<String> pizzeriaIds = new ArrayList<>();
172                     for (PizzeriaRegistration registration : pizzeriaRegistrations) {
173                         final String pizzeriaId = valueOf(registration.pizzeriaSpacePort);
174                         if (!pizzeriaIdentifiers.contains(pizzeriaId)) {
175                             pizzeriaIds.add(pizzeriaId);
176                             listenToPizzeria(pizzeriaId);
177                         }
178                     }
179
180                     SwingUtilities.invokeLater(new Runnable() {
181                         @Override
182                         public void run() {
183                             pizzeriaIdentifiers.addAll(pizzeriaIds);
184                         }
185                     });
186                 }
187             }
188         }).createSpaceListenerImpl();
189
190     }
191
192     private void listenToPizzeria(String pizzeriaId) {
193         final int port = Integer.parseInt(pizzeriaId);
194         listenForDeliveredOrders(port);
195         listenForPaymentDone(port);
196         listenForPaymentRequest(port);
197         listenForTableAssigned(port);
198         listenForOrdersTaken(port);
199         listenForDeliveryOrdersTaken(port);
200         listenForDeliveredDeliveryOrders(port);
201     }
202
203     public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
204         try {
205             TransactionReference tx = capi.createTransaction(
206                 Util.SPACE_TRANSACTION_TIMEOUT,
207                 URI.create(format(Util.SERVER_ADDR, pizzeriaSpacePort)));
208             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.ASSIGN_TABLE, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
209             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_GROUP, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
210             capi.commitTransaction(tx);
211         } catch (MzsCoreException e) {
212             Util.handleSpaceErrorAndTerminate(e);
213         }
214     }
215
216     public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
217         try {
218             TransactionReference tx = capi.createTransaction(
219                     Util.SPACE_TRANSACTION_TIMEOUT,
220                     URI.create(format(Util.SERVER_ADDR, pizzeriaSpacePort)));
221             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
222             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_DELIVERY, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
223             capi.commitTransaction(tx);
224         } catch (MzsCoreException e) {
225             Util.handleSpaceErrorAndTerminate(e);
226         }
227     }
228 }