X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fjcr%2Fexecution%2FJcrExecutionModulesListener.java;h=8543689294323ff8e0c3f24c59b7fea830b6b0d3;hb=26cd9f658531888bfa9ba69ea5c034839b4c4149;hp=f98611079dc2684ffd42d200c349714481d60700;hpb=86c47402780f41526382267ff1597d2f3a0d0dd7;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java index f98611079..854368929 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java @@ -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; @@ -15,11 +16,13 @@ import org.apache.commons.logging.LogFactory; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.core.execution.PrimitiveSpecAttribute; +import org.argeo.slc.core.execution.PrimitiveValue; 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.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 +35,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 +55,45 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, */ public void init() { clearAgent(); + if (modulesManager != null) { + List 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 +132,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 +146,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); } @@ -155,6 +208,8 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, SlcTypes.SLC_EXECUTION_FLOW); } } + + // name, description flowNode.setProperty(SLC_NAME, efd.getName()); String[] tokens = relativePath.split("/"); flowNode.setProperty(Property.JCR_TITLE, tokens[tokens.length - 1]); @@ -166,6 +221,7 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, ExecutionSpec executionSpec = efd.getExecutionSpec(); String esName = executionSpec.getName(); if (!(esName == null || esName.equals(ExecutionSpec.INTERNAL_NAME))) { + // reference spec node Node executionSpecsNode = moduleNode.hasNode(SLC_EXECUTION_SPECS) ? moduleNode .getNode(SLC_EXECUTION_SPECS) : moduleNode .addNode(SLC_EXECUTION_SPECS); @@ -180,8 +236,25 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, mapExecutionSpec(executionSpecNode, executionSpec); flowNode.setProperty(SLC_SPEC, executionSpecNode); } else { + // internal spec node mapExecutionSpec(flowNode, executionSpec); } + + // values + for (String attr : efd.getValues().keySet()) { + if (log.isDebugEnabled()) + log.debug(attr + "=" + efd.getValues().get(attr)); + ExecutionSpecAttribute esa = executionSpec.getAttributes() + .get(attr); + if (esa instanceof PrimitiveSpecAttribute) { + PrimitiveSpecAttribute psa = (PrimitiveSpecAttribute) esa; + Node valueNode = flowNode.addNode(attr); + valueNode.setProperty(SLC_TYPE, psa.getType()); + SlcJcrUtils.setPrimitiveAsProperty(valueNode, SLC_VALUE, + (PrimitiveValue) efd.getValues().get(attr)); + } + } + return flowNode; } @@ -255,6 +328,8 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, // we assume that it is more than one char long if (relativePath.charAt(0) == '/') relativePath = relativePath.substring(1); + // FIXME quick hack to avoid duplicate '/' + relativePath = relativePath.replaceAll("//", "/"); return relativePath; } @@ -270,4 +345,8 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, this.session = session; } + public void setModulesManager(ExecutionModulesManager modulesManager) { + this.modulesManager = modulesManager; + } + }