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