]> git.argeo.org Git - lgpl/argeo-commons.git/blob - AbstractJcrQueryEditor.java
482f9f9d4b69879ee1e56e3c367b4bfb1d949337
[lgpl/argeo-commons.git] / AbstractJcrQueryEditor.java
1 package org.argeo.eclipse.ui.jcr.editors;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
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;
11
12 import org.argeo.ArgeoException;
13 import org.argeo.eclipse.ui.GenericTableComparator;
14 import org.eclipse.core.runtime.IProgressMonitor;
15 import org.eclipse.core.runtime.IStatus;
16 import org.eclipse.core.runtime.Status;
17 import org.eclipse.jface.dialogs.ErrorDialog;
18 import org.eclipse.jface.viewers.ColumnLabelProvider;
19 import org.eclipse.jface.viewers.IDoubleClickListener;
20 import org.eclipse.jface.viewers.IStructuredContentProvider;
21 import org.eclipse.jface.viewers.TableViewer;
22 import org.eclipse.jface.viewers.TableViewerColumn;
23 import org.eclipse.jface.viewers.Viewer;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.custom.SashForm;
26 import org.eclipse.swt.events.SelectionAdapter;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.graphics.Image;
29 import org.eclipse.swt.layout.FillLayout;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.TableColumn;
34 import org.eclipse.ui.IEditorInput;
35 import org.eclipse.ui.IEditorSite;
36 import org.eclipse.ui.PartInitException;
37 import org.eclipse.ui.part.EditorPart;
38
39 /** Executes any JCR query. */
40 public abstract class AbstractJcrQueryEditor extends EditorPart {
41
42 protected String initialQuery;
43 protected String initialQueryType;
44
45 // IoC
46 private Session session;
47
48 private TableViewer viewer;
49 private List<TableViewerColumn> tableViewerColumns = new ArrayList<TableViewerColumn>();
50 private GenericTableComparator comparator;
51
52 protected abstract void createQueryForm(Composite parent);
53
54 @Override
55 public void init(IEditorSite site, IEditorInput input)
56 throws PartInitException {
57 JcrQueryEditorInput editorInput = (JcrQueryEditorInput) input;
58 initialQuery = editorInput.getQuery();
59 initialQueryType = editorInput.getQueryType();
60 setSite(site);
61 setInput(editorInput);
62 }
63
64 @Override
65 public final void createPartControl(final Composite parent) {
66 parent.setLayout(new FillLayout());
67
68 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
69 sashForm.setSashWidth(4);
70 sashForm.setLayout(new FillLayout());
71
72 Composite top = new Composite(sashForm, SWT.NONE);
73 GridLayout gl = new GridLayout(1, false);
74 top.setLayout(gl);
75
76 createQueryForm(top);
77
78 Composite bottom = new Composite(sashForm, SWT.NONE);
79 bottom.setLayout(new GridLayout(1, false));
80 sashForm.setWeights(getWeights());
81
82 viewer = new TableViewer(bottom);
83 viewer.getTable().setLayoutData(
84 new GridData(SWT.FILL, SWT.FILL, true, true));
85 viewer.getTable().setHeaderVisible(true);
86 viewer.setContentProvider(getQueryResultContentProvider());
87 viewer.setInput(getEditorSite());
88
89 if (getComparator() != null) {
90 comparator = getComparator();
91 viewer.setComparator(comparator);
92 }
93 if (getTableDoubleClickListener() != null)
94 viewer.addDoubleClickListener(getTableDoubleClickListener());
95
96 }
97
98 protected void executeQuery(String statement) {
99 try {
100 QueryResult qr = session.getWorkspace().getQueryManager()
101 .createQuery(statement, initialQueryType).execute();
102
103 // remove previous columns
104 for (TableViewerColumn tvc : tableViewerColumns)
105 tvc.getColumn().dispose();
106
107 int i = 0;
108 for (final String columnName : qr.getColumnNames()) {
109 TableViewerColumn tvc = new TableViewerColumn(viewer, SWT.NONE);
110 configureColumn(columnName, tvc, i);
111 tvc.setLabelProvider(getLabelProvider(columnName));
112 tableViewerColumns.add(tvc);
113 i++;
114 }
115
116 // We must create a local list because query result can be read only
117 // once.
118 // viewer.setInput(qr);
119
120 try {
121 List<Row> rows = new ArrayList<Row>();
122 RowIterator rit = qr.getRows();
123 while (rit.hasNext()) {
124 rows.add(rit.nextRow());
125 }
126 viewer.setInput(rows);
127 } catch (RepositoryException e) {
128 throw new ArgeoException("Cannot read query result", e);
129 }
130
131 } catch (RepositoryException e) {
132 ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
133 + statement, new Status(IStatus.ERROR,
134 "org.argeo.eclipse.ui.jcr", e.getMessage()));
135 // throw new ArgeoException("Cannot execute JCR query " + statement,
136 // e);
137 }
138 }
139
140 /**
141 * To be overidden to adapt size of form and result frames.
142 *
143 * @return
144 */
145 protected int[] getWeights() {
146 return new int[] { 30, 70 };
147 }
148
149 /**
150 * To be overidden to implement a doubleclick Listener on one of the rows of
151 * the table.
152 *
153 * @return
154 */
155 protected IDoubleClickListener getTableDoubleClickListener() {
156 return null;
157 }
158
159 /**
160 * To be overiden in order to implement a specific
161 * QueryResultContentProvider
162 */
163 protected IStructuredContentProvider getQueryResultContentProvider() {
164 return new QueryResultContentProvider();
165 }
166
167 /**
168 * Enable specific implementation for columns
169 */
170 protected List<TableViewerColumn> getTableViewerColumns() {
171 return tableViewerColumns;
172 }
173
174 /**
175 * Enable specific implementation for columns
176 */
177 protected TableViewer getTableViewer() {
178 return viewer;
179 }
180
181 /**
182 * To be overridden in order to configure column label providers .
183 */
184 protected ColumnLabelProvider getLabelProvider(final String columnName) {
185 return new ColumnLabelProvider() {
186 public String getText(Object element) {
187 Row row = (Row) element;
188 try {
189 return row.getValue(columnName).getString();
190 } catch (RepositoryException e) {
191 throw new ArgeoException("Cannot display row " + row, e);
192 }
193 }
194
195 public Image getImage(Object element) {
196 return null;
197 }
198 };
199 }
200
201 /**
202 * To be overridden in order to configure the columns.
203 *
204 * @deprecated use {@link
205 * org.argeo.eclipse.ui.jcr.editors.AbstractJcrQueryEditor.
206 * configureColumn(String jcrColumnName, TableViewerColumn
207 * column, int columnIndex)} instead
208 */
209 protected void configureColumn(String jcrColumnName,
210 TableViewerColumn column) {
211 column.getColumn().setWidth(50);
212 column.getColumn().setText(jcrColumnName);
213 }
214
215 /** To be overridden in order to configure the columns. */
216 protected void configureColumn(String jcrColumnName,
217 TableViewerColumn column, int columnIndex) {
218 column.getColumn().setWidth(50);
219 column.getColumn().setText(jcrColumnName);
220 }
221
222 private class QueryResultContentProvider implements
223 IStructuredContentProvider {
224
225 public void dispose() {
226 }
227
228 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
229 }
230
231 public Object[] getElements(Object inputElement) {
232
233 if (inputElement instanceof List)
234 return ((List) inputElement).toArray();
235
236 // Never reached might be deleted in future release
237 if (!(inputElement instanceof QueryResult))
238 return new String[] {};
239
240 try {
241 QueryResult queryResult = (QueryResult) inputElement;
242 List<Row> rows = new ArrayList<Row>();
243 RowIterator rit = queryResult.getRows();
244 while (rit.hasNext()) {
245 rows.add(rit.nextRow());
246 }
247
248 // List<Node> elems = new ArrayList<Node>();
249 // NodeIterator nit = queryResult.getNodes();
250 // while (nit.hasNext()) {
251 // elems.add(nit.nextNode());
252 // }
253 return rows.toArray();
254 } catch (RepositoryException e) {
255 throw new ArgeoException("Cannot read query result", e);
256 }
257 }
258
259 }
260
261 /**
262 * Might be used by children classes to sort columns.
263 *
264 * @param column
265 * @param index
266 * @return
267 */
268 protected SelectionAdapter getSelectionAdapter(final TableColumn column,
269 final int index) {
270
271 // A comparator must be define
272 if (comparator == null)
273 return null;
274
275 SelectionAdapter selectionAdapter = new SelectionAdapter() {
276 @Override
277 public void widgetSelected(SelectionEvent e) {
278
279 try {
280
281 comparator.setColumn(index);
282 int dir = viewer.getTable().getSortDirection();
283 if (viewer.getTable().getSortColumn() == column) {
284 dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
285 } else {
286
287 dir = SWT.DOWN;
288 }
289 viewer.getTable().setSortDirection(dir);
290 viewer.getTable().setSortColumn(column);
291 viewer.refresh();
292 } catch (Exception exc) {
293 exc.printStackTrace();
294 }
295 }
296 };
297 return selectionAdapter;
298 }
299
300 /**
301 * To be overriden to enable sorting.
302 *
303 * @author bsinou
304 *
305 */
306 protected GenericTableComparator getComparator() {
307 return null;
308 }
309
310 @Override
311 public boolean isDirty() {
312 return false;
313 }
314
315 @Override
316 public void doSave(IProgressMonitor monitor) {
317 // TODO save the query in JCR?
318
319 }
320
321 @Override
322 public void doSaveAs() {
323 }
324
325 @Override
326 public boolean isSaveAsAllowed() {
327 return false;
328 }
329
330 // IoC
331 public void setSession(Session session) {
332 this.session = session;
333 }
334 }