X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2Finternal%2FExecutionThread.java;fp=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2Finternal%2FExecutionThread.java;h=043f74bc7fa281e38812dda051f8bf11ef4e8a54;hb=1535eecc68ecbda4e67e158de6bcecd074db2545;hp=0000000000000000000000000000000000000000;hpb=059e4072088fe6a035d4236f69efa0540943098c;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/internal/ExecutionThread.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/internal/ExecutionThread.java new file mode 100644 index 000000000..043f74bc7 --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/internal/ExecutionThread.java @@ -0,0 +1,66 @@ +package org.argeo.slc.core.execution.internal; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.execution.ExecutionFlowDescriptor; +import org.argeo.slc.process.RealizedFlow; +import org.argeo.slc.process.SlcExecution; +import org.argeo.slc.process.SlcExecutionNotifier; +import org.argeo.slc.process.SlcExecutionStep; + +/** Thread of a single execution */ +public class ExecutionThread extends Thread { + private final static Log log = LogFactory.getLog(ExecutionThread.class); + + private final RealizedFlow realizedFlow; + private final ProcessThread processThread; + + public ExecutionThread(ProcessThread processThread, + RealizedFlow realizedFlow) { + super(processThread.getProcessThreadGroup(), "Flow " + + realizedFlow.getFlowDescriptor().getName()); + this.realizedFlow = realizedFlow; + this.processThread = processThread; + } + + public void run() { + ExecutionFlowDescriptor executionFlowDescriptor = realizedFlow + .getFlowDescriptor(); + String flowName = executionFlowDescriptor.getName(); + + dispatchAddStep(processThread.getSlcProcess(), new SlcExecutionStep( + SlcExecutionStep.TYPE_PHASE_START, "Flow " + flowName)); + + try { + processThread.getExecutionModulesManager().execute(realizedFlow); + } catch (Exception e) { + // TODO: re-throw exception ? + String msg = "Execution of flow " + flowName + " failed."; + log.error(msg, e); + dispatchAddStep(processThread.getSlcProcess(), + new SlcExecutionStep(msg + " " + e.getMessage())); + } finally { + processThread.flowCompleted(); + dispatchAddStep(processThread.getSlcProcess(), + new SlcExecutionStep(SlcExecutionStep.TYPE_PHASE_END, + "Flow " + flowName)); + } + } + + protected void dispatchAddStep(SlcExecution slcExecution, + SlcExecutionStep step) { + slcExecution.getSteps().add(step); + List steps = new ArrayList(); + steps.add(step); + for (Iterator it = processThread + .getExecutionModulesManager().getSlcExecutionNotifiers() + .iterator(); it.hasNext();) { + it.next().addSteps(slcExecution, steps); + } + } + +}