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