From 87a4e498d729e9267b08b2dee387b1529cc2f940 Mon Sep 17 00:00:00 2001
From: Jan Vales <jan@jvales.net>
Date: Mon, 10 Jun 2013 19:24:41 +0200
Subject: [PATCH] [JMS] Benchmarks are theoretically possible now. GroupGUI
 responsesmissing, so it wont work.

---
 runJMS.sh                                     |  3 +-
 .../tuwien/sbc/valesriegler/common/Util.java  | 34 +++++++----
 .../sbc/valesriegler/group/GroupAgent.java    | 56 +++++++++++++++++--
 .../group/jms/GroupJMSNACMsgListener.java     | 12 +++-
 .../group/jms/JMSGroupConnector.java          |  4 ++
 .../sbc/valesriegler/jms/nac/JMSNAC.java      |  1 +
 .../jms/nac/actions/BenchmarkStart.java       | 17 ++++++
 .../jms/nac/actions/BenchmarkStop.java        | 17 ++++++
 .../sbc/valesriegler/waiter/WaiterAgent.java  |  8 ++-
 .../valesriegler/waiter/jms/JMSWaiter.java    | 24 +++++++-
 .../waiter/jms/WaiterJMSNACMsgListener.java   | 53 ++++++++++++++++++
 11 files changed, 208 insertions(+), 21 deletions(-)
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStart.java
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStop.java
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/WaiterJMSNACMsgListener.java

diff --git a/runJMS.sh b/runJMS.sh
index 7bf81ca..d058c11 100755
--- a/runJMS.sh
+++ b/runJMS.sh
@@ -25,8 +25,9 @@ echo "*** continuing launch process ***"
 
 
 # Run Groupgui
-mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.group.GroupAgent" -Dexec.args="JMS tcp://localhost:61610?jms.prefetchPolicy.all=1" &
+#mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.group.GroupAgent" -Dexec.args="JMS tcp://localhost:61610?jms.prefetchPolicy.all=1" &
 
 #run pizzeria1
 ./runJMSPizzaria.sh "tcp://localhost:61621?jms.prefetchPolicy.all=1"
 ./runJMSPizzaria.sh "tcp://localhost:61622?jms.prefetchPolicy.all=1"
+
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
index 36d52c0..68634e3 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/Util.java
@@ -1,22 +1,34 @@
 package at.ac.tuwien.sbc.valesriegler.common;
 
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.border.TitledBorder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import at.ac.tuwien.sbc.valesriegler.group.gui.GroupCreationDetailsRequest;
 import at.ac.tuwien.sbc.valesriegler.types.Order;
 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.*;
