/*
- * 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);
-
- // log.info("\n##\n## SLC Process #" + process.getUuid() +
- // " STARTED by "
- // + authentication.getName() + "\n##\n");
+ 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\n##\n");
// Start logging
new LoggingThread().start();
- String oldStatus = process.getStatus();
process.setStatus(ExecutionProcess.RUNNING);
- executionModulesManager.dispatchUpdateStatus(process, oldStatus,
- ExecutionProcess.RUNNING);
-
try {
process();
} catch (InterruptedException e) {
die();
return;
+ } catch (Exception e) {
+ String msg = "Process " + getProcess().getUuid()
+ + " failed unexpectedly.";
+ log.error(msg, e);
+ getProcessThreadGroup().dispatchAddStep(
+ new ExecutionStep("Process", ExecutionStep.ERROR, msg + " "
+ + e.getMessage()));
}
// waits for all execution threads to complete (in case they were
/** 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;