From c01fbaba15e058ce88d12578d6523ee74e37acab Mon Sep 17 00:00:00 2001
From: Constantin Jucovschi <jucovschi@gmail.com>
Date: Tue, 15 Apr 2014 14:40:51 +0200
Subject: [PATCH] before pom editing

---
 .../mathhubworker/routes/MathHubRoute.java    | 29 +++++++
 docmanager/pom.xml                            | 15 +++-
 .../kwarc/sally4/docmanager/AlexRoute.java    |  3 -
 .../sally4/docmanager/DocumentManager.java    |  2 +-
 .../kwarc/sally4/docmanager/IDocWorkflow.java | 11 +++
 .../kwarc/sally4/docmanager/TestMain.java     | 29 +++----
 .../sally4/docmanager/impl/AlexRouteImpl.java | 41 +++++++++
 .../impl/AlexRouteMessageProcessor.java       | 34 ++++++++
 .../docmanager/impl/DocumentManagerImpl.java  | 85 +++++++++++++------
 .../docmanager/routes/SallyAlexRoute.java     | 20 +++--
 .../docmanager/routes/SallyRegisterRoute.java |  6 +-
 .../docmanager/routes/SallyAlexRouteTest.java | 51 +++++++++++
 planetary/pom.xml                             |  6 +-
 .../comm/planetaryclient/GetServices.java     | 39 +++++++++
 .../planetaryclient/GetSessionIDRequest.java  | 41 +++++++++
 .../planetaryclient/GetSessionIDResponse.java | 71 ++++++++++++++++
 .../comm/planetaryclient/ObjectFactory.java   | 63 ++++++++++++++
 .../comm/planetaryclient/package-info.java    |  9 ++
 .../impl/PlanetaryConnectionImpl.java         |  7 +-
 .../src/main/resources/planetaryclient.xsd    | 27 ++++++
 20 files changed, 524 insertions(+), 65 deletions(-)
 create mode 100644 MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java
 create mode 100644 docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
 create mode 100644 docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java
 create mode 100644 docmanager/src/test/java/info/kwarc/sally4/docmanager/routes/SallyAlexRouteTest.java
 create mode 100644 planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
 create mode 100644 planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
 create mode 100644 planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
 create mode 100644 planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
 create mode 100644 planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
 create mode 100644 planetary/src/main/resources/planetaryclient.xsd

diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java
new file mode 100644
index 0000000..ab8072a
--- /dev/null
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java
@@ -0,0 +1,29 @@
+package info.kwarc.sally4.mathhubworker.routes;
+
+import info.kwarc.sally.comm.CommUtils;
+import info.kwarc.sally.comm.planetaryclient.GetSessionIDRequest;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.DataFormat;
+
+public class MathHubRoute extends RouteBuilder {
+
+	public MathHubRoute() {
+		
+	}
+	
+	@Override
+	public void configure() throws Exception {
+		DataFormat planetaryClient = CommUtils.getDataFormat("planetaryclient", getClass().getClassLoader());
+		
+		from("direct:start")
+			.multicast().to("direct:requestSessionID");
+		
+		from("direct:requestSessionID")
+			.setBody(constant(new GetSessionIDRequest()))
+			.marshal(planetaryClient)
+				.inOut("alex:requestSessionID")
+			.unmarshal(planetaryClient);
+	}
+
+}
diff --git a/docmanager/pom.xml b/docmanager/pom.xml
index 49079f2..6daeb8a 100644
--- a/docmanager/pom.xml
+++ b/docmanager/pom.xml
@@ -54,6 +54,12 @@
 			<version>2.12.3</version>
 		</dependency>
 
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-test</artifactId>
+			<version>2.12.3</version>
+		</dependency>
+
 		<dependency>
 			<groupId>info.kwarc.sally4</groupId>
 			<artifactId>core</artifactId>
@@ -65,6 +71,13 @@
 			<artifactId>slf4j-simple</artifactId>
 			<version>1.7.7</version>
 		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 
 	<build>
