]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultListView.java
Update decorators to show more explicitly PASSED / FAILED / ERROR status in the Resul...
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui / src / main / java / org / argeo / slc / client / ui / views / JcrResultListView.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.slc.client.ui.views;
17
18 import java.text.DateFormat;
19 import java.text.SimpleDateFormat;
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import javax.jcr.Node;
24 import javax.jcr.NodeIterator;
25 import javax.jcr.RepositoryException;
26 import javax.jcr.Session;
27 import javax.jcr.observation.Event;
28 import javax.jcr.observation.EventListener;
29 import javax.jcr.observation.ObservationManager;
30 import javax.jcr.query.Query;
31
32 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
33 import org.argeo.eclipse.ui.jcr.NodeElementComparer;
34 import org.argeo.jcr.JcrUtils;
35 import org.argeo.slc.SlcException;
36 import org.argeo.slc.client.ui.ClientUiPlugin;
37 import org.argeo.slc.client.ui.editors.ProcessEditor;
38 import org.argeo.slc.client.ui.editors.ProcessEditorInput;
39 import org.argeo.slc.jcr.SlcJcrResultUtils;
40 import org.argeo.slc.jcr.SlcNames;
41 import org.argeo.slc.jcr.SlcTypes;
42 import org.eclipse.jface.viewers.ColumnLabelProvider;
43 import org.eclipse.jface.viewers.DoubleClickEvent;
44 import org.eclipse.jface.viewers.IBaseLabelProvider;
45 import org.eclipse.jface.viewers.IDoubleClickListener;
46 import org.eclipse.jface.viewers.IStructuredContentProvider;
47 import org.eclipse.jface.viewers.IStructuredSelection;
48 import org.eclipse.jface.viewers.ITableLabelProvider;
49 import org.eclipse.jface.viewers.TableViewer;
50 import org.eclipse.jface.viewers.Viewer;
51 import org.eclipse.swt.SWT;
52 import org.eclipse.swt.graphics.Image;
53 import org.eclipse.swt.widgets.Composite;
54 import org.eclipse.swt.widgets.Display;
55 import org.eclipse.swt.widgets.Table;
56 import org.eclipse.swt.widgets.TableColumn;
57 import org.eclipse.ui.IWorkbenchPage;
58 import org.eclipse.ui.PlatformUI;
59 import org.eclipse.ui.part.ViewPart;
60
61 /** Displays results. */
62 public class JcrResultListView extends ViewPart implements SlcNames {
63 public static final String ID = ClientUiPlugin.ID + ".jcrResultListView";
64
65 private TableViewer viewer;
66
67 private Session session;
68
69 private EventListener resultsObserver;
70
71 private DateFormat dateFormat = new SimpleDateFormat(
72 "EEE, dd MMM yyyy HH:mm:ss");
73 private Integer queryLimit = 2000;
74
75 public void createPartControl(Composite parent) {
76
77 Table table = createTable(parent);
78 viewer = new TableViewer(table);
79 viewer.setLabelProvider(createLabelProvider());
80 viewer.setContentProvider(new ViewContentProvider());
81 viewer.setInput(getViewSite());
82 viewer.addDoubleClickListener(new ViewDoubleClickListener());
83 viewer.setComparer(new NodeElementComparer());
84
85 getViewSite().setSelectionProvider(viewer);
86
87 resultsObserver = new ResultObserver(viewer.getTable().getDisplay());
88 try {
89 ObservationManager observationManager = session.getWorkspace()
90 .getObservationManager();
91 String[] nodeTypes = { SlcTypes.SLC_TEST_RESULT };
92 // FIXME Will not be notified if empty result is deleted
93 observationManager.addEventListener(resultsObserver,
94 Event.PROPERTY_ADDED | Event.NODE_REMOVED,
95 SlcJcrResultUtils.getSlcResultsBasePath(session), true,
96 null, nodeTypes, false);
97 } catch (RepositoryException e) {
98 throw new SlcException("Cannot register listeners", e);
99 }
100
101 }
102
103 protected Table createTable(Composite parent) {
104 int style = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
105 | SWT.FULL_SELECTION | SWT.MULTI;
106 // does not work with RAP, commented for the time being
107 // | SWT.HIDE_SELECTION;
108
109 Table table = new Table(parent, style);
110
111 table.setLinesVisible(true);
112 table.setHeaderVisible(true);
113
114 TableColumn column = new TableColumn(table, SWT.LEFT, 0);
115 column.setText("Date");
116 column.setWidth(200);
117
118 column = new TableColumn(table, SWT.LEFT, 1);
119 column.setText("Id");
120 column.setWidth(300);
121
122 return table;
123 }
124
125 // public void refresh() {
126 // viewer.refresh();
127 // }
128
129 /*
130 * METHODS TO BE OVERRIDDEN
131 */
132 protected IBaseLabelProvider createLabelProvider() {
133 return new ViewLabelProvider();
134 }
135
136 protected void processDoubleClick(DoubleClickEvent evt) {
137 Object obj = ((IStructuredSelection) evt.getSelection())
138 .getFirstElement();
139 try {
140 if (obj instanceof Node) {
141 Node node = (Node) obj;
142 // FIXME: open a default result editor
143 if (node.isNodeType(SlcTypes.SLC_PROCESS)) {
144 IWorkbenchPage activePage = PlatformUI.getWorkbench()
145 .getActiveWorkbenchWindow().getActivePage();
146 activePage.openEditor(
147 new ProcessEditorInput(node.getPath()),
148 ProcessEditor.ID);
149 }
150 }
151 } catch (Exception e) {
152 throw new SlcException("Cannot open " + obj, e);
153 }
154 }
155
156 public void setFocus() {
157 viewer.getControl().setFocus();
158 }
159
160 @Override
161 public void dispose() {
162 JcrUtils.unregisterQuietly(session.getWorkspace(), resultsObserver);
163 super.dispose();
164 }
165
166 class ViewContentProvider implements IStructuredContentProvider {
167
168 public Object[] getElements(Object inputElement) {
169 try {
170 // TODO filter, optimize with virtual table, ...
171 String sql = "SELECT * from [" + SlcTypes.SLC_TEST_RESULT
172 + "] ORDER BY [jcr:lastModified] DESC";
173 Query query = session.getWorkspace().getQueryManager()
174 .createQuery(sql, Query.JCR_SQL2);
175 // TODO paging
176 query.setLimit(queryLimit);
177 List<Node> nodes = new ArrayList<Node>();
178 for (NodeIterator nit = query.execute().getNodes(); nit
179 .hasNext();) {
180 nodes.add(nit.nextNode());
181 }
182 return nodes.toArray();
183 } catch (RepositoryException e) {
184 throw new SlcException("Cannot retrieve processes", e);
185 }
186 }
187
188 public void dispose() {
189 }
190
191 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
192 }
193
194 }
195
196 class ViewLabelProvider extends ColumnLabelProvider implements
197 ITableLabelProvider {
198
199 public Image getColumnImage(Object obj, int columnIndex) {
200 if (columnIndex != 0)
201 return null;
202 try {
203 Node node = (Node) obj;
204 if (node.hasProperty(SLC_COMPLETED)) {
205 // TODO
206 }
207 return null;
208 } catch (RepositoryException e) {
209 throw new SlcException("Cannot get column text", e);
210 }
211 }
212
213 public String getColumnText(Object obj, int index) {
214 try {
215 Node node = (Node) obj;
216 switch (index) {
217
218 case 0:
219 if (node.hasProperty(SLC_COMPLETED)) {
220 return dateFormat
221 .format(node.getProperty(SLC_COMPLETED)
222 .getDate().getTime());
223 } else {
224 return "OPEN";
225 }
226 case 1:
227 return node.getProperty(SlcNames.SLC_UUID).getString();
228 }
229 return getText(obj);
230 } catch (RepositoryException e) {
231 throw new SlcException("Cannot get column text", e);
232 }
233 }
234
235 }
236
237 class ViewDoubleClickListener implements IDoubleClickListener {
238 public void doubleClick(DoubleClickEvent evt) {
239 processDoubleClick(evt);
240 }
241
242 }
243
244 class ResultObserver extends AsyncUiEventListener {
245
246 public ResultObserver(Display display) {
247 super(display);
248 }
249
250 @Override
251 protected Boolean willProcessInUiThread(List<Event> events)
252 throws RepositoryException {
253 for (Event event : events) {
254 // getLog().debug("Received event " + event);
255 int eventType = event.getType();
256 if (eventType == Event.NODE_REMOVED)
257 return true;
258 String path = event.getPath();
259 int index = path.lastIndexOf('/');
260 String propertyName = path.substring(index + 1);
261 if (propertyName.equals(SLC_COMPLETED)
262 || propertyName.equals(SLC_UUID)) {
263 return true;
264 }
265 }
266 return false;
267 }
268
269 protected void onEventInUiThread(List<Event> events)
270 throws RepositoryException {
271 if (getLog().isTraceEnabled())
272 getLog().trace("Refresh result list");
273 viewer.refresh();
274 }
275
276 }
277
278 public void setSession(Session session) {
279 this.session = session;
280 }
281 }