1 package org
.argeo
.eclipse
.ui
.jcr
.editors
;
3 import java
.util
.ArrayList
;
6 import javax
.jcr
.RepositoryException
;
7 import javax
.jcr
.Session
;
8 import javax
.jcr
.query
.QueryResult
;
9 import javax
.jcr
.query
.Row
;
10 import javax
.jcr
.query
.RowIterator
;
12 import org
.apache
.commons
.logging
.Log
;
13 import org
.apache
.commons
.logging
.LogFactory
;
14 import org
.argeo
.ArgeoException
;
15 import org
.argeo
.eclipse
.ui
.GenericTableComparator
;
16 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
17 import org
.eclipse
.core
.runtime
.IStatus
;
18 import org
.eclipse
.core
.runtime
.Status
;
19 import org
.eclipse
.jface
.dialogs
.ErrorDialog
;
20 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
21 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
22 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
23 import org
.eclipse
.jface
.viewers
.TableViewer
;
24 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
25 import org
.eclipse
.jface
.viewers
.Viewer
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.custom
.SashForm
;
28 import org
.eclipse
.swt
.events
.SelectionAdapter
;
29 import org
.eclipse
.swt
.events
.SelectionEvent
;
30 import org
.eclipse
.swt
.graphics
.Image
;
31 import org
.eclipse
.swt
.layout
.FillLayout
;
32 import org
.eclipse
.swt
.layout
.GridData
;
33 import org
.eclipse
.swt
.layout
.GridLayout
;
34 import org
.eclipse
.swt
.widgets
.Composite
;
35 import org
.eclipse
.swt
.widgets
.TableColumn
;
36 import org
.eclipse
.ui
.IEditorInput
;
37 import org
.eclipse
.ui
.IEditorSite
;
38 import org
.eclipse
.ui
.PartInitException
;
39 import org
.eclipse
.ui
.part
.EditorPart
;
41 /** Executes any JCR query. */
42 public abstract class AbstractJcrQueryEditor
extends EditorPart
{
43 private final static Log log
= LogFactory
44 .getLog(AbstractJcrQueryEditor
.class);
46 protected String initialQuery
;
47 protected String initialQueryType
;
49 /** DEPENDENCY INJECTION */
50 private Session session
;
53 private TableViewer viewer
;
54 private List
<TableViewerColumn
> tableViewerColumns
= new ArrayList
<TableViewerColumn
>();
55 private GenericTableComparator comparator
;
57 /** Override to layout a form enabling the end user to build his query */
58 protected abstract void createQueryForm(Composite parent
);
61 public void init(IEditorSite site
, IEditorInput input
)
62 throws PartInitException
{
63 JcrQueryEditorInput editorInput
= (JcrQueryEditorInput
) input
;
64 initialQuery
= editorInput
.getQuery();
65 initialQueryType
= editorInput
.getQueryType();
67 setInput(editorInput
);
71 public final void createPartControl(final Composite parent
) {
72 parent
.setLayout(new FillLayout());
74 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
75 sashForm
.setSashWidth(4);
76 sashForm
.setLayout(new FillLayout());
78 Composite top
= new Composite(sashForm
, SWT
.NONE
);
79 GridLayout gl
= new GridLayout(1, false);
84 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
85 bottom
.setLayout(new GridLayout(1, false));
86 sashForm
.setWeights(getWeights());
88 viewer
= new TableViewer(bottom
);
89 viewer
.getTable().setLayoutData(
90 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
91 viewer
.getTable().setHeaderVisible(true);
92 viewer
.setContentProvider(getQueryResultContentProvider());
93 viewer
.setInput(getEditorSite());
95 if (getComparator() != null) {
96 comparator
= getComparator();
97 viewer
.setComparator(comparator
);
99 if (getTableDoubleClickListener() != null)
100 viewer
.addDoubleClickListener(getTableDoubleClickListener());
104 protected void executeQuery(String statement
) {
106 if (log
.isDebugEnabled())
107 log
.debug("Query : " + statement
);
109 QueryResult qr
= session
.getWorkspace().getQueryManager()
110 .createQuery(statement
, initialQueryType
).execute();
112 // remove previous columns
113 for (TableViewerColumn tvc
: tableViewerColumns
)
114 tvc
.getColumn().dispose();
117 for (final String columnName
: qr
.getColumnNames()) {
118 TableViewerColumn tvc
= new TableViewerColumn(viewer
, SWT
.NONE
);
119 configureColumn(columnName
, tvc
, i
);
120 tvc
.setLabelProvider(getLabelProvider(columnName
));
121 tableViewerColumns
.add(tvc
);
125 // Must create a local list: QueryResults can only be read once.
127 List
<Row
> rows
= new ArrayList
<Row
>();
128 RowIterator rit
= qr
.getRows();
129 while (rit
.hasNext()) {
130 rows
.add(rit
.nextRow());
132 viewer
.setInput(rows
);
133 } catch (RepositoryException e
) {
134 throw new ArgeoException("Cannot read query result", e
);
137 } catch (RepositoryException e
) {
138 ErrorDialog
.openError(null, "Error", "Cannot execute JCR query: "
139 + statement
, new Status(IStatus
.ERROR
,
140 "org.argeo.eclipse.ui.jcr", e
.getMessage()));
145 * To be overidden to adapt size of form and result frames.
149 protected int[] getWeights() {
150 return new int[] { 30, 70 };
154 * To be overidden to implement a doubleclick Listener on one of the rows of
159 protected IDoubleClickListener
getTableDoubleClickListener() {
164 * To be overiden in order to implement a specific
165 * QueryResultContentProvider
167 protected IStructuredContentProvider
getQueryResultContentProvider() {
168 return new QueryResultContentProvider();
172 * Enable specific implementation for columns
174 protected List
<TableViewerColumn
> getTableViewerColumns() {
175 return tableViewerColumns
;
179 * Enable specific implementation for columns
181 protected TableViewer
getTableViewer() {
186 * To be overridden in order to configure column label providers .
188 protected ColumnLabelProvider
getLabelProvider(final String columnName
) {
189 return new ColumnLabelProvider() {
190 public String
getText(Object element
) {
191 Row row
= (Row
) element
;
193 return row
.getValue(columnName
).getString();
194 } catch (RepositoryException e
) {
195 throw new ArgeoException("Cannot display row " + row
, e
);
199 public Image
getImage(Object element
) {
206 * To be overridden in order to configure the columns.
208 * @deprecated use {@link
209 * org.argeo.eclipse.ui.jcr.editors.AbstractJcrQueryEditor.
210 * configureColumn(String jcrColumnName, TableViewerColumn
211 * column, int columnIndex)} instead
213 protected void configureColumn(String jcrColumnName
,
214 TableViewerColumn column
) {
215 column
.getColumn().setWidth(50);
216 column
.getColumn().setText(jcrColumnName
);
219 /** To be overridden in order to configure the columns. */
220 protected void configureColumn(String jcrColumnName
,
221 TableViewerColumn column
, int columnIndex
) {
222 column
.getColumn().setWidth(50);
223 column
.getColumn().setText(jcrColumnName
);
226 private class QueryResultContentProvider
implements
227 IStructuredContentProvider
{
229 public void dispose() {
232 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
235 public Object
[] getElements(Object inputElement
) {
237 if (inputElement
instanceof List
)
238 return ((List
) inputElement
).toArray();
240 // Never reached might be deleted in future release
241 if (!(inputElement
instanceof QueryResult
))
242 return new String
[] {};
245 QueryResult queryResult
= (QueryResult
) inputElement
;
246 List
<Row
> rows
= new ArrayList
<Row
>();
247 RowIterator rit
= queryResult
.getRows();
248 while (rit
.hasNext()) {
249 rows
.add(rit
.nextRow());
252 // List<Node> elems = new ArrayList<Node>();
253 // NodeIterator nit = queryResult.getNodes();
254 // while (nit.hasNext()) {
255 // elems.add(nit.nextNode());
257 return rows
.toArray();
258 } catch (RepositoryException e
) {
259 throw new ArgeoException("Cannot read query result", e
);
266 * Might be used by children classes to sort columns.
272 protected SelectionAdapter
getSelectionAdapter(final TableColumn column
,
275 // A comparator must be define
276 if (comparator
== null)
279 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
281 public void widgetSelected(SelectionEvent e
) {
285 comparator
.setColumn(index
);
286 int dir
= viewer
.getTable().getSortDirection();
287 if (viewer
.getTable().getSortColumn() == column
) {
288 dir
= dir
== SWT
.UP ? SWT
.DOWN
: SWT
.UP
;
293 viewer
.getTable().setSortDirection(dir
);
294 viewer
.getTable().setSortColumn(column
);
296 } catch (Exception exc
) {
297 exc
.printStackTrace();
301 return selectionAdapter
;
305 * To be overridden to enable sorting.
307 protected GenericTableComparator
getComparator() {
312 public boolean isDirty() {
317 public void doSave(IProgressMonitor monitor
) {
318 // TODO save the query in JCR?
322 public void doSaveAs() {
326 public boolean isSaveAsAllowed() {
330 /** Returns the injected current session */
331 protected Session
getSession() {
335 /** DEPENDENCY INJECTION */
336 public void setSession(Session session
) {
337 this.session
= session
;