Communicate with the agent via JMS
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 27 Apr 2009 05:58:39 +0000 (05:58 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 27 Apr 2009 05:58:39 +0000 (05:58 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2375 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

25 files changed:
demo/pom.xml
demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml
runtime/org.argeo.slc.server/pom.xml
runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/execution/GetModuleDescriptor.java
runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/execution/ListModulesDescriptors.java
runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-service-servlet.xml
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgent.java
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgentDescriptor.java
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgentFactory.java [new file with mode: 0644]
runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgent.java
runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java [new file with mode: 0644]
runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxyFactory.java [new file with mode: 0644]
runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/MarshallerMessageConverter.java
runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml
runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/msg.xml
runtime/org.argeo.slc.support.castor/src/main/resources/org/argeo/slc/castor/runtime.xml
runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/ExecutionModuleDescriptorCastorTest.java
runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/SlcAgentDescriptorCastorTest.java [new file with mode: 0644]
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/runtime/AbstractAgent.java
server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js
server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/SlcApi.js
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/osgi.xml

index 4b4edb60854829da3ec8ad3dfe3c61a8049b2a56..1ba3ac654741460f49c252da25680f081732bd76 100644 (file)
@@ -21,7 +21,7 @@
                                <artifactId>maven-argeo-osgi-plugin</artifactId>
                                <configuration>
                                        <systemProperties>
-                                               <slc.osgi.bundles>${basedir}/site;in=*;ex=**/.svn/**</slc.osgi.bundles>
+                                               <slc.osgi.bundles>${basedir}/site;in=*;ex=**/.svn/**,${basedir}/../server/org.argeo.slc.siteserver/bundles;in=*;ex=**/.svn/**</slc.osgi.bundles>
                                        </systemProperties>
                                </configuration>
                        </plugin>
@@ -58,7 +58,7 @@
                                                        <execDir>target/exec/server</execDir>
                                                        <jvmArgs>
                                                                <jvmArg>-Xmx256m</jvmArg>
-                                                               <!-- <jvmArg>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000</jvmArg>-->
+                                                               <!-- <jvmArg>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000</jvmArg> -->    
                                                        </jvmArgs>
                                                        <systemProperties>
                                                                <slc.osgi.start>
@@ -94,7 +94,7 @@
                                                        <execDir>target/exec/agent</execDir>
                                                        <jvmArgs>
                                                                <jvmArg>-Xmx128m</jvmArg>
-                                                               <!-- <jvmArg>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8001</jvmArg> -->
+       <!--                                                    <jvmArg>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8001</jvmArg> --> 
                                                        </jvmArgs>
                                                        <systemProperties>
                                                                <slc.osgi.start>
index 06efcebfe0f5a07efdb19c961a882050dfee8aad..16060cc6995e04b331c49cdb9c1a878664820312 100644 (file)
@@ -7,6 +7,16 @@
        <import resource="classpath:org/argeo/slc/activemq/spring.xml" />
 
 
+       <bean
+               class="org.springframework.jms.listener.DefaultMessageListenerContainer">
+               <property name="connectionFactory" ref="jmsConnectionFactory" />
+               <property name="destination" ref="slcJms.destination.agent.request" />
+               <property name="messageListener" ref="jmsAgent" />
+               <property name="messageSelector">
+                       <bean factory-bean="jmsAgent" factory-method="getMessageSelector" />
+               </property>
+       </bean>
+
        <bean id="jmsAgent.listener.newExecution"
                class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                <property name="connectionFactory" ref="jmsConnectionFactory" />
@@ -28,6 +38,7 @@
                <property name="agentUnregister" ref="slcJms.destination.agent.unregister" />
                <property name="messageConverter" ref="slcDefault.jms.castorMessageConverter" />
                <property name="modulesManager" ref="modulesManager" />
+               <property name="responseDestination" ref="slcJms.destination.agent.response" />
        </bean>
 
        <!-- TreeTestResult Listener -->
index c60ae13af97598c5f477b44b79d66afb43659536..2c5925ddf50adf3499f68a27fa35fbaa1ce90d29 100644 (file)
@@ -34,7 +34,7 @@
                                                <Export-Package>
                                                        org.argeo.slc.*,org.argeo.slc.server,org.argeo.slc.server.spring
                                                </Export-Package>
-                                               <Import-Package>org.w3c.dom;version="0.0.0",javax.xml.*;version="0.0.0",org.argeo.slc.activemq,*</Import-Package>
+                                               <Import-Package>org.w3c.dom;version="0.0.0",javax.xml.*;version="0.0.0",org.argeo.slc.activemq,org.argeo.slc.execution,*</Import-Package>
                                        </instructions>
                                </configuration>
                        </plugin>
index b6a64b2efc84ff80f776a6ddd43f6781588141f7..dba3271777cf29202d0203062f08425fff8f205e 100644 (file)
@@ -4,29 +4,33 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;\r
 \r
 import org.argeo.slc.execution.ExecutionModuleDescriptor;\r
-import org.argeo.slc.execution.ExecutionModulesManager;\r
+import org.argeo.slc.runtime.SlcAgent;\r
+import org.argeo.slc.runtime.SlcAgentFactory;\r
 import org.argeo.slc.web.mvc.AbstractServiceController;\r
 import org.springframework.web.servlet.ModelAndView;\r
 \r
 /** . */\r
 public class GetModuleDescriptor extends AbstractServiceController {\r
-       private ExecutionModulesManager modulesManager;\r
+       private SlcAgentFactory agentFactory;\r
 \r
        @Override\r
        protected void handleServiceRequest(HttpServletRequest request,\r
                        HttpServletResponse response, ModelAndView modelAndView)\r
                        throws Exception {\r
 \r
+               String agentId = request.getParameter("agentId");\r
                String moduleName = request.getParameter("moduleName");\r
                String version = request.getParameter("version");\r
 \r
-               ExecutionModuleDescriptor md = modulesManager\r
-                               .getExecutionModuleDescriptor(moduleName, version);\r
+               SlcAgent slcAgent = agentFactory.getAgent(agentId);\r
+\r
+               ExecutionModuleDescriptor md = slcAgent.getExecutionModuleDescriptor(\r
+                               moduleName, version);\r
                modelAndView.addObject(md);\r
        }\r
 \r
-       public void setModulesManager(ExecutionModulesManager modulesManager) {\r
-               this.modulesManager = modulesManager;\r
+       public void setAgentFactory(SlcAgentFactory agentFactory) {\r
+               this.agentFactory = agentFactory;\r
        }\r
 \r
 }\r
index 32cf1383ef40f929f855bc35d5a409d1e43f3489..b9b210b568bf2920a852cc0e2479bb53a3717526 100644 (file)
@@ -1,42 +1,36 @@
 package org.argeo.slc.web.mvc.execution;\r
 \r
-import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import javax.servlet.http.HttpServletRequest;\r
 import javax.servlet.http.HttpServletResponse;\r
 \r
-import org.argeo.slc.execution.ExecutionModule;\r
 import org.argeo.slc.execution.ExecutionModuleDescriptor;\r
-import org.argeo.slc.execution.ExecutionModulesManager;\r
 import org.argeo.slc.msg.ObjectList;\r
+import org.argeo.slc.runtime.SlcAgent;\r
+import org.argeo.slc.runtime.SlcAgentFactory;\r
 import org.argeo.slc.web.mvc.AbstractServiceController;\r
 import org.springframework.web.servlet.ModelAndView;\r
 \r
 /** . */\r
 public class ListModulesDescriptors extends AbstractServiceController {\r
-       private ExecutionModulesManager modulesManager;\r
+       private SlcAgentFactory agentFactory;\r
 \r
        @Override\r
        protected void handleServiceRequest(HttpServletRequest request,\r
                        HttpServletResponse response, ModelAndView modelAndView)\r
                        throws Exception {\r
 \r
-               List<ExecutionModule> modules = modulesManager.listExecutionModules();\r
+               String agentId = request.getParameter("agentId");\r
+               SlcAgent slcAgent = agentFactory.getAgent(agentId);\r
 \r
-               List<ExecutionModuleDescriptor> descriptors = new ArrayList<ExecutionModuleDescriptor>();\r
-               for (ExecutionModule module : modules) {\r
-                       ExecutionModuleDescriptor md = new ExecutionModuleDescriptor();\r
-                       md.setName(module.getName());\r
-                       md.setVersion(module.getVersion());\r
-                       descriptors.add(md);\r
-               }\r
+               List<ExecutionModuleDescriptor> descriptors = slcAgent.listExecutionModuleDescriptors();\r
 \r
                modelAndView.addObject(new ObjectList(descriptors));\r
        }\r
 \r
-       public void setModulesManager(ExecutionModulesManager modulesManager) {\r
-               this.modulesManager = modulesManager;\r
+       public void setAgentFactory(SlcAgentFactory agentFactory) {\r
+               this.agentFactory = agentFactory;\r
        }\r
 \r
 }\r
index 7a8a88a8dc13650927ed2d72cb7881e9a9e22a2c..8262be92d848ae0d7ee72ba8b9aab00ef388f7f0 100644 (file)
 
        <bean name="/getExecutionDescriptor.service"
                class="org.argeo.slc.web.mvc.execution.GetModuleDescriptor">
-               <property name="modulesManager" ref="modulesManager" />
+               <property name="agentFactory" ref="agentFactory" />
        </bean>
 
        <bean name="/listModulesDescriptors.service"
                class="org.argeo.slc.web.mvc.execution.ListModulesDescriptors">
-               <property name="modulesManager" ref="modulesManager" />
+               <property name="agentFactory" ref="agentFactory" />
        </bean>
 
        <bean id="handlerMapping"
index fc3c2d52df184ee436a63bd392bb0f4e6fdba4eb..a0bb783d00f040b4f7d3499403e67515cab5fcd1 100644 (file)
@@ -1,5 +1,14 @@
 package org.argeo.slc.runtime;
 
+import java.util.List;
+
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+
 /** A local agent, able to run SLC Execution locally. */
 public interface SlcAgent {
+       public ExecutionModuleDescriptor getExecutionModuleDescriptor(
+                       String moduleName, String version);
+
+       public List<ExecutionModuleDescriptor> listExecutionModuleDescriptors();
+
 }
index 39eadf69e8498ba0f42d2c0aacd8ba393e4951cd..1e29a95edbaed336ecec7f909cc0b8eb353547b2 100644 (file)
@@ -1,8 +1,24 @@
 package org.argeo.slc.runtime;
 
-public class SlcAgentDescriptor {
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+
+public class SlcAgentDescriptor implements Cloneable {
        private String uuid;
        private String host;
+       private List<ExecutionModuleDescriptor> moduleDescriptors = new ArrayList<ExecutionModuleDescriptor>();
+
+       public SlcAgentDescriptor() {
+
+       }
+
+       public SlcAgentDescriptor(SlcAgentDescriptor template) {
+               uuid = template.uuid;
+               host = template.host;
+               moduleDescriptors.addAll(template.moduleDescriptors);
+       }
 
        public String getUuid() {
                return uuid;
@@ -20,4 +36,12 @@ public class SlcAgentDescriptor {
                this.host = host;
        }
 
+       public List<ExecutionModuleDescriptor> getModuleDescriptors() {
+               return moduleDescriptors;
+       }
+
+       public void setModuleDescriptors(
+                       List<ExecutionModuleDescriptor> modulesDescriptors) {
+               this.moduleDescriptors = modulesDescriptors;
+       }
 }
diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgentFactory.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/runtime/SlcAgentFactory.java
new file mode 100644 (file)
index 0000000..3ca5666
--- /dev/null
@@ -0,0 +1,5 @@
+package org.argeo.slc.runtime;
+
+public interface SlcAgentFactory {
+       public SlcAgent getAgent(String uuid);
+}
index 8678c1705b03c484911ccc7950cc79d7bc1b8800..78e93481b751d73c18a19e5c1c5b1431d931b1eb 100644 (file)
@@ -2,25 +2,36 @@ package org.argeo.slc.jms;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 import javax.jms.ConnectionFactory;
 import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.runtime.AbstractAgent;
+import org.argeo.slc.execution.ExecutionModule;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+import org.argeo.slc.msg.ObjectList;
 import org.argeo.slc.runtime.SlcAgent;
 import org.argeo.slc.runtime.SlcAgentDescriptor;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.listener.SessionAwareMessageListener;
 import org.springframework.jms.support.converter.MessageConverter;
 
 /** JMS based implementation of SLC Agent. */
 public class JmsAgent extends AbstractAgent implements SlcAgent,
-               InitializingBean, DisposableBean {
+               InitializingBean, DisposableBean, SessionAwareMessageListener {
        private final static Log log = LogFactory.getLog(JmsAgent.class);
 
        private final SlcAgentDescriptor agentDescriptor;
@@ -29,6 +40,9 @@ public class JmsAgent extends AbstractAgent implements SlcAgent,
        private Destination agentRegister;
        private Destination agentUnregister;
 
+       // private Destination requestDestination;
+       private Destination responseDestination;
+
        private MessageConverter messageConverter;
 
        public JmsAgent() {
@@ -81,12 +95,49 @@ public class JmsAgent extends AbstractAgent implements SlcAgent,
        public String getMessageSelector() {
                String messageSelector = "slc_agentId='" + agentDescriptor.getUuid()
                                + "'";
-               // String messageSelector = "slc-agentId LIKE '%'";
-               if (log.isDebugEnabled())
-                       log.debug("Message selector: " + messageSelector);
+               // if (log.isDebugEnabled())
+               // log.debug("Message selector: " + messageSelector);
                return messageSelector;
        }
 
+       public void onMessage(Message message, Session session) throws JMSException {
+               MessageProducer producer = session.createProducer(responseDestination);
+               String query = message.getStringProperty("query");
+               String correlationId = message.getJMSCorrelationID();
+               if (log.isDebugEnabled())
+                       log.debug("Received query " + query + " with correlationId "
+                                       + correlationId);
+
+               Message responseMsg = null;
+               if ("getExecutionModuleDescriptor".equals(query)) {
+                       String moduleName = message.getStringProperty("moduleName");
+                       String version = message.getStringProperty("version");
+                       ExecutionModuleDescriptor emd = getExecutionModuleDescriptor(
+                                       moduleName, version);
+                       responseMsg = messageConverter.toMessage(emd, session);
+               } else if ("listExecutionModuleDescriptors".equals(query)) {
+
+                       List<ExecutionModuleDescriptor> lst = listExecutionModuleDescriptors();
+                       SlcAgentDescriptor agentDescriptorToSend = new SlcAgentDescriptor(
+                                       agentDescriptor);
+                       agentDescriptorToSend.setModuleDescriptors(lst);
+                       responseMsg = messageConverter.toMessage(agentDescriptorToSend,
+                                       session);
+               } else {
+                       throw new SlcException("Unsupported query " + query);
+               }
+
+               if (responseMsg != null) {
+                       responseMsg.setJMSCorrelationID(correlationId);
+                       producer.send(responseMsg);
+                       if (log.isDebugEnabled())
+                               log.debug("Sent response to query " + query
+                                               + " with correlationId " + correlationId + ": "
+                                               + responseMsg);
+               }
+
+       }
+
        public void setMessageConverter(MessageConverter messageConverter) {
                this.messageConverter = messageConverter;
        }
@@ -95,4 +146,28 @@ public class JmsAgent extends AbstractAgent implements SlcAgent,
                this.connectionFactory = connectionFactory;
        }
 
+       public ExecutionModuleDescriptor getExecutionModuleDescriptor(
+                       String moduleName, String version) {
+               return getModulesManager().getExecutionModuleDescriptor(moduleName,
+                               version);
+       }
+
+       public List<ExecutionModuleDescriptor> listExecutionModuleDescriptors() {
+               List<ExecutionModule> modules = getModulesManager()
+                               .listExecutionModules();
+
+               List<ExecutionModuleDescriptor> descriptors = new ArrayList<ExecutionModuleDescriptor>();
+               for (ExecutionModule module : modules) {
+                       ExecutionModuleDescriptor md = new ExecutionModuleDescriptor();
+                       md.setName(module.getName());
+                       md.setVersion(module.getVersion());
+                       descriptors.add(md);
+               }
+               return descriptors;
+       }
+
+       public void setResponseDestination(Destination responseDestination) {
+               this.responseDestination = responseDestination;
+       }
+
 }
diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxy.java
new file mode 100644 (file)
index 0000000..3a311b9
--- /dev/null
@@ -0,0 +1,128 @@
+package org.argeo.slc.jms;
+
+import java.util.List;
+import java.util.UUID;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.execution.ExecutionModule;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+import org.argeo.slc.msg.ObjectList;
+import org.argeo.slc.runtime.SlcAgent;
+import org.argeo.slc.runtime.SlcAgentDescriptor;
+import org.springframework.jms.JmsException;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+import org.springframework.jms.support.converter.MessageConversionException;
+import org.springframework.jms.support.converter.MessageConverter;
+
+public class JmsAgentProxy implements SlcAgent {
+       private final static Log log = LogFactory.getLog(JmsAgentProxy.class);
+
+       private final String agentUuid;
+       private final Destination requestDestination;
+       private final Destination responseDestination;
+       private final JmsTemplate jmsTemplate;
+       private final MessageConverter messageConverter;
+
+       public JmsAgentProxy(String agentUuid, Destination requestDestination,
+                       Destination responseDestination, JmsTemplate jmsTemplate,
+                       MessageConverter messageConverter) {
+               this.agentUuid = agentUuid;
+               this.requestDestination = requestDestination;
+               this.responseDestination = responseDestination;
+               this.jmsTemplate = jmsTemplate;
+               this.messageConverter = messageConverter;
+       }
+
+       public ExecutionModuleDescriptor getExecutionModuleDescriptor(
+                       final String moduleName, final String version) {
+               return (ExecutionModuleDescriptor) sendReceive(new AgentProxyMessageCreator(
+                               "getExecutionModuleDescriptor") {
+                       public void setArguments(Message message) throws JMSException {
+                               message.setStringProperty("moduleName", moduleName);
+                               message.setStringProperty("version", version);
+                       }
+               });
+       }
+
+       public List<ExecutionModuleDescriptor> listExecutionModuleDescriptors() {
+               return ((SlcAgentDescriptor) sendReceive(new AgentProxyMessageCreator(
+                               "listExecutionModuleDescriptors"))).getModuleDescriptors();
+       }
+
+       protected Object sendReceive(AgentProxyMessageCreator messageCreator) {
+               String correlationId = UUID.randomUUID().toString();
+               messageCreator.setCorrelationId(correlationId);
+               send(messageCreator);
+               return processResponse(correlationId);
+       }
+
+       protected void send(AgentProxyMessageCreator messageCreator) {
+               jmsTemplate.send(requestDestination, messageCreator);
+               if (log.isDebugEnabled())
+                       log.debug("Sent request" + messageCreator.getQuery() + " to agent "
+                                       + agentUuid + " with correlationId "
+                                       + messageCreator.getCorrelationId());
+       }
+
+       protected Object processResponse(String correlationId) {
+               try {
+                       Message responseMsg = jmsTemplate.receiveSelected(
+                                       responseDestination, "JMSCorrelationID='" + correlationId
+                                                       + "'");
+                       if (log.isDebugEnabled())
+                               log.debug("Received response with correlationId "
+                                               + correlationId);
+                       return messageConverter.fromMessage(responseMsg);
+               } catch (Exception e) {
+                       throw new SlcException("Could not process response from agent "
+                                       + agentUuid + " with correlationId " + correlationId, e);
+               }
+       }
+
+       protected class AgentProxyMessageCreator implements MessageCreator {
+               private final String query;
+               private String correlationId;
+
+               public AgentProxyMessageCreator(String query) {
+                       this.query = query;
+               }
+
+               public final Message createMessage(Session session) throws JMSException {
+                       if (agentUuid == null)
+                               throw new SlcException("Agent UUID not set");
+                       if (correlationId == null)
+                               throw new SlcException("JMSCorrelationID not set");
+                       TextMessage msg = session.createTextMessage();
+                       msg.setStringProperty("slc_agentId", agentUuid);
+                       msg.setStringProperty("query", query);
+                       msg.setJMSCorrelationID(correlationId);
+                       setArguments(msg);
+                       return msg;
+               }
+
+               protected void setArguments(Message message) throws JMSException {
+               }
+
+               public String getQuery() {
+                       return query;
+               }
+
+               public String getCorrelationId() {
+                       return correlationId;
+               }
+
+               public void setCorrelationId(String correlationId) {
+                       this.correlationId = correlationId;
+               }
+
+       }
+}
diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxyFactory.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsAgentProxyFactory.java
new file mode 100644 (file)
index 0000000..1f625e1
--- /dev/null
@@ -0,0 +1,37 @@
+package org.argeo.slc.jms;
+
+import javax.jms.Destination;
+
+import org.argeo.slc.runtime.SlcAgent;
+import org.argeo.slc.runtime.SlcAgentFactory;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.support.converter.MessageConverter;
+
+public class JmsAgentProxyFactory implements SlcAgentFactory {
+       private Destination requestDestination;
+       private Destination responseDestination;
+       private JmsTemplate jmsTemplate;
+       private MessageConverter messageConverter;
+
+       public SlcAgent getAgent(String uuid) {
+               return new JmsAgentProxy(uuid, requestDestination, responseDestination,
+                               jmsTemplate, messageConverter);
+       }
+
+       public void setRequestDestination(Destination requestDestination) {
+               this.requestDestination = requestDestination;
+       }
+
+       public void setResponseDestination(Destination responseDestination) {
+               this.responseDestination = responseDestination;
+       }
+
+       public void setJmsTemplate(JmsTemplate jmsTemplate) {
+               this.jmsTemplate = jmsTemplate;
+       }
+
+       public void setMessageConverter(MessageConverter messageConverter) {
+               this.messageConverter = messageConverter;
+       }
+
+}
index 88d40a42645f0425de8c4c2fcc1315416afe0ae2..b42602606ea5f834e76d6514a7151e7078695e71 100644 (file)
@@ -44,7 +44,8 @@ public class MarshallerMessageConverter implements MessageConverter {
                                throw new SlcException("Could not unmarshall " + text, e);
                        }
                } else {
-                       throw new SlcException("Only JMS TextMessage are supported.");
+                       throw new SlcException("This type of messages is not supported: "
+                                       + message);
                }
        }
 
index c72f98c853a33e71e6313ccc5f2296e22eb85d30..80f844d039c3fafa181d33de6c3256c0e4633ffa 100644 (file)
                parent="slcJms.amTopic" />
        <bean id="slcJms.destination.agent.newExecution" p:physicalName="agent.newExecution"
                parent="slcJms.amTopic" />
+       <bean id="slcJms.destination.agent.request" p:physicalName="agent.request"
+               parent="slcJms.amTopic" />
+       <bean id="slcJms.destination.agent.response" p:physicalName="agent.response"
+               parent="slcJms.amTopic" />
 
        <!-- Test result service -->
        <bean id="slcJms.destination.test.create" p:physicalName="test.create"
index 1a5638d6499746d2f24b42f441db43d4b7ea8262..1d13dee7d608c324f6463e4b0cb38d0ccc741d22 100644 (file)
@@ -24,7 +24,7 @@
        <class name="org.argeo.slc.msg.ObjectList">
                <map-to ns-uri="http://argeo.org/projects/slc/schemas"
                        ns-prefix="slc" />
-               <field name="objects" collection="arraylist">
+               <field name="objects" collection="arraylist" type="java.lang.Object">
                        <bind-xml auto-naming="deriveByClass" />
                </field>
        </class>
index 839603dc338592e6de3fb2bc2f62da96ca83d65a..ce591d9af4c734277e53636e07013c79169cfae0 100644 (file)
@@ -12,5 +12,9 @@
                        <bind-xml node="attribute" />\r
                </field>\r
                <field name="host" />\r
+               <field name="moduleDescriptors" collection="arraylist"\r
+                       type="org.argeo.slc.execution.ExecutionModuleDescriptor">\r
+                       <bind-xml auto-naming="deriveByClass" />\r
+               </field>\r
        </class>\r
 </mapping>
\ No newline at end of file
index 5adbd62c3c6fe6ce24ef0a7689b7df2b7c25ea0f..0ee30625664b6930da71e18d55c70ee3bd467995 100644 (file)
@@ -6,6 +6,7 @@ import java.util.List;
 import org.argeo.slc.execution.ExecutionFlowDescriptor;\r
 import org.argeo.slc.execution.ExecutionModuleDescriptor;\r
 import org.argeo.slc.execution.ExecutionSpec;\r
+import org.argeo.slc.msg.ObjectList;\r
 import org.argeo.slc.unit.execution.ExecutionFlowDescriptorTestUtils;\r
 \r
 public class ExecutionModuleDescriptorCastorTest extends AbstractCastorTestCase {\r
@@ -27,4 +28,12 @@ public class ExecutionModuleDescriptorCastorTest extends AbstractCastorTestCase
 \r
                marshUnmarsh(moduleDescriptor, false);\r
        }\r
+\r
+       public void testMarshUnmarshMini() throws Exception {\r
+               ExecutionModuleDescriptor moduleDescriptor = new ExecutionModuleDescriptor();\r
+               moduleDescriptor.setName("test.moodule");\r
+               moduleDescriptor.setVersion("1.0.0");\r
+               marshUnmarsh(moduleDescriptor, false);\r
+       }\r
+\r
 }\r
diff --git a/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/SlcAgentDescriptorCastorTest.java b/runtime/org.argeo.slc.support.castor/src/test/java/org/argeo/slc/castor/SlcAgentDescriptorCastorTest.java
new file mode 100644 (file)
index 0000000..2e5e3af
--- /dev/null
@@ -0,0 +1,38 @@
+package org.argeo.slc.castor;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.argeo.slc.execution.ExecutionFlowDescriptor;\r
+import org.argeo.slc.execution.ExecutionModuleDescriptor;\r
+import org.argeo.slc.execution.ExecutionSpec;\r
+import org.argeo.slc.msg.ObjectList;\r
+import org.argeo.slc.runtime.SlcAgentDescriptor;\r
+import org.argeo.slc.unit.execution.ExecutionFlowDescriptorTestUtils;\r
+\r
+public class SlcAgentDescriptorCastorTest extends AbstractCastorTestCase {\r
+       public void testMarshUnmarshMini() throws Exception {\r
+               SlcAgentDescriptor agentDescriptor = createMiniAgentDescriptor();\r
+               marshUnmarsh(agentDescriptor, false);\r
+       }\r
+\r
+       public void testMarshUnmarshWithModuleDescriptor() throws Exception {\r
+               SlcAgentDescriptor agentDescriptor = createMiniAgentDescriptor();\r
+\r
+               List<ExecutionModuleDescriptor> lst = new ArrayList<ExecutionModuleDescriptor>();\r
+               ExecutionModuleDescriptor moduleDescriptor = new ExecutionModuleDescriptor();\r
+               moduleDescriptor.setName("test.moodule");\r
+               moduleDescriptor.setVersion("1.0.0");\r
+               lst.add(moduleDescriptor);\r
+               agentDescriptor.setModuleDescriptors(lst);\r
+\r
+               marshUnmarsh(agentDescriptor, false);\r
+       }\r
+       \r
+       protected static SlcAgentDescriptor createMiniAgentDescriptor(){\r
+               SlcAgentDescriptor agentDescriptor = new SlcAgentDescriptor();\r
+               agentDescriptor.setHost("localhost");\r
+               agentDescriptor.setUuid("555");\r
+               return agentDescriptor;\r
+       }\r
+}\r
index d3647b7187b44343f20c0570fb3896a351bd0378..75215115e9ecd5259bf11c5bd070ba328319b351 100644 (file)
@@ -1,49 +1,24 @@
 package org.argeo.slc.core.runtime;
 
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.execution.ExecutionModulesManager;
 import org.argeo.slc.process.SlcExecution;
-import org.argeo.slc.runtime.SlcApplication;
-import org.argeo.slc.runtime.SlcExecutionContext;
 
 public abstract class AbstractAgent {
-       private final static Log log = LogFactory.getLog(AbstractAgent.class);
+//     private final static Log log = LogFactory.getLog(AbstractAgent.class);
 
-//     private SlcApplication<SlcExecutionContext> slcApplication;
-       
        private ExecutionModulesManager modulesManager;
 
        protected void runSlcExecution(final SlcExecution slcExecution) {
                modulesManager.process(slcExecution);
-//             Thread thread = new Thread("SlcExecution " + slcExecution.getUuid()) {
-//                     public void run() {
-//                             Properties props = new Properties();
-//                             Map<String, String> attributes = slcExecution.getAttributes();
-//                             for (String key : attributes.keySet()) {
-//                                     props.setProperty(key, attributes.get(key));
-//                                     if (log.isTraceEnabled())
-//                                             log.trace(key + "=" + props.getProperty(key));
-//                             }
-//                             slcApplication.execute(slcExecution, props, null, null);
-//                             log.debug("Thread for SLC execution #" + slcExecution.getUuid()
-//                                             + " finished.");
-//                     }
-//             };
-//             thread.start();
        }
 
        public void setModulesManager(ExecutionModulesManager modulesManager) {
                this.modulesManager = modulesManager;
        }
 
-       
-//     public void setSlcApplication(
-//                     SlcApplication<SlcExecutionContext> application) {
-//             this.slcApplication = application;
-//     }
+       public ExecutionModulesManager getModulesManager() {
+               return modulesManager;
+       }
 
+       
 }
index 6e232ff3a55b13a8eb8c78c9ca391b6140027589..38eeb25feb61cf758c6a4839f3f71b935368f493 100644 (file)
@@ -290,11 +290,12 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
         * @param folder {qx.ui.tree.TreeFolder} A Tree folder containing in the key "moduleData" of its user data a map containing the keys {name,version} 
         */
        flowLoader : function(folder){
-               var moduleData = folder.getUserData("moduleData");              
+               var moduleData = folder.getUserData("moduleData");
+               var agentUuid = folder.getUserData("agentUuid");
                //var pathStub = ["", "/test/toto/zobi", "loop"];
                //var indexStub = 0;
                
-               var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(moduleData.name, moduleData.version);
+               var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(agentUuid,moduleData.name, moduleData.version);
                req.addListener("completed", function(response){
                        var executionModule = new org.argeo.slc.ria.execution.Module();                                         
                        executionModule.setXmlNode(response.getContent());
@@ -306,7 +307,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                                //indexStub ++;
                                file.setUserData("executionModule", executionModule);
                                file.setUserData("executionFlow", execFlows[key]);
-                               file.setUserData("agentUuid", folder.getUserData("agentUuid"));
+                               file.setUserData("agentUuid", agentUuid);
                                org.argeo.slc.ria.NewLauncherApplet.attachNodeByPath(
                                        folder, 
                                        path, 
index e2bdefb1ac4961cbcd570d6fdd17aee706c77ac3..e598db51eb83bc3508a62de6e0ccb44d9d263c6a 100644 (file)
@@ -235,12 +235,13 @@ qx.Class.define("org.argeo.slc.ria.SlcApi",
         * @param iLoadStatusables {org.argeo.ria.components.ILoadStatusables[]} Gui parts to update \r
         * @return {qx.io.remote.Request}\r
         */\r
-       getLoadExecutionDescriptorService : function(moduleName, moduleVersion, fireReloadEventType, iLoadStatusables){\r
+       getLoadExecutionDescriptorService : function(agentId,moduleName, moduleVersion, fireReloadEventType, iLoadStatusables){\r
                var req = org.argeo.slc.ria.SlcApi.getServiceRequest(\r
                        org.argeo.slc.ria.SlcApi.GET_EXECUTION_DESC_SERVICE,\r
                        fireReloadEventType,\r
                        iLoadStatusables\r
                ); \r
+               req.setParameter("agentId", agentId);\r
                req.setParameter("moduleName", moduleName);\r
                req.setParameter("version", moduleVersion);\r
                return req;\r
index 888a64c399e23deeb29b7661a547765ec35ebdde..fbee184ee23f1cbf245ea1431ef3f8a7dbde3150 100644 (file)
@@ -4,6 +4,7 @@ Import-Package: javax.jms,
  javax.management.j2ee.statistics,
  org.apache.commons.logging
 Require-Bundle: 
+ org.argeo.slc.specs,
  org.argeo.slc.server,
  org.argeo.slc.support.activemq,
  org.springframework.core,
index 8e68b553589d68a86e7bbc18983fbd3837102f5e..1abc49736f97d6e1df62498e259f8b74b154cbd2 100644 (file)
@@ -14,4 +14,5 @@
 
        <reference id="jmsConnectionFactory" interface="javax.jms.ConnectionFactory" />
 
+       <service ref="agentFactory" interface="org.argeo.slc.runtime.SlcAgentFactory" />
 </beans:beans>
\ No newline at end of file
index 5e1687d783b6f4fcdfab90c89f5bdcb39d319adf..a44c6e43d774c7630134e7b1c67e25190bcf3c56 100644 (file)
@@ -6,6 +6,18 @@
 
        <import resource="classpath:org/argeo/slc/activemq/spring.xml" />
 
+       <bean id="agentFactory" class="org.argeo.slc.jms.JmsAgentProxyFactory">
+               <property name="jmsTemplate">
+                       <bean class="org.springframework.jms.core.JmsTemplate">
+                               <property name="connectionFactory" ref="jmsConnectionFactory" />
+                               <property name="receiveTimeout" value="10000" />
+                       </bean>
+               </property>
+               <property name="messageConverter" ref="slcDefault.jms.castorMessageConverter" />
+               <property name="requestDestination" ref="slcJms.destination.agent.request" />
+               <property name="responseDestination" ref="slcJms.destination.agent.response" />
+       </bean>
+
        <!-- Agent Service -->
        <bean id="agentService.jmsContainer.register" parent="listenerContainer">
                <property name="destination" ref="slcJms.destination.agent.register" />
index bc1d3fcf2d24eb894f5c15eff7bd1e441f4e1441..e60afa16507fd577532804ef9d859cd7cd655245 100644 (file)
@@ -29,4 +29,6 @@
        <reference id="transactionManager"\r
                interface="org.springframework.transaction.PlatformTransactionManager" />\r
 \r
+       <reference id="agentFactory" interface="org.argeo.slc.runtime.SlcAgentFactory" />\r
+\r
 </beans:beans>
\ No newline at end of file