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%2Fviews%2FJcrExecutionModulesView.java;h=db5490391ad0bfaa3dad504078359286bdb21f0b;hb=a04bdc0fac50a960370e068bf854a83e503b0ab7;hp=eaa4cdd885c5a02d95d091308c99b7b941cfb283;hpb=a181e3d059185a9dc108e81f38c66f48f4e4aac8;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java index eaa4cdd88..db5490391 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java @@ -3,36 +3,38 @@ package org.argeo.slc.client.ui.views; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.Iterator; import java.util.List; -import java.util.Properties; +import java.util.SortedSet; +import java.util.TreeSet; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; import javax.jcr.observation.Event; -import javax.jcr.observation.EventIterator; -import javax.jcr.observation.EventListener; +import javax.jcr.query.Query; +import javax.jcr.query.QueryManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider; -import org.argeo.eclipse.ui.jcr.NodesWrapper; +import org.argeo.eclipse.ui.jcr.NodeElementComparer; import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider; -import org.argeo.eclipse.ui.jcr.WrappedNode; +import org.argeo.slc.BasicNameVersion; +import org.argeo.slc.NameVersion; 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.execution.ExecutionModulesManager; 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; import org.eclipse.jface.viewers.IStructuredSelection; @@ -46,9 +48,12 @@ 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.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; +/** JCR based view of the execution modules. */ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, SlcNames { private final static Log log = LogFactory @@ -60,19 +65,23 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, private Session session; - private ProcessController processController; + private ExecutionModulesManager modulesManager; public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - ColumnViewerToolTipSupport.enableFor(viewer); + + // FIXME : does not work in RAP, find a way to have it for RCP only + // ColumnViewerToolTipSupport.enableFor(viewer); ViewContentProvider contentProvider = new ViewContentProvider(session); viewer.setContentProvider(contentProvider); + viewer.setComparer(new NodeElementComparer()); final ViewLabelProvider viewLabelProvider = new ViewLabelProvider(); viewer.setLabelProvider(viewLabelProvider); viewer.setInput(getViewSite()); viewer.addDoubleClickListener(new ViewDoubleClickListener()); + getViewSite().setSelectionProvider(viewer); Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; // Transfer[] tt = new Transfer[] { EditorInputTransfer.getInstance() }; @@ -80,14 +89,16 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, viewer.addDragSupport(operations, tt, new ViewDragListener()); try { + String[] nodeTypes = { SlcTypes.SLC_AGENT, + SlcTypes.SLC_AGENT_FACTORY, SlcTypes.SLC_EXECUTION_MODULE }; session.getWorkspace() .getObservationManager() .addEventListener( - new VmAgentObserver(), + new VmAgentObserver(viewer.getTree().getDisplay()), Event.NODE_ADDED | Event.NODE_REMOVED | Event.NODE_MOVED, SlcJcrConstants.VM_AGENT_FACTORY_PATH, true, null, - null, false); + nodeTypes, false); } catch (RepositoryException e) { throw new SlcException("Cannot add observer", e); } @@ -112,17 +123,19 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, new String[] { SlcJcrConstants.VM_AGENT_FACTORY_PATH }); } - @Override - protected Object[] getChildren(Node node) throws RepositoryException { - if (node.isNodeType(SlcTypes.SLC_AGENT_PROXY)) { - List wrappers = new ArrayList(); - for (NodeIterator nit = node.getNodes(); nit.hasNext();) { - wrappers.add(new AgentNodesWrapper(nit.nextNode())); - } - return wrappers.toArray(); - } - return super.getChildren(node); - } + // @Override + // protected Object[] getChildren(Node node) throws RepositoryException + // { + // if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) { + // List wrappers = new + // ArrayList(); + // for (NodeIterator nit = node.getNodes(); nit.hasNext();) { + // wrappers.add(new AgentNodesWrapper(nit.nextNode())); + // } + // return wrappers.toArray(); + // } + // return super.getChildren(node); + // } @Override protected Object[] sort(Object parent, Object[] children) { @@ -131,6 +144,36 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, Arrays.sort(sorted, new ViewComparator()); return sorted; } + + @Override + protected List filterChildren(List children) + throws RepositoryException { + for (Iterator it = children.iterator(); it.hasNext();) { + Node node = it.next(); + // execution spec definitions + if (node.getName().equals(SLC_EXECUTION_SPECS)) + it.remove(); + // flow values + else if (node.getParent().isNodeType( + SlcTypes.SLC_EXECUTION_FLOW)) + it.remove(); + } + return super.filterChildren(children); + } + + @Override + public boolean hasChildren(Object element) { + if (element instanceof Node) { + Node node = (Node) element; + try { + if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW)) + return false; + } catch (RepositoryException e) { + throw new SlcException("Cannot check has children", e); + } + } + return super.hasChildren(element); + } } static class ViewComparator implements Comparator { @@ -140,6 +183,12 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, if (o1 instanceof Node && o2 instanceof Node) { Node node1 = (Node) o1; Node node2 = (Node) o2; + + if (node1.getName().equals(SLC_EXECUTION_SPECS)) + return -100; + if (node2.getName().equals(SLC_EXECUTION_SPECS)) + return 100; + if (node1.isNodeType(SLC_EXECUTION_FLOW) && node2.isNodeType(SLC_EXECUTION_FLOW)) { return node1.getName().compareTo(node2.getName()); @@ -163,65 +212,117 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, } - /** Wraps the execution modules of an agent. */ - static class AgentNodesWrapper extends NodesWrapper { - - public AgentNodesWrapper(Node node) { - super(node); + // /** Wraps the execution modules of an agent. */ + // static class AgentNodesWrapper extends NodesWrapper { + // + // public AgentNodesWrapper(Node node) { + // super(node); + // } + // + // protected List getWrappedNodes() + // throws RepositoryException { + // List children = new ArrayList(); + // Node executionModules = getNode(); + // for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) { + // for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions + // .hasNext();) { + // children.add(new WrappedNode(this, nitVersions.nextNode())); + // } + // } + // return children; + // } + // + // } + + class VmAgentObserver extends AsyncUiEventListener { + + public VmAgentObserver(Display display) { + super(display); } - protected List getWrappedNodes() - throws RepositoryException { - List children = new ArrayList(); - Node executionModules = getNode().getNode( - SlcNames.SLC_EXECUTION_MODULES); - for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) { - for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions - .hasNext();) { - children.add(new WrappedNode(this, nitVersions.nextNode())); + protected void onEventInUiThread(List events) { + for (Event event : events) { + try { + String path = event.getPath(); + + if (session.itemExists(path)) { + Node parentNode = session.getNode(path);// .getParent(); + if (log.isDebugEnabled()) + log.debug("Refresh " + parentNode); + viewer.refresh(parentNode); + } + } catch (RepositoryException e) { + log.warn("Cannot process event " + event + ": " + e); } } - return children; - } - - } - - class VmAgentObserver implements EventListener { - public void onEvent(EventIterator events) { + // try { + // Node vmAgentNode = session + // .getNode(SlcJcrConstants.VM_AGENT_FACTORY_PATH); + // viewer.refresh(vmAgentNode); + // } catch (RepositoryException e) { + // log.warn("Cannot process event : " + e); + // } + // TODO: optimize based on event viewer.refresh(); } - } class ViewLabelProvider extends DefaultNodeLabelProvider implements ITableLabelProvider { - public String getColumnText(Object obj, int index) { - return getText(obj); - } - public Image getColumnImage(Object obj, int index) { - return getImage(obj); + @Override + protected String getText(Node node) throws RepositoryException { + if (node.getName().equals(SLC_EXECUTION_SPECS)) + return "Execution Specifications"; + else if (node.getPath().equals( + SlcJcrConstants.VM_AGENT_FACTORY_PATH)) + return "Internal Agents"; + return super.getText(node); } + @Override public Image getImage(Node node) throws RepositoryException { - if (node.getParent().isNodeType(SlcTypes.SLC_AGENT_PROXY)) - return SlcImages.AGENT; - else if (node.isNodeType(SlcTypes.SLC_MODULE)) - return SlcImages.MODULE; + // we try to optimize a bit by putting deeper nodes first + if (node.getParent().isNodeType( + SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE)) + return SlcImages.CHOICES; + else if (node.isNodeType(SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE)) + return SlcImages.EXECUTION_SPEC_ATTRIBUTE; + else if (node.isNodeType(SlcTypes.SLC_EXECUTION_SPEC)) + return SlcImages.EXECUTION_SPEC; + else if (node.getName().equals(SLC_EXECUTION_SPECS)) + return SlcImages.EXECUTION_SPECS; else if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW)) return SlcImages.FLOW; + else if (node.isNodeType(SlcTypes.SLC_MODULE)) { + if (node.getProperty(SLC_STARTED).getBoolean()) + return SlcImages.MODULE; + else + return SlcImages.MODULE_STOPPED; + } else if (node.isNodeType(SlcTypes.SLC_AGENT)) + return SlcImages.AGENT; + else if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) + return SlcImages.AGENT_FACTORY; else return SlcImages.FOLDER; } public String getToolTipText(Node node) throws RepositoryException { - if (node.isNodeType(SlcTypes.SLC_MODULE) + if (node.isNodeType(NodeType.MIX_TITLE) && node.hasProperty(Property.JCR_DESCRIPTION)) return node.getProperty(Property.JCR_DESCRIPTION).getString(); return super.getToolTipText(node); } + public String getColumnText(Object obj, int index) { + return getText(obj); + } + + public Image getColumnImage(Object obj, int index) { + return getImage(obj); + } + } class ViewDoubleClickListener implements IDoubleClickListener { @@ -231,60 +332,56 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, try { if (obj instanceof Node) { Node node = (Node) obj; - if (node.isNodeType(SLC_EXECUTION_FLOW)) { - List paths = new ArrayList(); - paths.add(node.getPath()); - PlatformUI - .getWorkbench() - .getActiveWorkbenchWindow() - .getActivePage() - .openEditor( - new ProcessEditorInput(paths, true), - ProcessEditor.ID); + if (node.isNodeType(SLC_EXECUTION_MODULE)) { + String name = node.getProperty(SLC_NAME).getString(); + String version = node.getProperty(SLC_VERSION) + .getString(); + NameVersion nameVersion = new BasicNameVersion(name, + version); + Boolean started = node.getProperty(SLC_STARTED) + .getBoolean(); + if (started) { + modulesManager.stop(nameVersion); + } else { + modulesManager.start(nameVersion); + } + } else { + String path = node.getPath(); + // TODO factorize with editor + QueryManager qm = node.getSession().getWorkspace() + .getQueryManager(); + String statement = "SELECT * FROM [" + + SlcTypes.SLC_EXECUTION_FLOW + + "] WHERE ISDESCENDANTNODE(['" + path + + "']) OR ISSAMENODE(['" + path + "'])"; + // log.debug(statement); + Query query = qm.createQuery(statement, Query.JCR_SQL2); + + // order paths + SortedSet paths = new TreeSet(); + for (NodeIterator nit = query.execute().getNodes(); nit + .hasNext();) { + paths.add(nit.nextNode().getPath()); + } + + // List paths = new ArrayList(); + // paths.add(node.getPath()); + IWorkbenchPage activePage = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getActivePage(); + activePage.openEditor(new ProcessEditorInput( + new ArrayList(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 realizedFlows = new ArrayList(); - // 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); - // } } } class ViewDragListener extends DragSourceAdapter { - - public void dragStart(DragSourceEvent event) { - if (log.isDebugEnabled()) - log.debug("Start Drag " + event); - super.dragStart(event); - } - public void dragSetData(DragSourceEvent event) { - - // System.out.println("dragSetData: " + event); - IStructuredSelection selection = (IStructuredSelection) viewer .getSelection(); if (selection.getFirstElement() instanceof Node) { @@ -314,70 +411,17 @@ 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); - // // } } } } - - public void dragFinished(DragSourceEvent event) { - if (log.isDebugEnabled()) - 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) { this.session = session; } + public void setModulesManager(ExecutionModulesManager modulesManager) { + this.modulesManager = modulesManager; + } + } \ No newline at end of file