1 package org
.argeo
.slc
.client
.ui
.views
;
3 import java
.io
.ByteArrayOutputStream
;
4 import java
.io
.IOException
;
5 import java
.util
.ArrayList
;
6 import java
.util
.Arrays
;
7 import java
.util
.Comparator
;
9 import java
.util
.Properties
;
10 import java
.util
.UUID
;
12 import javax
.jcr
.Node
;
13 import javax
.jcr
.NodeIterator
;
14 import javax
.jcr
.Property
;
15 import javax
.jcr
.RepositoryException
;
16 import javax
.jcr
.Session
;
17 import javax
.jcr
.observation
.Event
;
18 import javax
.jcr
.observation
.EventIterator
;
19 import javax
.jcr
.observation
.EventListener
;
21 import org
.apache
.commons
.io
.IOUtils
;
22 import org
.argeo
.ArgeoException
;
23 import org
.argeo
.eclipse
.ui
.jcr
.DefaultNodeLabelProvider
;
24 import org
.argeo
.eclipse
.ui
.jcr
.NodesWrapper
;
25 import org
.argeo
.eclipse
.ui
.jcr
.SimpleNodeContentProvider
;
26 import org
.argeo
.eclipse
.ui
.jcr
.WrappedNode
;
27 import org
.argeo
.slc
.SlcException
;
28 import org
.argeo
.slc
.client
.ui
.ClientUiPlugin
;
29 import org
.argeo
.slc
.client
.ui
.controllers
.ProcessController
;
30 import org
.argeo
.slc
.client
.ui
.providers
.ExecutionModulesContentProvider
;
31 import org
.argeo
.slc
.client
.ui
.providers
.ExecutionModulesContentProvider
.FlowNode
;
32 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
33 import org
.argeo
.slc
.jcr
.SlcNames
;
34 import org
.argeo
.slc
.jcr
.SlcTypes
;
35 import org
.argeo
.slc
.process
.RealizedFlow
;
36 import org
.argeo
.slc
.process
.SlcExecution
;
37 import org
.eclipse
.jface
.viewers
.ColumnViewerToolTipSupport
;
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
.DragSourceEvent
;
46 import org
.eclipse
.swt
.dnd
.DragSourceListener
;
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
.part
.ViewPart
;
53 public class JcrExecutionModulesView
extends ViewPart
implements SlcTypes
,
55 // private final static Log log = LogFactory
56 // .getLog(JcrExecutionModulesView.class);
58 public static final String ID
= "org.argeo.slc.client.ui.jcrExecutionModulesView";
60 private TreeViewer viewer
;
62 private Session session
;
64 private ProcessController processController
;
66 public void createPartControl(Composite parent
) {
67 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
68 ColumnViewerToolTipSupport
.enableFor(viewer
);
70 ViewContentProvider contentProvider
= new ViewContentProvider(session
);
72 viewer
.setContentProvider(contentProvider
);
73 final ViewLabelProvider viewLabelProvider
= new ViewLabelProvider();
74 viewer
.setLabelProvider(viewLabelProvider
);
75 viewer
.setInput(getViewSite());
76 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
77 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
78 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
79 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
82 session
.getWorkspace()
83 .getObservationManager()
85 new VmAgentObserver(),
86 Event
.NODE_ADDED
| Event
.NODE_REMOVED
88 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
, true, null,
90 } catch (RepositoryException e
) {
91 throw new SlcException("Cannot add observer", e
);
95 public void setFocus() {
96 viewer
.getControl().setFocus();
99 public TreeViewer
getViewer() {
103 public void refreshView() {
104 viewer
.setInput(getViewSite());
107 class ViewContentProvider
extends SimpleNodeContentProvider
{
109 public ViewContentProvider(Session session
) {
111 new String
[] { SlcJcrConstants
.VM_AGENT_FACTORY_PATH
});
115 protected Object
[] getChildren(Node node
) throws RepositoryException
{
116 if (node
.isNodeType(SlcTypes
.SLC_AGENT_PROXY
)) {
117 List
<AgentNodesWrapper
> wrappers
= new ArrayList
<AgentNodesWrapper
>();
118 for (NodeIterator nit
= node
.getNodes(); nit
.hasNext();) {
119 wrappers
.add(new AgentNodesWrapper(nit
.nextNode()));
121 return wrappers
.toArray();
123 return super.getChildren(node
);
127 protected Object
[] sort(Object parent
, Object
[] children
) {
128 Object
[] sorted
= new Object
[children
.length
];
129 System
.arraycopy(children
, 0, sorted
, 0, children
.length
);
130 Arrays
.sort(sorted
, new ViewComparator());
135 static class ViewComparator
implements Comparator
<Object
> {
137 public int compare(Object o1
, Object o2
) {
139 if (o1
instanceof Node
&& o2
instanceof Node
) {
140 Node node1
= (Node
) o1
;
141 Node node2
= (Node
) o2
;
142 if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
143 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
144 return node1
.getName().compareTo(node2
.getName());
145 } else if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
146 && !node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
148 } else if (!node1
.isNodeType(SLC_EXECUTION_FLOW
)
149 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
153 return node1
.getName().compareTo(node2
.getName());
156 } catch (RepositoryException e
) {
157 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
165 /** Wraps the execution modules of an agent. */
166 static class AgentNodesWrapper
extends NodesWrapper
{
168 public AgentNodesWrapper(Node node
) {
172 protected List
<WrappedNode
> getWrappedNodes()
173 throws RepositoryException
{
174 List
<WrappedNode
> children
= new ArrayList
<WrappedNode
>();
175 Node executionModules
= getNode().getNode(
176 SlcNames
.SLC_EXECUTION_MODULES
);
177 for (NodeIterator nit
= executionModules
.getNodes(); nit
.hasNext();) {
178 for (NodeIterator nitVersions
= nit
.nextNode().getNodes(); nitVersions
180 children
.add(new WrappedNode(this, nitVersions
.nextNode()));
188 class VmAgentObserver
implements EventListener
{
190 public void onEvent(EventIterator events
) {
196 class ViewLabelProvider
extends DefaultNodeLabelProvider
implements
197 ITableLabelProvider
{
198 public String
getColumnText(Object obj
, int index
) {
202 public Image
getColumnImage(Object obj
, int index
) {
203 return getImage(obj
);
206 public Image
getImage(Node node
) throws RepositoryException
{
207 if (node
.getParent().isNodeType(SlcTypes
.SLC_AGENT_PROXY
))
208 return ClientUiPlugin
.getDefault().getImageRegistry()
210 else if (node
.isNodeType(SlcTypes
.SLC_MODULE
))
211 return ClientUiPlugin
.getDefault().getImageRegistry()
212 .get("executionModule");
213 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
214 return ClientUiPlugin
.getDefault().getImageRegistry()
217 return ClientUiPlugin
.getDefault().getImageRegistry()
221 public String
getToolTipText(Node node
) throws RepositoryException
{
222 if (node
.isNodeType(SlcTypes
.SLC_MODULE
)
223 && node
.hasProperty(Property
.JCR_DESCRIPTION
))
224 return node
.getProperty(Property
.JCR_DESCRIPTION
).getString();
225 return super.getToolTipText(node
);
230 class ViewDoubleClickListener
implements IDoubleClickListener
{
231 public void doubleClick(DoubleClickEvent evt
) {
232 Object obj
= ((IStructuredSelection
) evt
.getSelection())
234 if (obj
instanceof ExecutionModulesContentProvider
.FlowNode
) {
235 ExecutionModulesContentProvider
.FlowNode fn
= (ExecutionModulesContentProvider
.FlowNode
) obj
;
237 List
<RealizedFlow
> realizedFlows
= new ArrayList
<RealizedFlow
>();
238 RealizedFlow realizedFlow
= new RealizedFlow();
239 realizedFlow
.setModuleName(fn
.getExecutionModuleNode()
240 .getDescriptor().getName());
241 realizedFlow
.setModuleVersion(fn
.getExecutionModuleNode()
242 .getDescriptor().getVersion());
243 realizedFlow
.setFlowDescriptor(fn
.getExecutionModuleNode()
244 .getFlowDescriptors().get(fn
.getFlowName()));
245 realizedFlows
.add(realizedFlow
);
247 SlcExecution slcExecution
= new SlcExecution();
248 slcExecution
.setUuid(UUID
.randomUUID().toString());
249 slcExecution
.setRealizedFlows(realizedFlows
);
250 slcExecution
.setHost(fn
.getExecutionModuleNode().getAgentNode()
251 .getAgent().toString());
252 processController
.execute(fn
.getExecutionModuleNode()
253 .getAgentNode().getAgent(), slcExecution
);
259 class ViewDragListener
implements DragSourceListener
{
261 public void dragStart(DragSourceEvent event
) {
262 System
.out
.println("Start Drag");
265 public void dragSetData(DragSourceEvent event
) {
267 // System.out.println("dragSetData: " + event);
269 IStructuredSelection selection
= (IStructuredSelection
) viewer
271 if (selection
.getFirstElement() instanceof ExecutionModulesContentProvider
.FlowNode
) {
273 if (TextTransfer
.getInstance().isSupportedType(event
.dataType
)) {
274 ExecutionModulesContentProvider
.FlowNode flowNode
= (ExecutionModulesContentProvider
.FlowNode
) selection
277 Properties props
= new Properties();
278 flowNodeAsProperties(props
, flowNode
);
279 props
.setProperty("agentId", flowNode
280 .getExecutionModuleNode().getAgentNode().getAgent()
282 props
.setProperty("host", flowNode
.getExecutionModuleNode()
283 .getAgentNode().getAgent().toString());
285 ByteArrayOutputStream out
= new ByteArrayOutputStream();
287 props
.store(out
, "");
288 event
.data
= new String(out
.toByteArray());
289 } catch (IOException e
) {
290 throw new SlcException(
291 "Cannot transform realized flow", e
);
293 IOUtils
.closeQuietly(out
);
299 public void dragFinished(DragSourceEvent event
) {
300 System
.out
.println("Finished Drag");
303 protected void flowNodeAsProperties(Properties props
, FlowNode fn
) {
305 RealizedFlow realizedFlow
= new RealizedFlow();
306 realizedFlow
.setModuleName(fn
.getExecutionModuleNode()
307 .getDescriptor().getName());
308 realizedFlow
.setModuleVersion(fn
.getExecutionModuleNode()
309 .getDescriptor().getVersion());
310 realizedFlow
.setFlowDescriptor(fn
.getExecutionFlowDescriptor());
312 // As we want to have the effective ExecutionSpec and not a
313 // reference; we store it at the RealizeFlow level : thus the
314 // marshaller will store the object and not only a reference.
315 realizedFlow
.setExecutionSpec(fn
.getExecutionFlowDescriptor()
316 .getExecutionSpec());
318 // props.setProperty("RealizedFlowAsXml",
319 // oxmBean.marshal(realizedFlow));
321 // .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
327 public void setProcessController(ProcessController processController
) {
328 this.processController
= processController
;
331 public void setSession(Session session
) {
332 this.session
= session
;