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