]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/views/AbstractQueryArtifactsView.java
Merge remote-tracking branch 'origin/master' into testing
[gpl/argeo-slc.git] / legacy / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / views / AbstractQueryArtifactsView.java
1 package org.argeo.slc.client.ui.dist.views;
2
3 import java.util.ArrayList;
4 import java.util.Calendar;
5 import java.util.GregorianCalendar;
6 import java.util.Iterator;
7 import java.util.List;
8
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11 import javax.jcr.query.Query;
12 import javax.jcr.query.QueryResult;
13 import javax.jcr.query.Row;
14 import javax.jcr.query.RowIterator;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.argeo.eclipse.ui.GenericTableComparator;
19 import org.argeo.slc.SlcException;
20 import org.argeo.slc.SlcTypes;
21 import org.argeo.slc.client.ui.dist.utils.ArtifactsTableConfigurer;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.core.runtime.Status;
24 import org.eclipse.jface.dialogs.ErrorDialog;
25 import org.eclipse.jface.viewers.IStructuredContentProvider;
26 import org.eclipse.jface.viewers.ITableLabelProvider;
27 import org.eclipse.jface.viewers.LabelProvider;
28 import org.eclipse.jface.viewers.TableViewer;
29 import org.eclipse.jface.viewers.TableViewerColumn;
30 import org.eclipse.jface.viewers.Viewer;
31 import org.eclipse.swt.SWT;
32 import org.eclipse.swt.graphics.Image;
33 import org.eclipse.swt.layout.GridData;
34 import org.eclipse.swt.layout.GridLayout;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Table;
37 import org.eclipse.ui.part.ViewPart;
38
39 /** Factorizes useful methods to build a query view in a sashForm */
40 public abstract class AbstractQueryArtifactsView extends ViewPart implements
41 SlcTypes {
42 private static final Log log = LogFactory
43 .getLog(AbstractQueryArtifactsView.class);
44
45 // shortcuts
46 final protected static String SAVB = "[" + SLC_ARTIFACT_VERSION_BASE + "]";
47 final protected static String SBA = "[" + SLC_BUNDLE_ARTIFACT + "]";
48 final protected static String SIP = "[" + SLC_IMPORTED_PACKAGE + "]";
49 final protected static String SEP = "[" + SLC_EXPORTED_PACKAGE + "]";
50
51 /* DEPENDENCY INJECTION */
52 private Session session;
53 private List<String> columnProperties;
54
55 // This page widgets
56 private TableViewer viewer;
57 private List<TableViewerColumn> tableViewerColumns = new ArrayList<TableViewerColumn>();
58 private ArtifactsTableConfigurer tableConfigurer;
59 private GenericTableComparator comparator;
60
61 // to be set by client to display all columns
62 private boolean displayAllColumns = false;
63
64 protected void createResultPart(Composite parent) {
65 viewer = new TableViewer(parent);
66 Table table = viewer.getTable();
67 table.getParent().setLayout(new GridLayout(1, false));
68 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
69 viewer.getTable().setHeaderVisible(true);
70 viewer.getTable().setLinesVisible(true);
71
72 viewer.setLabelProvider(new ViewLabelProvider());
73 viewer.setContentProvider(new ViewContentProvider());
74 // viewer.addDoubleClickListener(new GenericDoubleClickListener());
75
76 tableConfigurer = new ArtifactsTableConfigurer(viewer, 1,
77 GenericTableComparator.DESCENDING);
78
79 comparator = tableConfigurer.getComparator();
80 viewer.setComparator(comparator);
81 }
82
83 protected void executeQuery(String statement) {
84 try {
85 Calendar stStamp = new GregorianCalendar();
86 if (log.isDebugEnabled()) {
87 log.debug("Executed query: " + statement);
88 }
89 QueryResult qr = session.getWorkspace().getQueryManager()
90 .createQuery(statement, Query.JCR_SQL2).execute();
91
92 if (log.isDebugEnabled()) {
93 Calendar enStamp = new GregorianCalendar();
94 long duration = enStamp.getTimeInMillis()
95 - stStamp.getTimeInMillis();
96 log.debug("Query executed in : " + duration / 1000 + "s.");
97 }
98
99 // remove previous columns
100 for (TableViewerColumn tvc : tableViewerColumns)
101 tvc.getColumn().dispose();
102
103 // If a pre(-defined list of columns has been injected, we use it,
104 // otherwise we display all results of the resultSet
105 if (!displayAllColumns && columnProperties != null) {
106 int i = 0;
107
108 Iterator<String> it = columnProperties.iterator();
109 while (it.hasNext()) {
110 String columnName = it.next();
111
112 TableViewerColumn tvc = new TableViewerColumn(viewer,
113 SWT.NONE);
114 tableConfigurer.configureColumn(columnName, tvc, i);
115 tvc.setLabelProvider(tableConfigurer
116 .getLabelProvider(columnName));
117 tableViewerColumns.add(tvc);
118 i++;
119 }
120 } else {
121 int i = 0;
122 for (final String columnName : qr.getColumnNames()) {
123 TableViewerColumn tvc = new TableViewerColumn(viewer,
124 SWT.NONE);
125 // Small hack to remove prefix from the column name
126 // String tmpStr = columnName.substring(columnName
127 // .lastIndexOf(".") + 1);
128 tableConfigurer.configureColumn(columnName, tvc, i);
129 tvc.setLabelProvider(tableConfigurer
130 .getLabelProvider(columnName));
131 tableViewerColumns.add(tvc);
132 i++;
133 }
134 }
135 // We must create a local list because query result can be read only
136 // once.
137 try {
138 List<Row> rows = new ArrayList<Row>();
139 RowIterator rit = qr.getRows();
140 while (rit.hasNext()) {
141 rows.add(rit.nextRow());
142 }
143 viewer.setInput(rows);
144 } catch (RepositoryException e) {
145 throw new SlcException("Cannot read query result", e);
146 }
147
148 } catch (RepositoryException e) {
149 ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
150 + statement, new Status(IStatus.ERROR,
151 "org.argeo.eclipse.ui.jcr", e.getMessage()));
152 }
153 }
154
155 /**
156 * Client must use this method to display all columns of the result set
157 * instead of a limited predifined and injected set
158 **/
159 public void displayAllColumns(boolean flag) {
160 displayAllColumns = flag;
161 }
162
163 // Can be overridden by subclasses.
164 protected String generateSelectStatement() {
165 StringBuffer sb = new StringBuffer("select " + SAVB + ".* ");
166 return sb.toString();
167 }
168
169 protected String generateFromStatement() {
170 StringBuffer sb = new StringBuffer(" from ");
171 sb.append(SAVB);
172 sb.append(" ");
173 return sb.toString();
174 }
175
176 // Providers
177 protected class ViewContentProvider implements IStructuredContentProvider {
178 private static final long serialVersionUID = 5286293288979552056L;
179
180 public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
181 }
182
183 public void dispose() {
184 }
185
186 @SuppressWarnings("unchecked")
187 public Object[] getElements(Object obj) {
188 return ((List<String[]>) obj).toArray();
189 }
190 }
191
192 protected class ViewLabelProvider extends LabelProvider implements
193 ITableLabelProvider {
194 private static final long serialVersionUID = -2407263563879116348L;
195
196 public String getColumnText(Object obj, int index) {
197 if (!(obj instanceof String[]))
198 return "Object is not properly formatted ";
199
200 String[] value = (String[]) obj;
201
202 return value[index];
203 }
204
205 public Image getColumnImage(Object obj, int index) {
206 return null;
207 }
208 }
209
210 /* DEPENDENCY INJECTION */
211 public void setSession(Session session) {
212 this.session = session;
213 }
214
215 public void setColumnProperties(List<String> columnProperties) {
216 this.columnProperties = columnProperties;
217 }
218 }