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