1 package at.ac.tuwien.sbc.valesriegler.xvsm;
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;
16 import java.io.Serializable;
17 import java.util.ArrayList;
18 import java.util.List;
21 public class GroupAgentXVSM extends AbstractXVSMConnector {
22 private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
24 public GroupAgentXVSM() {
25 super(Util.GROUP_AGENT_PORT);
26 groupAgentInfoContainer = useContainer(Util.GROUP_AGENT_INFO);
29 public void listenForDeliveredOrders(int port) {
30 SpaceListener deliveredOrders = new SpaceListenerImpl(capi, orderCompleteContainer, false) {
33 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
34 GroupData groupData = getSingleGroup(entries);
35 final int groupId = groupData.getOrder().getId();
37 SwingUtilities.invokeLater(new Runnable() {
40 GroupAgent.getInstance().getGroupModel().setGroupEating(groupId);
45 createNotification(deliveredOrders, useContainerOfSpaceWithPort(Util.ORDER_COMPLETE, port));
49 public void listenForPaymentRequest(int port) {
50 SpaceListener paymentRequest = new SpaceListenerImpl(capi, paymentRequestContainer, false) {
52 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
53 final GroupData group = getSingleGroup(entries);
55 SwingUtilities.invokeLater(new Runnable() {
58 GroupAgent.getInstance().getGroupModel().setGroupWantsToPay(group.getId());
66 createNotification(paymentRequest, useContainerOfSpaceWithPort(Util.PAYMENT_REQUEST, port));
69 public void listenForPaymentDone(int port) {
70 SpaceListener payment = new SpaceListenerImpl(capi, paymentDoneContainer, false) {
72 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
74 final GroupData group = getSingleGroup(entries);
76 SwingUtilities.invokeLater(new Runnable() {
79 GroupAgent.getInstance().getGroupModel().setGroupHasPaid(group.getId());
85 createNotification(payment, useContainerOfSpaceWithPort(Util.PAYMENT_DONE, port));
88 public void listenForTableAssigned(int port) {
89 SpaceListener tableAssignmentListener = new SpaceListenerImpl(capi, tableAssignedContainer, false) {
92 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
94 final List<Table> tables = castEntries(entries);
96 SwingUtilities.invokeLater(new Runnable() {
99 GroupAgent.getInstance().getGroupModel().setGroupsSitting(tables);
104 createNotification(tableAssignmentListener, useContainerOfSpaceWithPort(Util.TABLE_ASSIGNED, port));
108 public void listenForOrdersTaken(int port) {
109 SpaceListener tableAssignmentListener = new SpaceListenerImpl(capi, orderTakenContainer, false) {
111 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
112 final GroupData group = getSingleGroup(entries);
114 SwingUtilities.invokeLater(new Runnable() {
118 GroupAgent.getInstance().getGroupModel().setOrderTaken(group);
123 createNotification(tableAssignmentListener, useContainerOfSpaceWithPort(Util.ORDER_TAKEN, port));
126 public void listenForNewPizzerias() {
127 SpaceListener newPizzeriaListener = new SpaceListenerImpl(capi, groupAgentInfoContainer, true) {
130 void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
131 final Set<String> pizzeriaIdentifiers = GroupAgent.getInstance().getPizzeriaIdentifiers();
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);
144 SwingUtilities.invokeLater(new Runnable() {
147 pizzeriaIdentifiers.addAll(pizzeriaIds);
153 createNotification(newPizzeriaListener, groupAgentInfoContainer);
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);
166 public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
167 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.ASSIGN_TABLE, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
170 public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
171 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);