X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fcontrollers%2FProcessController.java;h=328282c54921bb094d29b7671c4954fc6cc6fb3b;hb=0e2ff188c2e8ffac85739cccc3925e8bd82d7be9;hp=311b64ac0ce991a113f2470cfbb1ba5e91c4a965;hpb=a857d591b8658b2f94ec9398b94e9447f130eb9d;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/controllers/ProcessController.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/controllers/ProcessController.java index 311b64ac0..328282c54 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/controllers/ProcessController.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/controllers/ProcessController.java @@ -1,25 +1,83 @@ package org.argeo.slc.client.ui.controllers; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.SlcException; +import org.argeo.slc.execution.ExecutionProcess; +import org.argeo.slc.jcr.SlcJcrConstants; +import org.argeo.slc.jcr.SlcJcrUtils; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.execution.JcrExecutionProcess; import org.argeo.slc.runtime.SlcAgent; -import org.argeo.slc.services.SlcExecutionService; +import org.argeo.slc.runtime.SlcAgentFactory; +/** + * We use a separate class (not in UI components) so that it can be a singleton + * in an application context. + */ public class ProcessController { private final static Log log = LogFactory.getLog(ProcessController.class); - private SlcExecutionService slcExecutionService; + private Map agentFactories = new HashMap(); - public void execute(SlcAgent agent, SlcExecution slcExecution) { - slcExecutionService.newExecution(slcExecution); - agent.runSlcExecution(slcExecution); - if (log.isDebugEnabled()) - log.debug("SlcExcution " + slcExecution.getUuid() - + " launched on Agent " + agent.toString()); + public ExecutionProcess process(Node processNode) { + JcrExecutionProcess process = new JcrExecutionProcess(processNode); + try { + // we currently only deal with single agents + Node realizedFlowNode = processNode.getNode(SlcNames.SLC_FLOW); + NodeIterator nit = realizedFlowNode.getNodes(); + if (nit.hasNext()) { + // TODO find a better way to determine which agent to use + // currently we check the agent of the first registered flow + Node firstRealizedFlow = nit.nextNode(); + // we assume there is an nt:address + String firstFlowPath = firstRealizedFlow + .getNode(SlcNames.SLC_ADDRESS) + .getProperty(Property.JCR_PATH).getString(); + Node flowNode = processNode.getSession().getNode(firstFlowPath); + String agentFactoryPath = SlcJcrUtils + .flowAgentFactoryPath(firstFlowPath); + if (!agentFactories.containsKey(agentFactoryPath)) + throw new SlcException("No agent factory registered under " + + agentFactoryPath); + SlcAgentFactory agentFactory = agentFactories + .get(agentFactoryPath); + Node agentNode = ((Node) flowNode + .getAncestor(SlcJcrUtils.AGENT_FACTORY_DEPTH + 1)); + String agentUuid = agentNode.getProperty(SlcNames.SLC_UUID) + .getString(); + + // process + SlcAgent slcAgent = agentFactory.getAgent(agentUuid); + slcAgent.process(process); + } + return process; + } catch (Exception e) { + if (!process.getStatus().equals(ExecutionProcess.ERROR)) + process.setStatus(ExecutionProcess.ERROR); + throw new SlcException("Cannot execute " + processNode, e); + } } - public void setSlcExecutionService(SlcExecutionService slcExecutionService) { - this.slcExecutionService = slcExecutionService; + public synchronized void register(SlcAgentFactory agentFactory, + Map properties) { + String path = properties.get(SlcJcrConstants.PROPERTY_PATH); + if (log.isDebugEnabled()) + log.debug("Agent factory registered under " + path); + agentFactories.put(path, agentFactory); } + public synchronized void unregister(SlcAgentFactory agentFactory, + Map properties) { + String path = properties.get(SlcJcrConstants.PROPERTY_PATH); + if (log.isDebugEnabled()) + log.debug("Agent factory unregistered from " + path); + agentFactories.remove(path); + } }