From 36d49fce6bd0365affe3e0b57054846d531a2c28 Mon Sep 17 00:00:00 2001
From: Simon Spinner <simon.spinner@uni-wuerzburg.de>
Date: Sun, 24 Apr 2016 17:52:27 +0200
Subject: [PATCH] Add message bus to agent controller.

---
 .../prisma/agent/generic/GenericAgent.java    | 32 +++++++++++++++----
 .../prisma/core/ModelSkeletonTest.java        |  3 +-
 .../ComponentInternalBehaviorMergerTest.java  |  2 +-
 .../prisma/core/agent/AgentController.java    |  9 ++++--
 .../prisma/core/impl/CDOModelRepository.java  |  3 --
 .../prisma/core/impl/RabbitMQMessageBus.java  | 13 ++++----
 6 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/tools.descartes.prisma.agent.generic/src/tools/descartes/prisma/agent/generic/GenericAgent.java b/tools.descartes.prisma.agent.generic/src/tools/descartes/prisma/agent/generic/GenericAgent.java
index 429e77f..97ccbae 100644
--- a/tools.descartes.prisma.agent.generic/src/tools/descartes/prisma/agent/generic/GenericAgent.java
+++ b/tools.descartes.prisma.agent.generic/src/tools/descartes/prisma/agent/generic/GenericAgent.java
@@ -32,12 +32,14 @@ import edu.kit.ipd.descartes.mm.resourcetype.ResourceTypeRepository;
 import edu.kit.ipd.descartes.mm.resourcetype.ResourcetypePackage;
 import tools.descartes.prisma.agent.generic.genericagent.GenericAgentConfiguration;
 import tools.descartes.prisma.agent.generic.genericagent.RequiredObject;
+import tools.descartes.prisma.core.MessageBus;
 import tools.descartes.prisma.core.ModelRepository;
 import tools.descartes.prisma.core.adapter.ModelSkeletonAdapter;
 import tools.descartes.prisma.core.adapter.ObjectMatcher;
 import tools.descartes.prisma.core.agent.AgentController;
 import tools.descartes.prisma.core.agent.DelegationProvider;
 import tools.descartes.prisma.core.impl.CDOModelRepository;
+import tools.descartes.prisma.core.impl.RabbitMQMessageBus;
 import tools.descartes.prisma.model.scope.DelegatedObject;
 import tools.descartes.prisma.model.skeleton.ModelSkeleton;
 
