1 package org
.argeo
.slc
.client
.ui
.views
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Arrays
;
5 import java
.util
.Comparator
;
6 import java
.util
.Iterator
;
8 import java
.util
.SortedSet
;
9 import java
.util
.TreeSet
;
11 import javax
.jcr
.Node
;
12 import javax
.jcr
.NodeIterator
;
13 import javax
.jcr
.Property
;
14 import javax
.jcr
.RepositoryException
;
15 import javax
.jcr
.Session
;
16 import javax
.jcr
.nodetype
.NodeType
;
17 import javax
.jcr
.observation
.Event
;
18 import javax
.jcr
.query
.Query
;
19 import javax
.jcr
.query
.QueryManager
;
21 import org
.apache
.commons
.logging
.Log
;
22 import org
.apache
.commons
.logging
.LogFactory
;
23 import org
.argeo
.ArgeoException
;
24 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
25 import org
.argeo
.eclipse
.ui
.jcr
.DefaultNodeLabelProvider
;
26 import org
.argeo
.eclipse
.ui
.jcr
.NodeElementComparer
;
27 import org
.argeo
.eclipse
.ui
.jcr
.SimpleNodeContentProvider
;
28 import org
.argeo
.slc
.BasicNameVersion
;
29 import org
.argeo
.slc
.NameVersion
;
30 import org
.argeo
.slc
.SlcException
;
31 import org
.argeo
.slc
.client
.ui
.SlcImages
;
32 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
33 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
34 import org
.argeo
.slc
.execution
.ExecutionModulesManager
;
35 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
36 import org
.argeo
.slc
.jcr
.SlcNames
;
37 import org
.argeo
.slc
.jcr
.SlcTypes
;
38 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
39 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
40 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
41 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
42 import org
.eclipse
.jface
.viewers
.TreeViewer
;
43 import org
.eclipse
.swt
.SWT
;
44 import org
.eclipse
.swt
.dnd
.DND
;
45 import org
.eclipse
.swt
.dnd
.DragSourceAdapter
;
46 import org
.eclipse
.swt
.dnd
.DragSourceEvent
;
47 import org
.eclipse
.swt
.dnd
.TextTransfer
;
48 import org
.eclipse
.swt
.dnd
.Transfer
;
49 import org
.eclipse
.swt
.graphics
.Image
;
50 import org
.eclipse
.swt
.widgets
.Composite
;
51 import org
.eclipse
.swt
.widgets
.Display
;
52 import org
.eclipse
.ui
.IWorkbenchPage
;
53 import org
.eclipse
.ui
.PlatformUI
;
54 import org
.eclipse
.ui
.part
.ViewPart
;
56 /** JCR based view of the execution modules. */
57 public class JcrExecutionModulesView
extends ViewPart
implements SlcTypes
,
59 private final static Log log
= LogFactory
60 .getLog(JcrExecutionModulesView
.class);
62 public static final String ID
= "org.argeo.slc.client.ui.jcrExecutionModulesView";
64 private TreeViewer viewer
;
66 private Session session
;
68 private ExecutionModulesManager modulesManager
;
70 public void createPartControl(Composite parent
) {
71 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
73 // FIXME : does not work in RAP, find a way to have it for RCP only
74 // ColumnViewerToolTipSupport.enableFor(viewer);
76 ViewContentProvider contentProvider
= new ViewContentProvider(session
);
78 viewer
.setContentProvider(contentProvider
);
79 viewer
.setComparer(new NodeElementComparer());
80 final ViewLabelProvider viewLabelProvider
= new ViewLabelProvider();
81 viewer
.setLabelProvider(viewLabelProvider
);
82 viewer
.setInput(getViewSite());
83 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
84 getViewSite().setSelectionProvider(viewer
);
86 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
87 // Transfer[] tt = new Transfer[] { EditorInputTransfer.getInstance() };
88 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
89 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
92 String
[] nodeTypes
= { SlcTypes
.SLC_AGENT
,
93 SlcTypes
.SLC_AGENT_FACTORY
, SlcTypes
.SLC_EXECUTION_MODULE
};
94 session
.getWorkspace()
95 .getObservationManager()
97 new VmAgentObserver(viewer
.getTree().getDisplay()),
98 Event
.NODE_ADDED
| Event
.NODE_REMOVED
100 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
, true, null,
102 } catch (RepositoryException e
) {
103 throw new SlcException("Cannot add observer", e
);
107 public void setFocus() {
108 viewer
.getControl().setFocus();
111 public TreeViewer
getViewer() {
115 public void refreshView() {
116 viewer
.setInput(getViewSite());
119 class ViewContentProvider
extends SimpleNodeContentProvider
{
121 public ViewContentProvider(Session session
) {
123 new String
[] { SlcJcrConstants
.VM_AGENT_FACTORY_PATH
});
127 // protected Object[] getChildren(Node node) throws RepositoryException
129 // if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) {
130 // List<AgentNodesWrapper> wrappers = new
131 // ArrayList<AgentNodesWrapper>();
132 // for (NodeIterator nit = node.getNodes(); nit.hasNext();) {
133 // wrappers.add(new AgentNodesWrapper(nit.nextNode()));
135 // return wrappers.toArray();
137 // return super.getChildren(node);
141 protected Object
[] sort(Object parent
, Object
[] children
) {
142 Object
[] sorted
= new Object
[children
.length
];
143 System
.arraycopy(children
, 0, sorted
, 0, children
.length
);
144 Arrays
.sort(sorted
, new ViewComparator());
149 protected List
<Node
> filterChildren(List
<Node
> children
)
150 throws RepositoryException
{
151 for (Iterator
<Node
> it
= children
.iterator(); it
.hasNext();) {
152 Node node
= it
.next();
153 // execution spec definitions
154 if (node
.getName().equals(SLC_EXECUTION_SPECS
))
157 else if (node
.getParent().isNodeType(
158 SlcTypes
.SLC_EXECUTION_FLOW
))
161 return super.filterChildren(children
);
165 public boolean hasChildren(Object element
) {
166 if (element
instanceof Node
) {
167 Node node
= (Node
) element
;
169 if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
171 } catch (RepositoryException e
) {
172 throw new SlcException("Cannot check has children", e
);
175 return super.hasChildren(element
);
179 static class ViewComparator
implements Comparator
<Object
> {
181 public int compare(Object o1
, Object o2
) {
183 if (o1
instanceof Node
&& o2
instanceof Node
) {
184 Node node1
= (Node
) o1
;
185 Node node2
= (Node
) o2
;
187 if (node1
.getName().equals(SLC_EXECUTION_SPECS
))
189 if (node2
.getName().equals(SLC_EXECUTION_SPECS
))
192 if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
193 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
194 return node1
.getName().compareTo(node2
.getName());
195 } else if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
196 && !node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
198 } else if (!node1
.isNodeType(SLC_EXECUTION_FLOW
)
199 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
203 return node1
.getName().compareTo(node2
.getName());
206 } catch (RepositoryException e
) {
207 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
215 // /** Wraps the execution modules of an agent. */
216 // static class AgentNodesWrapper extends NodesWrapper {
218 // public AgentNodesWrapper(Node node) {
222 // protected List<WrappedNode> getWrappedNodes()
223 // throws RepositoryException {
224 // List<WrappedNode> children = new ArrayList<WrappedNode>();
225 // Node executionModules = getNode();
226 // for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) {
227 // for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions
229 // children.add(new WrappedNode(this, nitVersions.nextNode()));
237 class VmAgentObserver
extends AsyncUiEventListener
{
239 public VmAgentObserver(Display display
) {
243 protected void onEventInUiThread(List
<Event
> events
) {
244 for (Event event
: events
) {
246 String path
= event
.getPath();
248 if (session
.itemExists(path
)) {
249 Node parentNode
= session
.getNode(path
);// .getParent();
250 if (log
.isDebugEnabled())
251 log
.debug("Refresh " + parentNode
);
252 viewer
.refresh(parentNode
);
254 } catch (RepositoryException e
) {
255 log
.warn("Cannot process event " + event
+ ": " + e
);
260 // Node vmAgentNode = session
261 // .getNode(SlcJcrConstants.VM_AGENT_FACTORY_PATH);
262 // viewer.refresh(vmAgentNode);
263 // } catch (RepositoryException e) {
264 // log.warn("Cannot process event : " + e);
266 // TODO: optimize based on event
271 class ViewLabelProvider
extends DefaultNodeLabelProvider
implements
272 ITableLabelProvider
{
275 protected String
getText(Node node
) throws RepositoryException
{
276 if (node
.getName().equals(SLC_EXECUTION_SPECS
))
277 return "Execution Specifications";
278 else if (node
.getPath().equals(
279 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
))
280 return "Internal Agents";
281 return super.getText(node
);
285 public Image
getImage(Node node
) throws RepositoryException
{
286 // we try to optimize a bit by putting deeper nodes first
287 if (node
.getParent().isNodeType(
288 SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
289 return SlcImages
.CHOICES
;
290 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
291 return SlcImages
.EXECUTION_SPEC_ATTRIBUTE
;
292 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC
))
293 return SlcImages
.EXECUTION_SPEC
;
294 else if (node
.getName().equals(SLC_EXECUTION_SPECS
))
295 return SlcImages
.EXECUTION_SPECS
;
296 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
297 return SlcImages
.FLOW
;
298 else if (node
.isNodeType(SlcTypes
.SLC_MODULE
)) {
299 if (node
.getProperty(SLC_STARTED
).getBoolean())
300 return SlcImages
.MODULE
;
302 return SlcImages
.MODULE_STOPPED
;
303 } else if (node
.isNodeType(SlcTypes
.SLC_AGENT
))
304 return SlcImages
.AGENT
;
305 else if (node
.isNodeType(SlcTypes
.SLC_AGENT_FACTORY
))
306 return SlcImages
.AGENT_FACTORY
;
308 return SlcImages
.FOLDER
;
311 public String
getToolTipText(Node node
) throws RepositoryException
{
312 if (node
.isNodeType(NodeType
.MIX_TITLE
)
313 && node
.hasProperty(Property
.JCR_DESCRIPTION
))
314 return node
.getProperty(Property
.JCR_DESCRIPTION
).getString();
315 return super.getToolTipText(node
);
318 public String
getColumnText(Object obj
, int index
) {
322 public Image
getColumnImage(Object obj
, int index
) {
323 return getImage(obj
);
328 class ViewDoubleClickListener
implements IDoubleClickListener
{
329 public void doubleClick(DoubleClickEvent evt
) {
330 Object obj
= ((IStructuredSelection
) evt
.getSelection())
333 if (obj
instanceof Node
) {
334 Node node
= (Node
) obj
;
335 if (node
.isNodeType(SLC_EXECUTION_MODULE
)) {
336 String name
= node
.getProperty(SLC_NAME
).getString();
337 String version
= node
.getProperty(SLC_VERSION
)
339 NameVersion nameVersion
= new BasicNameVersion(name
,
341 Boolean started
= node
.getProperty(SLC_STARTED
)
344 modulesManager
.stop(nameVersion
);
346 modulesManager
.start(nameVersion
);
349 String path
= node
.getPath();
350 // TODO factorize with editor
351 QueryManager qm
= node
.getSession().getWorkspace()
353 String statement
= "SELECT * FROM ["
354 + SlcTypes
.SLC_EXECUTION_FLOW
355 + "] WHERE ISDESCENDANTNODE(['" + path
356 + "']) OR ISSAMENODE(['" + path
+ "'])";
357 // log.debug(statement);
358 Query query
= qm
.createQuery(statement
, Query
.JCR_SQL2
);
361 SortedSet
<String
> paths
= new TreeSet
<String
>();
362 for (NodeIterator nit
= query
.execute().getNodes(); nit
364 paths
.add(nit
.nextNode().getPath());
367 // List<String> paths = new ArrayList<String>();
368 // paths.add(node.getPath());
369 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
370 .getActiveWorkbenchWindow().getActivePage();
371 activePage
.openEditor(new ProcessEditorInput(
372 new ArrayList
<String
>(paths
), true),
376 } catch (Exception e
) {
377 throw new SlcException("Cannot open " + obj
, e
);
383 class ViewDragListener
extends DragSourceAdapter
{
384 public void dragSetData(DragSourceEvent event
) {
385 IStructuredSelection selection
= (IStructuredSelection
) viewer
387 if (selection
.getFirstElement() instanceof Node
) {
388 Node node
= (Node
) selection
.getFirstElement();
390 // if (node.isNodeType(SLC_EXECUTION_FLOW)) {
391 // if (EditorInputTransfer.getInstance().isSupportedType(
392 // event.dataType)) {
393 // ProcessEditorInput pei = new ProcessEditorInput(
395 // EditorInputData eid = EditorInputTransfer
396 // .createEditorInputData(ProcessEditor.ID,
398 // event.data = new EditorInputTransfer.EditorInputData[] { eid
403 // } catch (RepositoryException e1) {
404 // throw new SlcException("Cannot drag " + node, e1);
407 if (TextTransfer
.getInstance().isSupportedType(event
.dataType
)) {
409 event
.data
= node
.getPath();
410 } catch (RepositoryException e1
) {
411 // TODO Auto-generated catch block
412 e1
.printStackTrace();
419 public void setSession(Session session
) {
420 this.session
= session
;
423 public void setModulesManager(ExecutionModulesManager modulesManager
) {
424 this.modulesManager
= modulesManager
;