1 package org
.argeo
.slc
.client
.ui
.views
;
3 import java
.text
.DateFormat
;
4 import java
.text
.SimpleDateFormat
;
5 import java
.util
.ArrayList
;
9 import javax
.jcr
.NodeIterator
;
10 import javax
.jcr
.Repository
;
11 import javax
.jcr
.RepositoryException
;
12 import javax
.jcr
.Session
;
13 import javax
.jcr
.observation
.Event
;
14 import javax
.jcr
.observation
.EventListener
;
15 import javax
.jcr
.observation
.ObservationManager
;
16 import javax
.jcr
.query
.Query
;
18 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
19 import org
.argeo
.eclipse
.ui
.jcr
.NodeElementComparer
;
20 import org
.argeo
.jcr
.JcrUtils
;
21 import org
.argeo
.slc
.SlcException
;
22 import org
.argeo
.slc
.SlcNames
;
23 import org
.argeo
.slc
.SlcTypes
;
24 import org
.argeo
.slc
.client
.ui
.ClientUiPlugin
;
25 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
26 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
27 import org
.argeo
.slc
.jcr
.SlcJcrResultUtils
;
28 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
29 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
30 import org
.eclipse
.jface
.viewers
.IBaseLabelProvider
;
31 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
32 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
33 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
34 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
35 import org
.eclipse
.jface
.viewers
.TableViewer
;
36 import org
.eclipse
.jface
.viewers
.Viewer
;
37 import org
.eclipse
.swt
.SWT
;
38 import org
.eclipse
.swt
.graphics
.Image
;
39 import org
.eclipse
.swt
.widgets
.Composite
;
40 import org
.eclipse
.swt
.widgets
.Display
;
41 import org
.eclipse
.swt
.widgets
.Table
;
42 import org
.eclipse
.swt
.widgets
.TableColumn
;
43 import org
.eclipse
.ui
.IWorkbenchPage
;
44 import org
.eclipse
.ui
.PlatformUI
;
45 import org
.eclipse
.ui
.part
.ViewPart
;
47 /** Displays results. */
48 public class JcrResultListView
extends ViewPart
implements SlcNames
{
49 public static final String ID
= ClientUiPlugin
.ID
+ ".jcrResultListView";
51 private TableViewer viewer
;
53 private Repository repository
;
54 private Session session
;
56 private EventListener resultsObserver
;
58 private DateFormat dateFormat
= new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
59 private Integer queryLimit
= 2000;
61 public void createPartControl(Composite parent
) {
63 session
= repository
.login();
64 } catch (RepositoryException e1
) {
65 throw new SlcException("Cannot log in to repository");
68 Table table
= createTable(parent
);
69 viewer
= new TableViewer(table
);
70 viewer
.setLabelProvider(createLabelProvider());
71 viewer
.setContentProvider(new ViewContentProvider());
72 viewer
.setInput(getViewSite());
73 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
74 viewer
.setComparer(new NodeElementComparer());
76 getViewSite().setSelectionProvider(viewer
);
78 resultsObserver
= new ResultObserver(viewer
.getTable().getDisplay());
80 ObservationManager observationManager
= session
.getWorkspace().getObservationManager();
81 String
[] nodeTypes
= { SlcTypes
.SLC_TEST_RESULT
};
82 // FIXME Will not be notified if empty result is deleted
83 observationManager
.addEventListener(resultsObserver
, Event
.PROPERTY_ADDED
| Event
.NODE_REMOVED
,
84 SlcJcrResultUtils
.getSlcResultsBasePath(session
), true, null, nodeTypes
, false);
85 } catch (RepositoryException e
) {
86 throw new SlcException("Cannot register listeners", e
);
91 protected Table
createTable(Composite parent
) {
92 int style
= SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.MULTI
;
93 // does not work with RAP, commented for the time being
94 // | SWT.HIDE_SELECTION;
96 Table table
= new Table(parent
, style
);
98 table
.setLinesVisible(true);
99 table
.setHeaderVisible(true);
101 TableColumn column
= new TableColumn(table
, SWT
.LEFT
, 0);
102 column
.setText("Date");
103 column
.setWidth(200);
105 column
= new TableColumn(table
, SWT
.LEFT
, 1);
106 column
.setText("Id");
107 column
.setWidth(300);
112 // public void refresh() {
117 * METHODS TO BE OVERRIDDEN
119 protected IBaseLabelProvider
createLabelProvider() {
120 return new ViewLabelProvider();
123 protected void processDoubleClick(DoubleClickEvent evt
) {
124 Object obj
= ((IStructuredSelection
) evt
.getSelection()).getFirstElement();
126 if (obj
instanceof Node
) {
127 Node node
= (Node
) obj
;
128 // FIXME: open a default result editor
129 if (node
.isNodeType(SlcTypes
.SLC_PROCESS
)) {
130 IWorkbenchPage activePage
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage();
131 activePage
.openEditor(new ProcessEditorInput(node
.getPath()), ProcessEditor
.ID
);
134 } catch (Exception e
) {
135 throw new SlcException("Cannot open " + obj
, e
);
139 public void setFocus() {
140 viewer
.getControl().setFocus();
143 class ViewContentProvider
implements IStructuredContentProvider
{
144 private static final long serialVersionUID
= -4719077015405546260L;
146 public Object
[] getElements(Object inputElement
) {
148 // TODO filter, optimize with virtual table, ...
149 String sql
= "SELECT * from [" + SlcTypes
.SLC_TEST_RESULT
+ "] ORDER BY [jcr:lastModified] DESC";
150 Query query
= session
.getWorkspace().getQueryManager().createQuery(sql
, Query
.JCR_SQL2
);
152 query
.setLimit(queryLimit
);
153 List
<Node
> nodes
= new ArrayList
<Node
>();
154 for (NodeIterator nit
= query
.execute().getNodes(); nit
.hasNext();) {
155 nodes
.add(nit
.nextNode());
157 return nodes
.toArray();
158 } catch (RepositoryException e
) {
159 throw new SlcException("Cannot retrieve processes", e
);
163 public void dispose() {
166 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
171 class ViewLabelProvider
extends ColumnLabelProvider
implements ITableLabelProvider
{
172 private static final long serialVersionUID
= -6323202576386795247L;
174 public Image
getColumnImage(Object obj
, int columnIndex
) {
175 if (columnIndex
!= 0)
178 Node node
= (Node
) obj
;
179 if (node
.hasProperty(SLC_COMPLETED
)) {
183 } catch (RepositoryException e
) {
184 throw new SlcException("Cannot get column text", e
);
188 public String
getColumnText(Object obj
, int index
) {
190 Node node
= (Node
) obj
;
194 if (node
.hasProperty(SLC_COMPLETED
)) {
195 return dateFormat
.format(node
.getProperty(SLC_COMPLETED
).getDate().getTime());
200 return node
.getProperty(SlcNames
.SLC_UUID
).getString();
203 } catch (RepositoryException e
) {
204 throw new SlcException("Cannot get column text", e
);
210 class ViewDoubleClickListener
implements IDoubleClickListener
{
211 public void doubleClick(DoubleClickEvent evt
) {
212 processDoubleClick(evt
);
217 class ResultObserver
extends AsyncUiEventListener
{
219 public ResultObserver(Display display
) {
224 protected Boolean
willProcessInUiThread(List
<Event
> events
) throws RepositoryException
{
225 for (Event event
: events
) {
226 // getLog().debug("Received event " + event);
227 int eventType
= event
.getType();
228 if (eventType
== Event
.NODE_REMOVED
)
230 String path
= event
.getPath();
231 int index
= path
.lastIndexOf('/');
232 String propertyName
= path
.substring(index
+ 1);
233 if (propertyName
.equals(SLC_COMPLETED
) || propertyName
.equals(SLC_UUID
)) {
240 protected void onEventInUiThread(List
<Event
> events
) throws RepositoryException
{
241 if (getLog().isTraceEnabled())
242 getLog().trace("Refresh result list");
247 public void dispose() {
248 JcrUtils
.unregisterQuietly(session
.getWorkspace(), resultsObserver
);
249 JcrUtils
.logoutQuietly(session
);
253 public void setRepository(Repository repository
) {
254 this.repository
= repository
;