/*
- * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ * Copyright (C) 2007-2012 Argeo GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.argeo.slc.core.execution;
import java.util.ArrayList;
import org.argeo.slc.execution.ExecutionModulesManager;
import org.argeo.slc.execution.ExecutionProcess;
import org.argeo.slc.execution.ExecutionStep;
-import org.argeo.slc.process.RealizedFlow;
-import org.argeo.slc.process.SlcExecution;
+import org.argeo.slc.execution.RealizedFlow;
+import org.springframework.security.Authentication;
+import org.springframework.security.context.SecurityContextHolder;
-/** Thread of the SLC Process, starting the sub executions. */
-@SuppressWarnings("deprecation")
+/**
+ * Main thread coordinating an {@link ExecutionProcess}, launching parallel or
+ * sequential {@link ExecutionThread}s.
+ */
public class ProcessThread extends Thread {
private final static Log log = LogFactory.getLog(ProcessThread.class);
private Set<ExecutionThread> executionThreads = Collections
.synchronizedSet(new HashSet<ExecutionThread>());
- private Boolean hadAnError = false;
+ // private Boolean hadAnError = false;
private Boolean killed = false;
public ProcessThread(ThreadGroup processesThreadGroup,
super(processesThreadGroup, "SLC Process #" + process.getUuid());
this.executionModulesManager = executionModulesManager;
this.process = process;
- processThreadGroup = new ProcessThreadGroup(executionModulesManager,
- this);
+ processThreadGroup = new ProcessThreadGroup(process);
}
public final void run() {
// authenticate thread
- // Authentication authentication = getProcessThreadGroup()
- // .getAuthentication();
- // if (authentication == null)
- // throw new SlcException("Can only execute authenticated threads");
- // SecurityContextHolder.getContext().setAuthentication(authentication);
+ Authentication authentication = getProcessThreadGroup()
+ .getAuthentication();
+ if (authentication == null)
+ throw new SlcException("Can only execute authenticated threads");
+ SecurityContextHolder.getContext().setAuthentication(authentication);
// log.info("\n##\n## SLC Process #" + process.getUuid() +
// " STARTED by "
// Start logging
new LoggingThread().start();
- String oldStatus = process.getStatus();
+ // String oldStatus = process.getStatus();
process.setStatus(ExecutionProcess.RUNNING);
- executionModulesManager.dispatchUpdateStatus(process, oldStatus,
- ExecutionProcess.RUNNING);
+ // executionModulesManager.dispatchUpdateStatus(process, oldStatus,
+ // ExecutionProcess.RUNNING);
try {
process();
/** Make sure this is called BEFORE all the threads are interrupted. */
private void computeFinalStatus() {
- String oldStatus = process.getStatus();
+ // String oldStatus = process.getStatus();
// TODO: error management at flow level?
if (killed)
process.setStatus(ExecutionProcess.KILLED);
- else if (hadAnError)
+ else if (processThreadGroup.hadAnError())
process.setStatus(ExecutionProcess.ERROR);
else
process.setStatus(ExecutionProcess.COMPLETED);
- executionModulesManager.dispatchUpdateStatus(process, oldStatus,
- process.getStatus());
+ // executionModulesManager.dispatchUpdateStatus(process, oldStatus,
+ // process.getStatus());
log.info("\n## SLC Process #" + process.getUuid() + " "
+ process.getStatus() + "\n");
}
* custom process types. Default expects an {@link SlcExecution}.
*/
protected void process() throws InterruptedException {
- if (!(process instanceof SlcExecution))
- throw new SlcException("Unsupported process type "
- + process.getClass());
- SlcExecution slcExecution = (SlcExecution) process;
List<RealizedFlow> flowsToProcess = new ArrayList<RealizedFlow>();
- flowsToProcess.addAll(slcExecution.getRealizedFlows());
-
+ flowsToProcess.addAll(process.getRealizedFlows());
while (flowsToProcess.size() > 0) {
RealizedFlow realizedFlow = flowsToProcess.remove(0);
execute(realizedFlow, true);
if (killed)
return;
- ExecutionThread thread = new ExecutionThread(this, realizedFlow);
+ ExecutionThread thread = new ExecutionThread(processThreadGroup,
+ executionModulesManager, realizedFlow);
executionThreads.add(thread);
thread.start();
return;
}
- public void notifyError() {
- hadAnError = true;
- }
-
- public synchronized void flowCompleted() {
- // notifyAll();
- }
+// public void notifyError() {
+// hadAnError = true;
+// }
+//
+// public synchronized void flowCompleted() {
+// // notifyAll();
+// }
public ExecutionProcess getProcess() {
return process;