@@ -47,8 +49,9 @@ public class GenericAgent implements IApplication {
 
 		private final Set<EObject> delegatedObjects = new HashSet<>();
 
-		public GenericAgentController(ModelRepository repository, GenericAgentConfiguration configuration) {
-			super(repository, configuration.getScope().getPath(), configuration.getId());
+		public GenericAgentController(ModelRepository repository, MessageBus messageBus,
+				GenericAgentConfiguration configuration) {
+			super(repository, messageBus, configuration.getScope().getPath(), configuration.getId());
 		}
 
 		@Override
@@ -107,17 +110,30 @@ public class GenericAgent implements IApplication {
 
 		Options options = new Options();
 		options.addOption("r", "repository", true, "Host of the model repository");
-		options.addOption("p", "port", true, "Port of the model repository");
+		options.addOption("u", "user", true, "User of the model repository");
+		options.addOption("p", "password", true, "Password of the model repository");
 		options.addOption("c", "config", true, "Agent configuration");
 
 		CommandLineParser cliParser = new GnuParser();
 		CommandLine cli = cliParser.parse(options, args);
 
-		String repositoryURL = null;
+		String repositoryHost = null;
+		String repositoryUser = null;
+		String repositoryPassword = null;
 		String configurationPath = null;
 		boolean help = false;
 		if (cli.hasOption("r")) {
-			repositoryURL = cli.getOptionValue("r");
+			repositoryHost = cli.getOptionValue("r");
+		} else {
+			help = true;
+		}
+		if (cli.hasOption("u")) {
+			repositoryUser = cli.getOptionValue("u");
+		} else {
+			help = true;
+		}
+		if (cli.hasOption("p")) {
+			repositoryPassword = cli.getOptionValue("p");
 		} else {
 			help = true;
 		}
@@ -134,8 +150,10 @@ public class GenericAgent implements IApplication {
 		}
 		GenericAgentConfiguration configuration = loadConfiguration(configurationPath);
 
-		ModelRepository repository = new CDOModelRepository(repositoryURL);
-		GenericAgentController agent = new GenericAgentController(repository, configuration);
+		MessageBus messageBus = new RabbitMQMessageBus(repositoryHost, repositoryUser, repositoryPassword);
+		ModelRepository repository = new CDOModelRepository(repositoryHost, repositoryUser, repositoryPassword,
+				messageBus);
+		GenericAgentController agent = new GenericAgentController(repository, messageBus, configuration);
 
 		agent.setDelegationProvider(new GenericDelegationProvider(configuration));
 
diff --git a/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/ModelSkeletonTest.java b/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/ModelSkeletonTest.java
index 0b621bd..dc440ba 100644
--- a/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/ModelSkeletonTest.java
+++ b/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/ModelSkeletonTest.java
@@ -33,7 +33,8 @@ public class ModelSkeletonTest {
 		messageBus = new TestMessageBus();
 		repository = new TestModelRepository(messageBus);
 		repository.getSystemScope().create();
-		this.controller = new AgentController(repository, ApplicationScope.APPLICATION_SCOPE_TYPE + "/" + name,
+		this.controller = new AgentController(repository, messageBus,
+				ApplicationScope.APPLICATION_SCOPE_TYPE + "/" + name,
 				InetAddress.getLocalHost().toString());
 		this.controller.start().get();
 		this.scope = (ApplicationScope) this.controller.getContainerScope();
diff --git a/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/adapter/ComponentInternalBehaviorMergerTest.java b/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/adapter/ComponentInternalBehaviorMergerTest.java
index 36bd2ef..2ff0ecf 100644
--- a/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/adapter/ComponentInternalBehaviorMergerTest.java
+++ b/tools.descartes.prisma.core.tests/src/tools/descartes/prisma/core/adapter/ComponentInternalBehaviorMergerTest.java
@@ -35,7 +35,7 @@ public class ComponentInternalBehaviorMergerTest {
 	public void setUp() throws Exception {
 		messageBus = new TestMessageBus();
 		repository = new TestModelRepository(messageBus);
-		controller = new AgentController(repository, ApplicationScope.APPLICATION_SCOPE_TYPE + "/test",
+		controller = new AgentController(repository, messageBus, ApplicationScope.APPLICATION_SCOPE_TYPE + "/test",
 				UUID.randomUUID().toString());
 		controller.start().get();
 		transaction = repository.createTransaction();
diff --git a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/agent/AgentController.java b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/agent/AgentController.java
index ec9582c..3bab0d5 100644
--- a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/agent/AgentController.java
+++ b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/agent/AgentController.java
@@ -15,6 +15,7 @@ import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.Notifier;
 import org.eclipse.emf.ecore.EObject;
 
+import tools.descartes.prisma.core.MessageBus;
 import tools.descartes.prisma.core.ModelRepository;
 import tools.descartes.prisma.core.Transaction;
 import tools.descartes.prisma.core.adapter.ModelSkeletonAdapter;
@@ -85,7 +86,8 @@ public class AgentController {
 	private static final int MAX_RETRIES = 3;
 
 	private Agent agent;
-	private ModelRepository repository;
+	private final MessageBus messageBus;
+	private final ModelRepository repository;
 	private final ScheduledExecutorService workerThread = Executors.newScheduledThreadPool(1);
 	private final String scopePath;
 	private final String id;
@@ -108,7 +110,8 @@ public class AgentController {
 
 	private volatile boolean running = false;
 
-	public AgentController(ModelRepository repository, String scopePath, String id) {
+	public AgentController(ModelRepository repository, MessageBus messageBus, String scopePath, String id) {
+		this.messageBus = messageBus;
 		this.repository = repository;
 		this.scopePath = scopePath;
 		this.id = id;
@@ -218,6 +221,7 @@ public class AgentController {
 	}
 
 	protected void startAsync() {
+		messageBus.connect();
 		repository.connect();
 		SystemGlobalScope systemScope = getModelRepository().getSystemScope();
 		systemScope.create();
@@ -244,6 +248,7 @@ public class AgentController {
 			scope.removeAgent(this, removeFilter);
 		} finally {
 			repository.disconnect();
+			messageBus.disconnect();
 		}
 	}
 
diff --git a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/CDOModelRepository.java b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/CDOModelRepository.java
index dc2bfb7..0d345c7 100644
--- a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/CDOModelRepository.java
+++ b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/CDOModelRepository.java
@@ -33,9 +33,6 @@ import tools.descartes.prisma.core.scopes.SystemGlobalScope;
 
 public class CDOModelRepository implements ModelRepository {
 
-	private static final int RABBITMQ_PORT = 5672;
-	private static final String RABBITMQ_VHOST = "prisma";
-
 	private final RepositoryConnection connection;
 	private CDOView readOnlyView;
 	private final Map<String, Scope> scopes = new HashMap<>();
diff --git a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/RabbitMQMessageBus.java b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/RabbitMQMessageBus.java
index dc191a4..43d2d39 100644
--- a/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/RabbitMQMessageBus.java
+++ b/tools.descartes.prisma.core/src/tools/descartes/prisma/core/impl/RabbitMQMessageBus.java
@@ -20,24 +20,23 @@ import tools.descartes.prisma.core.exceptions.MessagingException;
 
 public class RabbitMQMessageBus implements MessageBus {
 
+	private static final int RABBITMQ_PORT = 5672;
+	private static final String RABBITMQ_VHOST = "prisma";
+
 	private final Log log = LogFactory.getLog(RabbitMQMessageBus.class);
 
 	private final String userName;
 	private final String password;
-	private final String virtualHost;
 	private final String host;
-	private final int port;
 
 	private Connection connection;
 	private Channel channel;
 
-	public RabbitMQMessageBus(String userName, String password, String virtualHost, String host, int port) {
+	public RabbitMQMessageBus(String host, String userName, String password) {
 		super();
 		this.userName = userName;
 		this.password = password;
-		this.virtualHost = virtualHost;
 		this.host = host;
-		this.port = port;
 	}
 
 	@Override
@@ -45,9 +44,9 @@ public class RabbitMQMessageBus implements MessageBus {
 		ConnectionFactory connectionFactory = new ConnectionFactory();
 		connectionFactory.setUsername(userName);
 		connectionFactory.setPassword(password);
-		connectionFactory.setVirtualHost(virtualHost);
+		connectionFactory.setVirtualHost(RABBITMQ_VHOST);
 		connectionFactory.setHost(host);
-		connectionFactory.setPort(port);
+		connectionFactory.setPort(RABBITMQ_PORT);
 		try {
 			connection = connectionFactory.newConnection();
 			channel = connection.createChannel();
-- 
GitLab