+ public void process(SlcExecution slcExecution) {
+ new ProcessThread(slcExecution).start();
+ }
+
+ protected void dispatchUpdateStatus(SlcExecution slcExecution,
+ String oldStatus, String newStatus) {
+ for (Iterator<SlcExecutionNotifier> it = slcExecutionNotifiers
+ .iterator(); it.hasNext();) {
+ it.next().updateStatus(slcExecution, oldStatus, newStatus);
+ }
+ }
+
+ public void setSlcExecutionNotifiers(
+ List<SlcExecutionNotifier> slcExecutionNotifiers) {
+ this.slcExecutionNotifiers = slcExecutionNotifiers;
+ }
+
+ private class ProcessThread extends Thread {
+ private final SlcExecution slcExecution;
+ private final List<RealizedFlow> flowsToProcess = new ArrayList<RealizedFlow>();
+
+ public ProcessThread(SlcExecution slcExecution) {
+ this.slcExecution = slcExecution;
+ }
+
+ public void run() {
+ log.info("\n##\n## Process SLC Execution " + slcExecution
+ + "\n##\n");
+
+ // FIXME: hack to let the SlcExecution be registered on server
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e1) {
+ // silent
+ }
+
+ slcExecution.setStatus(SlcExecution.STATUS_RUNNING);
+ dispatchUpdateStatus(slcExecution, SlcExecution.STATUS_SCHEDULED,
+ SlcExecution.STATUS_RUNNING);
+
+ flowsToProcess.addAll(slcExecution.getRealizedFlows());
+
+ while (flowsToProcess.size() > 0) {
+ RealizedFlow flow = flowsToProcess.remove(0);
+ ExecutionModule module = getExecutionModule(flow
+ .getModuleName(), flow.getModuleVersion());
+ if (module != null) {
+ ExecutionThread thread = new ExecutionThread(this, flow
+ .getFlowDescriptor(), module);
+ thread.start();
+ } else {
+ throw new SlcException("ExecutionModule "
+ + flow.getModuleName() + ", version "
+ + flow.getModuleVersion() + " not found.");
+ }
+
+ synchronized (this) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ // silent
+ }
+ }
+ }
+
+ slcExecution.setStatus(SlcExecution.STATUS_RUNNING);
+ dispatchUpdateStatus(slcExecution, SlcExecution.STATUS_RUNNING,
+ SlcExecution.STATUS_FINISHED);
+ /*
+ * for (RealizedFlow flow : slcExecution.getRealizedFlows()) {
+ * ExecutionModule module = getExecutionModule(flow.getModuleName(),
+ * flow.getModuleVersion()); if (module != null) { ExecutionThread
+ * thread = new ExecutionThread(flow .getFlowDescriptor(), module);
+ * thread.start(); } else { throw new
+ * SlcException("ExecutionModule " + flow.getModuleName() +
+ * ", version " + flow.getModuleVersion() + " not found."); } }
+ */
+ }
+
+ public synchronized void flowCompleted() {
+ notifyAll();
+ }
+ }
+
+ private class ExecutionThread extends Thread {
+ private final ExecutionFlowDescriptor executionFlowDescriptor;
+ private final ExecutionModule executionModule;
+ private final ProcessThread processThread;
+
+ public ExecutionThread(ProcessThread processThread,
+ ExecutionFlowDescriptor executionFlowDescriptor,
+ ExecutionModule executionModule) {
+ super("SLC Execution #" /* + executionContext.getUuid() */);
+ this.executionFlowDescriptor = executionFlowDescriptor;
+ this.executionModule = executionModule;
+ this.processThread = processThread;
+ }
+
+ public void run() {
+ try {
+ executionModule.execute(executionFlowDescriptor);
+ } catch (Exception e) {
+ // TODO: re-throw exception ?
+ log.error("Execution "/* + executionContext.getUuid() */
+ + " failed.", e);
+ } finally {
+ processThread.flowCompleted();
+ }
+ }
+ }