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.DeliveryGroup;
5 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
6 import at.ac.tuwien.sbc.valesriegler.group.gui.DeliveryOverviewModel;
7 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
8 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
9 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
10 import at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers.SpaceAction;
11 import org.mozartspaces.core.MzsConstants.RequestTimeout;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
16 import java.io.Serializable;
18 import java.util.concurrent.atomic.AtomicLong;
20 import static java.lang.String.valueOf;
22 public class GroupAgentXVSM extends AbstractXVSMConnector {
23 private static final Logger log = LoggerFactory.getLogger(GroupAgentXVSM.class);
25 private AtomicLong startTime = new AtomicLong();
27 public GroupAgentXVSM() {
28 super(Util.GROUP_AGENT_PORT);
29 groupAgentInfoContainer = useContainer(Util.GROUP_AGENT_INFO);
32 public void listenForNewPizzerias() {
33 getDefaultBuilder().setCref(groupAgentInfoContainer).setLookaround(true).setSpaceAction(new SpaceAction() {
36 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
37 final Set<String> pizzeriaIdentifiers = GroupAgent.getInstance().getPizzeriaIdentifiers();
39 synchronized (pizzeriaIdentifiers) {
40 final List<PizzeriaRegistration> pizzeriaRegistrations = castEntries(entries);
41 final List<String> pizzeriaIds = new ArrayList<>();
42 for (PizzeriaRegistration registration : pizzeriaRegistrations) {
43 final String pizzeriaId = valueOf(registration.pizzeriaSpacePort);
44 if (!pizzeriaIdentifiers.contains(pizzeriaId)) {
45 pizzeriaIds.add(pizzeriaId);
46 listenToPizzeria(pizzeriaId);
50 SwingUtilities.invokeLater(new Runnable() {
53 pizzeriaIdentifiers.addAll(pizzeriaIds);
58 }).createSpaceListenerImpl();
62 public void listenToPizzeria(String pizzeriaId) {
63 final int port = Integer.parseInt(pizzeriaId);
64 listenToGroupUpdates(port);
65 listenToDeliveryUpdates(port);
68 private void listenToDeliveryUpdates(int port) {
69 getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PIZZERIA_DELIVERY, port)).setSpaceAction(new SpaceAction() {
71 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
72 final List<DeliveryGroupData> groups = castEntries(entries);
74 SwingUtilities.invokeLater(new Runnable() {
78 GroupAgent.getInstance().getDeliveryModel().addDeliveries(groups);
82 if (Util.runSimulation) {
83 boolean finished = GroupAgent.getInstance().getDeliveryModel().hasFinished();
85 final long now = new Date().getTime();
86 final long difference = now - startTime.get();
87 log.info("Finished after {} seconds", difference / 1000);
91 }).createSpaceListenerImpl();
94 private void listenToGroupUpdates(int port) {
95 getDefaultBuilder().setCref(useContainerOfSpaceWithPort(Util.PIZZERIA_GROUP, port)).setSpaceAction(new SpaceAction() {
97 public void onEntriesWritten(List<? extends Serializable> entries) throws Exception {
98 final List<GroupData> groups = castEntries(entries);
100 SwingUtilities.invokeLater(new Runnable() {
104 GroupAgent.getInstance().getGroupModel().addGroupData(groups);
108 }).createSpaceListenerImpl();
111 public void sendNewGroupsToSpace(List<GroupData> groupData, int pizzeriaSpacePort) {
112 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_GROUP, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
113 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.ASSIGN_TABLE, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
116 public void sendNewDeliveriesToSpace(List<DeliveryGroupData> groupData, int pizzeriaSpacePort) {
117 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PIZZERIA_DELIVERY, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
118 sendItemsToContainer(groupData, useContainerOfSpaceWithPort(Util.PHONE_CALLS, pizzeriaSpacePort), RequestTimeout.DEFAULT, null);
121 public void runSimulation() {
122 new Thread(new Runnable() {
125 List<PizzaType> pizzaTypes1 = Arrays.asList(PizzaType.CARDINALE, PizzaType.SALAMI, PizzaType.MARGHERITA, PizzaType.MARGHERITA);
126 List<PizzaType> pizzaTypes2 = Arrays.asList(PizzaType.CARDINALE, PizzaType.SALAMI, PizzaType.MARGHERITA);
127 List<PizzaType> pizzaTypes3 = Arrays.asList(PizzaType.SALAMI, PizzaType.MARGHERITA);
129 final String pizzeria1 = "9874";
130 final String pizzeria2 = "9875";
131 List<DeliveryGroup> groups1 = GroupAgent.getInstance().createGroups(pizzaTypes1, pizzeria1, 4);
132 List<DeliveryGroup> groups2 = GroupAgent.getInstance().createGroups(pizzaTypes2, pizzeria2, 3);
133 List<DeliveryGroup> groups3 = GroupAgent.getInstance().createGroups(pizzaTypes3, pizzeria2, 2);
135 final DeliveryOverviewModel deliveryModel = GroupAgent.getInstance().getDeliveryModel();
136 // deliveryModel.addItems(groups1);
137 deliveryModel.addItems(groups2);
138 deliveryModel.addItems(groups3);
140 GroupAgent.getInstance().onDeliveryGroupsCreated(groups2);
141 GroupAgent.getInstance().onDeliveryGroupsCreated(groups3);
142 // GroupAgent.getInstance().onDeliveryGroupsCreated(groups1);
144 log.info("ATTENTION: Now let's wait 60 seconds!");
147 startTime.set(new Date().getTime());
149 } catch (InterruptedException e) {
150 e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
153 log.info("ATTENTION: It's all over now!");
154 notificationMgr.shutdown();
156 deliveryModel.createStatistics();