]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Processes list view
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 19 Apr 2011 19:09:56 +0000 (19:09 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 19 Apr 2011 19:09:56 +0000 (19:09 +0000)
ASSIGNED - bug 17: Generalize agent management and registration beyond JMS
https://bugzilla.argeo.org/show_bug.cgi?id=17

git-svn-id: https://svn.argeo.org/slc/trunk@4458 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF
eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/jcr.xml
eclipse/plugins/org.argeo.slc.client.ui/plugin.xml
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/SlcExecutionPerspective.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessEditor.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/listeners/TestManagerServiceAdapter.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrProcessListView.java [new file with mode: 0644]

index e2a3d55829f9192ab9c619964dd9867f0daf554e..9fe6f8f6e91b3fcbee5335ba85c3d617e14a469c 100644 (file)
@@ -16,6 +16,7 @@ Export-Package: org.argeo.slc.client.ui,
 Import-Package: javax.jcr;version="2.0.0",
  javax.jcr.nodetype;version="2.0.0",
  javax.jcr.observation;version="2.0.0",
+ javax.jcr.query;version="2.0.0",
  org.apache.commons.io;version="1.4.0",
  org.apache.commons.logging;version="1.1.1",
  org.argeo,
index 072ed63132d784d47589dbb1b91ab42b9aec3345..340ae1c780fbd8ce62f0d16f04071bf4eeb44d50 100644 (file)
@@ -7,10 +7,13 @@
        <!-- Views -->
        <bean id="jcrExecutionModulesView" class="org.argeo.slc.client.ui.views.JcrExecutionModulesView"
                scope="prototype">
-               <property name="processController" ref="processController" />
                <property name="session" ref="session" />
        </bean>
 
+       <bean id="jcrProcessListView" class="org.argeo.slc.client.ui.views.JcrProcessListView"
+               scope="prototype">
+               <property name="session" ref="session" />
+       </bean>
 
        <bean id="session" class="org.argeo.jcr.spring.ThreadBoundSession">
                <property name="repository" ref="repository" />
index 39cadc59f8e74c0f12bdd8371e464c939853da24..96f9fe1f95814a544f9ea009caaf938a8849f124 100644 (file)
                 icon="icons/processes.gif"
                 restorable="true">
           </view>
+          <view
+                id="org.argeo.slc.client.ui.jcrProcessListView"
+                class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                name="Processes"
+                icon="icons/processes.gif"
+                restorable="true">
+          </view>
           <view
                 allowMultiple="true"
                 class="org.argeo.eclipse.spring.SpringExtensionFactory"
index 5374dd17f11d67b6c1f28fb42c7259261843d424..144131fe0d79a709d1e06df2fc41197bed0a8160 100644 (file)
@@ -24,7 +24,7 @@ public class SlcExecutionPerspective implements IPerspectiveFactory {
 
                IFolderLayout bottom = layout.createFolder("bottom",
                                IPageLayout.BOTTOM, 0.65f, editorArea);
-               bottom.addView("org.argeo.slc.client.ui.processListView");
+               bottom.addView("org.argeo.slc.client.ui.jcrProcessListView");
 
 //             IFolderLayout topRight = layout.createFolder("topRight",
 //                             IPageLayout.RIGHT, 0.6f, "main");
index 6a0e2652a941d4f9f397f7a6090ec751eae1f4f1..6a217808924c2969c3ebc11bd34a9e399eb0d080 100644 (file)
@@ -14,9 +14,8 @@ import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
 import javax.jcr.observation.ObservationManager;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.SlcImages;
 import org.argeo.slc.execution.ExecutionProcess;
@@ -48,7 +47,6 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.layout.RowLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.forms.AbstractFormPart;
@@ -59,7 +57,7 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
 
 public class ProcessBuilderPage extends FormPage implements SlcNames, SlcTypes {
        public final static String ID = "processBuilderPage";
-       private final static Log log = LogFactory.getLog(ProcessBuilderPage.class);
+       //private final static Log log = LogFactory.getLog(ProcessBuilderPage.class);
 
        private Node processNode;
 
@@ -259,14 +257,7 @@ public class ProcessBuilderPage extends FormPage implements SlcNames, SlcTypes {
 
        @Override
        public void dispose() {
-               try {
-                       if (statusObserver != null) {
-                               processNode.getSession().getWorkspace().getObservationManager()
-                                               .removeEventListener(statusObserver);
-                       }
-               } catch (Exception e) {
-                       log.error("Cannot dispose observer for " + processNode + ": " + e);
-               }
+               JcrUtils.unregisterQuietly(processNode, statusObserver);
                super.dispose();
        }
 
index 92f1b194f1ab49e9441894cb2d848671e1e65131..4da6f061a849061467a42c6281632a1579b46e3c 100644 (file)
@@ -19,7 +19,6 @@ import org.argeo.slc.jcr.SlcJcrConstants;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.PartInitException;
index 499559833f24eda809b65db637821a9f3bc5b2bd..c34159b7e2c80cfdf90fd1087cf191d6ad31fc58 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.slc.client.ui.listeners;
 
-import org.argeo.slc.SlcException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.client.ui.ClientUiPlugin;
 import org.argeo.slc.core.attachment.Attachment;
 import org.argeo.slc.core.attachment.SimpleAttachment;
@@ -16,8 +17,8 @@ import org.eclipse.ui.handlers.IHandlerService;
 
 /** In memory access to a test manager service */
 public class TestManagerServiceAdapter implements TreeTestResultListener {
-       // private static final Log log = LogFactory
-       // .getLog(TestManagerServiceAdapter.class);
+       private static final Log log = LogFactory
+                       .getLog(TestManagerServiceAdapter.class);
 
        private Boolean onlyOnClose = false;
 
@@ -71,10 +72,7 @@ public class TestManagerServiceAdapter implements TreeTestResultListener {
                                                                                        null);
 
                                                } catch (Exception e) {
-                                                       e.printStackTrace();
-                                                       throw new SlcException(
-                                                                       "Problem while rendering result. "
-                                                                                       + e.getMessage());
+                                                       log.error("Cannot refresh views: " + e);
                                                }
                                        }
                                }
index eaa4cdd885c5a02d95d091308c99b7b941cfb283..025fb55c10c757a263ffcae2262779fc68f04ae7 100644 (file)
@@ -4,7 +4,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Properties;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -24,14 +23,11 @@ import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider;
 import org.argeo.eclipse.ui.jcr.WrappedNode;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.SlcImages;
-import org.argeo.slc.client.ui.controllers.ProcessController;
 import org.argeo.slc.client.ui.editors.ProcessEditor;
 import org.argeo.slc.client.ui.editors.ProcessEditorInput;
-import org.argeo.slc.client.ui.providers.ExecutionModulesContentProvider.FlowNode;
 import org.argeo.slc.jcr.SlcJcrConstants;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
-import org.argeo.slc.process.RealizedFlow;
 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
@@ -46,6 +42,7 @@ import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.part.ViewPart;
 
@@ -60,8 +57,6 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
 
        private Session session;
 
-       private ProcessController processController;
-
        public void createPartControl(Composite parent) {
                viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
                ColumnViewerToolTipSupport.enableFor(viewer);
@@ -234,41 +229,15 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
                                        if (node.isNodeType(SLC_EXECUTION_FLOW)) {
                                                List<String> paths = new ArrayList<String>();
                                                paths.add(node.getPath());
-                                               PlatformUI
-                                                               .getWorkbench()
-                                                               .getActiveWorkbenchWindow()
-                                                               .getActivePage()
-                                                               .openEditor(
-                                                                               new ProcessEditorInput(paths, true),
-                                                                               ProcessEditor.ID);
+                                               IWorkbenchPage activePage = PlatformUI.getWorkbench()
+                                                               .getActiveWorkbenchWindow().getActivePage();
+                                               activePage.openEditor(new ProcessEditorInput(paths,
+                                                               true), ProcessEditor.ID);
                                        }
                                }
                        } catch (Exception e) {
                                throw new SlcException("Cannot open " + obj, e);
                        }
-
-                       // if (obj instanceof ExecutionModulesContentProvider.FlowNode) {
-                       // ExecutionModulesContentProvider.FlowNode fn =
-                       // (ExecutionModulesContentProvider.FlowNode) obj;
-                       //
-                       // List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
-                       // RealizedFlow realizedFlow = new RealizedFlow();
-                       // realizedFlow.setModuleName(fn.getExecutionModuleNode()
-                       // .getDescriptor().getName());
-                       // realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
-                       // .getDescriptor().getVersion());
-                       // realizedFlow.setFlowDescriptor(fn.getExecutionModuleNode()
-                       // .getFlowDescriptors().get(fn.getFlowName()));
-                       // realizedFlows.add(realizedFlow);
-                       //
-                       // SlcExecution slcExecution = new SlcExecution();
-                       // slcExecution.setUuid(UUID.randomUUID().toString());
-                       // slcExecution.setRealizedFlows(realizedFlows);
-                       // slcExecution.setHost(fn.getExecutionModuleNode().getAgentNode()
-                       // .getAgent().toString());
-                       // processController.execute(fn.getExecutionModuleNode()
-                       // .getAgentNode().getAgent(), slcExecution);
-                       // }
                }
 
        }