@@ -76,7 +89,7 @@
 				<extensions>true</extensions>
 				<configuration>
 					<instructions>
-						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
 						<Private-Package>info.kwarc.sally4.docmanager.impl</Private-Package>
 						<Import-Package>*;</Import-Package>
 						<Export-Package>info.kwarc.sally4.docmanager*</Export-Package>
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
index d612b62..a670cdd 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
@@ -1,12 +1,9 @@
 package info.kwarc.sally4.docmanager;
 
 
-
-
 public interface AlexRoute {
 	public String getAlexStateQueue();
 	public String getAlexQueue();
 	
 	public void addOnStopHandler(Runnable r);
-	public void stop();
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/DocumentManager.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/DocumentManager.java
index 1e48541..7353175 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/DocumentManager.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/DocumentManager.java
@@ -3,5 +3,5 @@ package info.kwarc.sally4.docmanager;
 import info.kwarc.sally.comm.core.Registerdocument;
 
 public interface DocumentManager {
-	AlexRoute registerDocument(Registerdocument doc);
+	AlexRoute registerDocument(Registerdocument doc);	
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
new file mode 100644
index 0000000..b7e435b
--- /dev/null
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
@@ -0,0 +1,11 @@
+package info.kwarc.sally4.docmanager;
+
+import org.apache.camel.Exchange;
+
+public interface IDocWorkflow {
+	String [] getInterfaceRequirements();
+	String [] getHandlingNamespaces();
+	
+	boolean handleMessage(String namespace, String type, Exchange exchange);
+	void onNewDocument(AlexRoute route);
+}
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
index 85d49fe..a5f8526 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
@@ -1,7 +1,9 @@
 package info.kwarc.sally4.docmanager;
 
+import info.kwarc.sally.comm.BodyHasType;
 import info.kwarc.sally.comm.CommUtils;
-import info.kwarc.sally.comm.core.Onsallyframe;
+import info.kwarc.sally.comm.core.Heartbeatrequest;
+import info.kwarc.sally.comm.core.Heartbeatresponse;
 import info.kwarc.sally.comm.core.Registerdocument;
 import info.kwarc.sally.comm.core.Registerdocumentresponse;
 import info.kwarc.sally4.docmanager.routes.SallyRegisterRoute;
@@ -46,34 +48,25 @@ public class TestMain extends RouteBuilder {
 		Registerdocument reg = new Registerdocument();
 		reg.setDocumentqueue("client123");
 		reg.setTheoqueue("theo");
-		reg.getInterfaces().add("test");
+		reg.getInterfaces().add("planetaryclient");
 		temp.sendBody("direct:client-register", reg);
 	}
 
 	@Override
 	public void configure() throws Exception {
 		DataFormat core = CommUtils.getDataFormat("core");
+		Heartbeatresponse response = new Heartbeatresponse();
 				
 		from("direct:client-register")
 			.marshal(core)
+			.to("log:too")
 				.inOut("activemq:queue:"+SallyRegisterRoute.sallyRegisterQueue)
-			.to("log:msg")
 			.unmarshal(core)
 			.process(new Processor() {
 				public void process(Exchange exchange) throws Exception {
 					Registerdocumentresponse resp = exchange.getIn().getBody(Registerdocumentresponse.class);
 					sally_queue = resp.getSallyqueue();
 				}
-			})
-			.process(new Processor() {
-				
-				public void process(Exchange exchange) throws Exception {
-					ProducerTemplate temp = exchange.getContext().createProducerTemplate();
-					Onsallyframe onSallyFrame = new Onsallyframe();
-					onSallyFrame.setPosx(100);
-					onSallyFrame.setPosy(100);
-					temp.sendBody("direct:send_sally_doc", onSallyFrame);
-				}
 			});
 		
 		from("direct:send_sally_doc").marshal(core).inOut("activemq:queue:sally_doc_client123").to("log:asd");
@@ -81,12 +74,10 @@ public class TestMain extends RouteBuilder {
 		from("activemq:queue:client123")
 			.to("log:test")
 			.unmarshal(core)
-			.process(new Processor() {
-				
-				public void process(Exchange exchange) throws Exception {
-					System.out.println(exchange.getIn().getBody());
-				}
-			});
+				.choice()
+					.when(new BodyHasType(Heartbeatrequest.class))
+						.setBody(constant(response))
+				.endChoice();
 	}
 
 
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
index e4552d2..c98de18 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
@@ -1,11 +1,19 @@
 package info.kwarc.sally4.docmanager.impl;
 
 import info.kwarc.sally4.docmanager.AlexRoute;
+import info.kwarc.sally4.docmanager.IDocWorkflow;
 
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Queue;
+
+import org.apache.camel.Exchange;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 public class AlexRouteImpl implements AlexRoute {
@@ -15,6 +23,10 @@ public class AlexRouteImpl implements AlexRoute {
 	HashSet<String> interfaces;
 	List<Runnable> stopHandlers;
 	
+	Queue<IDocWorkflow> workflows;
+	
+	Logger log;
+	
 	String alexStateQueue;
 
 	String generateUUID(String doc_queue) {
@@ -22,14 +34,39 @@ public class AlexRouteImpl implements AlexRoute {
 		return "sally_doc_"+doc_queue;
 	}
 	
+	protected void forwardMessage(String namespace, String msgType, Exchange e) {
+		Iterator<IDocWorkflow> iter = workflows.iterator();
+		while (iter.hasNext()) {
+			IDocWorkflow work = iter.next();
+			for (String s : work.getHandlingNamespaces()) {
+				if (s.equals(namespace)) {
+					if (work.handleMessage(namespace, msgType, e)) {
+						return;
+					}
+				}
+			}
+		}
+	}
+	
 	public AlexRouteImpl(String alexQueue, String theoQueue, Collection<String> interfaces) {
+		log = LoggerFactory.getLogger(getClass());
 		this.alexQueue = alexQueue;
 		this.theoQueue = theoQueue;
 		this.interfaces = new HashSet<String>(interfaces);
 		this.alexStateQueue = generateUUID(alexQueue);
 		stopHandlers = new ArrayList<Runnable>();
+		workflows = new ArrayDeque<IDocWorkflow>();
 	}	
 	
+	public void addDocumentWorkflow(IDocWorkflow workflow) {
+		workflows.add(workflow);
+		workflow.onNewDocument(this);
+	}
+
+	public void removeDocumentWorkflow(IDocWorkflow workflow) {
+		workflows.remove(workflow);
+	}
+	
 	public String getAlexStateQueue() {
 		return alexStateQueue;
 	}
@@ -42,6 +79,10 @@ public class AlexRouteImpl implements AlexRoute {
 		stopHandlers.add(stopHandler);
 	}
 
+	public HashSet<String> getInterfaces() {
+		return interfaces;
+	}
+	
 	public void stop() {
 		for (Runnable r : stopHandlers) {
 			try {
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java
new file mode 100644
index 0000000..31c965c
--- /dev/null
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java
@@ -0,0 +1,34 @@
+package info.kwarc.sally4.docmanager.impl;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AlexRouteMessageProcessor implements Processor {
+	AlexRouteImpl route;
+	
+	Logger log;
+	
+	Pattern xmlNamespace = Pattern.compile("<(\\w+)\\s+xmlns=\"([\\w/:.]+)\"/>");
+	
+	public AlexRouteMessageProcessor(AlexRouteImpl route) {
+		this.route = route;
+		log = LoggerFactory.getLogger(getClass());
+	}
+	
+	public void process(Exchange exchange) throws Exception {
+		Matcher m = xmlNamespace.matcher(exchange.getIn().getBody(String.class));
+		if (m.find()) {
+			String msgType = m.group(1);
+			String namespace = m.group(2);
+			route.forwardMessage(namespace, msgType, exchange);
+		} else {
+			exchange.setException(new Exception("Could not detect namespace in incoming message"));
+		}
+	}
+
+}
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
index 1af2e17..0e7030a 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
@@ -5,18 +5,23 @@ import info.kwarc.sally4.activemq.ActiveMQService;
 import info.kwarc.sally4.core.CamelContextProvider;
 import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.DocumentManager;
+import info.kwarc.sally4.docmanager.IDocWorkflow;
 import info.kwarc.sally4.docmanager.routes.SallyRegisterRoute;
 
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.felix.ipojo.annotations.Bind;
 import org.apache.felix.ipojo.annotations.Component;
 import org.apache.felix.ipojo.annotations.Instantiate;
 import org.apache.felix.ipojo.annotations.Invalidate;
 import org.apache.felix.ipojo.annotations.Provides;
 import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.annotations.Unbind;
 import org.apache.felix.ipojo.annotations.Validate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,40 +30,72 @@ import org.slf4j.LoggerFactory;
 @Instantiate
 @Provides
 public class DocumentManagerImpl implements DocumentManager {
-	
-	Map<String, AlexRoute> docs;
-	SallyRegisterRoute registerRoute;
-	
-	CamelContext camelContext;
-			
-	Logger log;
-	
+
+	@Requires
+	IDocWorkflow[] workflows;
+
 	@Requires
 	ActiveMQService activeMQ;
-	
+
 	@Requires
 	CamelContextProvider camelContextProvider;
 	
+	Map<String, AlexRouteImpl> docs;
+	SallyRegisterRoute registerRoute;
+
+	CamelContext camelContext;
+
+	Logger log;
+
+
 	public DocumentManagerImpl() {
-		docs = new HashMap<String, AlexRoute>();
+		docs = new HashMap<String, AlexRouteImpl>();
 		registerRoute = new SallyRegisterRoute(this);
-		log = LoggerFactory.getLogger(getClass());
+		log = LoggerFactory.getLogger(getClass());		
 	}
-		
+
 	public AlexRoute registerDocument(Registerdocument doc) {
 		if (docs.containsKey(doc.getDocumentqueue()))
 			return docs.get(doc.getDocumentqueue());
-		
-		AlexRouteImpl route = new AlexRouteImpl(doc.getDocumentqueue(), doc.getTheoqueue(), doc.getInterfaces());
 
+		AlexRouteImpl route = new AlexRouteImpl(doc.getDocumentqueue(), doc.getTheoqueue(), doc.getInterfaces());
+				
 		docs.put(doc.getDocumentqueue(), route);
+		
+		for (IDocWorkflow workflow : workflows) {
+			HashSet<String> required = new HashSet<String>(Arrays.asList(workflow.getInterfaceRequirements()));
+			if (route.getInterfaces().containsAll(required)) {
+				route.addDocumentWorkflow(workflow);
+			}
+		}
+		
 		return route;
 	}
 
+
+	@Bind(aggregate=true)
+	private void bindWorkflow(IDocWorkflow workflow) 
+	{ 
+		HashSet<String> required = new HashSet<String>(Arrays.asList(workflow.getInterfaceRequirements()));
+		for (AlexRouteImpl route : docs.values()) {
+			if (route.getInterfaces().containsAll(required)) {
+				route.addDocumentWorkflow(workflow);
+			}
+		}
+	}
+
+	@Unbind
+	private void unbindWorkflow(IDocWorkflow workflow) 
+	{ 
+		for (AlexRouteImpl route : docs.values()) {
+			route.removeDocumentWorkflow(workflow);
+		}
+	}
+
+
 	@Validate
 	public void start() {
 		try {
-			log.info(camelContextProvider.getName());
 			camelContext = new DefaultCamelContext();
 			camelContext.addComponent("activemq", camelContextProvider.getComponent("activemq"));
 			camelContext.addRoutes(registerRoute);
@@ -67,19 +104,19 @@ public class DocumentManagerImpl implements DocumentManager {
 			log.info(e.getMessage());
 			e.printStackTrace();
 		}
-		
+
 	}
-	
+
 	@Invalidate
 	public void stop() {
-			try {
-				camelContext.stop();
-				for (AlexRoute route : docs.values()) {
-					route.stop();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
+		try {
+			camelContext.stop();
+			for (AlexRouteImpl route : docs.values()) {
+				route.stop();
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
index fc75b86..32a6695 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
@@ -2,7 +2,8 @@ package info.kwarc.sally4.docmanager.routes;
 
 import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.core.Heartbeatrequest;
-import info.kwarc.sally4.docmanager.AlexRoute;
+import info.kwarc.sally4.docmanager.impl.AlexRouteImpl;
+import info.kwarc.sally4.docmanager.impl.AlexRouteMessageProcessor;
 
 import org.apache.camel.ExchangeTimedOutException;
 import org.apache.camel.builder.RouteBuilder;
@@ -13,7 +14,7 @@ import org.slf4j.LoggerFactory;
 public class SallyAlexRoute extends RouteBuilder  {
 
 	Logger log;
-	AlexRoute route;
+	AlexRouteImpl route;
 	
 	public Heartbeatrequest generateHeartbeat() {
 		return new Heartbeatrequest();
@@ -23,7 +24,7 @@ public class SallyAlexRoute extends RouteBuilder  {
 		route.stop();
 	}
 	
-	SallyAlexRoute(AlexRoute route) {
+	SallyAlexRoute(AlexRouteImpl route) {
 		log = LoggerFactory.getLogger(getClass());
 		this.route = route;
 	}
@@ -32,6 +33,9 @@ public class SallyAlexRoute extends RouteBuilder  {
 	public void configure() throws Exception {
 		DataFormat core = CommUtils.getDataFormat("core");
 
+		/**
+		 * Sends a Heartbeat message to the Alex. if it does not respond after 20sec, this route will shutdown.
+		 */
 		from("timer://foo?fixedRate=true&period=60000")
 			.bean(method(this, "generateHeartbeat"))
 			.marshal(core)
@@ -40,9 +44,13 @@ public class SallyAlexRoute extends RouteBuilder  {
 			.doCatch(ExchangeTimedOutException.class)
 				.bean(method(this, "stopSallyRoute"));
 		
-		from("alex:default")
-			.to("log:test")
-			.to("alex:default");
+		/**
+		 * 
+		 */
+		from("alex:defaultin")
+			.convertBodyTo(String.class)
+			.process(new AlexRouteMessageProcessor(route))
+			.to("alex:defaultout");
 	}
 
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
index 5aeb204..bdd6453 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
@@ -2,8 +2,8 @@ package info.kwarc.sally4.docmanager.routes;
 
 import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.core.Registerdocumentresponse;
-import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.component.AlexComponent;
+import info.kwarc.sally4.docmanager.impl.AlexRouteImpl;
 import info.kwarc.sally4.docmanager.impl.DocumentManagerImpl;
 
 import org.apache.camel.CamelContext;
@@ -23,12 +23,12 @@ public class SallyRegisterRoute extends RouteBuilder {
 		this.docManager = docManager;
 	}
 
-	public Registerdocumentresponse createRouteContext(AlexRoute route) throws Exception {
+	public Registerdocumentresponse createRouteContext(AlexRouteImpl route) throws Exception {
 		final CamelContext alexRouteContext = new DefaultCamelContext();
 		alexRouteContext.addComponent("activemq", getContext().getComponent("activemq"));
 		alexRouteContext.addComponent("alex", new AlexComponent(route));
 		alexRouteContext.addRoutes(new SallyAlexRoute(route));
-		alexRouteContext.getShutdownStrategy().setTimeout(1);
+		alexRouteContext.getShutdownStrategy().setTimeout(10);
 		alexRouteContext.start();
 		
 		route.addOnStopHandler(new Runnable() {
diff --git a/docmanager/src/test/java/info/kwarc/sally4/docmanager/routes/SallyAlexRouteTest.java b/docmanager/src/test/java/info/kwarc/sally4/docmanager/routes/SallyAlexRouteTest.java
new file mode 100644
index 0000000..c300b4e
--- /dev/null
+++ b/docmanager/src/test/java/info/kwarc/sally4/docmanager/routes/SallyAlexRouteTest.java
@@ -0,0 +1,51 @@
+package info.kwarc.sally4.docmanager.routes;
+
+import info.kwarc.sally4.docmanager.impl.AlexRouteImpl;
+
+import java.util.Arrays;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.direct.DirectComponent;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class SallyAlexRouteTest extends CamelTestSupport {
+
+	SallyAlexRoute route;
+	
+	@EndpointInject(uri="mock:result")
+	MockEndpoint result;
+	
+	@Test
+	public void ValidMessage() throws InterruptedException {
+		ProducerTemplate temp = context.createProducerTemplate();
+		temp.sendBody("alex:defaultin", "  <GetServices    xmlns=\"http://kwarc.info/sally/comm/planetaryclient\"/>   ");
+		result.expectedMessageCount(1);
+		result.assertIsSatisfied();
+	}
+	
+	
+	@Test
+	public void InvalidMessage() throws InterruptedException {
+		ProducerTemplate temp = context.createProducerTemplate();
+		try {
+			temp.sendBody("alex:defaultin", "  <GetServices/>   ");
+			fail();
+		} catch (Exception e) {
+		}
+		result.expectedMessageCount(0);
+		result.assertIsSatisfied();
+	}
+		
+	@Override
+	protected RouteBuilder createRouteBuilder() throws Exception {
+		route = new SallyAlexRoute(new AlexRouteImpl("a", "b", Arrays.asList(new String[]{"asd"})));
+		route.from("alex:defaultout").to("mock:result");
+		context.addComponent("alex", new DirectComponent());
+		return route;
+	}
+
+}
diff --git a/planetary/pom.xml b/planetary/pom.xml
index 0d19616..d92dbff 100644
--- a/planetary/pom.xml
+++ b/planetary/pom.xml
@@ -45,7 +45,7 @@
 		<dependency>
 			<groupId>info.kwarc.sally4</groupId>
 			<artifactId>core</artifactId>
-			<version>0.0.1-SNAPSHOT</version>
+			<version>0.0.2-SNAPSHOT</version>
 		</dependency>
 
 
@@ -78,10 +78,10 @@
 				<extensions>true</extensions>
 				<configuration>
 					<instructions>
-						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
 						<Private-Package>info.kwarc.sally4.planetary.impl</Private-Package>
 						<Import-Package>*;com.mysql.jdbc</Import-Package>
-						<Export-Package>info.kwarc.sally4.planetary*</Export-Package>
+						<Export-Package>info.kwarc.sally4.planetary*;info.kwarc.sally.comm*</Export-Package>
 					</instructions>
 				</configuration>
 			</plugin>
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
new file mode 100644
index 0000000..e1bd8d3
--- /dev/null
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
@@ -0,0 +1,39 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+//
+
+
+package info.kwarc.sally.comm.planetaryclient;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType>
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "")
+@XmlRootElement(name = "GetServices")
+public class GetServices {
+
+
+}
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
new file mode 100644
index 0000000..80fe528
--- /dev/null
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
@@ -0,0 +1,41 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+//
+
+
+package info.kwarc.sally.comm.planetaryclient;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType>
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "")
+@XmlRootElement(name = "GetSessionIDRequest")
+public class GetSessionIDRequest {
+
+
+}
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
new file mode 100644
index 0000000..a232d3d
--- /dev/null
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
@@ -0,0 +1,71 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+//
+
+
+package info.kwarc.sally.comm.planetaryclient;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType>
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="sessionid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+    "sessionid"
+})
+@XmlRootElement(name = "GetSessionIDResponse")
+public class GetSessionIDResponse {
+
+    @XmlElement(required = true)
+    protected String sessionid;
+
+    /**
+     * Gets the value of the sessionid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getSessionid() {
+        return sessionid;
+    }
+
+    /**
+     * Sets the value of the sessionid property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setSessionid(String value) {
+        this.sessionid = value;
+    }
+
+}
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
new file mode 100644
index 0000000..a8893b7
--- /dev/null
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
@@ -0,0 +1,63 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+//
+
+
+package info.kwarc.sally.comm.planetaryclient;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the info.kwarc.sally.comm.planetaryclient package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: info.kwarc.sally.comm.planetaryclient
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link GetSessionIDResponse }
+     * 
+     */
+    public GetSessionIDResponse createGetSessionIDResponse() {
+        return new GetSessionIDResponse();
+    }
+
+    /**
+     * Create an instance of {@link GetSessionIDRequest }
+     * 
+     */
+    public GetSessionIDRequest createGetSessionIDRequest() {
+        return new GetSessionIDRequest();
+    }
+
+    /**
+     * Create an instance of {@link GetServices }
+     * 
+     */
+    public GetServices createGetServices() {
+        return new GetServices();
+    }
+
+}
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
new file mode 100644
index 0000000..0655923
--- /dev/null
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
@@ -0,0 +1,9 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+//
+
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://kwarc.info/sally/comm/planetaryclient", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+package info.kwarc.sally.comm.planetaryclient;
diff --git a/planetary/src/main/java/info/kwarc/sally4/planetary/impl/PlanetaryConnectionImpl.java b/planetary/src/main/java/info/kwarc/sally4/planetary/impl/PlanetaryConnectionImpl.java
index 2b9c811..b08cad0 100644
--- a/planetary/src/main/java/info/kwarc/sally4/planetary/impl/PlanetaryConnectionImpl.java
+++ b/planetary/src/main/java/info/kwarc/sally4/planetary/impl/PlanetaryConnectionImpl.java
@@ -20,12 +20,10 @@ import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
 public class PlanetaryConnectionImpl implements PlanetaryConnection {
 	@Requires
 	CamelContextProvider camelContextProvider;
-	CamelContext context ;
 	MysqlDataSource mysqlDataSource;
 	
 	@Validate
 	public void start() {
-		context = camelContextProvider.getSallyCamelContext();
 		SqlComponent sqlComponent = new SqlComponent();
 		mysqlDataSource = new MysqlDataSource();
 		mysqlDataSource.setUser("root");
@@ -34,13 +32,12 @@ public class PlanetaryConnectionImpl implements PlanetaryConnection {
 		mysqlDataSource.setDatabaseName("planetmmt1");
 		
 		sqlComponent.setDataSource(mysqlDataSource);
-		context.addComponent("planetary", sqlComponent);
-		
+		camelContextProvider.registerGlobalComponent("planetary", sqlComponent);
 	}
 	
 	@Invalidate
 	public void stop() {
-		context.removeComponent("planetary");
+		camelContextProvider.unregisterGlobalComponent("planetary");
 		
 	}
 	
diff --git a/planetary/src/main/resources/planetaryclient.xsd b/planetary/src/main/resources/planetaryclient.xsd
new file mode 100644
index 0000000..6139dd4
--- /dev/null
+++ b/planetary/src/main/resources/planetaryclient.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="http://kwarc.info/sally/comm/planetaryclient" elementFormDefault="qualified">
+
+	<xs:element name="GetSessionIDRequest">
+		<xs:complexType>
+			<xs:sequence>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+
+	<xs:element name="GetSessionIDResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="sessionid" type="xs:string" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<xs:element name="GetServices">
+		<xs:complexType>
+		</xs:complexType>
+	</xs:element>
+
+
+</xs:schema>
\ No newline at end of file
-- 
GitLab