]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/GroupAgentXVSM.java
[XVSM] Remove some containers of the Group Agent by introducing notifications of...
[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.PizzaOrder;
8 import at.ac.tuwien.sbc.valesriegler.types.Table;
9 import org.mozartspaces.core.MzsConstants.RequestTimeout;
10 import org.mozartspaces.core.MzsCoreException;
11 import org.mozartspaces.core.TransactionReference;
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.List;
19 import java.util.Set;
20
21 public class GroupAgentXVSM extends AbstractXVSMConnector {
22         private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
23         
24         public GroupAgentXVSM() {
25                 super(Util.GROUP_AGENT_PORT);
26         groupAgentInfoContainer = useContainer(Util.GROUP_AGENT_INFO);
27         }
28         
29         public void listenForDeliveredOrders(int port) {
30                 SpaceListener deliveredOrders = new SpaceListenerImpl(capi, orderCompleteContainer, false) {
31                         
32                         @Override
33                         void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
34                                 GroupData groupData =  getSingleGroup(entries);
35                                 final int groupId = groupData.getOrder().getId();
36                            
37                 SwingUtilities.invokeLater(new Runnable() {
38                                         @Override
39                                         public void run() {
40                                                 GroupAgent.getInstance().getGroupModel().setGroupEating(groupId);
41                                         }
42                                 });
43             }
44         };
45         createNotification(deliveredOrders, useContainerOfSpaceWithPort(Util.ORDER_COMPLETE, port));
46
47         }
48
49         public void listenForPaymentRequest(int port) {
50                 SpaceListener paymentRequest = new SpaceListenerImpl(capi, paymentRequestContainer, false) {
51             @Override
52             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
53                 final GroupData group = getSingleGroup(entries);
54                            
55                 SwingUtilities.invokeLater(new Runnable() {
56                                         @Override
57                                         public void run() {
58                                                 GroupAgent.getInstance().getGroupModel().setGroupWantsToPay(group.getId());
59                                         }
60                                 });
61                 
62             }
63
64         
65         };
66         createNotification(paymentRequest, useContainerOfSpaceWithPort(Util.PAYMENT_REQUEST, port));
67         }
68
69         public void listenForPaymentDone(int port) {
70                 SpaceListener payment = new SpaceListenerImpl(capi, paymentDoneContainer, false) {
71             @Override
72             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
73                 
74                 final GroupData group = getSingleGroup(entries);
75                            
76                 SwingUtilities.invokeLater(new Runnable() {
77                                         @Override
78                                         public void run() {
79                                                 GroupAgent.getInstance().getGroupModel().setGroupHasPaid(group.getId());
80                                         }
81                                 });
82                 
83             }
84         };
85         createNotification(payment, useContainerOfSpaceWithPort(Util.PAYMENT_DONE, port));
86         }
87
88         public void listenForTableAssigned(int port) {
89                 SpaceListener tableAssignmentListener = new SpaceListenerImpl(capi, tableAssignedContainer, false) {
90                         
91             @Override
92             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
93                                 
94                                 final List<Table> tables = castEntries(entries);
95                                 
96                                 SwingUtilities.invokeLater(new Runnable() {
97                                         @Override
98                                         public void run() {
99                                                 GroupAgent.getInstance().getGroupModel().setGroupsSitting(tables);
100                                         }
101                                 });
102             }
103         };
104         createNotification(tableAssignmentListener, useContainerOfSpaceWithPort(Util.TABLE_ASSIGNED, port));
105     
106         }
107
108         public void listenForOrdersTaken(int port) {
109                 SpaceListener tableAssignmentListener = new SpaceListenerImpl(capi, orderTakenContainer, false) {
110             @Override
111             void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
112                final GroupData group = getSingleGroup(entries);
113                                 
114                                 SwingUtilities.invokeLater(new Runnable() {
115                                         
116                                         @Override
117                                         public void run() {
118                                                 GroupAgent.getInstance().getGroupModel().setOrderTaken(group);
119                                         }
120                                 });
121             }
122         };
123         createNotification(tableAssignmentListener, useContainerOfSpaceWithPort(Util.ORDER_TAKEN, port));
124         }
125
126     public void listenForNewPizzerias() {
127         SpaceListener newPizzeriaListener = new SpaceListenerImpl(capi, groupAgentInfoContainer, true) {
128
129             @Override
130             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 = String.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         };
153         createNotification(newPizzeriaListener, groupAgentInfoContainer);
154
155     }
156
157     private void listenToPizzeria(String pizzeriaId) {
158         final int port = Integer.parseInt(pizzeriaId);
159         listenForDeliveredOrders(port);
160         listenForPaymentDone(port);
161         listenForPaymentRequest(port);
162         listenForTableAssigned(port);
163         listenForOrdersTaken(port);
164     }
165
166     public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
167         sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.ASSIGN_TABLE, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
168     }
169
170     public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
171         sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
172     }
173 }