+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.client.ui.dist.views;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+import javax.jcr.query.Row;
+import javax.jcr.query.RowIterator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.GenericTableComparator;
+import org.argeo.slc.client.ui.dist.utils.ArtifactsTableConfigurer;
+import org.argeo.slc.jcr.SlcTypes;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.part.ViewPart;
+
+/** Factorizes useful methods to build a query view in a sashForm */
+public abstract class AbstractQueryArtifactsView extends ViewPart implements
+ SlcTypes {
+ private static final Log log = LogFactory
+ .getLog(AbstractQueryArtifactsView.class);
+
+ // shortcuts
+ final protected static String SAVB = "[" + SLC_ARTIFACT_VERSION_BASE + "]";
+ final protected static String SBA = "[" + SLC_BUNDLE_ARTIFACT + "]";
+ final protected static String SIP = "[" + SLC_IMPORTED_PACKAGE + "]";
+ final protected static String SEP = "[" + SLC_EXPORTED_PACKAGE + "]";
+
+ /* DEPENDENCY INJECTION */
+ private Session session;
+ private List<String> columnProperties;
+
+ // This page widgets
+ private TableViewer viewer;
+ private List<TableViewerColumn> tableViewerColumns = new ArrayList<TableViewerColumn>();
+ private ArtifactsTableConfigurer tableConfigurer;
+ private GenericTableComparator comparator;
+
+ // to be set by client to display all columns
+ private boolean displayAllColumns = false;
+
+ protected void createResultPart(Composite parent) {
+ viewer = new TableViewer(parent);
+ Table table = viewer.getTable();
+ table.getParent().setLayout(new GridLayout(1, false));
+ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ viewer.getTable().setHeaderVisible(true);
+ viewer.getTable().setLinesVisible(true);
+
+ viewer.setLabelProvider(new ViewLabelProvider());
+ viewer.setContentProvider(new ViewContentProvider());
+ // viewer.addDoubleClickListener(new GenericDoubleClickListener());
+
+ tableConfigurer = new ArtifactsTableConfigurer(viewer, 1,
+ GenericTableComparator.DESCENDING);
+
+ comparator = tableConfigurer.getComparator();
+ viewer.setComparator(comparator);
+ }
+
+ protected void executeQuery(String statement) {
+ try {
+ Calendar stStamp = new GregorianCalendar();
+ if (log.isDebugEnabled()) {
+ log.debug("Executed query: " + statement);
+ }
+ QueryResult qr = session.getWorkspace().getQueryManager()
+ .createQuery(statement, Query.JCR_SQL2).execute();
+
+ if (log.isDebugEnabled()) {
+ Calendar enStamp = new GregorianCalendar();
+ long duration = enStamp.getTimeInMillis()
+ - stStamp.getTimeInMillis();
+ log.debug("Query executed in : " + duration / 1000 + "s.");
+ }
+
+ // remove previous columns
+ for (TableViewerColumn tvc : tableViewerColumns)
+ tvc.getColumn().dispose();
+
+ // If a pre(-defined list of columns has been injected, we use it,
+ // otherwise we display all results of the resultSet
+ if (!displayAllColumns && columnProperties != null) {
+ int i = 0;
+
+ Iterator<String> it = columnProperties.iterator();
+ while (it.hasNext()) {
+ String columnName = it.next();
+
+ TableViewerColumn tvc = new TableViewerColumn(viewer,
+ SWT.NONE);
+ tableConfigurer.configureColumn(columnName, tvc, i);
+ tvc.setLabelProvider(tableConfigurer
+ .getLabelProvider(columnName));
+ tableViewerColumns.add(tvc);
+ i++;
+ }
+ } else {
+ int i = 0;
+ for (final String columnName : qr.getColumnNames()) {
+ TableViewerColumn tvc = new TableViewerColumn(viewer,
+ SWT.NONE);
+ // Small hack to remove prefix from the column name
+ // String tmpStr = columnName.substring(columnName
+ // .lastIndexOf(".") + 1);
+ tableConfigurer.configureColumn(columnName, tvc, i);
+ tvc.setLabelProvider(tableConfigurer
+ .getLabelProvider(columnName));
+ tableViewerColumns.add(tvc);
+ i++;
+ }
+ }
+ // We must create a local list because query result can be read only
+ // once.
+ try {
+ List<Row> rows = new ArrayList<Row>();
+ RowIterator rit = qr.getRows();
+ while (rit.hasNext()) {
+ rows.add(rit.nextRow());
+ }
+ viewer.setInput(rows);
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot read query result", e);
+ }
+
+ } catch (RepositoryException e) {
+ ErrorDialog.openError(null, "Error", "Cannot execute JCR query: "
+ + statement, new Status(IStatus.ERROR,
+ "org.argeo.eclipse.ui.jcr", e.getMessage()));
+ }
+ }
+
+ /**
+ * Client must use this method to display all columns of the result set
+ * instead of a limited predifined and injected set
+ **/
+ public void displayAllColumns(boolean flag) {
+ displayAllColumns = flag;
+ }
+
+ // Can be overridden by subclasses.
+ protected String generateSelectStatement() {
+ StringBuffer sb = new StringBuffer("select " + SAVB + ".* ");
+ return sb.toString();
+ }
+
+ protected String generateFromStatement() {
+ StringBuffer sb = new StringBuffer(" from ");
+ sb.append(SAVB);
+ sb.append(" ");
+ return sb.toString();
+ }
+
+ // Providers
+ protected class ViewContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
+ }
+
+ public void dispose() {
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object obj) {
+ return ((List<String[]>) obj).toArray();
+ }
+ }
+
+ protected class ViewLabelProvider extends LabelProvider implements
+ ITableLabelProvider {
+ public String getColumnText(Object obj, int index) {
+ if (!(obj instanceof String[]))
+ return "Object is not properly formatted ";
+
+ String[] value = (String[]) obj;
+
+ return value[index];
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ return null;
+ }
+ }
+
+ /* DEPENDENCY INJECTION */
+ public void setSession(Session session) {
+ this.session = session;
+ }
+
+ public void setColumnProperties(List<String> columnProperties) {
+ this.columnProperties = columnProperties;
+ }
+}
\ No newline at end of file