]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java
Add failOnError property
[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 processThread.notifyError();
47 } finally {
48 processThread.flowCompleted();
49 dispatchAddStep(processThread.getSlcProcess(),
50 new SlcExecutionStep(SlcExecutionStep.TYPE_PHASE_END,
51 "Flow " + flowName));
52 }
53 }
54
55 protected void dispatchAddStep(SlcExecution slcExecution,
56 SlcExecutionStep step) {
57 slcExecution.getSteps().add(step);
58 List<SlcExecutionStep> steps = new ArrayList<SlcExecutionStep>();
59 steps.add(step);
60 for (Iterator<SlcExecutionNotifier> it = processThread
61 .getExecutionModulesManager().getSlcExecutionNotifiers()
62 .iterator(); it.hasNext();) {
63 it.next().addSteps(slcExecution, steps);
64 }
65 }
66
67 }