X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.jcr%2Fsrc%2Forg%2Fargeo%2Fslc%2Fjcr%2Fexecution%2FJcrProcessThread.java;fp=org.argeo.slc.jcr%2Fsrc%2Forg%2Fargeo%2Fslc%2Fjcr%2Fexecution%2FJcrProcessThread.java;h=67c213d306fa1b3c56a362a0128e1dc23542171d;hb=825d60c5348dbe3f5be25b0bccf7bdebfe694219;hp=0000000000000000000000000000000000000000;hpb=5e991fff5cba01858dcc5747a27e637325bc5c8e;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.jcr/src/org/argeo/slc/jcr/execution/JcrProcessThread.java b/org.argeo.slc.jcr/src/org/argeo/slc/jcr/execution/JcrProcessThread.java new file mode 100644 index 0000000..67c213d --- /dev/null +++ b/org.argeo.slc.jcr/src/org/argeo/slc/jcr/execution/JcrProcessThread.java @@ -0,0 +1,73 @@ +package org.argeo.slc.jcr.execution; + +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.SlcNames; +import org.argeo.slc.execution.ExecutionModulesManager; +import org.argeo.slc.execution.ExecutionProcess; +import org.argeo.slc.execution.RealizedFlow; +import org.argeo.slc.runtime.ProcessThread; + +/** Where the actual execution takes place */ +public class JcrProcessThread extends ProcessThread implements SlcNames { + + public JcrProcessThread(ThreadGroup processesThreadGroup, ExecutionModulesManager executionModulesManager, + JcrExecutionProcess process) { + super(processesThreadGroup, executionModulesManager, process); + } + + /** Overridden in order to set progress status on realized flow nodes. */ + @Override + protected void process() throws InterruptedException { + Session session = null; + if (getProcess() instanceof JcrExecutionProcess) + try { + session = ((JcrExecutionProcess) getProcess()).getRepository().login(CmsConstants.HOME_WORKSPACE); + + List realizedFlows = getProcess().getRealizedFlows(); + for (RealizedFlow realizedFlow : realizedFlows) { + Node realizedFlowNode = session.getNode(((JcrRealizedFlow) realizedFlow).getPath()); + setFlowStatus(realizedFlowNode, ExecutionProcess.RUNNING); + + try { + // + // EXECUTE THE FLOW + // + execute(realizedFlow, true); + + setFlowStatus(realizedFlowNode, ExecutionProcess.COMPLETED); + } catch (RepositoryException e) { + throw e; + } catch (InterruptedException e) { + setFlowStatus(realizedFlowNode, ExecutionProcess.KILLED); + throw e; + } catch (RuntimeException e) { + setFlowStatus(realizedFlowNode, ExecutionProcess.ERROR); + throw e; + } + } + } catch (RepositoryException e) { + throw new SlcException("Cannot process " + getJcrExecutionProcess().getNodePath(), e); + } finally { + JcrUtils.logoutQuietly(session); + } + else + super.process(); + } + + protected void setFlowStatus(Node realizedFlowNode, String status) throws RepositoryException { + realizedFlowNode.setProperty(SLC_STATUS, status); + realizedFlowNode.getSession().save(); + } + + protected JcrExecutionProcess getJcrExecutionProcess() { + return (JcrExecutionProcess) getProcess(); + } +}