]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java
Modular distributions
[gpl/argeo-slc.git] / runtime / org.argeo.slc.core / src / main / java / org / argeo / slc / core / execution / ExecutionThread.java
1 package org.argeo.slc.core.execution;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.argeo.slc.execution.ExecutionFlowDescriptor;
10 import org.argeo.slc.process.RealizedFlow;
11 import org.argeo.slc.process.SlcExecution;
12 import org.argeo.slc.process.SlcExecutionNotifier;
13 import org.argeo.slc.process.SlcExecutionStep;
14
15 /** Thread of a single execution */
16 public class ExecutionThread extends Thread {
17 private final static Log log = LogFactory.getLog(ExecutionThread.class);
18
19 private final RealizedFlow realizedFlow;
20 private final ProcessThread processThread;
21
22 public ExecutionThread(ProcessThread processThread,
23 RealizedFlow realizedFlow) {
24 super(processThread.getProcessThreadGroup(), "Flow "
25 + realizedFlow.getFlowDescriptor().getName());
26 this.realizedFlow = realizedFlow;
27 this.processThread = processThread;
28 }
29
30 public void run() {
31 ExecutionFlowDescriptor executionFlowDescriptor = realizedFlow
32 .getFlowDescriptor();
33 String flowName = executionFlowDescriptor.getName();
34
35 dispatchAddStep(processThread.getSlcProcess(), new SlcExecutionStep(
36 SlcExecutionStep.TYPE_PHASE_START, "Flow " + flowName));
37
38 try {
39 processThread.getExecutionModulesManager().execute(realizedFlow);
40 } catch (Exception e) {
41 // TODO: re-throw exception ?
42 String msg = "Execution of flow " + flowName + " failed.";
43 log.error(msg, e);
44 dispatchAddStep(processThread.getSlcProcess(),
45 new SlcExecutionStep(msg + " " + e.getMessage()));
46 } finally {
47 processThread.flowCompleted();
48 dispatchAddStep(processThread.getSlcProcess(),
49 new SlcExecutionStep(SlcExecutionStep.TYPE_PHASE_END,
50 "Flow " + flowName));
51 }
52 }
53
54 protected void dispatchAddStep(SlcExecution slcExecution,
55 SlcExecutionStep step) {
56 slcExecution.getSteps().add(step);
57 List<SlcExecutionStep> steps = new ArrayList<SlcExecutionStep>();
58 steps.add(step);
59 for (Iterator<SlcExecutionNotifier> it = processThread
60 .getExecutionModulesManager().getSlcExecutionNotifiers()
61 .iterator(); it.hasNext();) {
62 it.next().addSteps(slcExecution, steps);
63 }
64 }
65
66 }