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