X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FExecutionThread.java;h=bf92c1c60afd02adaba2b182c3051d7172e57218;hb=9610da4b60d2b6d9e135d1b5a3d801e82701f73f;hp=e946fe133e5a351dd53274649efa0706de50dec6;hpb=74904a755b5b344238eafa798419b80c5e74f7ed;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java index e946fe133..bf92c1c60 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/ExecutionThread.java @@ -15,11 +15,17 @@ */ package org.argeo.slc.core.execution; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; import org.argeo.slc.execution.ExecutionFlowDescriptor; import org.argeo.slc.execution.ExecutionStep; -import org.argeo.slc.process.RealizedFlow; +import org.argeo.slc.execution.RealizedFlow; +import org.springframework.security.Authentication; +import org.springframework.security.context.SecurityContextHolder; /** Thread of a single execution */ public class ExecutionThread extends Thread { @@ -30,6 +36,8 @@ public class ExecutionThread extends Thread { private final RealizedFlow realizedFlow; private final ProcessThread processThread; + private List destructionCallbacks = new ArrayList(); + public ExecutionThread(ProcessThread processThread, RealizedFlow realizedFlow) { super(processThread.getProcessThreadGroup(), "Flow " @@ -40,17 +48,11 @@ public class ExecutionThread extends Thread { public void run() { // authenticate thread -// Authentication authentication = getProcessThreadGroup() -// .getAuthentication(); -// if (authentication == null) -// throw new SlcException("Can only execute authenticated threads"); -// SecurityContextHolder.getContext().setAuthentication(authentication); - - if (getContextClassLoader() != null) { - if (log.isTraceEnabled()) - log.trace("Context class loader set to " - + getContextClassLoader()); - } + Authentication authentication = getProcessThreadGroup() + .getAuthentication(); + if (authentication == null) + throw new SlcException("Can only execute authenticated threads"); + SecurityContextHolder.getContext().setAuthentication(authentication); // Retrieve execution flow descriptor ExecutionFlowDescriptor executionFlowDescriptor = realizedFlow @@ -81,6 +83,7 @@ public class ExecutionThread extends Thread { processThread.flowCompleted(); dispatchAddStep(new ExecutionStep(realizedFlow.getModuleName(), ExecutionStep.PHASE_END, "Flow " + flowName)); + processDestructionCallbacks(); } } @@ -88,6 +91,25 @@ public class ExecutionThread extends Thread { processThread.getProcessThreadGroup().dispatchAddStep(step); } + private synchronized void processDestructionCallbacks() { + for (int i = destructionCallbacks.size() - 1; i >= 0; i--) { + try { + destructionCallbacks.get(i).run(); + } catch (Exception e) { + log.warn("Could not process destruction callback " + i + + " in thread " + getName(), e); + } + } + } + + /** + * Gather object destruction callback to be called in reverse order at the + * end of the thread + */ + synchronized void registerDestructionCallback(String name, Runnable callback) { + destructionCallbacks.add(callback); + } + protected ProcessThreadGroup getProcessThreadGroup() { return processThread.getProcessThreadGroup(); }