-import javax.swing.border.TitledBorder;
-import java.awt.*;
-import java.net.URI;
-import java.util.*;
-import java.util.List;
 
 public abstract class Util {
 	private static final Logger log = LoggerFactory.getLogger(Util.class);
-	public static boolean useJMS = false;
+	public static boolean useJMS = true;
 
 	public static final String TABLE_ASSIGNED = "tables";
 	public static final String ASSIGN_TABLE = "assignTable";
@@ -42,7 +54,7 @@ public abstract class Util {
 	public static final String DELIVERY_PROGRESS = "deliveryInProgress";
 	public static final String DELIVERY_DONE = "deliveryDone";
 
-	public static final boolean runSimulation = false;
+	public static final boolean runSimulation = true;
 
 	public static final String NUMBER_DISPLAY_FORMAT = String.format("%%0%dd", 3);
 
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
index 2f8b153..106f995 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupAgent.java
@@ -1,21 +1,32 @@
 package at.ac.tuwien.sbc.valesriegler.group;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.jms.JMSException;
+import javax.swing.SwingUtilities;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import at.ac.tuwien.sbc.valesriegler.common.Util;
 import at.ac.tuwien.sbc.valesriegler.group.gui.DeliveryOverviewModel;
 import at.ac.tuwien.sbc.valesriegler.group.gui.GroupCreationDetailsRequest;
 import at.ac.tuwien.sbc.valesriegler.group.gui.GroupOverviewModel;
 import at.ac.tuwien.sbc.valesriegler.group.jms.GroupJMSNACMsgListener;
+import at.ac.tuwien.sbc.valesriegler.group.jms.JMSGroupConnector;
 import at.ac.tuwien.sbc.valesriegler.jms.nac.JMSNAC;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.BenchmarkStart;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.BenchmarkStop;
 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
 import at.ac.tuwien.sbc.valesriegler.types.Order;
 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
 import at.ac.tuwien.sbc.valesriegler.xvsm.GroupAgentXVSM;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.*;
-import java.util.*;
 
 /**
  * The Main class of the Group component.
@@ -61,9 +72,42 @@ public class GroupAgent {
 		}
 
 		groupAgent = new GroupAgent();
-		if (! Util.runSimulation) {
+		if (!Util.runSimulation) {
 			groupGui = new GroupGUI();
 			SwingUtilities.invokeLater(groupGui);
+		} else {
+			JMSGroupConnector.getConnectors().put("tcp://localhost:61621?jms.prefetchPolicy.all=1",
+					new JMSGroupConnector("tcp://localhost:61621?jms.prefetchPolicy.all=1"));
+			JMSGroupConnector.getConnectors().put("tcp://localhost:61622?jms.prefetchPolicy.all=1",
+					new JMSGroupConnector("tcp://localhost:61622?jms.prefetchPolicy.all=1"));
+			try {
+				List<PizzaType> pizzaTypes1 = Arrays.asList(PizzaType.CARDINALE, PizzaType.SALAMI, PizzaType.MARGHERITA,
+						PizzaType.MARGHERITA);
+				List<PizzaType> pizzaTypes2 = Arrays.asList(PizzaType.CARDINALE, PizzaType.SALAMI, PizzaType.MARGHERITA);
+				List<PizzaType> pizzaTypes3 = Arrays.asList(PizzaType.SALAMI, PizzaType.MARGHERITA);
+
+				final String pizzeria1 = "tcp://localhost:61621?jms.prefetchPolicy.all=1";
+				final String pizzeria2 = "tcp://localhost:61622?jms.prefetchPolicy.all=1";
+				List<DeliveryGroup> groups1 = GroupAgent.getInstance().createGroups(pizzaTypes1, pizzeria1, 4);
+				List<DeliveryGroup> groups2 = GroupAgent.getInstance().createGroups(pizzaTypes2, pizzeria2, 3);
+				List<DeliveryGroup> groups3 = GroupAgent.getInstance().createGroups(pizzaTypes3, pizzeria2, 2);
+
+				final DeliveryOverviewModel deliveryModel = GroupAgent.getInstance().getDeliveryModel();
+				deliveryModel.addItems(groups1);
+				deliveryModel.addItems(groups2);
+				deliveryModel.addItems(groups3);
+
+				GroupAgent.getInstance().onDeliveryGroupsCreated(groups2);
+				GroupAgent.getInstance().onDeliveryGroupsCreated(groups3);
+				GroupAgent.getInstance().onDeliveryGroupsCreated(groups1);
+
+				Thread.sleep(20000);
+				jmsnac.sendNACMsg(new BenchmarkStart());
+				Thread.sleep(60000);
+				jmsnac.sendNACMsg(new BenchmarkStop());
+			} catch (InterruptedException | JMSException e) {
+				log.warn("EXCEPTION!", e);
+			}
 		}
 	}
 
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/GroupJMSNACMsgListener.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/GroupJMSNACMsgListener.java
index 5485fbe..70f439f 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/GroupJMSNACMsgListener.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/GroupJMSNACMsgListener.java
@@ -12,6 +12,7 @@ import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
 import at.ac.tuwien.sbc.valesriegler.jms.nac.AbstractJMSNACMsgListener;
 import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.AddressInfoRequest;
 import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.AddressInfoResponse;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.BenchmarkStop;
 /**
  * Handles the NAC communication for the Group Agent.
  * 
@@ -35,13 +36,22 @@ public class GroupJMSNACMsgListener extends AbstractJMSNACMsgListener implements
 				Object obj = objMsg.getObject();
 				if (obj instanceof AddressInfoRequest) {
 					// DO NOTHING.
+
 				} else if (obj instanceof AddressInfoResponse) {
 					AddressInfoResponse response = (AddressInfoResponse) obj;
 					GroupAgent.getInstance().getPizzeriaIdentifiers().add(response.getAddress());
 					if (!Util.runSimulation) {
 						GroupAgent.getGroupGui().getFrame().repaint();
+						JMSGroupConnector.getConnectors().put(response.getAddress(), new JMSGroupConnector(response.getAddress()));
+					}
+				} else if (obj instanceof BenchmarkStop) {
+					for (String keys : JMSGroupConnector.getConnectors().keySet()) {
+						JMSGroupConnector c = JMSGroupConnector.getConnector(keys);
+						c.getConnection().close();
+						GroupAgent.getInstance().getDeliveryModel().createStatistics();
 					}
-					JMSGroupConnector.getConnectors().put(response.getAddress(), new JMSGroupConnector(response.getAddress()));
+				} else if (obj instanceof BenchmarkStop) {
+					// DO NOTHING.
 				} else {
 					log.warn("Received unknown Object: " + obj);
 				}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/JMSGroupConnector.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/JMSGroupConnector.java
index c382ba3..b15d33f 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/JMSGroupConnector.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/jms/JMSGroupConnector.java
@@ -174,4 +174,8 @@ public class JMSGroupConnector extends AbstractGroupConnector implements Message
 		return connectors.get(key);
 	}
 
+	public Connection getConnection() {
+		return connection;
+	}
+
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/JMSNAC.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/JMSNAC.java
index a70f946..4605d65 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/JMSNAC.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/JMSNAC.java
@@ -42,6 +42,7 @@ public class JMSNAC {
 		}
 	}
 	public void sendNACMsg(AbstractNACMsg msg) throws JMSException {
+		log.debug("sendNACMsg():" + msg);
 		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
 		MessageProducer prod = session.createProducer(session.createTopic(JMS_NAC_TOPIC));
 		prod.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStart.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStart.java
new file mode 100644
index 0000000..1e00f35
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStart.java
@@ -0,0 +1,17 @@
+package at.ac.tuwien.sbc.valesriegler.jms.nac.actions;
+
+/**
+ * Message hat instructs everyone to reply their Address.
+ * 
+ * @author jan
+ * 
+ */
+public class BenchmarkStart extends AbstractNACMsg {
+	public BenchmarkStart() {
+	}
+
+	@Override
+	public String toString() {
+		return "BenchmarkStop []";
+	}
+}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStop.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStop.java
new file mode 100644
index 0000000..fc63c5a
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/jms/nac/actions/BenchmarkStop.java
@@ -0,0 +1,17 @@
+package at.ac.tuwien.sbc.valesriegler.jms.nac.actions;
+
+/**
+ * Message hat instructs everyone to reply their Address.
+ * 
+ * @author jan
+ * 
+ */
+public class BenchmarkStop extends AbstractNACMsg {
+	public BenchmarkStop() {
+	}
+
+	@Override
+	public String toString() {
+		return "BenchmarkStop []";
+	}
+}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/WaiterAgent.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/WaiterAgent.java
index 0e59f52..241fe61 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/WaiterAgent.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/WaiterAgent.java
@@ -15,6 +15,7 @@ import at.ac.tuwien.sbc.valesriegler.waiter.jms.JMSWaiter;
 public class WaiterAgent {
 	private static final String USAGE = "This application needs exactly 2 parameters: <\"XVSM\"|\"JMS\"> <XVSM-Space-Identifier|JMS-Server-URL> <ID of type Integer>";
 	private static final Logger log = LoggerFactory.getLogger(WaiterAgent.class);
+	static public JMSWaiter jmsWaiter;
 
 	public static void main(String[] args) {
 		if (args.length != 3) {
@@ -32,11 +33,16 @@ public class WaiterAgent {
 
 		log.info("Middleware: " + mw + " ID:" + parsedId);
 		if ("JMS".equalsIgnoreCase(mw)) {
-			new JMSWaiter(args[1], parsedId);
+			jmsWaiter = new JMSWaiter(args[1], parsedId);
 		} else if ("XVSM".equalsIgnoreCase(mw)) {
 			// TODO: XVSM Waiter?
 		} else {
 			throw new IllegalArgumentException(USAGE);
 		}
 	}
+
+	public JMSWaiter getJmsWaiter() {
+		return jmsWaiter;
+	}
+
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/JMSWaiter.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/JMSWaiter.java
index 8ba3124..0d4f0c8 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/JMSWaiter.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/JMSWaiter.java
@@ -9,6 +9,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import at.ac.tuwien.sbc.valesriegler.common.HasId;
+import at.ac.tuwien.sbc.valesriegler.common.Util;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.JMSNAC;
 import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.CookedOrders;
 import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantADelivery;
 import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantToOrder;
@@ -25,21 +27,33 @@ import at.ac.tuwien.sbc.valesriegler.waiter.jms.messageListeners.WantToSitAtTabl
 public class JMSWaiter implements HasId {
 	private static final Logger log = LoggerFactory.getLogger(JMSWaiter.class);
 	private final String CONNECTSTRING;
+	private Connection connection;
+
 	public String getCONNECTSTRING() {
 		return CONNECTSTRING;
 	}
 
 	final private int id;
+	private JMSNAC jmsnac;
 
 	public JMSWaiter(String jmsURL, int id) {
 		CONNECTSTRING = jmsURL;
 		this.id = id;
 		log.info("I AM A WAITER WITH ID {}", id);
 
+		WaiterJMSNACMsgListener tmp = new WaiterJMSNACMsgListener();
+		jmsnac = new JMSNAC(tmp);
+
+		if (!Util.runSimulation) {
+			initJMS();
+		}
+	}
+
+	public void initJMS() {
 		try {
 			// Connecting to the Broker and to the output queue
 			ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTSTRING);
-			Connection connection = connectionFactory.createConnection();
+			connection = connectionFactory.createConnection();
 			connection.start();
 
 			Session sessWantToSit = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
@@ -77,4 +91,12 @@ public class JMSWaiter implements HasId {
 	public int getId() {
 		return id;
 	}
+
+	public Connection getConnection() {
+		return connection;
+	}
+
+	public void setConnection(Connection connection) {
+		this.connection = connection;
+	}
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/WaiterJMSNACMsgListener.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/WaiterJMSNACMsgListener.java
new file mode 100644
index 0000000..f9d957d
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/waiter/jms/WaiterJMSNACMsgListener.java
@@ -0,0 +1,53 @@
+package at.ac.tuwien.sbc.valesriegler.waiter.jms;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.ac.tuwien.sbc.valesriegler.jms.nac.AbstractJMSNACMsgListener;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.AddressInfoRequest;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.AddressInfoResponse;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.BenchmarkStart;
+import at.ac.tuwien.sbc.valesriegler.jms.nac.actions.BenchmarkStop;
+import at.ac.tuwien.sbc.valesriegler.waiter.WaiterAgent;
+/**
+ * Handles the NAC communication for the Group Agent.
+ * 
+ * @author jan
+ * 
+ */
+public class WaiterJMSNACMsgListener extends AbstractJMSNACMsgListener {
+	private static final Logger log = LoggerFactory.getLogger(WaiterJMSNACMsgListener.class);
+
+	public WaiterJMSNACMsgListener() {
+	}
+
+	@Override
+	public void onMessage(Message msg) {
+		try {
+			if (msg instanceof ObjectMessage) {
+				ObjectMessage objMsg = (ObjectMessage) msg;
+				Object obj = objMsg.getObject();
+				if (obj instanceof AddressInfoRequest) {
+					// DO NOTHING.
+				} else if (obj instanceof AddressInfoResponse) {
+					// DO NOTHING.
+				} else if (obj instanceof BenchmarkStop) {
+					WaiterAgent.jmsWaiter.getConnection().close();
+				} else if (obj instanceof BenchmarkStart) {
+					WaiterAgent.jmsWaiter.initJMS();
+
+				} else {
+					log.warn("Received unknown Object: " + obj);
+				}
+			} else {
+				log.warn("Received unknown Message: " + msg);
+			}
+		} catch (JMSException e) {
+			log.error("EXCEPTION!", e);
+		}
+	}
+}
-- 
2.43.0