1 package at.ac.tuwien.sbc.valesriegler.xvsm;
3 import java.io.Serializable;
6 import javax.swing.SwingUtilities;
8 import org.mozartspaces.notifications.Notification;
9 import org.mozartspaces.notifications.NotificationListener;
10 import org.mozartspaces.notifications.Operation;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
14 import at.ac.tuwien.sbc.valesriegler.common.Util;
15 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
16 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
17 import at.ac.tuwien.sbc.valesriegler.types.Table;
19 public class GroupAgentXVSM extends AbstractXVSMConnector {
20 private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
22 public GroupAgentXVSM() {
24 assignTableContainer = useContainer(Util.ASSIGN_TABLE) ;
25 orderCompleteContainer = useContainer(Util.ORDER_COMPLETE) ;
26 paymentRequestContainer = useContainer(Util.PAYMENT_REQUEST) ;
27 paymentDoneContainer = useContainer(Util.PAYMENT_DONE);
28 tableAssignedContainer = useContainer(Util.TABLE_ASSIGNED);
29 orderTakenContainer = useContainer(Util.ORDER_TAKEN);
32 public void listenForDeliveredOrders() {
33 NotificationListener deliveredOrders = new NotificationListener() {
35 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
36 final List<GroupData> groups = castEntries(entries);
38 log.info("{} order was delivered!", groups.size());
39 if(groups.size() != 1) {
40 throw new RuntimeException("A waiter should only deliver one order at once!");
42 final int groupId = groups.get(0).getOrder().getId();
44 SwingUtilities.invokeLater(new Runnable() {
47 GroupAgent.getInstance().getGroupModel().setGroupEating(groupId);
53 notificationMgr.createNotification(orderCompleteContainer, deliveredOrders, Operation.WRITE);
54 } catch (Exception e) {
55 handleSpaceErrorAndTerminate(e);
59 public void listenForPaymentRequest() {
60 NotificationListener paymentRequest = new NotificationListener() {
62 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
63 log.info("PAY REQUEST by");
64 final List<GroupData> groups = castEntries(entries);
66 if(groups.size() != 1) {
67 throw new RuntimeException("A group only says as a whole that it wants to pay");
69 final GroupData group = groups.get(0);
70 log.info("PAY REQUEST by {}", group.getId());
72 SwingUtilities.invokeLater(new Runnable() {
75 GroupAgent.getInstance().getGroupModel().setGroupWantsToPay(group.getId());
82 notificationMgr.createNotification(paymentRequestContainer, paymentRequest, Operation.WRITE);
83 } catch (Exception e) {
84 handleSpaceErrorAndTerminate(e);
88 public void listenForPaymentDone() {
89 NotificationListener payment = new NotificationListener() {
91 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
93 final List<GroupData> groups = castEntries(entries);
95 if(groups.size() != 1) {
96 throw new RuntimeException("A group can only have paid as a whole!");
98 final GroupData group = groups.get(0);
101 SwingUtilities.invokeLater(new Runnable() {
104 GroupAgent.getInstance().getGroupModel().setGroupHasPaid(group.getId());
111 notificationMgr.createNotification(paymentDoneContainer, payment, Operation.WRITE);
112 } catch (Exception e) {
113 handleSpaceErrorAndTerminate(e);
117 public void listenForTableAssigned() {
118 NotificationListener tableAssignmentListener = new NotificationListener() {
121 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
122 log.info("A table was assigned to a group, heureka!");
124 final List<Table> tables = castEntries(entries);
126 SwingUtilities.invokeLater(new Runnable() {
129 GroupAgent.getInstance().getGroupModel().setGroupsSitting(tables);
135 notificationMgr.createNotification(tableAssignedContainer, tableAssignmentListener, Operation.WRITE);
136 log.info("Created tableOccupiedContainer notification for the group agent");
137 } catch (Exception e) {
138 handleSpaceErrorAndTerminate(e);
142 public void listenForOrdersTaken() {
143 NotificationListener orderTakenListener = new NotificationListener() {
145 public void entryOperationFinished(final Notification notification, final Operation operation, final List<? extends Serializable> entries) {
148 final List<GroupData> groups = castEntries(entries);
150 if(groups.size() != 1) {
151 throw new RuntimeException("A group always orders as a whole!");
153 final GroupData group = groups.get(0);
155 SwingUtilities.invokeLater(new Runnable() {
159 GroupAgent.getInstance().getGroupModel().setOrderTaken(group);
165 notificationMgr.createNotification(orderTakenContainer, orderTakenListener, Operation.WRITE);
166 log.info("Created orderTakenContainer notification for the group agent");
167 } catch (Exception e) {
168 handleSpaceErrorAndTerminate(e);