import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.process.SlcExecution;
import org.argeo.slc.runtime.SlcAgent;
import org.argeo.slc.runtime.SlcAgentFactory;
-import org.argeo.slc.services.SlcExecutionService;
+/**
+ * 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<String, SlcAgentFactory> agentFactories = new HashMap<String, SlcAgentFactory>();
- public void execute(SlcAgent agent, SlcExecution slcExecution) {
- slcExecutionService.newExecution(slcExecution);
- agent.process(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 {
+ SlcAgent slcAgent = findAgent(processNode);
+ if (slcAgent == null)
+ throw new SlcException("Cannot find agent for " + processNode);
+ 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 process(Node processNode) {
+ public void kill(Node processNode) {
+ JcrExecutionProcess process = new JcrExecutionProcess(processNode);
try {
- // we currently only deal with single agents
- Node flowNode = processNode.getNode(SlcNames.SLC_FLOW);
- NodeIterator nit = flowNode.getNodes();
- if (nit.hasNext()) {
- Node firstFlow = nit.nextNode();
- // we assume there is an nt:address
- String firstFlowPath = firstFlow.getNode(SlcNames.SLC_ADDRESS)
- .getProperty(Property.JCR_PATH).getString();
- String agentFactoryPath = SlcJcrUtils
- .flowAgentFactoryPath(firstFlowPath);
- if (!agentFactories.containsKey(agentFactoryPath))
- throw new SlcException("No agent factory registered under "
- + agentFactoryPath);
- SlcAgentFactory agentFactory = agentFactories
- .get(agentFactoryPath);
- String agentUuid = ((Node) processNode
- .getAncestor(SlcJcrUtils.AGENT_FACTORY_DEPTH + 1))
- .getName();
-
- // process
- SlcAgent slcAgent = agentFactory.getAgent(agentUuid);
- slcAgent.process(new JcrExecutionProcess(processNode));
- }
- } catch (RepositoryException e) {
+ SlcAgent slcAgent = findAgent(processNode);
+ if (slcAgent == null)
+ throw new SlcException("Cannot find agent for " + processNode);
+ slcAgent.kill(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;
+ protected SlcAgent findAgent(Node processNode) throws RepositoryException {
+ // 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
+ return agentFactory.getAgent(agentUuid);
+ }
+ return null;
}
public synchronized void register(SlcAgentFactory agentFactory,