2 * Copyright (C) 2007-2012 Argeo GmbH
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.slc
.client
.ui
.views
;
18 import java
.text
.DateFormat
;
19 import java
.text
.SimpleDateFormat
;
20 import java
.util
.ArrayList
;
21 import java
.util
.List
;
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
;
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
;
62 /** Displays processes. */
63 public class JcrProcessListView
extends ViewPart
{
64 public static final String ID
= ClientUiPlugin
.ID
+ ".jcrProcessListView";
66 private TableViewer viewer
;
68 private Repository repository
;
69 private Session session
;
71 private EventListener processesObserver
;
73 private DateFormat dateFormat
= new SimpleDateFormat(
74 "EEE, dd MMM yyyy HH:mm:ss");
75 private Integer queryLimit
= 2000;
77 public void createPartControl(Composite parent
) {
79 session
= repository
.login();
80 } catch (RepositoryException re
) {
81 throw new SlcException("Unable to log in Repository " + repository
,
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());
91 processesObserver
= new AsyncUiEventListener(viewer
.getTable()
93 protected void onEventInUiThread(List
<Event
> events
) {
94 // TODO optimize by updating only the changed process
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,
106 } catch (RepositoryException e
) {
107 throw new SlcException("Cannot register listeners", e
);
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;
118 Table table
= new Table(parent
, style
);
120 table
.setLinesVisible(true);
121 table
.setHeaderVisible(true);
123 TableColumn column
= new TableColumn(table
, SWT
.LEFT
, 0);
124 column
.setText("Date");
125 column
.setWidth(200);
127 column
= new TableColumn(table
, SWT
.LEFT
, 1);
128 column
.setText("Host");
129 column
.setWidth(100);
131 column
= new TableColumn(table
, SWT
.LEFT
, 2);
132 column
.setText("Id");
133 column
.setWidth(300);
135 column
= new TableColumn(table
, SWT
.LEFT
, 3);
136 column
.setText("Status");
137 column
.setWidth(100);
142 public void setFocus() {
143 viewer
.getControl().setFocus();
146 class ContentProvider
implements IStructuredContentProvider
{
148 public Object
[] getElements(Object inputElement
) {
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
);
155 query
.setLimit(queryLimit
);
156 List
<Node
> nodes
= new ArrayList
<Node
>();
157 for (NodeIterator nit
= query
.execute().getNodes(); nit
159 nodes
.add(nit
.nextNode());
161 return nodes
.toArray();
162 } catch (RepositoryException e
) {
163 throw new SlcException("Cannot retrieve processes", e
);
167 public void dispose() {
170 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
175 class LabelProvider
extends ColumnLabelProvider
implements
176 ITableLabelProvider
{
178 public Image
getColumnImage(Object obj
, int columnIndex
) {
179 if (columnIndex
!= 0)
182 Node node
= (Node
) obj
;
183 String status
= node
.getProperty(SlcNames
.SLC_STATUS
)
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
;
199 throw new SlcException("Unkown status " + status
);
200 } catch (RepositoryException e
) {
201 throw new SlcException("Cannot get column text", e
);
205 public String
getColumnText(Object obj
, int index
) {
207 Node node
= (Node
) obj
;
211 return dateFormat
.format(node
212 .getProperty(Property
.JCR_LAST_MODIFIED
).getDate()
217 return node
.getProperty(SlcNames
.SLC_UUID
).getString();
219 return node
.getProperty(SlcNames
.SLC_STATUS
).getString();
222 } catch (RepositoryException e
) {
223 throw new SlcException("Cannot get column text", e
);
229 class ViewDoubleClickListener
implements IDoubleClickListener
{
230 public void doubleClick(DoubleClickEvent evt
) {
231 Object obj
= ((IStructuredSelection
) evt
.getSelection())
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()),
244 } catch (Exception e
) {
245 throw new SlcException("Cannot open " + obj
, e
);
251 public void dispose() {
252 JcrUtils
.unregisterQuietly(session
.getWorkspace(), processesObserver
);
253 JcrUtils
.logoutQuietly(session
);
257 public void setRepository(Repository repository
) {
258 this.repository
= repository
;