]> 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
Fix execution spec node added twice
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.jcr / src / main / java / org / argeo / slc / jcr / execution / JcrExecutionModulesListener.java
index d108e9dd5b3d6cb7bf3710bbc3681dd4bef0a018..9e866dfc79051f37f303cb5239d30bb4f7d3dcb3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2012 Mathieu Baudier
+ * 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.
@@ -29,7 +29,6 @@ import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.execution.PrimitiveSpecAttribute;
@@ -38,6 +37,7 @@ import org.argeo.slc.core.execution.RefSpecAttribute;
 import org.argeo.slc.core.execution.RefValueChoice;
 import org.argeo.slc.deploy.ModuleDescriptor;
 import org.argeo.slc.execution.ExecutionFlowDescriptor;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
 import org.argeo.slc.execution.ExecutionModulesListener;
 import org.argeo.slc.execution.ExecutionModulesManager;
 import org.argeo.slc.execution.ExecutionSpec;
@@ -76,38 +76,62 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                        session = repository.login();
                        clearAgent();
                        if (modulesManager != null) {
+                               Node agentNode = session.getNode(agent.getNodePath());
+
                                List<ModuleDescriptor> moduleDescriptors = modulesManager
                                                .listModules();
+
+                               // scan SLC-ExecutionModule metadata
+                               for (ModuleDescriptor md : moduleDescriptors) {
+                                       if (md.getMetadata().containsKey(
+                                                       ExecutionModuleDescriptor.SLC_EXECUTION_MODULE)) {
+                                               String moduleNodeName = SlcJcrUtils
+                                                               .getModuleNodeName(md);
+                                               Node moduleNode = agentNode.hasNode(moduleNodeName) ? agentNode
+                                                               .getNode(moduleNodeName) : agentNode
+                                                               .addNode(moduleNodeName);
+                                               moduleNode.addMixin(SlcTypes.SLC_EXECUTION_MODULE);
+                                               moduleNode.setProperty(SLC_NAME, md.getName());
+                                               moduleNode.setProperty(SLC_VERSION, md.getVersion());
+                                               moduleNode.setProperty(Property.JCR_TITLE,
+                                                               md.getTitle());
+                                               moduleNode.setProperty(Property.JCR_DESCRIPTION,
+                                                               md.getDescription());
+                                               moduleNode.setProperty(SLC_STARTED, md.getStarted());
+                                       }
+                               }
+
+                               // scan execution modules property
                                String executionModules = System
                                                .getProperty(SLC_EXECUTION_MODULES_PROPERTY);
                                if (executionModules != null) {
-                                       Node agentNode = session.getNode(agent.getNodePath());
                                        for (String executionModule : executionModules.split(",")) {
-                                               allModules: for (ModuleDescriptor moduleDescriptor : moduleDescriptors) {
+                                               allModules: for (ModuleDescriptor md : moduleDescriptors) {
                                                        String moduleNodeName = SlcJcrUtils
-                                                                       .getModuleNodeName(moduleDescriptor);
-                                                       if (moduleDescriptor.getName().equals(
-                                                                       executionModule)) {
+                                                                       .getModuleNodeName(md);
+                                                       if (md.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_NAME, md.getName());
                                                                moduleNode.setProperty(SLC_VERSION,
-                                                                               moduleDescriptor.getVersion());
+                                                                               md.getVersion());
                                                                moduleNode.setProperty(Property.JCR_TITLE,
-                                                                               moduleDescriptor.getTitle());
+                                                                               md.getTitle());
                                                                moduleNode.setProperty(
                                                                                Property.JCR_DESCRIPTION,
-                                                                               moduleDescriptor.getDescription());
-                                                               moduleNode.setProperty(SLC_STARTED, false);
+                                                                               md.getDescription());
+                                                               moduleNode.setProperty(SLC_STARTED,
+                                                                               md.getStarted());
                                                                break allModules;
                                                        }
                                                }
                                        }
+
+                                       // save if needed
                                        if (session.hasPendingChanges())
                                                session.save();
                                }
