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
.RepositoryException
;
15 import javax
.jcr
.Session
;
16 import javax
.jcr
.observation
.Event
;
17 import javax
.jcr
.observation
.EventIterator
;
18 import javax
.jcr
.observation
.EventListener
;
20 import org
.apache
.commons
.io
.IOUtils
;
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
.DefaultNodeLabelProvider
;
25 import org
.argeo
.eclipse
.ui
.jcr
.NodesWrapper
;
26 import org
.argeo
.eclipse
.ui
.jcr
.SimpleNodeContentProvider
;
27 import org
.argeo
.eclipse
.ui
.jcr
.WrappedNode
;
28 import org
.argeo
.slc
.SlcException
;
29 import org
.argeo
.slc
.client
.ui
.ClientUiPlugin
;
30 import org
.argeo
.slc
.client
.ui
.controllers
.ProcessController
;
31 import org
.argeo
.slc
.client
.ui
.providers
.ExecutionModulesContentProvider
;
32 import org
.argeo
.slc
.client
.ui
.providers
.ExecutionModulesContentProvider
.FlowNode
;
33 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
34 import org
.argeo
.slc
.jcr
.SlcNames
;
35 import org
.argeo
.slc
.jcr
.SlcTypes
;
36 import org
.argeo
.slc
.process
.RealizedFlow
;
37 import org
.argeo
.slc
.process
.SlcExecution
;
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
);
69 ViewContentProvider contentProvider
= new ViewContentProvider(session
);
71 viewer
.setContentProvider(contentProvider
);
72 viewer
.setLabelProvider(new ViewLabelProvider());
73 viewer
.setInput(getViewSite());
74 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
75 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
76 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
77 viewer
.addDragSupport(operations
, tt
, new ViewDragListener());
80 session
.getWorkspace()
81 .getObservationManager()
83 new VmAgentObserver(),
84 Event
.NODE_ADDED
| Event
.NODE_REMOVED
86 SlcJcrConstants
.VM_AGENT_FACTORY_PATH
, true, null,
88 } catch (RepositoryException e
) {
89 throw new SlcException("Cannot add observer", e
);
93 public void setFocus() {
94 viewer
.getControl().setFocus();
97 public TreeViewer
getViewer() {
101 public void refreshView() {
102 viewer
.setInput(getViewSite());
105 class ViewContentProvider
extends SimpleNodeContentProvider
{
107 public ViewContentProvider(Session session
) {
109 new String
[] { SlcJcrConstants
.VM_AGENT_FACTORY_PATH
});
113 protected Object
[] getChildren(Node node
) throws RepositoryException
{
114 if (node
.isNodeType(SlcTypes
.SLC_AGENT_PROXY
)) {
115 List
<AgentNodesWrapper
> wrappers
= new ArrayList
<AgentNodesWrapper
>();
116 for (NodeIterator nit
= node
.getNodes(); nit
.hasNext();) {
117 wrappers
.add(new AgentNodesWrapper(nit
.nextNode()));
119 return wrappers
.toArray();
121 return super.getChildren(node
);
125 protected Object
[] sort(Object parent
, Object
[] children
) {
126 Object
[] sorted
= new Object
[children
.length
];
127 System
.arraycopy(children
, 0, sorted
, 0, children
.length
);
128 Arrays
.sort(sorted
, new ViewComparator());
133 static class ViewComparator
implements Comparator
<Object
> {
135 public int compare(Object o1
, Object o2
) {
137 if (o1
instanceof Node
&& o2
instanceof Node
) {
138 Node node1
= (Node
) o1
;
139 Node node2
= (Node
) o2
;
140 if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
141 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
142 return node1
.getName().compareTo(node2
.getName());
143 } else if (node1
.isNodeType(SLC_EXECUTION_FLOW
)
144 && !node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
146 } else if (!node1
.isNodeType(SLC_EXECUTION_FLOW
)
147 && node2
.isNodeType(SLC_EXECUTION_FLOW
)) {
151 return node1
.getName().compareTo(node2
.getName());
154 } catch (RepositoryException e
) {
155 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
163 /** Wraps the execution modules of an agent. */
164 static class AgentNodesWrapper
extends NodesWrapper
{
166 public AgentNodesWrapper(Node node
) {
170 protected List
<WrappedNode
> getWrappedNodes()
171 throws RepositoryException
{
172 List
<WrappedNode
> children
= new ArrayList
<WrappedNode
>();
173 Node executionModules
= getNode().getNode(
174 SlcNames
.SLC_EXECUTION_MODULES
);
175 for (NodeIterator nit
= executionModules
.getNodes(); nit
.hasNext();) {
176 for (NodeIterator nitVersions
= nit
.nextNode().getNodes(); nitVersions
178 children
.add(new WrappedNode(this, nitVersions
.nextNode()));
186 class VmAgentObserver
implements EventListener
{
188 public void onEvent(EventIterator events
) {
194 class ViewLabelProvider
extends DefaultNodeLabelProvider
implements
195 ITableLabelProvider
{
196 public String
getColumnText(Object obj
, int index
) {
200 public Image
getColumnImage(Object obj
, int index
) {
201 return getImage(obj
);
204 public Image
getImage(Node node
) throws RepositoryException
{
205 if (node
.getParent().isNodeType(SlcTypes
.SLC_AGENT_PROXY
))
206 return ClientUiPlugin
.getDefault().getImageRegistry()
208 else if (node
.isNodeType(SlcTypes
.SLC_MODULE
))
209 return ClientUiPlugin
.getDefault().getImageRegistry()
210 .get("executionModule");
211 else if (node
.isNodeType(SlcTypes
.SLC_EXECUTION_FLOW
))
212 return ClientUiPlugin
.getDefault().getImageRegistry()
215 return ClientUiPlugin
.getDefault().getImageRegistry()
220 class ViewDoubleClickListener
implements IDoubleClickListener
{
221 public void doubleClick(DoubleClickEvent evt
) {
222 Object obj
= ((IStructuredSelection
) evt
.getSelection())
224 if (obj
instanceof ExecutionModulesContentProvider
.FlowNode
) {
225 ExecutionModulesContentProvider
.FlowNode fn
= (ExecutionModulesContentProvider
.FlowNode
) obj
;
227 List
<RealizedFlow
> realizedFlows
= new ArrayList
<RealizedFlow
>();
228 RealizedFlow realizedFlow
= new RealizedFlow();
229 realizedFlow
.setModuleName(fn
.getExecutionModuleNode()
230 .getDescriptor().getName());
231 realizedFlow
.setModuleVersion(fn
.getExecutionModuleNode()
232 .getDescriptor().getVersion());
233 realizedFlow
.setFlowDescriptor(fn
.getExecutionModuleNode()
234 .getFlowDescriptors().get(fn
.getFlowName()));
235 realizedFlows
.add(realizedFlow
);
237 SlcExecution slcExecution
= new SlcExecution();
238 slcExecution
.setUuid(UUID
.randomUUID().toString());
239 slcExecution
.setRealizedFlows(realizedFlows
);
240 slcExecution
.setHost(fn
.getExecutionModuleNode().getAgentNode()
241 .getAgent().toString());
242 processController
.execute(fn
.getExecutionModuleNode()
243 .getAgentNode().getAgent(), slcExecution
);
249 class ViewDragListener
implements DragSourceListener
{
251 public void dragStart(DragSourceEvent event
) {
252 System
.out
.println("Start Drag");
255 public void dragSetData(DragSourceEvent event
) {
257 // System.out.println("dragSetData: " + event);
259 IStructuredSelection selection
= (IStructuredSelection
) viewer
261 if (selection
.getFirstElement() instanceof ExecutionModulesContentProvider
.FlowNode
) {
263 if (TextTransfer
.getInstance().isSupportedType(event
.dataType
)) {
264 ExecutionModulesContentProvider
.FlowNode flowNode
= (ExecutionModulesContentProvider
.FlowNode
) selection
267 Properties props
= new Properties();
268 flowNodeAsProperties(props
, flowNode
);
269 props
.setProperty("agentId", flowNode
270 .getExecutionModuleNode().getAgentNode().getAgent()
272 props
.setProperty("host", flowNode
.getExecutionModuleNode()
273 .getAgentNode().getAgent().toString());
275 ByteArrayOutputStream out
= new ByteArrayOutputStream();
277 props
.store(out
, "");
278 event
.data
= new String(out
.toByteArray());
279 } catch (IOException e
) {
280 throw new SlcException(
281 "Cannot transform realized flow", e
);
283 IOUtils
.closeQuietly(out
);
289 public void dragFinished(DragSourceEvent event
) {
290 System
.out
.println("Finished Drag");
293 protected void flowNodeAsProperties(Properties props
, FlowNode fn
) {
295 RealizedFlow realizedFlow
= new RealizedFlow();
296 realizedFlow
.setModuleName(fn
.getExecutionModuleNode()
297 .getDescriptor().getName());
298 realizedFlow
.setModuleVersion(fn
.getExecutionModuleNode()
299 .getDescriptor().getVersion());
300 realizedFlow
.setFlowDescriptor(fn
.getExecutionFlowDescriptor());
302 // As we want to have the effective ExecutionSpec and not a
303 // reference; we store it at the RealizeFlow level : thus the
304 // marshaller will store the object and not only a reference.
305 realizedFlow
.setExecutionSpec(fn
.getExecutionFlowDescriptor()
306 .getExecutionSpec());
308 // props.setProperty("RealizedFlowAsXml",
309 // oxmBean.marshal(realizedFlow));
311 // .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
317 public void setProcessController(ProcessController processController
) {
318 this.processController
= processController
;
321 public void setSession(Session session
) {
322 this.session
= session
;