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%2FJcrProcessThread.java;h=4f7af507a6ae3ae8163cf096782d5a68c67e6857;hb=659b2045881a49a5987c1e03a41e07799aeda4a8;hp=34685fff0973a9c01e6c33048e86bebe3ce24ac4;hpb=a181e3d059185a9dc108e81f38c66f48f4e4aac8;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java index 34685fff0..4f7af507a 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java @@ -1,40 +1,82 @@ package org.argeo.slc.jcr.execution; +import java.util.HashMap; +import java.util.Map; + import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.RepositoryException; import org.argeo.ArgeoException; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.execution.DefaultExecutionSpec; +import org.argeo.slc.core.execution.PrimitiveSpecAttribute; +import org.argeo.slc.core.execution.PrimitiveUtils; import org.argeo.slc.core.execution.ProcessThread; +import org.argeo.slc.core.execution.RefSpecAttribute; import org.argeo.slc.execution.ExecutionFlowDescriptor; import org.argeo.slc.execution.ExecutionModulesManager; +import org.argeo.slc.execution.ExecutionProcess; +import org.argeo.slc.execution.ExecutionSpecAttribute; import org.argeo.slc.jcr.SlcJcrUtils; import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; import org.argeo.slc.process.RealizedFlow; +/** Where the actual execution takes place */ public class JcrProcessThread extends ProcessThread implements SlcNames { - public JcrProcessThread(ExecutionModulesManager executionModulesManager, + public JcrProcessThread(ThreadGroup processesThreadGroup, + ExecutionModulesManager executionModulesManager, JcrExecutionProcess process) { - super(executionModulesManager, process); + super(processesThreadGroup, executionModulesManager, process); } @Override - protected void process() { + protected void process() throws InterruptedException { try { - Node realizedFlowNode = getNode().getNode(SLC_FLOW); + Node rootRealizedFlowNode = getNode().getNode(SLC_FLOW); // we just manage one level for the time being - NodeIterator nit = realizedFlowNode.getNodes(SLC_FLOW); + NodeIterator nit = rootRealizedFlowNode.getNodes(SLC_FLOW); while (nit.hasNext()) { - process(nit.nextNode()); + Node realizedFlowNode = nit.nextNode(); + + // set status on realized flow + realizedFlowNode.setProperty(SLC_STATUS, + ExecutionProcess.RUNNING); + realizedFlowNode.getSession().save(); + try { + execute(realizedFlowNode); + + // set status on realized flow + realizedFlowNode.setProperty(SLC_STATUS, + ExecutionProcess.COMPLETED); + realizedFlowNode.getSession().save(); + } catch (RepositoryException e) { + throw e; + } catch (InterruptedException e) { + // set status on realized flow + realizedFlowNode.setProperty(SLC_STATUS, + ExecutionProcess.KILLED); + realizedFlowNode.getSession().save(); + throw e; + } catch (RuntimeException e) { + // set status on realized flow + realizedFlowNode.setProperty(SLC_STATUS, + ExecutionProcess.ERROR); + realizedFlowNode.getSession().save(); + throw e; + } } } catch (RepositoryException e) { throw new ArgeoException("Cannot process " + getNode(), e); } } - protected void process(Node realizedFlowNode) throws RepositoryException { + /** Configure the realized flows */ + protected void execute(Node realizedFlowNode) throws RepositoryException, + InterruptedException { if (realizedFlowNode.hasNode(SLC_ADDRESS)) { String flowPath = realizedFlowNode.getNode(SLC_ADDRESS) .getProperty(Property.JCR_PATH).getString(); @@ -52,11 +94,85 @@ public class JcrProcessThread extends ProcessThread implements SlcNames { realizedFlow.setModuleName(executionModuleName); realizedFlow.setModuleVersion(executionModuleVersion); + // retrieve execution spec + DefaultExecutionSpec executionSpec = new DefaultExecutionSpec(); + Map attrs = readExecutionSpecAttributes(realizedFlowNode); + executionSpec.setAttributes(attrs); + + // set execution spec name + if (flowNode.hasProperty(SlcNames.SLC_SPEC)) { + Node executionSpecNode = flowNode.getProperty(SLC_SPEC) + .getNode(); + executionSpec.setBeanName(executionSpecNode.getProperty( + SLC_NAME).getString()); + } + + // explicitly retrieve values + Map values = new HashMap(); + for (String attrName : attrs.keySet()) { + ExecutionSpecAttribute attr = attrs.get(attrName); + Object value = attr.getValue(); + values.put(attrName, value); + } + ExecutionFlowDescriptor efd = new ExecutionFlowDescriptor(flowName, - null, null); + values, executionSpec); realizedFlow.setFlowDescriptor(efd); + // + // EXECUTE THE FLOW + // execute(realizedFlow, true); + // + } + } + + protected Map readExecutionSpecAttributes( + Node node) { + try { + Map attrs = new HashMap(); + for (NodeIterator nit = node.getNodes(); nit.hasNext();) { + Node specAttrNode = nit.nextNode(); + if (specAttrNode + .isNodeType(SlcTypes.SLC_PRIMITIVE_SPEC_ATTRIBUTE)) { + String type = specAttrNode.getProperty(SLC_TYPE) + .getString(); + Object value = null; + if (specAttrNode.hasProperty(SLC_VALUE)) { + String valueStr = specAttrNode.getProperty(SLC_VALUE) + .getString(); + value = PrimitiveUtils.convert(type, valueStr); + } + PrimitiveSpecAttribute specAttr = new PrimitiveSpecAttribute( + type, value); + attrs.put(specAttrNode.getName(), specAttr); + } else if (specAttrNode + .isNodeType(SlcTypes.SLC_REF_SPEC_ATTRIBUTE)) { + if (!specAttrNode.hasProperty(SLC_VALUE)) { + continue; + } + Integer value = (int) specAttrNode.getProperty(SLC_VALUE) + .getLong(); + RefSpecAttribute specAttr = new RefSpecAttribute(); + NodeIterator children = specAttrNode.getNodes(); + int index = 0; + String id = null; + while (children.hasNext()) { + Node child = children.nextNode(); + if (index == value) + id = child.getName(); + index++; + } + specAttr.setValue(id); + attrs.put(specAttrNode.getName(), specAttr); + } + // throw new SlcException("Unsupported spec attribute " + // + specAttrNode); + } + return attrs; + } catch (RepositoryException e) { + throw new SlcException("Cannot read spec attributes from " + node, + e); } }