]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/views/AbstractQueryArtifactsView.java
SLC UI building (except Dist)
[gpl/argeo-slc.git] / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / views / AbstractQueryArtifactsView.java
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 (file)
index 0000000..45c0d0f
--- /dev/null
@@ -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<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