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