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