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