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