@@ -139,8 +163,13 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
        /*
         * EXECUTION MODULES LISTENER
         */
+
        public synchronized void executionModuleAdded(
                        ModuleDescriptor moduleDescriptor) {
+               syncExecutionModule(moduleDescriptor);
+       }
+
+       protected void syncExecutionModule(ModuleDescriptor moduleDescriptor) {
                try {
                        Node agentNode = session.getNode(agent.getNodePath());
                        String moduleNodeName = SlcJcrUtils
@@ -155,13 +184,12 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                                        moduleDescriptor.getTitle());
                        moduleNode.setProperty(Property.JCR_DESCRIPTION,
                                        moduleDescriptor.getDescription());
-                       moduleNode.setProperty(SLC_STARTED, true);
+                       moduleNode.setProperty(SLC_STARTED, moduleDescriptor.getStarted());
                        session.save();
                } catch (RepositoryException e) {
                        JcrUtils.discardQuietly(session);
-                       throw new SlcException("Cannot add module " + moduleDescriptor, e);
+                       throw new SlcException("Cannot sync module " + moduleDescriptor, e);
                }
-
        }
 
        public synchronized void executionModuleRemoved(
@@ -215,8 +243,9 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                        String relativePath, ExecutionFlowDescriptor efd)
                        throws RepositoryException {
                Node flowNode = null;
-               Iterator<String> names = Arrays.asList(relativePath.split("/"))
-                               .iterator();
+               List<String> pathTokens = Arrays.asList(relativePath.split("/"));
+
+               Iterator<String> names = pathTokens.iterator();
                // create intermediary paths
                Node currNode = moduleNode;
                while (names.hasNext()) {
@@ -234,8 +263,7 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
 
                // name, description
                flowNode.setProperty(SLC_NAME, efd.getName());
-               String[] tokens = relativePath.split("/");
-               String endName = tokens[tokens.length - 1];
+               String endName = pathTokens.get(pathTokens.size() - 1);
                flowNode.setProperty(Property.JCR_TITLE, endName);
                if (efd.getDescription() != null
                                && !efd.getDescription().trim().equals("")) {
@@ -247,7 +275,11 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                // execution spec
                ExecutionSpec executionSpec = efd.getExecutionSpec();
                String esName = executionSpec.getName();
-               if (!(esName == null || esName.equals(ExecutionSpec.INTERNAL_NAME))) {
+               if (esName == null || esName.equals(ExecutionSpec.INTERNAL_NAME)
+                               || esName.contains("#")/* automatically generated bean name */) {
+                       // internal spec node
+                       mapExecutionSpec(flowNode, executionSpec);
+               } else {
                        // reference spec node
                        Node executionSpecsNode = moduleNode.hasNode(SLC_EXECUTION_SPECS) ? moduleNode
                                        .getNode(SLC_EXECUTION_SPECS) : moduleNode
@@ -262,18 +294,18 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                                                executionSpec.getDescription());
                        mapExecutionSpec(executionSpecNode, executionSpec);
                        flowNode.setProperty(SLC_SPEC, executionSpecNode);
-               } else {
-                       // internal spec node
-                       mapExecutionSpec(flowNode, executionSpec);
                }
 
                // values
                for (String attr : efd.getValues().keySet()) {
                        ExecutionSpecAttribute esa = executionSpec.getAttributes()
                                        .get(attr);
+                       if (!flowNode.hasNode(attr))
+                               throw new SlcException("No spec node for attribute '" + attr
+                                               + "' in flow " + flowNode.getPath());
                        if (esa instanceof PrimitiveSpecAttribute) {
                                PrimitiveSpecAttribute psa = (PrimitiveSpecAttribute) esa;
-                               Node valueNode = flowNode.addNode(attr);
+                               Node valueNode = flowNode.getNode(attr);
                                valueNode.setProperty(SLC_TYPE, psa.getType());
                                SlcJcrUtils.setPrimitiveAsProperty(valueNode, SLC_VALUE,
                                                (PrimitiveValue) efd.getValues().get(attr));