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.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;
17 import java.io.Serializable;
19 import java.util.ArrayList;
20 import java.util.List;
23 import static java.lang.String.format;
24 import static java.lang.String.valueOf;
26 public class GroupAgentXVSM extends AbstractXVSMConnector {
27 private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
29 public GroupAgentXVSM() {
30 super(Util.GROUP_AGENT_PORT);
31 groupAgentInfoContainer = useContainer(Util.GROUP_AGENT_INFO);
34 public void listenForDeliveredOrders(int port) {
35 SpaceListener deliveredOrders = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.ORDER_COMPLETE, port)).setSpaceAction(new SpaceAction() {
39 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
40 GroupData groupData = getSingleGroup(entries);
41 final int groupId = groupData.getId();
43 SwingUtilities.invokeLater(new Runnable() {
46 GroupAgent.getInstance().getGroupModel().setGroupEating(groupId);
50 }).createSpaceListenerImpl();
54 public void listenForPaymentRequest(int port) {
55 SpaceListener paymentRequest = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PAYMENT_REQUEST, port)).setSpaceAction(new SpaceAction() {
57 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
58 final GroupData group = getSingleGroup(entries);
60 SwingUtilities.invokeLater(new Runnable() {
63 GroupAgent.getInstance().getGroupModel().setGroupWantsToPay(group.getId());
70 }).createSpaceListenerImpl();
73 public void listenForPaymentDone(int port) {
74 SpaceListener payment = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PAYMENT_DONE, port)).setSpaceAction(new SpaceAction() {
76 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
78 final GroupData group = getSingleGroup(entries);
80 SwingUtilities.invokeLater(new Runnable() {
83 GroupAgent.getInstance().getGroupModel().setGroupHasPaid(group.getId());
88 }).createSpaceListenerImpl();
91 public void listenForTableAssigned(int port) {
92 SpaceListener tableAssignmentListener = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.TABLE_ASSIGNED, port)).setSpaceAction(new SpaceAction() {
95 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
97 final List<Table> tables = castEntries(entries);
99 SwingUtilities.invokeLater(new Runnable() {
102 GroupAgent.getInstance().getGroupModel().setGroupsSitting(tables);
106 }).createSpaceListenerImpl();
109 public void listenForOrdersTaken(int port) {
110 SpaceListener tableAssignmentListener = getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.ORDER_TAKEN, port)).setSpaceAction(new SpaceAction() {
112 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
113 final GroupData group = getSingleGroup(entries);
115 SwingUtilities.invokeLater(new Runnable() {
119 GroupAgent.getInstance().getGroupModel().setOrderTaken(group);
123 }).createSpaceListenerImpl();
126 public void listenForDeliveryOrdersTaken(int port) {
127 getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_ORDER_TAKEN, port)).setSpaceAction(new SpaceAction() {
129 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
130 final List<DeliveryGroupData> groups = castEntries(entries);
132 SwingUtilities.invokeLater(new Runnable() {
136 GroupAgent.getInstance().getDeliveryModel().setOrdersTaken(groups);
140 }).createSpaceListenerImpl();
143 private void listenForDeliveredDeliveryOrders(int port) {
144 getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.DELIVERY_DONE, port)).setSpaceAction(new SpaceAction() {
146 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
147 final List<DeliveryGroupData> groups = castEntries(entries);
149 log.info("DElivered orders!");
151 SwingUtilities.invokeLater(new Runnable() {
155 GroupAgent.getInstance().getDeliveryModel().setOrdersDelivered(groups);
159 }).createSpaceListenerImpl();
162 public void listenForNewPizzerias() {
163 SpaceListener newPizzeriaListener = getDefaultBuilder().setCref(groupAgentInfoContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
166 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
167 final Set<String> pizzeriaIdentifiers = GroupAgent.getInstance().getPizzeriaIdentifiers();
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);
180 SwingUtilities.invokeLater(new Runnable() {
183 pizzeriaIdentifiers.addAll(pizzeriaIds);
188 }).createSpaceListenerImpl();
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);
203 public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
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);
216 public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
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);