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
;
10 import javax
.jcr
.Property
;
11 import javax
.jcr
.RepositoryException
;
12 import javax
.jcr
.Session
;
13 import javax
.jcr
.nodetype
.NodeType
;
14 import javax
.jcr
.observation
.Event
;
15 import javax
.jcr
.observation
.EventIterator
;
17 import org
.argeo
.ArgeoException
;
18 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
19 import org
.argeo
.eclipse
.ui
.jcr
.DefaultNodeLabelProvider
;
20 import org
.argeo
.eclipse
.ui
.jcr
.SimpleNodeContentProvider
;
21 import org
.argeo
.slc
.BasicNameVersion
;
22 import org
.argeo
.slc
.NameVersion
;
23 import org
.argeo
.slc
.SlcException
;
24 import org
.argeo
.slc
.client
.ui
.SlcImages
;
25 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
26 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
27 import org
.argeo
.slc
.execution
.ExecutionModulesManager
;
28 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
29 import org
.argeo
.slc
.jcr
.SlcNames
;
30 import org
.argeo
.slc
.jcr
.SlcTypes
;
31 import org
.eclipse
.jface
.viewers
.ColumnViewerToolTipSupport
;
32 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
33 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
34 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
35 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
36 import org
.eclipse
.jface
.viewers
.TreeViewer
;
37 import org
.eclipse
.swt
.SWT
;
38 import org
.eclipse
.swt
.dnd
.DND
;
39 import org
.eclipse
.swt
.dnd
.DragSourceAdapter
;
40 import org
.eclipse
.swt
.dnd
.DragSourceEvent
;
41 import org
.eclipse
.swt
.dnd
.TextTransfer
;
42 import org
.eclipse
.swt
.dnd
.Transfer
;
43 import org
.eclipse
.swt
.graphics
.Image
;
44 import org
.eclipse
.swt
.widgets
.Composite
;
45 import org
.eclipse
.ui
.IWorkbenchPage
;
46 import org
.eclipse
.ui
.PlatformUI
;
47 import org
.eclipse
.ui
.part
.ViewPart
;
49 /** JCR based view of the execution modules. */
50 public class JcrExecutionModulesView
extends ViewPart
implements SlcTypes
,
52 // private final static Log log = LogFactory
53 // .getLog(JcrExecutionModulesView.class);
55 public static final String ID
= "org.argeo.slc.client.ui.jcrExecutionModulesView";
57 private TreeViewer viewer
;
59 private Session session
;
61 private ExecutionModulesManager modulesManager
;
63 public void createPartControl(Composite parent
) {
64 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
65 ColumnViewerToolTipSupport
.enableFor(viewer
);
67 ViewContentProvider contentProvider
= new ViewContentProvider(session
);
69 viewer
.setContentProvider(contentProvider
);
70 final ViewLabelProvider viewLabelProvider
= new ViewLabelProvider();
71 viewer
.setLabelProvider(viewLabelProvider
);
72 viewer
.setInput(getViewSite());
73 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
74 getViewSite().setSelectionProvider(viewer
);
76 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
77 // Transfer[] tt = new Transfer[] { EditorInputTransfer.getInstance() };
78 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
79 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
82 session
.getWorkspace()
83 .getObservationManager()
85 new VmAgentObserver(),
86 Event
.NODE_ADDED
| Event
.NODE_REMOVED
88 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
, true, null,
90 } catch (RepositoryException e
) {
91 throw new SlcException("Cannot add observer", e
);
95 public void setFocus() {
96 viewer
.getControl().setFocus();
99 public TreeViewer
getViewer() {
103 public void refreshView() {
104 viewer
.setInput(getViewSite());
107 class ViewContentProvider
extends SimpleNodeContentProvider
{
109 public ViewContentProvider(Session session
) {
111 new String
[] { SlcJcrConstants
.VM_AGENT_FACTORY_PATH
});
115 // protected Object[] getChildren(Node node) throws RepositoryException
117 // if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) {
118 // List<AgentNodesWrapper> wrappers = new
119 // ArrayList<AgentNodesWrapper>();
120 // for (NodeIterator nit = node.getNodes(); nit.hasNext();) {
121 // wrappers.add(new AgentNodesWrapper(nit.nextNode()));
123 // return wrappers.toArray();
125 // return super.getChildren(node);
129 protected Object
[] sort(Object parent
, Object
[] children
) {
130 Object
[] sorted
= new Object
[children
.length
];
131 System
.arraycopy(children
, 0, sorted
, 0, children
.length
);
132 Arrays
.sort(sorted
, new ViewComparator());
137 protected List
<Node
> filterChildren(List
<Node
> children
)
138 throws RepositoryException
{
139 for (Iterator
<Node
> it
= children
.iterator(); it
.hasNext();) {
140 Node node
= it
.next();
141 // execution spec definitions
142 if (node
.getName().equals(SLC_EXECUTION_SPECS
))
145 else if (node
.getParent().isNodeType(
146 SlcTypes
.SLC_EXECUTION_FLOW
))
149 return super.filterChildren(children
);
153 public boolean hasChildren(Object element
) {
154 if (element
instanceof Node
) {
155 Node node
= (Node
) element
;
157 if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
159 } catch (RepositoryException e
) {
160 throw new SlcException("Cannot check has children", e
);
163 return super.hasChildren(element
);
167 static class ViewComparator
implements Comparator
<Object
> {
169 public int compare(Object o1
, Object o2
) {
171 if (o1
instanceof Node
&& o2
instanceof Node
) {
172 Node node1
= (Node
) o1
;
173 Node node2
= (Node
) o2
;
175 if (node1
.getName().equals(SLC_EXECUTION_SPECS
))
177 if (node2
.getName().equals(SLC_EXECUTION_SPECS
))
180 if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
181 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
182 return node1
.getName().compareTo(node2
.getName());
183 } else if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
184 && !node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
186 } else if (!node1
.isNodeType(SLC_EXECUTION_FLOW
)
187 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
191 return node1
.getName().compareTo(node2
.getName());
194 } catch (RepositoryException e
) {
195 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
203 // /** Wraps the execution modules of an agent. */
204 // static class AgentNodesWrapper extends NodesWrapper {
206 // public AgentNodesWrapper(Node node) {
210 // protected List<WrappedNode> getWrappedNodes()
211 // throws RepositoryException {
212 // List<WrappedNode> children = new ArrayList<WrappedNode>();
213 // Node executionModules = getNode();
214 // for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) {
215 // for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions
217 // children.add(new WrappedNode(this, nitVersions.nextNode()));
225 class VmAgentObserver
extends AsyncUiEventListener
{
226 protected void onEventInUiThread(EventIterator events
) {
227 // List<Node> baseNodes = ((SimpleNodeContentProvider) viewer
228 // .getContentProvider()).getBaseNodes();
229 // Node baseNode = baseNodes.get(0);
231 // while (events.hasNext()) {
232 // Event event = events.nextEvent();
234 // String path = event.getPath();
235 // String baseNodePath = baseNode.getPath();
236 // if (path.startsWith(baseNodePath)) {
237 // String relPath = path
238 // .substring(baseNodePath.length() + 1);
239 // log.debug("relPath: " + relPath);
240 // if (baseNode.hasNode(relPath)) {
241 // Node refreshNode = baseNode.getNode(relPath);
242 // log.debug("refreshNode: " + refreshNode);
243 // viewer.refresh(refreshNode);
247 // // if (log.isDebugEnabled())
248 // // log.debug("Process " + path + ": " + event);
250 // // if (session.itemExists(path)) {
251 // // Node parentNode = session.getNode(path).getParent();
252 // // log.debug("Parent: " + parentNode);
253 // // viewer.refresh(parentNode);
255 // } catch (RepositoryException e) {
256 // log.warn("Cannot process event " + event + ": " + e);
261 // Node vmAgentNode = session
262 // .getNode(SlcJcrConstants.VM_AGENT_FACTORY_PATH);
263 // viewer.refresh(vmAgentNode);
264 // } catch (RepositoryException e) {
265 // log.warn("Cannot process event : " + e);
267 // TODO: optimize based on event
272 class ViewLabelProvider
extends DefaultNodeLabelProvider
implements
273 ITableLabelProvider
{
276 protected String
getText(Node node
) throws RepositoryException
{
277 if (node
.getName().equals(SLC_EXECUTION_SPECS
))
278 return "Execution Specifications";
279 else if (node
.getPath().equals(
280 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
))
281 return "Internal Agents";
282 return super.getText(node
);
286 public Image
getImage(Node node
) throws RepositoryException
{
287 // we try to optimize a bit by putting deeper nodes first
288 if (node
.getParent().isNodeType(
289 SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
290 return SlcImages
.CHOICES
;
291 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC_ATTRIBUTE
))
292 return SlcImages
.EXECUTION_SPEC_ATTRIBUTE
;
293 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_SPEC
))
294 return SlcImages
.EXECUTION_SPEC
;
295 else if (node
.getName().equals(SLC_EXECUTION_SPECS
))
296 return SlcImages
.EXECUTION_SPECS
;
297 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
298 return SlcImages
.FLOW
;
299 else if (node
.isNodeType(SlcTypes
.SLC_MODULE
)) {
300 if (node
.getProperty(SLC_STARTED
).getBoolean())
301 return SlcImages
.MODULE
;
303 return SlcImages
.MODULE_STOPPED
;
304 } else if (node
.isNodeType(SlcTypes
.SLC_AGENT
))
305 return SlcImages
.AGENT
;
306 else if (node
.isNodeType(SlcTypes
.SLC_AGENT_FACTORY
))
307 return SlcImages
.AGENT_FACTORY
;
309 return SlcImages
.FOLDER
;
312 public String
getToolTipText(Node node
) throws RepositoryException
{
313 if (node
.isNodeType(NodeType
.MIX_TITLE
)
314 && node
.hasProperty(Property
.JCR_DESCRIPTION
))
315 return node
.getProperty(Property
.JCR_DESCRIPTION
).getString();
316 return super.getToolTipText(node
);
319 public String
getColumnText(Object obj
, int index
) {
323 public Image
getColumnImage(Object obj
, int index
) {
324 return getImage(obj
);
329 class ViewDoubleClickListener
implements IDoubleClickListener
{
330 public void doubleClick(DoubleClickEvent evt
) {
331 Object obj
= ((IStructuredSelection
) evt
.getSelection())
334 if (obj
instanceof Node
) {
335 Node node
= (Node
) obj
;
336 if (node
.isNodeType(SLC_EXECUTION_FLOW
)) {
337 List
<String
> paths
= new ArrayList
<String
>();
338 paths
.add(node
.getPath());
339 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
340 .getActiveWorkbenchWindow().getActivePage();
341 activePage
.openEditor(new ProcessEditorInput(paths
,
342 true), ProcessEditor
.ID
);
343 } else if (node
.isNodeType(SLC_EXECUTION_MODULE
)) {
344 String name
= node
.getProperty(SLC_NAME
).getString();
345 String version
= node
.getProperty(SLC_VERSION
)
347 NameVersion nameVersion
= new BasicNameVersion(name
,
349 Boolean started
= node
.getProperty(SLC_STARTED
)
352 modulesManager
.stop(nameVersion
);
354 modulesManager
.start(nameVersion
);
358 } catch (Exception e
) {
359 throw new SlcException("Cannot open " + obj
, e
);
365 class ViewDragListener
extends DragSourceAdapter
{
366 public void dragSetData(DragSourceEvent event
) {
367 IStructuredSelection selection
= (IStructuredSelection
) viewer
369 if (selection
.getFirstElement() instanceof Node
) {
370 Node node
= (Node
) selection
.getFirstElement();
372 // if (node.isNodeType(SLC_EXECUTION_FLOW)) {
373 // if (EditorInputTransfer.getInstance().isSupportedType(
374 // event.dataType)) {
375 // ProcessEditorInput pei = new ProcessEditorInput(
377 // EditorInputData eid = EditorInputTransfer
378 // .createEditorInputData(ProcessEditor.ID,
380 // event.data = new EditorInputTransfer.EditorInputData[] { eid
385 // } catch (RepositoryException e1) {
386 // throw new SlcException("Cannot drag " + node, e1);
389 if (TextTransfer
.getInstance().isSupportedType(event
.dataType
)) {
391 event
.data
= node
.getPath();
392 } catch (RepositoryException e1
) {
393 // TODO Auto-generated catch block
394 e1
.printStackTrace();
401 public void setSession(Session session
) {
402 this.session
= session
;
405 public void setModulesManager(ExecutionModulesManager modulesManager
) {
406 this.modulesManager
= modulesManager
;