X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.core%2Fsrc%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FProcessThread.java;h=926789677165b760d56d5519a5e3b0ea96ef04cc;hb=f13697a39e4e56f0d99632307f5531b1f07d7f45;hp=b17e478f7a172fe458afa2b47d173b9400cdb743;hpb=c4282a516108d936112fbd4b91291563ec30a5e4;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.core/src/org/argeo/slc/core/execution/ProcessThread.java b/org.argeo.slc.core/src/org/argeo/slc/core/execution/ProcessThread.java index b17e478f7..926789677 100644 --- a/org.argeo.slc.core/src/org/argeo/slc/core/execution/ProcessThread.java +++ b/org.argeo.slc.core/src/org/argeo/slc/core/execution/ProcessThread.java @@ -15,14 +15,21 @@ */ package org.argeo.slc.core.execution; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.security.auth.Subject; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.execution.ExecutionProcess; import org.argeo.slc.execution.ExecutionStep; @@ -39,48 +46,64 @@ public class ProcessThread extends Thread { private final ExecutionProcess process; private final ProcessThreadGroup processThreadGroup; - private Set executionThreads = Collections - .synchronizedSet(new HashSet()); + private Set executionThreads = Collections.synchronizedSet(new HashSet()); // private Boolean hadAnError = false; private Boolean killed = false; - public ProcessThread(ThreadGroup processesThreadGroup, - ExecutionModulesManager executionModulesManager, + private final AccessControlContext accessControlContext; + + public ProcessThread(ThreadGroup processesThreadGroup, ExecutionModulesManager executionModulesManager, ExecutionProcess process) { super(processesThreadGroup, "SLC Process #" + process.getUuid()); this.executionModulesManager = executionModulesManager; this.process = process; processThreadGroup = new ProcessThreadGroup(process); + accessControlContext = AccessController.getContext(); } 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\n##\n"); + log.info("\n##\n## SLC Process #" + process.getUuid() + " STARTED\n##\n"); // Start logging new LoggingThread().start(); process.setStatus(ExecutionProcess.RUNNING); try { - process(); + Subject subject = Subject.getSubject(accessControlContext); + try { + Subject.doAs(subject, new PrivilegedExceptionAction() { + + @Override + public Void run() throws Exception { + process(); + return null; + } + + }); + } catch (PrivilegedActionException privilegedActionException) { + Throwable cause = privilegedActionException.getCause(); + if (cause instanceof InterruptedException) + throw (InterruptedException) cause; + else + throw new SlcException("Cannot process", cause); + } + // process(); } catch (InterruptedException e) { die(); return; } catch (Exception e) { - String msg = "Process " + getProcess().getUuid() - + " failed unexpectedly."; + String msg = "Process " + getProcess().getUuid() + " failed unexpectedly."; log.error(msg, e); - getProcessThreadGroup().dispatchAddStep( - new ExecutionStep("Process", ExecutionStep.ERROR, msg + " " - + e.getMessage())); + getProcessThreadGroup() + .dispatchAddStep(new ExecutionStep("Process", ExecutionStep.ERROR, msg + " " + e.getMessage())); } // waits for all execution threads to complete (in case they were @@ -111,8 +134,7 @@ public class ProcessThread extends Thread { process.setStatus(ExecutionProcess.COMPLETED); // executionModulesManager.dispatchUpdateStatus(process, oldStatus, // process.getStatus()); - log.info("\n## SLC Process #" + process.getUuid() + " " - + process.getStatus() + "\n"); + log.info("\n## SLC Process #" + process.getUuid() + " " + process.getStatus() + "\n"); } /** Called when being killed */ @@ -143,13 +165,11 @@ public class ProcessThread extends Thread { } /** @return the (distinct) thread used for this execution */ - protected final void execute(RealizedFlow realizedFlow, Boolean synchronous) - throws InterruptedException { + protected final void execute(RealizedFlow realizedFlow, Boolean synchronous) throws InterruptedException { if (killed) return; - ExecutionThread thread = new ExecutionThread(processThreadGroup, - executionModulesManager, realizedFlow); + ExecutionThread thread = new ExecutionThread(processThreadGroup, executionModulesManager, realizedFlow); executionThreads.add(thread); thread.start(); @@ -201,8 +221,7 @@ public class ProcessThread extends Thread { break; } - if (!ProcessThread.this.isAlive() - && processThreadGroup.getSteps().size() == 0) + if (!ProcessThread.this.isAlive() && processThreadGroup.getSteps().size() == 0) run = false; } }