]> git.argeo.org Git - gpl/argeo-slc.git/blob - sandbox/argeo.slc.executionflow/src/main/java/org/argeo/slc/executionflow/Executor.java
Introduce executor and event notifications
[gpl/argeo-slc.git] / sandbox / argeo.slc.executionflow / src / main / java / org / argeo / slc / executionflow / Executor.java
1 package org.argeo.slc.executionflow;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.argeo.slc.process.SlcExecution;
6 import org.springframework.beans.BeansException;
7 import org.springframework.context.ApplicationContext;
8 import org.springframework.context.ApplicationContextAware;
9 import org.springframework.context.ApplicationEvent;
10 import org.springframework.context.ApplicationListener;
11
12 public class Executor implements ApplicationListener, ApplicationContextAware {
13 private final static Log log = LogFactory.getLog(Executor.class);
14
15 private ApplicationContext applicationContext;
16
17 public void onApplicationEvent(ApplicationEvent event) {
18 if (event instanceof NewExecutionEvent) {
19 SlcExecution slcExecution = ((NewExecutionEvent) event)
20 .getSlcExecution();
21 ExecutionContext executionContext = new ExecutionContext();
22 ExecutionThread thread = new ExecutionThread(executionContext,
23 slcExecution);
24 thread.start();
25 }
26
27 }
28
29 public void setApplicationContext(ApplicationContext applicationContext)
30 throws BeansException {
31 this.applicationContext = applicationContext;
32 }
33
34 private class ExecutionThread extends Thread {
35 private final SlcExecution slcExecution;
36 private final ExecutionContext executionContext;
37
38 public ExecutionThread(ExecutionContext executionContext,
39 SlcExecution slcExecution) {
40 super("SLC Execution #" + executionContext.getUuid());
41 this.slcExecution = slcExecution;
42 this.executionContext = executionContext;
43 }
44
45 public void run() {
46 // Initialize from SlcExecution
47 ExecutionContext.registerExecutionContext(executionContext);
48 ExecutionContext.getVariables()
49 .putAll(slcExecution.getAttributes());
50
51 try {
52 log
53 .info("Start execution #"
54 + ExecutionContext.getExecutionUuid());
55 String executionBean = slcExecution.getAttributes().get(
56 "slc.flows");
57 ExecutionFlow main = (ExecutionFlow) applicationContext
58 .getBean(executionBean);
59 main.execute();
60 } finally {
61 applicationContext.publishEvent(new ExecutionFinishedEvent(
62 this, executionContext));
63 }
64
65 }
66 }
67
68 }