]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
[XVSM] Crucial container communication changes
[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.getOrder().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 listenForNewPizzerias() {
127         SpaceListener newPizzeriaListener = getDefaultBuilder().setCref(groupAgentInfoContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
128
129             @Override
130             public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
131                 final Set<String> pizzeriaIdentifiers = GroupAgent.getInstance().getPizzeriaIdentifiers();
132
133                 synchronized (pizzeriaIdentifiers) {
134                     final List<PizzeriaRegistration> pizzeriaRegistrations = castEntries(entries);
135                     final List<String> pizzeriaIds = new ArrayList<>();
136                     for (PizzeriaRegistration registration : pizzeriaRegistrations) {
137                         final String pizzeriaId = valueOf(registration.pizzeriaSpacePort);
138                         if (!pizzeriaIdentifiers.contains(pizzeriaId)) {
139                             pizzeriaIds.add(pizzeriaId);
140                             listenToPizzeria(pizzeriaId);
141                         }
142                     }
143
144                     SwingUtilities.invokeLater(new Runnable() {
145                         @Override
146                         public void run() {
147                             pizzeriaIdentifiers.addAll(pizzeriaIds);
148                         }
149                     });
150                 }
151             }
152         }).createSpaceListenerImpl();
153
154     }
155
156     private void listenToPizzeria(String pizzeriaId) {
157         final int port = Integer.parseInt(pizzeriaId);
158         listenForDeliveredOrders(port);
159         listenForPaymentDone(port);
160         listenForPaymentRequest(port);
161         listenForTableAssigned(port);
162         listenForOrdersTaken(port);
163     }
164
165     public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
166         try {
167             TransactionReference tx = capi.createTransaction(
168                 Util.SPACE_TRANSACTION_TIMEOUT,
169                 URI.create(format(Util.SERVER_ADDR, pizzeriaSpacePort)));
170             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.ASSIGN_TABLE, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
171             sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_GROUP, pizzeriaSpacePort), RequestTimeout.DEFAULT, tx);
172             capi.commitTransaction(tx);
173         } catch (MzsCoreException e) {
174             Util.handleSpaceErrorAndTerminate(e);
175         }
176     }
177
178     public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
179         sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
180     }
181 }