X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Feditors%2FProcessEditor.java;h=a355ff7d952d3b46413e6dd09362d6fb39f98da2;hb=880043c9903335002a51778324b82f37f1aa9983;hp=e898a64a12d69b04a523ebddcf84d876ca3c62bc;hpb=9bab32638cc6a08ba96c3feca190733e9d1ac0ac;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java index e898a64a1..a355ff7d9 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java @@ -1,28 +1,38 @@ package org.argeo.slc.client.ui.editors; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; import javax.jcr.Node; -import javax.jcr.Property; +import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; +import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.ClientUiPlugin; import org.argeo.slc.client.ui.controllers.ProcessController; +import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.execution.ExecutionProcess; +import org.argeo.slc.execution.ExecutionProcessNotifier; +import org.argeo.slc.execution.ExecutionStep; import org.argeo.slc.jcr.SlcJcrUtils; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.editor.FormEditor; -public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { +/** Editor for an execution process. */ +public class ProcessEditor extends FormEditor implements + ExecutionProcessNotifier, SlcTypes, SlcNames { public final static String ID = ClientUiPlugin.ID + ".processEditor"; private Session session; @@ -32,6 +42,8 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { private ProcessBuilderPage builderPage; private ProcessLogPage logPage; + private ExecutionModulesManager modulesManager; + @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { @@ -63,15 +75,6 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { processNode.setProperty(SLC_STATUS, ExecutionProcess.NEW); Node processFlow = processNode.addNode(SLC_FLOW); processFlow.addMixin(SLC_REALIZED_FLOW); - - // add initial flows - for (String path : pei.getInitialFlowPaths()) { - Node realizedFlow = processFlow.addNode(SLC_FLOW); - realizedFlow.addMixin(SLC_REALIZED_FLOW); - Node address = realizedFlow.addNode(SLC_ADDRESS, - NodeType.NT_ADDRESS); - address.setProperty(Property.JCR_PATH, path); - } return processNode; } @@ -97,7 +100,7 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { } /** Actually runs the process. */ - public void process() { + void process() { // the modifications have to be saved before execution try { processNode.setProperty(SLC_STATUS, ExecutionProcess.SCHEDULED); @@ -105,7 +108,68 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { throw new SlcException("Cannot update status of " + processNode, e); } doSave(null); - processController.process(processNode); + try { + // show log + setActivePage(logPage.getId()); + + ExecutionProcess process = processController.process(processNode); + Map properties = new HashMap(); + properties.put(ExecutionModulesManager.SLC_PROCESS_ID, + process.getUuid()); + modulesManager.registerProcessNotifier(this, properties); + } catch (Exception e) { + ErrorFeedback.show("Execution of " + processNode + " failed", e); + } + } + + void kill() { + processController.kill(processNode); + } + + /** Opens a new editor with a copy of this process */ + void relaunch() { + try { + Node duplicatedNode = duplicateProcess(); + IWorkbenchPage activePage = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getActivePage(); + activePage.openEditor( + new ProcessEditorInput(duplicatedNode.getPath()), + ProcessEditor.ID); + close(false); + } catch (Exception e1) { + throw new SlcException("Cannot relaunch " + processNode, e1); + } + } + + /** Duplicates the process */ + protected Node duplicateProcess() { + try { + Session session = processNode.getSession(); + String uuid = UUID.randomUUID().toString(); + String destPath = SlcJcrUtils.createExecutionProcessPath(uuid); + Node newNode = JcrUtils.mkdirs(session, destPath, + SlcTypes.SLC_PROCESS); + + Node rootRealizedFlowNode = newNode.addNode(SLC_FLOW); + // copy node + JcrUtils.copy(processNode.getNode(SLC_FLOW), rootRealizedFlowNode); + + newNode.setProperty(SLC_UUID, uuid); + newNode.setProperty(SLC_STATUS, ExecutionProcess.INITIALIZED); + + // reset realized flow status + // we just manage one level for the time being + NodeIterator nit = rootRealizedFlowNode.getNodes(SLC_FLOW); + while (nit.hasNext()) { + nit.nextNode().setProperty(SLC_STATUS, + ExecutionProcess.INITIALIZED); + } + + session.save(); + return newNode; + } catch (RepositoryException e) { + throw new SlcException("Cannot duplicate process", e); + } } @Override @@ -114,7 +178,7 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { builderPage = new ProcessBuilderPage(this, processNode); addPage(builderPage); firePropertyChange(PROP_DIRTY); - logPage = new ProcessLogPage(this); + logPage = new ProcessLogPage(this, processNode); addPage(logPage); } catch (PartInitException e) { throw new SlcException("Cannot add pages", e); @@ -148,6 +212,14 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { return false; } + public void updateStatus(ExecutionProcess process, String oldStatus, + String newStatus) { + } + + public void addSteps(ExecutionProcess process, List steps) { + // logPage.addSteps(steps); + } + /** Expects one session per editor. */ public void setSession(Session session) { this.session = session; @@ -157,4 +229,8 @@ public class ProcessEditor extends FormEditor implements SlcTypes, SlcNames { this.processController = processController; } + public void setModulesManager(ExecutionModulesManager modulesManager) { + this.modulesManager = modulesManager; + } + }