]> 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/ExecutionModulesView.java
Improve process management
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / views / ExecutionModulesView.java
1 package org.argeo.slc.client.ui.views;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Properties;
8 import java.util.UUID;
9
10 import org.apache.commons.io.IOUtils;
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13 import org.argeo.slc.SlcException;
14 import org.argeo.slc.client.oxm.OxmInterface;
15 import org.argeo.slc.client.ui.SlcImages;
16 import org.argeo.slc.client.ui.controllers.ProcessController;
17 import org.argeo.slc.client.ui.providers.ExecutionModulesContentProvider;
18 import org.argeo.slc.client.ui.providers.ExecutionModulesContentProvider.FlowNode;
19 import org.argeo.slc.execution.ExecutionModuleDescriptor;
20 import org.argeo.slc.process.RealizedFlow;
21 import org.argeo.slc.process.SlcExecution;
22 import org.eclipse.jface.viewers.DoubleClickEvent;
23 import org.eclipse.jface.viewers.IContentProvider;
24 import org.eclipse.jface.viewers.IDoubleClickListener;
25 import org.eclipse.jface.viewers.IStructuredSelection;
26 import org.eclipse.jface.viewers.ITableLabelProvider;
27 import org.eclipse.jface.viewers.LabelProvider;
28 import org.eclipse.jface.viewers.TreeViewer;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.dnd.DND;
31 import org.eclipse.swt.dnd.DragSourceEvent;
32 import org.eclipse.swt.dnd.DragSourceListener;
33 import org.eclipse.swt.dnd.TextTransfer;
34 import org.eclipse.swt.dnd.Transfer;
35 import org.eclipse.swt.graphics.Image;
36 import org.eclipse.swt.widgets.Composite;
37 import org.eclipse.ui.ISharedImages;
38 import org.eclipse.ui.PlatformUI;
39 import org.eclipse.ui.part.ViewPart;
40
41 public class ExecutionModulesView extends ViewPart {
42 private final static Log log = LogFactory
43 .getLog(ExecutionModulesView.class);
44
45 public static final String ID = "org.argeo.slc.client.ui.executionModulesView";
46
47 private TreeViewer viewer;
48
49 // Ioc
50 private IContentProvider contentProvider;
51 private OxmInterface oxmBean;
52 private ProcessController processController;
53
54 public void createPartControl(Composite parent) {
55 viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
56 viewer.setContentProvider(contentProvider);
57 viewer.setLabelProvider(new ViewLabelProvider());
58 viewer.setInput(getViewSite());
59 viewer.addDoubleClickListener(new ViewDoubleClickListener());
60 int operations = DND.DROP_COPY | DND.DROP_MOVE;
61 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
62 viewer.addDragSupport(operations, tt, new ViewDragListener());
63 }
64
65 public void setFocus() {
66 viewer.getControl().setFocus();
67 }
68
69 public TreeViewer getViewer() {
70 return viewer;
71 }
72
73 public void refreshView() {
74 viewer.setInput(getViewSite());
75 }
76
77 class ViewLabelProvider extends LabelProvider implements
78 ITableLabelProvider {
79 public String getColumnText(Object obj, int index) {
80 if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode) {
81 ExecutionModuleDescriptor emd = ((ExecutionModulesContentProvider.ExecutionModuleNode) obj)
82 .getDescriptor();
83 if (emd.getLabel() != null) {
84 return emd.getLabel();
85 } else {
86 return getText(emd);
87 }
88 } else
89 return getText(obj);
90 }
91
92 public Image getColumnImage(Object obj, int index) {
93 return getImage(obj);
94 }
95
96 public Image getImage(Object obj) {
97 if (obj instanceof ExecutionModulesContentProvider.AgentNode)
98 return SlcImages.AGENT;
99 else if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode)
100 return SlcImages.MODULE;
101 else if (obj instanceof ExecutionModulesContentProvider.FolderNode)
102 return SlcImages.FOLDER;
103 else if (obj instanceof ExecutionModulesContentProvider.FlowNode)
104 return SlcImages.FLOW;
105 else
106 return PlatformUI.getWorkbench().getSharedImages()
107 .getImage(ISharedImages.IMG_OBJ_ELEMENT);
108 }
109 }
110
111 class ViewDoubleClickListener implements IDoubleClickListener {
112 public void doubleClick(DoubleClickEvent evt) {
113 Object obj = ((IStructuredSelection) evt.getSelection())
114 .getFirstElement();
115 if (obj instanceof ExecutionModulesContentProvider.FlowNode) {
116 ExecutionModulesContentProvider.FlowNode fn = (ExecutionModulesContentProvider.FlowNode) obj;
117
118 List<RealizedFlow> realizedFlows = new ArrayList<RealizedFlow>();
119 RealizedFlow realizedFlow = new RealizedFlow();
120 realizedFlow.setModuleName(fn.getExecutionModuleNode()
121 .getDescriptor().getName());
122 realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
123 .getDescriptor().getVersion());
124 realizedFlow.setFlowDescriptor(fn.getExecutionModuleNode()
125 .getFlowDescriptors().get(fn.getFlowName()));
126 realizedFlows.add(realizedFlow);
127
128 SlcExecution slcExecution = new SlcExecution();
129 slcExecution.setUuid(UUID.randomUUID().toString());
130 slcExecution.setRealizedFlows(realizedFlows);
131 slcExecution.setHost(fn.getExecutionModuleNode().getAgentNode()
132 .getAgent().toString());
133 processController.execute(fn.getExecutionModuleNode()
134 .getAgentNode().getAgent(), slcExecution);
135 }
136 }
137
138 }
139
140 class ViewDragListener implements DragSourceListener {
141
142 public void dragStart(DragSourceEvent event) {
143 System.out.println("Start Drag");
144 }
145
146 public void dragSetData(DragSourceEvent event) {
147
148 // System.out.println("dragSetData: " + event);
149
150 IStructuredSelection selection = (IStructuredSelection) viewer
151 .getSelection();
152 if (selection.getFirstElement() instanceof ExecutionModulesContentProvider.FlowNode) {
153
154 if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
155 ExecutionModulesContentProvider.FlowNode flowNode = (ExecutionModulesContentProvider.FlowNode) selection
156 .getFirstElement();
157
158 Properties props = new Properties();
159 flowNodeAsProperties(props, flowNode);
160 props.setProperty("agentId", flowNode
161 .getExecutionModuleNode().getAgentNode().getAgent()
162 .getAgentUuid());
163 props.setProperty("host", flowNode.getExecutionModuleNode()
164 .getAgentNode().getAgent().toString());
165
166 ByteArrayOutputStream out = new ByteArrayOutputStream();
167 try {
168 props.store(out, "");
169 event.data = new String(out.toByteArray());
170 } catch (IOException e) {
171 throw new SlcException(
172 "Cannot transform realized flow", e);
173 } finally {
174 IOUtils.closeQuietly(out);
175 }
176 }
177 }
178 }
179
180 public void dragFinished(DragSourceEvent event) {
181 System.out.println("Finished Drag");
182 }
183
184 protected void flowNodeAsProperties(Properties props, FlowNode fn) {
185
186 RealizedFlow realizedFlow = new RealizedFlow();
187 realizedFlow.setModuleName(fn.getExecutionModuleNode()
188 .getDescriptor().getName());
189 realizedFlow.setModuleVersion(fn.getExecutionModuleNode()
190 .getDescriptor().getVersion());
191 realizedFlow.setFlowDescriptor(fn.getExecutionFlowDescriptor());
192
193 // As we want to have the effective ExecutionSpec and not a
194 // reference; we store it at the RealizeFlow level : thus the
195 // marshaller will store the object and not only a reference.
196 realizedFlow.setExecutionSpec(fn.getExecutionFlowDescriptor()
197 .getExecutionSpec());
198
199 props.setProperty("RealizedFlowAsXml",
200 oxmBean.marshal(realizedFlow));
201 System.out
202 .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
203
204 }
205
206 }
207
208 // IoC
209 public void setContentProvider(IContentProvider contentProvider) {
210 this.contentProvider = contentProvider;
211 }
212
213 public void setProcessController(ProcessController processController) {
214 this.processController = processController;
215 }
216
217 public void setOxmBean(OxmInterface oxmBean) {
218 this.oxmBean = oxmBean;
219 }
220
221 }