]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java
Start / stop modules
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.jcr / src / main / java / org / argeo / slc / jcr / execution / JcrExecutionModulesListener.java
index 4d0c55cb0ed76e4f2915850e7e8945037a3112d5..90b86f3d327549e76cb2693726795d102532e6c7 100644 (file)
@@ -2,6 +2,7 @@ package org.argeo.slc.jcr.execution;
 
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -20,6 +21,7 @@ import org.argeo.slc.core.execution.RefValueChoice;
 import org.argeo.slc.deploy.ModuleDescriptor;
 import org.argeo.slc.execution.ExecutionFlowDescriptor;
 import org.argeo.slc.execution.ExecutionModulesListener;
+import org.argeo.slc.execution.ExecutionModulesManager;
 import org.argeo.slc.execution.ExecutionSpec;
 import org.argeo.slc.execution.ExecutionSpecAttribute;
 import org.argeo.slc.jcr.SlcJcrUtils;
@@ -32,10 +34,14 @@ import org.argeo.slc.jcr.SlcTypes;
  */
 public class JcrExecutionModulesListener implements ExecutionModulesListener,
                SlcNames {
+       private final static String SLC_EXECUTION_MODRULES_PROPERTY = "slc.executionModules";
+
        private final static Log log = LogFactory
                        .getLog(JcrExecutionModulesListener.class);
        private JcrAgent agent;
 
+       private ExecutionModulesManager modulesManager;
+
        /**
         * We don't use a thread bound session because many different threads will
         * call this critical component and we don't want to login each time. We
@@ -48,6 +54,45 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
         */
        public void init() {
                clearAgent();
+               if (modulesManager != null) {
+                       List<ModuleDescriptor> moduleDescriptors = modulesManager
+                                       .listModules();
+                       String executionModules = System
+                                       .getProperty(SLC_EXECUTION_MODRULES_PROPERTY);
+                       if (executionModules != null)
+                               try {
+                                       Node agentNode = session.getNode(agent.getNodePath());
+                                       for (String executionModule : executionModules.split(",")) {
+                                               for (ModuleDescriptor moduleDescriptor : moduleDescriptors) {
+                                                       String moduleNodeName = SlcJcrUtils
+                                                                       .getModuleNodeName(moduleDescriptor);
+                                                       if (moduleDescriptor.getName().equals(
+                                                                       executionModule)) {
+                                                               Node moduleNode = agentNode
+                                                                               .hasNode(moduleNodeName) ? agentNode
+                                                                               .getNode(moduleNodeName) : agentNode
+                                                                               .addNode(moduleNodeName);
+                                                               moduleNode
+                                                                               .addMixin(SlcTypes.SLC_EXECUTION_MODULE);
+                                                               moduleNode.setProperty(SLC_NAME,
+                                                                               moduleDescriptor.getName());
+                                                               moduleNode.setProperty(SLC_VERSION,
+                                                                               moduleDescriptor.getVersion());
+                                                               moduleNode.setProperty(Property.JCR_TITLE,
+                                                                               moduleDescriptor.getTitle());
+                                                               moduleNode.setProperty(
+                                                                               Property.JCR_DESCRIPTION,
+                                                                               moduleDescriptor.getDescription());
+                                                               moduleNode.setProperty(SLC_STARTED, false);
+                                                       }
+                                               }
+                                       }
+                                       session.save();
+                               } catch (RepositoryException e) {
+                                       JcrUtils.discardQuietly(session);
+                                       throw new SlcException("Cannot initialize modules", e);
+                               }
+               }
        }
 
        public void dispose() {
@@ -86,6 +131,7 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                                        moduleDescriptor.getTitle());
                        moduleNode.setProperty(Property.JCR_DESCRIPTION,
                                        moduleDescriptor.getDescription());
+                       moduleNode.setProperty(SLC_STARTED, true);
                        session.save();
                } catch (RepositoryException e) {
                        JcrUtils.discardQuietly(session);
@@ -99,10 +145,16 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                try {
                        String moduleName = SlcJcrUtils.getModuleNodeName(moduleDescriptor);
                        Node agentNode = session.getNode(agent.getNodePath());
-                       if (agentNode.hasNode(moduleName))
-                               agentNode.getNode(moduleName).remove();
-                       agentNode.getSession().save();
+                       if (agentNode.hasNode(moduleName)) {
+                               Node moduleNode = agentNode.getNode(moduleName);
+                               for (NodeIterator nit = moduleNode.getNodes(); nit.hasNext();) {
+                                       nit.nextNode().remove();
+                               }
+                               moduleNode.setProperty(SLC_STARTED, false);
+                       }
+                       session.save();
                } catch (RepositoryException e) {
+                       JcrUtils.discardQuietly(session);
                        throw new SlcException("Cannot remove module " + moduleDescriptor,
                                        e);
                }
@@ -272,4 +324,8 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                this.session = session;
        }
 
+       public void setModulesManager(ExecutionModulesManager modulesManager) {
+               this.modulesManager = modulesManager;
+       }
+
 }