Provide SlcAgentFactory in the core agent
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 25 Feb 2013 15:48:30 +0000 (15:48 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 25 Feb 2013 15:48:30 +0000 (15:48 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6085 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

modules/org.argeo.slc.agent.jcr/META-INF/spring/jcr-osgi.xml
modules/org.argeo.slc.agent/META-INF/spring/agent.xml
modules/org.argeo.slc.agent/META-INF/spring/common.xml [deleted file]
modules/org.argeo.slc.agent/META-INF/spring/osgi.xml
modules/org.argeo.slc.agent/agent.properties
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgentFactory.java [new file with mode: 0644]
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrConstants.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java

index 9e2a0cbf4ab309609234338e06bb6eb8655d1039..f96930793355f36df8e1793ef4127fc5a3f1ff78 100644 (file)
        \r
        <service interface="org.argeo.slc.execution.ExecutionModulesListener"\r
                ref="executionModulesListener" />\r
-       <service ref="agent" interface="org.argeo.slc.runtime.SlcAgentFactory">\r
-               <service-properties>\r
-                       <beans:entry>\r
-                               <beans:key>\r
-                                       <util:constant static-field="org.argeo.slc.jcr.SlcJcrConstants.PROPERTY_PATH" />\r
-                               </beans:key>\r
-                               <util:constant\r
-                                       static-field="org.argeo.slc.jcr.SlcJcrConstants.VM_AGENT_FACTORY_PATH" />\r
-                       </beans:entry>\r
-               </service-properties>\r
-       </service>\r
        <service ref="agent" interface="org.argeo.slc.runtime.SlcAgent" />\r
 \r
        <service ref="fileSystemManager" interface="org.apache.commons.vfs.FileSystemManager" />\r
index bcb4d0a0504931c356c1758904aedf3e6e74b82b..2afd8f580a3c5f6d52bc69b7ddadcc145b73ead5 100644 (file)
@@ -4,6 +4,14 @@
        xsi:schemaLocation="\r
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
+       <bean\r
+               class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">\r
+               <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />\r
+               <property name="locations">\r
+                       <value>osgibundle:agent.properties</value>\r
+               </property>\r
+       </bean>\r
+\r
        <!-- Manager -->\r
        <bean id="modulesManager" class="org.argeo.slc.osgi.OsgiExecutionModulesManager"\r
                init-method="init" destroy-method="destroy">\r
                <property name="defaultTimeout" value="${slc.agent.osgi.defaultTimeout}" />\r
        </bean>\r
 \r
-       <!-- Logging -->\r
-       <!-- <bean id="log4Notification" class="org.argeo.slc.log4j.SlcExecutionAppender" -->\r
-       <!-- init-method="init" destroy-method="destroy"> -->\r
-       <!-- <property name="disabled" value="${slc.agent.log4Notification.disabled}" \r
-               /> -->\r
-       <!-- <property name="level" value="${slc.agent.log4Notification.level}" \r
-               /> -->\r
-       <!-- <property name="onlyExecutionThread" -->\r
-       <!-- value="${slc.agent.log4Notification.onlyExecutionThread}" /> -->\r
-       <!-- </bean> -->\r
-\r
-\r
+       <!-- Agent Factory -->\r
+       <bean id="vmAgentFactory" class="org.argeo.slc.core.execution.DefaultAgentFactory" />\r
 </beans>
\ No newline at end of file
diff --git a/modules/org.argeo.slc.agent/META-INF/spring/common.xml b/modules/org.argeo.slc.agent/META-INF/spring/common.xml
deleted file mode 100644 (file)
index 2a3f36c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
-       default-lazy-init="false">
-
-       <bean
-               class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-               <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
-               <property name="locations">
-                       <value>osgibundle:agent.properties</value>
-               </property>
-       </bean>
-</beans>
\ No newline at end of file
index f0c8e5a4875de65dec195e11ba56858dfdd5a936..1756f89edc46d1e580bb03dfb17a049d6b5e4536 100644 (file)
@@ -1,13 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <beans:beans xmlns="http://www.springframework.org/schema/osgi"\r
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"\r
+       xmlns:util="http://www.springframework.org/schema/util"\r
        xsi:schemaLocation="http://www.springframework.org/schema/osgi  \r
        http://www.springframework.org/schema/osgi/spring-osgi-1.1.xsd\r
        http://www.springframework.org/schema/beans   \r
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
-       <!-- <beans:import resource="classpath:org/argeo/slc/osgi/manager.xml" /> -->\r
-\r
        <!-- REFERENCES -->\r
        <list id="executionContexts" interface="org.argeo.slc.execution.ExecutionContext"\r
                cardinality="0..N">\r
        <list id="slcExecutionListeners" interface="org.argeo.slc.process.SlcExecutionNotifier"\r
                cardinality="0..N" />\r
 \r
+       <list id="agents" interface="org.argeo.slc.runtime.SlcAgent"\r
+               cardinality="0..N">\r
+               <listener ref="vmAgentFactory" bind-method="register"\r
+                       unbind-method="unregister" />\r
+       </list>\r
+\r
        <!-- SERVICES -->\r
        <service ref="modulesManager" interface="org.argeo.slc.execution.ExecutionModulesManager" />\r
 \r
+       <service ref="vmAgentFactory" interface="org.argeo.slc.runtime.SlcAgentFactory">\r
+               <service-properties>\r
+                       <beans:entry key="argeo.slc.jcr.path" value="/slc:system/slc:agents/slc:vm" />\r
+               </service-properties>\r
+       </service>\r
 \r
 </beans:beans>
\ No newline at end of file
index ae0950c6c0b6e05b97310c53acdb24b30ce4997a..4767d7c52f683b6fae46ea9837fbbcec556b7505 100644 (file)
@@ -1,8 +1 @@
 slc.agent.osgi.defaultTimeout=60000
-
-# Disable LOG4J notification to the process
-#slc.agent.log4Notification.disabled=false
-# Notification level
-#slc.agent.log4Notification.level=
-# Do not log sub threads (those started by the process)
-#slc.agent.log4Notification.onlyExecutionThread=false
diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgentFactory.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgentFactory.java
new file mode 100644 (file)
index 0000000..e80db13
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.core.execution;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.runtime.SlcAgent;
+import org.argeo.slc.runtime.SlcAgentFactory;
+
+/** Register agents (typically via OSGi listeners) */
+public class DefaultAgentFactory implements SlcAgentFactory {
+       private final static Log log = LogFactory.getLog(DefaultAgentFactory.class);
+
+       private Map<String, SlcAgent> agents = new HashMap<String, SlcAgent>();
+
+       public SlcAgent getAgent(String uuid) {
+               if (agents.containsKey(uuid))
+                       return agents.get(uuid);
+               else
+                       return null;
+       }
+
+       public void pingAll(List<String> activeAgentIds) {
+               for (SlcAgent agent : agents.values())
+                       agent.ping();
+       }
+
+       public synchronized void register(SlcAgent agent,
+                       Map<String, String> properties) {
+               agents.put(agent.getAgentUuid(), agent);
+               if (log.isDebugEnabled())
+                       log.debug("Agent " + agent.getAgentUuid() + " registered");
+       }
+
+       public synchronized void unregister(SlcAgent agent,
+                       Map<String, String> properties) {
+               agents.remove(agent.getAgentUuid());
+               if (log.isDebugEnabled())
+                       log.debug("Agent " + agent.getAgentUuid() + " unregistered");
+       }
+
+}
index 4347c165eae980f48d88009a76b00c5f9ceb767b..179a081f4d0f86686a9ed3ba88149d52daeb4dad 100644 (file)
@@ -18,9 +18,10 @@ package org.argeo.slc.jcr;
 /** JCR related constants used across SLC */
 public interface SlcJcrConstants {
        public final static String PROPERTY_PATH = "argeo.slc.jcr.path";
-       
+
        public final static String SLC_BASE_PATH = "/" + SlcNames.SLC_SYSTEM;
-       public final static String AGENTS_BASE_PATH = SLC_BASE_PATH + "/slc:agents";
-       public final static String VM_AGENT_FACTORY_PATH = AGENTS_BASE_PATH
-                       + "/slc:vm";
+       public final static String AGENTS_BASE_PATH = SLC_BASE_PATH + "/"
+                       + SlcNames.SLC_AGENTS;
+       public final static String VM_AGENT_FACTORY_PATH = AGENTS_BASE_PATH + "/"
+                       + SlcNames.SLC_VM;
 }
index 9e915984a14b89616fe0cf2d60ee59679c7fc83c..b0f12702fdcbc878c3a3c76a30c6cbea28afedae 100644 (file)
@@ -19,6 +19,9 @@ package org.argeo.slc.jcr;
 public interface SlcNames {
        public final static String SLC_ = "slc:";
 
+       /*
+        * GENERAL
+        */
        public final static String SLC_UUID = "slc:uuid";
        public final static String SLC_STATUS = "slc:status";
        // generic name for result parts of a given test result (slc:testResult)
@@ -29,9 +32,7 @@ public interface SlcNames {
        // slc:check that aggregate status of all result parts of a given test
        // result
        public final static String SLC_AGGREGATED_STATUS = "slc:aggregatedStatus";
-       
-       
-       
+
        public final static String SLC_TYPE = "slc:type";
        public final static String SLC_NAME = "slc:name";
        public final static String SLC_VERSION = "slc:version";
@@ -39,14 +40,20 @@ public interface SlcNames {
        public final static String SLC_ADDRESS = "slc:address";
        public final static String SLC_METADATA = "slc:metadata";
 
+       public final static String SLC_TIMESTAMP = "slc:timestamp";
        public final static String SLC_STARTED = "slc:started";
        public final static String SLC_COMPLETED = "slc:completed";
 
+       public final static String SLC_VM = "slc:vm";
+       /*
+        * SLC RUNTIME
+        */
+       // execution
        public final static String SLC_SPEC = "slc:spec";
        public final static String SLC_EXECUTION_SPECS = "slc:executionSpecs";
        public final static String SLC_FLOW = "slc:flow";
        public final static String SLC_LOG = "slc:log";
-       public final static String SLC_TIMESTAMP = "slc:timestamp";
+       public final static String SLC_AGENTS = "slc:agents";
 
        // spec attribute
        public final static String SLC_IS_IMMUTABLE = "slc:isImmutable";
@@ -72,7 +79,7 @@ public interface SlcNames {
        public final static String SLC_ISSUES = "slc:issues";
 
        /*
-        * REPO
+        * SLC REPO
         */
        // shared
        public final static String SLC_URL = "slc:url";
index 751d8a97d2db20e82e567c6fb4a1a403d1285966..273a6ced29d7138133c30cdd1f2963a55007caf1 100644 (file)
@@ -15,7 +15,6 @@
  */
 package org.argeo.slc.jcr.execution;
 
-import java.util.List;
 import java.util.UUID;
 
 import javax.jcr.Node;
@@ -32,15 +31,12 @@ import org.argeo.slc.execution.ExecutionProcess;
 import org.argeo.slc.jcr.SlcJcrConstants;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
-import org.argeo.slc.runtime.SlcAgent;
-import org.argeo.slc.runtime.SlcAgentFactory;
 
 /** SLC VM agent synchronizing with a JCR repository. */
-public class JcrAgent extends DefaultAgent implements SlcAgentFactory, SlcNames {
+public class JcrAgent extends DefaultAgent implements SlcNames {
        private Repository repository;
 
-       /** only one agent per VM is currently supported */
-       private final String agentNodeName = "default";
+       private String agentNodeName = "default";
 
        /*
         * LIFECYCLE
@@ -85,20 +81,6 @@ public class JcrAgent extends DefaultAgent implements SlcAgentFactory, SlcNames
                                (JcrExecutionProcess) process);
        }
 
-       /*
-        * SLC AGENT FACTORY
-        */
-       public SlcAgent getAgent(String uuid) {
-               if (!uuid.equals(getAgentUuid()))
-                       throw new SlcException("Internal UUID " + getAgentUuid()
-                                       + " is different from argument UUID " + uuid);
-               return this;
-       }
-
-       public void pingAll(List<String> activeAgentIds) {
-               ping();
-       }
-
        /*
         * UTILITIES
         */
@@ -117,4 +99,8 @@ public class JcrAgent extends DefaultAgent implements SlcAgentFactory, SlcNames
                this.repository = repository;
        }
 
+       public void setAgentNodeName(String agentNodeName) {
+               this.agentNodeName = agentNodeName;
+       }
+
 }
index 41353e05260394f2468560b2e3618789420d7fcc..e28c727501a95a91ad74c66c92105e1589a93f34 100644 (file)
@@ -1,4 +1,5 @@
 /*
+
  * Copyright (C) 2007-2012 Argeo GmbH
  *
  * Licensed under the Apache License, Version 2.0 (the "License");