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