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=9e866dfc79051f37f303cb5239d30bb4f7d3dcb3;hb=ce8f53763eec2a2b9e15e97f2eaa8468b551ea31;hp=d108e9dd5b3d6cb7bf3710bbc3681dd4bef0a018;hpb=74904a755b5b344238eafa798419b80c5e74f7ed;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 d108e9dd5..9e866dfc7 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 @@ -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 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 names = Arrays.asList(relativePath.split("/")) - .iterator(); + List pathTokens = Arrays.asList(relativePath.split("/")); + + Iterator 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));