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
.Repository
;
26 import javax
.jcr
.RepositoryException
;
27 import javax
.jcr
.Session
;
28 import javax
.jcr
.observation
.Event
;
29 import javax
.jcr
.observation
.EventListener
;
30 import javax
.jcr
.observation
.ObservationManager
;
31 import javax
.jcr
.query
.Query
;
33 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
34 import org
.argeo
.eclipse
.ui
.jcr
.NodeElementComparer
;
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
.editors
.ProcessEditor
;
39 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
40 import org
.argeo
.slc
.jcr
.SlcJcrResultUtils
;
41 import org
.argeo
.slc
.jcr
.SlcNames
;
42 import org
.argeo
.slc
.jcr
.SlcTypes
;
43 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
44 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
45 import org
.eclipse
.jface
.viewers
.IBaseLabelProvider
;
46 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
47 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
48 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
49 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
50 import org
.eclipse
.jface
.viewers
.TableViewer
;
51 import org
.eclipse
.jface
.viewers
.Viewer
;
52 import org
.eclipse
.swt
.SWT
;
53 import org
.eclipse
.swt
.graphics
.Image
;
54 import org
.eclipse
.swt
.widgets
.Composite
;
55 import org
.eclipse
.swt
.widgets
.Display
;
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 results. */
63 public class JcrResultListView
extends ViewPart
implements SlcNames
{
64 public static final String ID
= ClientUiPlugin
.ID
+ ".jcrResultListView";
66 private TableViewer viewer
;
68 private Repository repository
;
69 private Session session
;
71 private EventListener resultsObserver
;
73 private DateFormat dateFormat
= new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
74 private Integer queryLimit
= 2000;
76 public void createPartControl(Composite parent
) {
78 session
= repository
.login();
79 } catch (RepositoryException e1
) {
80 throw new SlcException("Cannot log in to repository");
83 Table table
= createTable(parent
);
84 viewer
= new TableViewer(table
);
85 viewer
.setLabelProvider(createLabelProvider());
86 viewer
.setContentProvider(new ViewContentProvider());
87 viewer
.setInput(getViewSite());
88 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
89 viewer
.setComparer(new NodeElementComparer());
91 getViewSite().setSelectionProvider(viewer
);
93 resultsObserver
= new ResultObserver(viewer
.getTable().getDisplay());
95 ObservationManager observationManager
= session
.getWorkspace().getObservationManager();
96 String
[] nodeTypes
= { SlcTypes
.SLC_TEST_RESULT
};
97 // FIXME Will not be notified if empty result is deleted
98 observationManager
.addEventListener(resultsObserver
, Event
.PROPERTY_ADDED
| Event
.NODE_REMOVED
,
99 SlcJcrResultUtils
.getSlcResultsBasePath(session
), true, null, nodeTypes
, false);
100 } catch (RepositoryException e
) {
101 throw new SlcException("Cannot register listeners", e
);
106 protected Table
createTable(Composite parent
) {
107 int style
= SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
;
108 // does not work with RAP, commented for the time being
109 // | SWT.HIDE_SELECTION;
111 Table table
= new Table(parent
, style
);
113 table
.setLinesVisible(true);
114 table
.setHeaderVisible(true);
116 TableColumn column
= new TableColumn(table
, SWT
.LEFT
, 0);
117 column
.setText("Date");
118 column
.setWidth(200);
120 column
= new TableColumn(table
, SWT
.LEFT
, 1);
121 column
.setText("Id");
122 column
.setWidth(300);
127 // public void refresh() {
132 * METHODS TO BE OVERRIDDEN
134 protected IBaseLabelProvider
createLabelProvider() {
135 return new ViewLabelProvider();
138 protected void processDoubleClick(DoubleClickEvent evt
) {
139 Object obj
= ((IStructuredSelection
) evt
.getSelection()).getFirstElement();
141 if (obj
instanceof Node
) {
142 Node node
= (Node
) obj
;
143 // FIXME: open a default result editor
144 if (node
.isNodeType(SlcTypes
.SLC_PROCESS
)) {
145 IWorkbenchPage activePage
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage();
146 activePage
.openEditor(new ProcessEditorInput(node
.getPath()), ProcessEditor
.ID
);
149 } catch (Exception e
) {
150 throw new SlcException("Cannot open " + obj
, e
);
154 public void setFocus() {
155 viewer
.getControl().setFocus();
158 class ViewContentProvider
implements IStructuredContentProvider
{
159 private static final long serialVersionUID
= -4719077015405546260L;
161 public Object
[] getElements(Object inputElement
) {
163 // TODO filter, optimize with virtual table, ...
164 String sql
= "SELECT * from [" + SlcTypes
.SLC_TEST_RESULT
+ "] ORDER BY [jcr:lastModified] DESC";
165 Query query
= session
.getWorkspace().getQueryManager().createQuery(sql
, Query
.JCR_SQL2
);
167 query
.setLimit(queryLimit
);
168 List
<Node
> nodes
= new ArrayList
<Node
>();
169 for (NodeIterator nit
= query
.execute().getNodes(); nit
.hasNext();) {
170 nodes
.add(nit
.nextNode());
172 return nodes
.toArray();
173 } catch (RepositoryException e
) {
174 throw new SlcException("Cannot retrieve processes", e
);
178 public void dispose() {
181 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
186 class ViewLabelProvider
extends ColumnLabelProvider
implements ITableLabelProvider
{
187 private static final long serialVersionUID
= -6323202576386795247L;
189 public Image
getColumnImage(Object obj
, int columnIndex
) {
190 if (columnIndex
!= 0)
193 Node node
= (Node
) obj
;
194 if (node
.hasProperty(SLC_COMPLETED
)) {
198 } catch (RepositoryException e
) {
199 throw new SlcException("Cannot get column text", e
);
203 public String
getColumnText(Object obj
, int index
) {
205 Node node
= (Node
) obj
;
209 if (node
.hasProperty(SLC_COMPLETED
)) {
210 return dateFormat
.format(node
.getProperty(SLC_COMPLETED
).getDate().getTime());
215 return node
.getProperty(SlcNames
.SLC_UUID
).getString();
218 } catch (RepositoryException e
) {
219 throw new SlcException("Cannot get column text", e
);
225 class ViewDoubleClickListener
implements IDoubleClickListener
{
226 public void doubleClick(DoubleClickEvent evt
) {
227 processDoubleClick(evt
);
232 class ResultObserver
extends AsyncUiEventListener
{
234 public ResultObserver(Display display
) {
239 protected Boolean
willProcessInUiThread(List
<Event
> events
) throws RepositoryException
{
240 for (Event event
: events
) {
241 // getLog().debug("Received event " + event);
242 int eventType
= event
.getType();
243 if (eventType
== Event
.NODE_REMOVED
)
245 String path
= event
.getPath();
246 int index
= path
.lastIndexOf('/');
247 String propertyName
= path
.substring(index
+ 1);
248 if (propertyName
.equals(SLC_COMPLETED
) || propertyName
.equals(SLC_UUID
)) {
255 protected void onEventInUiThread(List
<Event
> events
) throws RepositoryException
{
256 if (getLog().isTraceEnabled())
257 getLog().trace("Refresh result list");
262 public void dispose() {
263 JcrUtils
.unregisterQuietly(session
.getWorkspace(), resultsObserver
);
264 JcrUtils
.logoutQuietly(session
);
268 public void setRepository(Repository repository
) {
269 this.repository
= repository
;