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=b33238e3cc4ea32b9f14f23931b3f8f6b30b5b54;hb=83996361545b06f97a85d20f3b5824af0a2c4904;hp=00e517c5373fbbd1916df553576e3c3a633904e7;hpb=0b7eb0b64c545d0362d126581816138b609a2026;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 00e517c53..b33238e3c 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 @@ -5,26 +5,40 @@ import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.List; +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.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.NodeElementComparer; import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider; +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.editors.ProcessEditor; import org.argeo.slc.client.ui.editors.ProcessEditorInput; +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.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; @@ -39,6 +53,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.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; @@ -46,8 +61,8 @@ 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 - // .getLog(JcrExecutionModulesView.class); + private final static Log log = LogFactory + .getLog(JcrExecutionModulesView.class); public static final String ID = "org.argeo.slc.client.ui.jcrExecutionModulesView"; @@ -55,15 +70,22 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, private Session session; + 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); + // FIXME fail on RAP put it in specific + ColumnViewerToolTipSupport.enableFor(viewer); viewer.setInput(getViewSite()); viewer.addDoubleClickListener(new ViewDoubleClickListener()); getViewSite().setSelectionProvider(viewer); @@ -74,14 +96,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); } @@ -133,11 +157,30 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, 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 { @@ -199,7 +242,35 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, // } class VmAgentObserver extends AsyncUiEventListener { - protected void onEventInUiThread(EventIterator events) { + + public VmAgentObserver(Display display) { + super(display); + } + + 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.isTraceEnabled()) + log.trace("Refresh " + parentNode + " after event " + + event); + viewer.refresh(parentNode); + } + } catch (RepositoryException e) { + log.warn("Cannot process event " + event + ": " + e); + } + } + + // 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(); } @@ -210,7 +281,10 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, @Override protected String getText(Node node) throws RepositoryException { - if (node.getName().equals(SLC_EXECUTION_SPECS)) + if (node.isNodeType(NodeType.MIX_TITLE) + && node.hasProperty(Property.JCR_TITLE)) + return node.getProperty(Property.JCR_TITLE).getString(); + else if (node.getName().equals(SLC_EXECUTION_SPECS)) return "Execution Specifications"; else if (node.getPath().equals( SlcJcrConstants.VM_AGENT_FACTORY_PATH)) @@ -232,9 +306,12 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, return SlcImages.EXECUTION_SPECS; else if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW)) return SlcImages.FLOW; - else if (node.isNodeType(SlcTypes.SLC_MODULE)) - return SlcImages.MODULE; - else if (node.isNodeType(SlcTypes.SLC_AGENT)) + 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; @@ -266,13 +343,63 @@ 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()); + if (node.isNodeType(SLC_EXECUTION_MODULE)) { + String name = node.getProperty(SLC_NAME).getString(); + String version = node.getProperty(SLC_VERSION) + .getString(); + final NameVersion nameVersion = new BasicNameVersion( + name, version); + Boolean started = node.getProperty(SLC_STARTED) + .getBoolean(); + + Job job; + if (started) { + job = new Job("Stop " + nameVersion) { + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask("Stop " + nameVersion, 1); + modulesManager.stop(nameVersion); + monitor.worked(1); + return Status.OK_STATUS; + } + }; + } else { + job = new Job("Start " + nameVersion) { + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask("Start " + nameVersion, 1); + modulesManager.start(nameVersion); + monitor.worked(1); + return Status.OK_STATUS; + } + }; + } + job.setUser(true); + job.schedule(); + } 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(paths, - true), ProcessEditor.ID); + activePage.openEditor(new ProcessEditorInput( + new ArrayList(paths), true), + ProcessEditor.ID); } } } catch (Exception e) { @@ -322,4 +449,8 @@ public class JcrExecutionModulesView extends ViewPart implements SlcTypes, this.session = session; } + public void setModulesManager(ExecutionModulesManager modulesManager) { + this.modulesManager = modulesManager; + } + } \ No newline at end of file