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
.EventIterator
;
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
.client
.ui
.editors
.ProcessEditor
;
23 import org
.argeo
.slc
.client
.ui
.editors
.ProcessEditorInput
;
24 import org
.argeo
.slc
.jcr
.SlcJcrConstants
;
25 import org
.argeo
.slc
.jcr
.SlcNames
;
26 import org
.argeo
.slc
.jcr
.SlcTypes
;
27 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
28 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
29 import org
.eclipse
.jface
.viewers
.IBaseLabelProvider
;
30 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
31 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
32 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
33 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
34 import org
.eclipse
.jface
.viewers
.TableViewer
;
35 import org
.eclipse
.jface
.viewers
.Viewer
;
36 import org
.eclipse
.swt
.SWT
;
37 import org
.eclipse
.swt
.graphics
.Image
;
38 import org
.eclipse
.swt
.widgets
.Composite
;
39 import org
.eclipse
.swt
.widgets
.Display
;
40 import org
.eclipse
.swt
.widgets
.Table
;
41 import org
.eclipse
.swt
.widgets
.TableColumn
;
42 import org
.eclipse
.ui
.IWorkbenchPage
;
43 import org
.eclipse
.ui
.PlatformUI
;
44 import org
.eclipse
.ui
.part
.ViewPart
;
46 /** Displays results. */
47 public class JcrResultListView
extends ViewPart
implements SlcNames
{
48 public static final String ID
= "org.argeo.slc.client.ui.jcrResultListView";
50 private TableViewer viewer
;
52 private Session session
;
54 private EventListener resultsObserver
;
56 private DateFormat dateFormat
= new SimpleDateFormat(
57 "EEE, dd MMM yyyy HH:mm:ss");
58 private Integer queryLimit
= 2000;
60 public void createPartControl(Composite parent
) {
62 Table table
= createTable(parent
);
63 viewer
= new TableViewer(table
);
64 viewer
.setLabelProvider(createLabelProvider());
65 viewer
.setContentProvider(new ViewContentProvider());
66 viewer
.setInput(getViewSite());
67 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
68 viewer
.setComparer(new NodeElementComparer());
70 getViewSite().setSelectionProvider(viewer
);
72 resultsObserver
= new ResultObserver(viewer
.getTable().getDisplay());
74 ObservationManager observationManager
= session
.getWorkspace()
75 .getObservationManager();
76 String
[] nodeTypes
= { SlcTypes
.SLC_RESULT
};
77 // FIXME Will not be notified if empty result is deleted
78 observationManager
.addEventListener(resultsObserver
,
79 Event
.PROPERTY_ADDED
| Event
.NODE_REMOVED
,
80 SlcJcrConstants
.RESULTS_BASE_PATH
, true, null, nodeTypes
,
82 } catch (RepositoryException e
) {
83 throw new SlcException("Cannot register listeners", e
);
88 protected Table
createTable(Composite parent
) {
89 int style
= SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
90 | SWT
.FULL_SELECTION
| SWT
.MULTI
;
91 // does not work with RAP, commented for the time being
92 // | SWT.HIDE_SELECTION;
94 Table table
= new Table(parent
, style
);
96 table
.setLinesVisible(true);
97 table
.setHeaderVisible(true);
99 TableColumn column
= new TableColumn(table
, SWT
.LEFT
, 0);
100 column
.setText("Date");
101 column
.setWidth(200);
103 column
= new TableColumn(table
, SWT
.LEFT
, 1);
104 column
.setText("Id");
105 column
.setWidth(300);
110 // public void refresh() {
115 * METHODS TO BE OVERRIDDEN
117 protected IBaseLabelProvider
createLabelProvider() {
118 return new ViewLabelProvider();
121 protected void processDoubleClick(DoubleClickEvent evt
) {
122 Object obj
= ((IStructuredSelection
) evt
.getSelection())
125 if (obj
instanceof Node
) {
126 Node node
= (Node
) obj
;
127 // FIXME: open a default result editor
128 if (node
.isNodeType(SlcTypes
.SLC_PROCESS
)) {
129 IWorkbenchPage activePage
= PlatformUI
.getWorkbench()
130 .getActiveWorkbenchWindow().getActivePage();
131 activePage
.openEditor(
132 new ProcessEditorInput(node
.getPath()),
136 } catch (Exception e
) {
137 throw new SlcException("Cannot open " + obj
, e
);
141 public void setFocus() {
142 viewer
.getControl().setFocus();
146 public void dispose() {
147 JcrUtils
.unregisterQuietly(session
.getWorkspace(), resultsObserver
);
151 class ViewContentProvider
implements IStructuredContentProvider
{
153 public Object
[] getElements(Object inputElement
) {
155 // TODO filter, optimize with virtual table, ...
156 String sql
= "SELECT * from [slc:result] ORDER BY [jcr:lastModified] DESC";
157 Query query
= session
.getWorkspace().getQueryManager()
158 .createQuery(sql
, Query
.JCR_SQL2
);
160 query
.setLimit(queryLimit
);
161 List
<Node
> nodes
= new ArrayList
<Node
>();
162 for (NodeIterator nit
= query
.execute().getNodes(); nit
164 nodes
.add(nit
.nextNode());
166 return nodes
.toArray();
167 } catch (RepositoryException e
) {
168 throw new SlcException("Cannot retrieve processes", e
);
172 public void dispose() {
175 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
180 class ViewLabelProvider
extends ColumnLabelProvider
implements
181 ITableLabelProvider
{
183 public Image
getColumnImage(Object obj
, int columnIndex
) {
184 if (columnIndex
!= 0)
187 Node node
= (Node
) obj
;
188 if (node
.hasProperty(SLC_COMPLETED
)) {
192 } catch (RepositoryException e
) {
193 throw new SlcException("Cannot get column text", e
);
197 public String
getColumnText(Object obj
, int index
) {
199 Node node
= (Node
) obj
;
203 if (node
.hasProperty(SLC_COMPLETED
)) {
205 .format(node
.getProperty(SLC_COMPLETED
)
206 .getDate().getTime());
211 return node
.getProperty(SlcNames
.SLC_UUID
).getString();
214 } catch (RepositoryException e
) {
215 throw new SlcException("Cannot get column text", e
);
221 class ViewDoubleClickListener
implements IDoubleClickListener
{
222 public void doubleClick(DoubleClickEvent evt
) {
223 processDoubleClick(evt
);
228 class ResultObserver
extends AsyncUiEventListener
{
230 public ResultObserver(Display display
) {
235 protected Boolean
willProcessInUiThread(List
<Event
> events
)
236 throws RepositoryException
{
237 for (Event event
: events
) {
238 // getLog().debug("Received event " + event);
239 int eventType
= event
.getType();
240 if (eventType
== Event
.NODE_REMOVED
)
242 // if (event.getType() == Event.PROPERTY_ADDED) {
243 String path
= event
.getPath();
244 // getLog().debug(path);
245 int index
= path
.lastIndexOf('/');
246 String propertyName
= path
.substring(index
+ 1);
247 // Property property = session.getProperty(path);
248 // if (!property.getName().equals(SLC_COMPLETED))
250 if (propertyName
.equals(SLC_COMPLETED
)
251 || propertyName
.equals(SLC_UUID
)) {
252 // getLog().debug("Kept " + propertyName);
255 // getLog().debug("Skipped " + propertyName);
257 // } else if (eventType == Event.NODE_ADDED
258 // || eventType == Event.NODE_MOVED
259 // || eventType == Event.NODE_REMOVED) {
267 protected void onEventInUiThread(List
<Event
> events
)
268 throws RepositoryException
{
269 if (getLog().isDebugEnabled())
270 getLog().debug("Refresh result list");
276 public void setSession(Session session
) {
277 this.session
= session
;