@@ -314,31 +283,6 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
                                                // TODO Auto-generated catch block
                                                e1.printStackTrace();
                                        }
-                                       //
-                                       // // ExecutionModulesContentProvider.FlowNode flowNode =
-                                       // (ExecutionModulesContentProvider.FlowNode) selection
-                                       // // .getFirstElement();
-                                       // //
-                                       // // Properties props = new Properties();
-                                       // // flowNodeAsProperties(props, flowNode);
-                                       // // props.setProperty("agentId", flowNode
-                                       // // .getExecutionModuleNode().getAgentNode().getAgent()
-                                       // // .getAgentUuid());
-                                       // // props.setProperty("host",
-                                       // flowNode.getExecutionModuleNode()
-                                       // // .getAgentNode().getAgent().toString());
-                                       // //
-                                       // // ByteArrayOutputStream out = new
-                                       // ByteArrayOutputStream();
-                                       // // try {
-                                       // // props.store(out, "");
-                                       // // event.data = new String(out.toByteArray());
-                                       // // } catch (IOException e) {
-                                       // // throw new SlcException(
-                                       // // "Cannot transform realized flow", e);
-                                       // // } finally {
-                                       // // IOUtils.closeQuietly(out);
-                                       // // }
                                }
                        }
                }
@@ -348,32 +292,6 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
                                log.debug("Finished Drag " + event);
                }
 
