]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java
Improve UI
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / editors / ProcessEditor.java
index e898a64a12d69b04a523ebddcf84d876ca3c62bc..a355ff7d952d3b46413e6dd09362d6fb39f98da2 100644 (file)
@@ -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<String, String> properties = new HashMap<String, String>();
+                       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<ExecutionStep> 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;
+       }
+
 }