]> 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/JcrProcessListView.java
Document and improve execution model
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / views / JcrProcessListView.java
1 package org.argeo.slc.client.ui.views;
2
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import javax.jcr.Node;
9 import javax.jcr.NodeIterator;
10 import javax.jcr.Property;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13 import javax.jcr.observation.Event;
14 import javax.jcr.observation.EventIterator;
15 import javax.jcr.observation.EventListener;
16 import javax.jcr.observation.ObservationManager;
17 import javax.jcr.query.Query;
18
19 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
20 import org.argeo.jcr.JcrUtils;
21 import org.argeo.slc.SlcException;
22 import org.argeo.slc.client.ui.SlcImages;
23 import org.argeo.slc.client.ui.editors.ProcessEditor;
24 import org.argeo.slc.client.ui.editors.ProcessEditorInput;
25 import org.argeo.slc.execution.ExecutionProcess;
26 import org.argeo.slc.jcr.SlcJcrConstants;
27 import org.argeo.slc.jcr.SlcNames;
28 import org.argeo.slc.jcr.SlcTypes;
29 import org.eclipse.jface.viewers.ColumnLabelProvider;
30 import org.eclipse.jface.viewers.DoubleClickEvent;
31 import org.eclipse.jface.viewers.IDoubleClickListener;
32 import org.eclipse.jface.viewers.IStructuredContentProvider;
33 import org.eclipse.jface.viewers.IStructuredSelection;
34 import org.eclipse.jface.viewers.ITableLabelProvider;
35 import org.eclipse.jface.viewers.TableViewer;
36 import org.eclipse.jface.viewers.Viewer;
37 import org.eclipse.swt.SWT;
38 import org.eclipse.swt.graphics.Image;
39 import org.eclipse.swt.widgets.Composite;
40 import org.eclipse.swt.widgets.Table;
41 import org.eclipse.swt.widgets.TableColumn;
42 import org.eclipse.ui.IWorkbenchPage;
43 import org.eclipse.ui.PlatformUI;
44 import org.eclipse.ui.part.ViewPart;
45
46 /**
47 * This class display the list of all processes that have run in the
48 * corresponding agent. Currently, the local agent.
49 */
50 public class JcrProcessListView extends ViewPart {
51 public static final String ID = "org.argeo.slc.client.ui.jcrProcessListView";
52
53 private TableViewer viewer;
54
55 private Session session;
56
57 private EventListener processesObserver;
58
59 private DateFormat dateFormat = new SimpleDateFormat(
60 "EEE, dd MMM yyyy HH:mm:ss");
61 private Integer queryLimit = 100;
62
63 public void createPartControl(Composite parent) {
64 Table table = createTable(parent);
65 viewer = new TableViewer(table);
66 viewer.setLabelProvider(new LabelProvider());
67 viewer.setContentProvider(new ContentProvider());
68 viewer.setInput(getViewSite());
69 viewer.addDoubleClickListener(new ViewDoubleClickListener());
70
71 processesObserver = new AsyncUiEventListener() {
72 protected void onEventInUiThread(EventIterator events) {
73 // TODO optimize by updating only the changed process
74 viewer.refresh();
75 }
76 };
77 try {
78 ObservationManager observationManager = session.getWorkspace()
79 .getObservationManager();
80 observationManager.addEventListener(processesObserver,
81 Event.NODE_ADDED | Event.NODE_REMOVED
82 | Event.PROPERTY_CHANGED,
83 SlcJcrConstants.PROCESSES_BASE_PATH, true, null, null,
84 false);
85 } catch (RepositoryException e) {
86 throw new SlcException("Cannot register listeners", e);
87 }
88
89 }
90
91 protected Table createTable(Composite parent) {
92 int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
93 | SWT.FULL_SELECTION;
94 // does not function with RAP, commented for the time being
95 // | SWT.HIDE_SELECTION;
96
97 Table table = new Table(parent, style);
98
99 table.setLinesVisible(true);
100 table.setHeaderVisible(true);
101
102 TableColumn column = new TableColumn(table, SWT.LEFT, 0);
103 column.setText("Date");
104 column.setWidth(200);
105
106 column = new TableColumn(table, SWT.LEFT, 1);
107 column.setText("Host");
108 column.setWidth(100);
109
110 column = new TableColumn(table, SWT.LEFT, 2);
111 column.setText("Id");
112 column.setWidth(300);
113
114 column = new TableColumn(table, SWT.LEFT, 3);
115 column.setText("Status");
116 column.setWidth(100);
117
118 return table;
119 }
120
121 public void setFocus() {
122 viewer.getControl().setFocus();
123 }
124
125 @Override
126 public void dispose() {
127 JcrUtils.unregisterQuietly(session.getWorkspace(), processesObserver);
128 super.dispose();
129 }
130
131 class ContentProvider implements IStructuredContentProvider {
132
133 public Object[] getElements(Object inputElement) {
134 try {
135 // TODO filter, optimize with virtual table, ...
136 String sql = "SELECT * from [slc:process] ORDER BY [jcr:lastModified] DESC";
137 Query query = session.getWorkspace().getQueryManager()
138 .createQuery(sql, Query.JCR_SQL2);
139 // TODO paging
140 query.setLimit(queryLimit);
141 List<Node> nodes = new ArrayList<Node>();
142 for (NodeIterator nit = query.execute().getNodes(); nit
143 .hasNext();) {
144 nodes.add(nit.nextNode());
145 }
146 return nodes.toArray();
147 } catch (RepositoryException e) {
148 throw new SlcException("Cannot retrieve processes", e);
149 }
150 }
151
152 public void dispose() {
153 }
154
155 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
156 }
157
158 }
159
160 class LabelProvider extends ColumnLabelProvider implements
161 ITableLabelProvider {
162
163 public Image getColumnImage(Object obj, int columnIndex) {
164 if (columnIndex != 0)
165 return null;
166 try {
167 Node node = (Node) obj;
168 String status = node.getProperty(SlcNames.SLC_STATUS)
169 .getString();
170 if (status.equals(ExecutionProcess.NEW)
171 || status.equals(ExecutionProcess.INITIALIZED)
172 || status.equals(ExecutionProcess.SCHEDULED))
173 return SlcImages.PROCESS_SCHEDULED;
174 else if (status.equals(ExecutionProcess.ERROR)
175 || status.equals(ExecutionProcess.UNKOWN))
176 return SlcImages.PROCESS_ERROR;
177 else if (status.equals(ExecutionProcess.COMPLETED))
178 return SlcImages.PROCESS_COMPLETED;
179 else if (status.equals(ExecutionProcess.RUNNING))
180 return SlcImages.PROCESS_RUNNING;
181 else
182 throw new SlcException("Unkown status " + status);
183 } catch (RepositoryException e) {
184 throw new SlcException("Cannot get column text", e);
185 }
186 }
187
188 public String getColumnText(Object obj, int index) {
189 try {
190 Node node = (Node) obj;
191 switch (index) {
192
193 case 0:
194 return dateFormat.format(node
195 .getProperty(Property.JCR_LAST_MODIFIED).getDate()
196 .getTime());
197 case 1:
198 return "local";
199 case 2:
200 return node.getProperty(SlcNames.SLC_UUID).getString();
201 case 3:
202 return node.getProperty(SlcNames.SLC_STATUS).getString();
203 }
204 return getText(obj);
205 } catch (RepositoryException e) {
206 throw new SlcException("Cannot get column text", e);
207 }
208 }
209
210 }
211
212 class ViewDoubleClickListener implements IDoubleClickListener {
213 public void doubleClick(DoubleClickEvent evt) {
214 Object obj = ((IStructuredSelection) evt.getSelection())
215 .getFirstElement();
216 try {
217 if (obj instanceof Node) {
218 Node node = (Node) obj;
219 if (node.isNodeType(SlcTypes.SLC_PROCESS)) {
220 IWorkbenchPage activePage = PlatformUI.getWorkbench()
221 .getActiveWorkbenchWindow().getActivePage();
222 activePage.openEditor(
223 new ProcessEditorInput(node.getPath()),
224 ProcessEditor.ID);
225 }
226 }
227 } catch (Exception e) {
228 throw new SlcException("Cannot open " + obj, e);
229 }
230 }
231
232 }
233
234 public void setSession(Session session) {
235 this.session = session;
236 }
237
238 }