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