X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=inline;f=org.argeo.slc.client.ui.dist%2Fsrc%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fviews%2FAbstractQueryArtifactsView.java;fp=org.argeo.slc.client.ui.dist%2Fsrc%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fviews%2FAbstractQueryArtifactsView.java;h=45c0d0f2eb5b328c7711fd55ada4b39b0c92657d;hb=2db415932b071525adb52c6374e021174512a924;hp=0000000000000000000000000000000000000000;hpb=7e2f6c6ae08e97925955184aaa29035ac05de149;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/views/AbstractQueryArtifactsView.java b/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/views/AbstractQueryArtifactsView.java new file mode 100644 index 000000000..45c0d0f2e --- /dev/null +++ b/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/views/AbstractQueryArtifactsView.java @@ -0,0 +1,230 @@ +/* + * 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 columnProperties; + + // This page widgets + private TableViewer viewer; + private List tableViewerColumns = new ArrayList(); + 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 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 rows = new ArrayList(); + 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) 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 columnProperties) { + this.columnProperties = columnProperties; + } +} \ No newline at end of file