]> git.argeo.org Git - gpl/argeo-slc.git/blob - eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java
ece324d8f66802200dda08723333c39c18292e92
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / views / JcrExecutionModulesView.java
1 package org.argeo.slc.client.ui.views;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Comparator;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.SortedSet;
9 import java.util.TreeSet;
10
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;
20
21 import org.argeo.ArgeoException;
22 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
23 import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider;
24 import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider;
25 import org.argeo.slc.BasicNameVersion;
26 import org.argeo.slc.NameVersion;
27 import org.argeo.slc.SlcException;
28 import org.argeo.slc.client.ui.SlcImages;
29 import org.argeo.slc.client.ui.editors.ProcessEditor;
30 import org.argeo.slc.client.ui.editors.ProcessEditorInput;
31 import org.argeo.slc.execution.ExecutionModulesManager;
32 import org.argeo.slc.jcr.SlcJcrConstants;
33 import org.argeo.slc.jcr.SlcNames;
34 import org.argeo.slc.jcr.SlcTypes;
35 import org.eclipse.jface.viewers.DoubleClickEvent;
36 import org.eclipse.jface.viewers.IDoubleClickListener;
37 import org.eclipse.jface.viewers.IStructuredSelection;
38 import org.eclipse.jface.viewers.ITableLabelProvider;
39 import org.eclipse.jface.viewers.TreeViewer;
40 import org.eclipse.swt.SWT;
41 import org.eclipse.swt.dnd.DND;
42 import org.eclipse.swt.dnd.DragSourceAdapter;
43 import org.eclipse.swt.dnd.DragSourceEvent;
44 import org.eclipse.swt.dnd.TextTransfer;
45 import org.eclipse.swt.dnd.Transfer;
46 import org.eclipse.swt.graphics.Image;
47 import org.eclipse.swt.widgets.Composite;
48 import org.eclipse.swt.widgets.Display;
49 import org.eclipse.ui.IWorkbenchPage;
50 import org.eclipse.ui.PlatformUI;
51 import org.eclipse.ui.part.ViewPart;
52
53 /** JCR based view of the execution modules. */
54 public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
55 SlcNames {
56 // private final static Log log = LogFactory
57 // .getLog(JcrExecutionModulesView.class);
58
59 public static final String ID = "org.argeo.slc.client.ui.jcrExecutionModulesView";
60
61 private TreeViewer viewer;
62
63 private Session session;
64
65 private ExecutionModulesManager modulesManager;
66
67 public void createPartControl(Composite parent) {
68 viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
69
70 // FIXME : does not work in RAP, find a way to have it for RCP only
71 // ColumnViewerToolTipSupport.enableFor(viewer);
72
73 ViewContentProvider contentProvider = new ViewContentProvider(session);
74
75 viewer.setContentProvider(contentProvider);
76 final ViewLabelProvider viewLabelProvider = new ViewLabelProvider();
77 viewer.setLabelProvider(viewLabelProvider);
78 viewer.setInput(getViewSite());
79 viewer.addDoubleClickListener(new ViewDoubleClickListener());
80 getViewSite().setSelectionProvider(viewer);
81
82 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
83 // Transfer[] tt = new Transfer[] { EditorInputTransfer.getInstance() };
84 int operations = DND.DROP_COPY | DND.DROP_MOVE;
85 viewer.addDragSupport(operations, tt, new ViewDragListener());
86
87 try {
88 session.getWorkspace()
89 .getObservationManager()
90 .addEventListener(
91 new VmAgentObserver(viewer.getTree().getDisplay()),
92 Event.NODE_ADDED | Event.NODE_REMOVED
93 | Event.NODE_MOVED,
94 SlcJcrConstants.VM_AGENT_FACTORY_PATH, true, null,
95 null, false);
96 } catch (RepositoryException e) {
97 throw new SlcException("Cannot add observer", e);
98 }
99 }
100
101 public void setFocus() {
102 viewer.getControl().setFocus();
103 }
104
105 public TreeViewer getViewer() {
106 return viewer;
107 }
108
109 public void refreshView() {
110 viewer.setInput(getViewSite());
111 }
112
113 class ViewContentProvider extends SimpleNodeContentProvider {
114
115 public ViewContentProvider(Session session) {
116 super(session,
117 new String[] { SlcJcrConstants.VM_AGENT_FACTORY_PATH });
118 }
119
120 // @Override
121 // protected Object[] getChildren(Node node) throws RepositoryException
122 // {
123 // if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY)) {
124 // List<AgentNodesWrapper> wrappers = new
125 // ArrayList<AgentNodesWrapper>();
126 // for (NodeIterator nit = node.getNodes(); nit.hasNext();) {
127 // wrappers.add(new AgentNodesWrapper(nit.nextNode()));
128 // }
129 // return wrappers.toArray();
130 // }
131 // return super.getChildren(node);
132 // }
133
134 @Override
135 protected Object[] sort(Object parent, Object[] children) {
136 Object[] sorted = new Object[children.length];
137 System.arraycopy(children, 0, sorted, 0, children.length);
138 Arrays.sort(sorted, new ViewComparator());
139 return sorted;
140 }
141
142 @Override
143 protected List<Node> filterChildren(List<Node> children)
144 throws RepositoryException {
145 for (Iterator<Node> it = children.iterator(); it.hasNext();) {
146 Node node = it.next();
147 // execution spec definitions
148 if (node.getName().equals(SLC_EXECUTION_SPECS))
149 it.remove();
150 // flow values
151 else if (node.getParent().isNodeType(
152 SlcTypes.SLC_EXECUTION_FLOW))
153 it.remove();
154 }
155 return super.filterChildren(children);
156 }
157
158 @Override
159 public boolean hasChildren(Object element) {
160 if (element instanceof Node) {
161 Node node = (Node) element;
162 try {
163 if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW))
164 return false;
165 } catch (RepositoryException e) {
166 throw new SlcException("Cannot check has children", e);
167 }
168 }
169 return super.hasChildren(element);
170 }
171 }
172
173 static class ViewComparator implements Comparator<Object> {
174
175 public int compare(Object o1, Object o2) {
176 try {
177 if (o1 instanceof Node && o2 instanceof Node) {
178 Node node1 = (Node) o1;
179 Node node2 = (Node) o2;
180
181 if (node1.getName().equals(SLC_EXECUTION_SPECS))
182 return -100;
183 if (node2.getName().equals(SLC_EXECUTION_SPECS))
184 return 100;
185
186 if (node1.isNodeType(SLC_EXECUTION_FLOW)
187 && node2.isNodeType(SLC_EXECUTION_FLOW)) {
188 return node1.getName().compareTo(node2.getName());
189 } else if (node1.isNodeType(SLC_EXECUTION_FLOW)
190 && !node2.isNodeType(SLC_EXECUTION_FLOW)) {
191 return 1;
192 } else if (!node1.isNodeType(SLC_EXECUTION_FLOW)
193 && node2.isNodeType(SLC_EXECUTION_FLOW)) {
194 return -1;
195 } else {
196 // TODO: check title
197 return node1.getName().compareTo(node2.getName());
198 }
199 }
200 } catch (RepositoryException e) {
201 throw new ArgeoException("Cannot compare " + o1 + " and " + o2,
202 e);
203 }
204 return 0;
205 }
206
207 }
208
209 // /** Wraps the execution modules of an agent. */
210 // static class AgentNodesWrapper extends NodesWrapper {
211 //
212 // public AgentNodesWrapper(Node node) {
213 // super(node);
214 // }
215 //
216 // protected List<WrappedNode> getWrappedNodes()
217 // throws RepositoryException {
218 // List<WrappedNode> children = new ArrayList<WrappedNode>();
219 // Node executionModules = getNode();
220 // for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) {
221 // for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions
222 // .hasNext();) {
223 // children.add(new WrappedNode(this, nitVersions.nextNode()));
224 // }
225 // }
226 // return children;
227 // }
228 //
229 // }
230
231 class VmAgentObserver extends AsyncUiEventListener {
232
233 public VmAgentObserver(Display display) {
234 super(display);
235 }
236
237 protected void onEventInUiThread(List<Event> events) {
238 // List<Node> baseNodes = ((SimpleNodeContentProvider) viewer
239 // .getContentProvider()).getBaseNodes();
240 // Node baseNode = baseNodes.get(0);
241 //
242 // while (events.hasNext()) {
243 // Event event = events.nextEvent();
244 // try {
245 // String path = event.getPath();
246 // String baseNodePath = baseNode.getPath();
247 // if (path.startsWith(baseNodePath)) {
248 // String relPath = path
249 // .substring(baseNodePath.length() + 1);
250 // log.debug("relPath: " + relPath);
251 // if (baseNode.hasNode(relPath)) {
252 // Node refreshNode = baseNode.getNode(relPath);
253 // log.debug("refreshNode: " + refreshNode);
254 // viewer.refresh(refreshNode);
255 // }
256 //
257 // }
258 // // if (log.isDebugEnabled())
259 // // log.debug("Process " + path + ": " + event);
260 //
261 // // if (session.itemExists(path)) {
262 // // Node parentNode = session.getNode(path).getParent();
263 // // log.debug("Parent: " + parentNode);
264 // // viewer.refresh(parentNode);
265 // // }
266 // } catch (RepositoryException e) {
267 // log.warn("Cannot process event " + event + ": " + e);
268 // }
269 // }
270
271 // try {
272 // Node vmAgentNode = session
273 // .getNode(SlcJcrConstants.VM_AGENT_FACTORY_PATH);
274 // viewer.refresh(vmAgentNode);
275 // } catch (RepositoryException e) {
276 // log.warn("Cannot process event : " + e);
277 // }
278 // TODO: optimize based on event
279 viewer.refresh();
280 }
281 }
282
283 class ViewLabelProvider extends DefaultNodeLabelProvider implements
284 ITableLabelProvider {
285
286 @Override
287 protected String getText(Node node) throws RepositoryException {
288 if (node.getName().equals(SLC_EXECUTION_SPECS))
289 return "Execution Specifications";
290 else if (node.getPath().equals(
291 SlcJcrConstants.VM_AGENT_FACTORY_PATH))
292 return "Internal Agents";
293 return super.getText(node);
294 }
295
296 @Override
297 public Image getImage(Node node) throws RepositoryException {
298 // we try to optimize a bit by putting deeper nodes first
299 if (node.getParent().isNodeType(
300 SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE))
301 return SlcImages.CHOICES;
302 else if (node.isNodeType(SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE))
303 return SlcImages.EXECUTION_SPEC_ATTRIBUTE;
304 else if (node.isNodeType(SlcTypes.SLC_EXECUTION_SPEC))
305 return SlcImages.EXECUTION_SPEC;
306 else if (node.getName().equals(SLC_EXECUTION_SPECS))
307 return SlcImages.EXECUTION_SPECS;
308 else if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW))
309 return SlcImages.FLOW;
310 else if (node.isNodeType(SlcTypes.SLC_MODULE)) {
311 if (node.getProperty(SLC_STARTED).getBoolean())
312 return SlcImages.MODULE;
313 else
314 return SlcImages.MODULE_STOPPED;
315 } else if (node.isNodeType(SlcTypes.SLC_AGENT))
316 return SlcImages.AGENT;
317 else if (node.isNodeType(SlcTypes.SLC_AGENT_FACTORY))
318 return SlcImages.AGENT_FACTORY;
319 else
320 return SlcImages.FOLDER;
321 }
322
323 public String getToolTipText(Node node) throws RepositoryException {
324 if (node.isNodeType(NodeType.MIX_TITLE)
325 && node.hasProperty(Property.JCR_DESCRIPTION))
326 return node.getProperty(Property.JCR_DESCRIPTION).getString();
327 return super.getToolTipText(node);
328 }
329
330 public String getColumnText(Object obj, int index) {
331 return getText(obj);
332 }
333
334 public Image getColumnImage(Object obj, int index) {
335 return getImage(obj);
336 }
337
338 }
339
340 class ViewDoubleClickListener implements IDoubleClickListener {
341 public void doubleClick(DoubleClickEvent evt) {
342 Object obj = ((IStructuredSelection) evt.getSelection())
343 .getFirstElement();
344 try {
345 if (obj instanceof Node) {
346 Node node = (Node) obj;
347 if (node.isNodeType(SLC_EXECUTION_MODULE)) {
348 String name = node.getProperty(SLC_NAME).getString();
349 String version = node.getProperty(SLC_VERSION)
350 .getString();
351 NameVersion nameVersion = new BasicNameVersion(name,
352 version);
353 Boolean started = node.getProperty(SLC_STARTED)
354 .getBoolean();
355 if (started) {
356 modulesManager.stop(nameVersion);
357 } else {
358 modulesManager.start(nameVersion);
359 }
360 } else {
361 String path = node.getPath();
362 // TODO factorize with editor
363 QueryManager qm = node.getSession().getWorkspace()
364 .getQueryManager();
365 String statement = "SELECT * FROM ["
366 + SlcTypes.SLC_EXECUTION_FLOW
367 + "] WHERE ISDESCENDANTNODE(['" + path
368 + "']) OR ISSAMENODE(['" + path + "'])";
369 // log.debug(statement);
370 Query query = qm.createQuery(statement, Query.JCR_SQL2);
371
372 // order paths
373 SortedSet<String> paths = new TreeSet<String>();
374 for (NodeIterator nit = query.execute().getNodes(); nit
375 .hasNext();) {
376 paths.add(nit.nextNode().getPath());
377 }
378
379 // List<String> paths = new ArrayList<String>();
380 // paths.add(node.getPath());
381 IWorkbenchPage activePage = PlatformUI.getWorkbench()
382 .getActiveWorkbenchWindow().getActivePage();
383 activePage.openEditor(new ProcessEditorInput(
384 new ArrayList<String>(paths), true),
385 ProcessEditor.ID);
386 }
387 }
388 } catch (Exception e) {
389 throw new SlcException("Cannot open " + obj, e);
390 }
391 }
392
393 }
394
395 class ViewDragListener extends DragSourceAdapter {
396 public void dragSetData(DragSourceEvent event) {
397 IStructuredSelection selection = (IStructuredSelection) viewer
398 .getSelection();
399 if (selection.getFirstElement() instanceof Node) {
400 Node node = (Node) selection.getFirstElement();
401 // try {
402 // if (node.isNodeType(SLC_EXECUTION_FLOW)) {
403 // if (EditorInputTransfer.getInstance().isSupportedType(
404 // event.dataType)) {
405 // ProcessEditorInput pei = new ProcessEditorInput(
406 // node.getPath());
407 // EditorInputData eid = EditorInputTransfer
408 // .createEditorInputData(ProcessEditor.ID,
409 // pei);
410 // event.data = new EditorInputTransfer.EditorInputData[] { eid
411 // };
412 //
413 // }
414 // }
415 // } catch (RepositoryException e1) {
416 // throw new SlcException("Cannot drag " + node, e1);
417 // }
418
419 if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
420 try {
421 event.data = node.getPath();
422 } catch (RepositoryException e1) {
423 // TODO Auto-generated catch block
424 e1.printStackTrace();
425 }
426 }
427 }
428 }
429 }
430
431 public void setSession(Session session) {
432 this.session = session;
433 }
434
435 public void setModulesManager(ExecutionModulesManager modulesManager) {
436 this.modulesManager = modulesManager;
437 }
438
439 }