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
.RepositoryException
;
11 import javax
.jcr
.Session
;
12 import javax
.jcr
.observation
.Event
;
13 import javax
.jcr
.observation
.EventListener
;
14 import javax
.jcr
.observation
.ObservationManager
;
15 import javax
.jcr
.query
.Query
;
17 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
18 import org
.argeo
.eclipse
.ui
.jcr
.NodeElementComparer
;
19 import org
.argeo
.jcr
.JcrUtils
;
20 import org
.argeo
.slc
.SlcException
;
21 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditor
;
22 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
23 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
24 import org
.argeo
.slc
.jcr
.SlcNames
;
25 import org
.argeo
.slc
.jcr
.SlcTypes
;
26 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
27 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
28 import org
.eclipse
.jface
.viewers
.IBaseLabelProvider
;
29 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
30 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
31 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
32 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
33 import org
.eclipse
.jface
.viewers
.TableViewer
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.swt
.SWT
;
36 import org
.eclipse
.swt
.graphics
.Image
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.swt
.widgets
.Display
;
39 import org
.eclipse
.swt
.widgets
.Table
;
40 import org
.eclipse
.swt
.widgets
.TableColumn
;
41 import org
.eclipse
.ui
.IWorkbenchPage
;
42 import org
.eclipse
.ui
.PlatformUI
;
43 import org
.eclipse
.ui
.part
.ViewPart
;
45 /** Displays results. */
46 public class JcrResultListView
extends ViewPart
implements SlcNames
{
47 public static final String ID
= "org.argeo.slc.client.ui.jcrResultListView";
49 private TableViewer viewer
;
51 private Session session
;
53 private EventListener resultsObserver
;
55 private DateFormat dateFormat
= new SimpleDateFormat(
56 "EEE, dd MMM yyyy HH:mm:ss");
57 private Integer queryLimit
= 2000;
59 public void createPartControl(Composite parent
) {
61 Table table
= createTable(parent
);
62 viewer
= new TableViewer(table
);
63 viewer
.setLabelProvider(createLabelProvider());
64 viewer
.setContentProvider(new ViewContentProvider());
65 viewer
.setInput(getViewSite());
66 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
67 viewer
.setComparer(new NodeElementComparer());
69 getViewSite().setSelectionProvider(viewer
);
71 resultsObserver
= new ResultObserver(viewer
.getTable().getDisplay());
73 ObservationManager observationManager
= session
.getWorkspace()
74 .getObservationManager();
75 String
[] nodeTypes
= { SlcTypes
.SLC_RESULT
};
76 // FIXME Will not be notified if empty result is deleted
77 observationManager
.addEventListener(resultsObserver
,
78 Event
.PROPERTY_ADDED
| Event
.NODE_REMOVED
,
79 SlcJcrConstants
.RESULTS_BASE_PATH
, true, null, nodeTypes
,
81 } catch (RepositoryException e
) {
82 throw new SlcException("Cannot register listeners", e
);
87 protected Table
createTable(Composite parent
) {
88 int style
= SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
89 | SWT
.FULL_SELECTION
| SWT
.MULTI
;
90 // does not work with RAP, commented for the time being
91 // | SWT.HIDE_SELECTION;
93 Table table
= new Table(parent
, style
);
95 table
.setLinesVisible(true);
96 table
.setHeaderVisible(true);
98 TableColumn column
= new TableColumn(table
, SWT
.LEFT
, 0);
99 column
.setText("Date");
100 column
.setWidth(200);
102 column
= new TableColumn(table
, SWT
.LEFT
, 1);
103 column
.setText("Id");
104 column
.setWidth(300);
109 // public void refresh() {
114 * METHODS TO BE OVERRIDDEN
116 protected IBaseLabelProvider
createLabelProvider() {
117 return new ViewLabelProvider();
120 protected void processDoubleClick(DoubleClickEvent evt
) {
121 Object obj
= ((IStructuredSelection
) evt
.getSelection())
124 if (obj
instanceof Node
) {
125 Node node
= (Node
) obj
;
126 // FIXME: open a default result editor
127 if (node
.isNodeType(SlcTypes
.SLC_PROCESS
)) {
128 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
129 .getActiveWorkbenchWindow().getActivePage();
130 activePage
.openEditor(
131 new ProcessEditorInput(node
.getPath()),
135 } catch (Exception e
) {
136 throw new SlcException("Cannot open " + obj
, e
);
140 public void setFocus() {
141 viewer
.getControl().setFocus();
145 public void dispose() {
146 JcrUtils
.unregisterQuietly(session
.getWorkspace(), resultsObserver
);
150 class ViewContentProvider
implements IStructuredContentProvider
{
152 public Object
[] getElements(Object inputElement
) {
154 // TODO filter, optimize with virtual table, ...
155 String sql
= "SELECT * from [slc:result] ORDER BY [jcr:lastModified] DESC";
156 Query query
= session
.getWorkspace().getQueryManager()
157 .createQuery(sql
, Query
.JCR_SQL2
);
159 query
.setLimit(queryLimit
);
160 List
<Node
> nodes
= new ArrayList
<Node
>();
161 for (NodeIterator nit
= query
.execute().getNodes(); nit
163 nodes
.add(nit
.nextNode());
165 return nodes
.toArray();
166 } catch (RepositoryException e
) {
167 throw new SlcException("Cannot retrieve processes", e
);
171 public void dispose() {
174 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
179 class ViewLabelProvider
extends ColumnLabelProvider
implements
180 ITableLabelProvider
{
182 public Image
getColumnImage(Object obj
, int columnIndex
) {
183 if (columnIndex
!= 0)
186 Node node
= (Node
) obj
;
187 if (node
.hasProperty(SLC_COMPLETED
)) {
191 } catch (RepositoryException e
) {
192 throw new SlcException("Cannot get column text", e
);
196 public String
getColumnText(Object obj
, int index
) {
198 Node node
= (Node
) obj
;
202 if (node
.hasProperty(SLC_COMPLETED
)) {
204 .format(node
.getProperty(SLC_COMPLETED
)
205 .getDate().getTime());
210 return node
.getProperty(SlcNames
.SLC_UUID
).getString();
213 } catch (RepositoryException e
) {
214 throw new SlcException("Cannot get column text", e
);
220 class ViewDoubleClickListener
implements IDoubleClickListener
{
221 public void doubleClick(DoubleClickEvent evt
) {
222 processDoubleClick(evt
);
227 class ResultObserver
extends AsyncUiEventListener
{
229 public ResultObserver(Display display
) {
234 protected Boolean
willProcessInUiThread(List
<Event
> events
)
235 throws RepositoryException
{
236 for (Event event
: events
) {
237 // getLog().debug("Received event " + event);
238 int eventType
= event
.getType();
239 if (eventType
== Event
.NODE_REMOVED
)
241 String path
= event
.getPath();
242 int index
= path
.lastIndexOf('/');
243 String propertyName
= path
.substring(index
+ 1);
244 if (propertyName
.equals(SLC_COMPLETED
)
245 || propertyName
.equals(SLC_UUID
)) {
252 protected void onEventInUiThread(List
<Event
> events
)
253 throws RepositoryException
{
254 if (getLog().isTraceEnabled())
255 getLog().trace("Refresh result list");
261 public void setSession(Session session
) {
262 this.session
= session
;