-               protected void flowNodeAsProperties(Properties props, FlowNode fn) {
-
-                       RealizedFlow realizedFlow = new RealizedFlow();
-                       realizedFlow.setModuleName(fn.getExecutionModuleNode()
-                                       .getDescriptor().getName());
-                       realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
-                                       .getDescriptor().getVersion());
-                       realizedFlow.setFlowDescriptor(fn.getExecutionFlowDescriptor());
-
-                       // As we want to have the effective ExecutionSpec and not a
-                       // reference; we store it at the RealizeFlow level : thus the
-                       // marshaller will store the object and not only a reference.
-                       realizedFlow.setExecutionSpec(fn.getExecutionFlowDescriptor()
-                                       .getExecutionSpec());
-
-                       // props.setProperty("RealizedFlowAsXml",
-                       // oxmBean.marshal(realizedFlow));
-                       // System.out
-                       // .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
-
-               }
-
-       }
-
-       public void setProcessController(ProcessController processController) {
-               this.processController = processController;
        }
 
        public void setSession(Session session) {
diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrProcessListView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrProcessListView.java
new file mode 100644 (file)
index 0000000..8c2bb40
--- /dev/null
@@ -0,0 +1,205 @@
+package org.argeo.slc.client.ui.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.observation.ObservationManager;
+import javax.jcr.query.Query;
+
+import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.editors.ProcessEditor;
+import org.argeo.slc.client.ui.editors.ProcessEditorInput;
+import org.argeo.slc.jcr.SlcJcrConstants;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * This class display the list of all processes that have run in the
+ * corresponding agent. Currently, the local agent.
+ */
+public class JcrProcessListView extends ViewPart {
+       public static final String ID = "org.argeo.slc.client.ui.jcrProcessListView";
+
+       private TableViewer viewer;
+
+       private Session session;
+
+       private EventListener processesObserver;
+
+       public void createPartControl(Composite parent) {
+               Table table = createTable(parent);
+               viewer = new TableViewer(table);
+               viewer.setLabelProvider(new LabelProvider());
+               viewer.setContentProvider(new ContentProvider());
+               viewer.setInput(getViewSite());
+               viewer.addDoubleClickListener(new ViewDoubleClickListener());
+
+               processesObserver = new AsyncUiEventListener() {
+                       protected void onEventInUiThread(EventIterator events) {
+                               viewer.refresh();
+                       }
+               };
+               try {
+                       ObservationManager observationManager = session.getWorkspace()
+                                       .getObservationManager();
+                       observationManager.addEventListener(processesObserver,
+                                       Event.NODE_ADDED | Event.NODE_REMOVED
+                                                       | Event.PROPERTY_CHANGED,
+                                       SlcJcrConstants.PROCESSES_BASE_PATH, true, null, null,
+                                       false);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot register listeners", e);
+               }
+
+       }
+
+       protected Table createTable(Composite parent) {
+               int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
+                               | SWT.FULL_SELECTION;
+               // does not function with RAP, commented for the time being
+               // | SWT.HIDE_SELECTION;
+
+               Table table = new Table(parent, style);
+
+               table.setLinesVisible(true);
+               table.setHeaderVisible(true);
+
+               TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+               column.setText("Date");
+               column.setWidth(200);
+
+               column = new TableColumn(table, SWT.LEFT, 1);
+               column.setText("Host");
+               column.setWidth(100);
+
+               column = new TableColumn(table, SWT.LEFT, 2);
+               column.setText("Id");
+               column.setWidth(300);
+
+               column = new TableColumn(table, SWT.LEFT, 3);
+               column.setText("Status");
+               column.setWidth(100);
+
+               return table;
+       }
+
+       public void setFocus() {
+               viewer.getControl().setFocus();
+       }
+
+       @Override
+       public void dispose() {
+               JcrUtils.unregisterQuietly(session.getWorkspace(), processesObserver);
+               super.dispose();
+       }
+
+       class ContentProvider implements IStructuredContentProvider {
+
+               public Object[] getElements(Object inputElement) {
+                       try {
+                               // TODO filter, optimize with virtual table, ...
+                               String sql = "SELECT * from [slc:process] ORDER BY [jcr:lastModified] DESC";
+                               Query query = session.getWorkspace().getQueryManager()
+                                               .createQuery(sql, Query.JCR_SQL2);
+                               List<Node> nodes = new ArrayList<Node>();
+                               for (NodeIterator nit = query.execute().getNodes(); nit
+                                               .hasNext();) {
+                                       nodes.add(nit.nextNode());
+                               }
+                               return nodes.toArray();
+                       } catch (RepositoryException e) {
+                               throw new SlcException("Cannot retrieve processes", e);
+                       }
+               }
+
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+
+       }
+
+       class LabelProvider extends ColumnLabelProvider implements
+                       ITableLabelProvider {
+
+               public Image getColumnImage(Object element, int columnIndex) {
+                       // TODO Auto-generated method stub
+                       return null;
+               }
+
+               public String getColumnText(Object obj, int index) {
+                       try {
+                               Node node = (Node) obj;
+                               switch (index) {
+
+                               case 0:
+                                       return node.getProperty(Property.JCR_CREATED).getString();
+                               case 1:
+                                       return "local";
+                               case 2:
+                                       return node.getProperty(SlcNames.SLC_UUID).getString();
+                               case 3:
+                                       return node.getProperty(SlcNames.SLC_STATUS).getString();
+                               }
+                               return getText(obj);
+                       } catch (RepositoryException e) {
+                               throw new SlcException("Cannot get column text", e);
+                       }
+               }
+
+       }
+
+       class ViewDoubleClickListener implements IDoubleClickListener {
+               public void doubleClick(DoubleClickEvent evt) {
+                       Object obj = ((IStructuredSelection) evt.getSelection())
+                                       .getFirstElement();
+                       try {
+                               if (obj instanceof Node) {
+                                       Node node = (Node) obj;
+                                       if (node.isNodeType(SlcTypes.SLC_PROCESS)) {
+                                               IWorkbenchPage activePage = PlatformUI.getWorkbench()
+                                                               .getActiveWorkbenchWindow().getActivePage();
+                                               activePage.openEditor(
+                                                               new ProcessEditorInput(node.getPath()),
+                                                               ProcessEditor.ID);
+                                       }
+                               }
+                       } catch (Exception e) {
+                               throw new SlcException("Cannot open " + obj, e);
+                       }
+               }
+
+       }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+
+}
\ No newline at end of file