From 9c81cfac688138b84a0171b81f37b0bc39a57d4b Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Wed, 22 Jun 2011 10:08:55 +0000
Subject: [PATCH] GridCustomFilterGrid refactored into a TypedTableGrid

SVN: 21800
---
 .../web/client/ICommonClientService.java      |   8 +-
 .../web/client/ICommonClientServiceAsync.java |  10 +-
 .../specific/CustomGridFilterColDefKind.java  | 104 ------------------
 .../filter/GridCustomFilterGrid.java          |  56 +++++-----
 .../web/server/CommonClientService.java       |  21 ++--
 .../resultset/AbstractExpressionProvider.java |  85 ++++++++++++++
 .../resultset/CustomGridColumnProvider.java   |  51 +++------
 .../resultset/GridCustomFilterProvider.java   |  42 +++++++
 .../openbis/systemtest/FilterSystemTest.java  |  24 ++--
 9 files changed, 207 insertions(+), 194 deletions(-)
 delete mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/CustomGridFilterColDefKind.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExpressionProvider.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/GridCustomFilterProvider.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index dfd4d53e22e..cbc4486a436 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -955,14 +955,16 @@ public interface ICommonClientService extends IClientService
     /**
      * Returns {@link GridCustomFilter}s for given grid and display criteria.
      */
-    public ResultSet<GridCustomFilter> listFilters(String gridId,
-            DefaultResultSetConfig<String, GridCustomFilter> resultSetConfig)
+    public TypedTableResultSet<GridCustomFilter> listFilters(
+            String gridId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> resultSetConfig)
             throws UserFailureException;
 
     /**
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for custom grid filters.
      */
-    public String prepareExportFilters(final TableExportCriteria<GridCustomFilter> criteria)
+    public String prepareExportFilters(
+            final TableExportCriteria<TableModelRowWithObject<GridCustomFilter>> criteria)
             throws UserFailureException;
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index e9304a98d6a..eadc781f655 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -861,14 +861,16 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#listFilters(String, DefaultResultSetConfig)
      */
-    public void listFilters(String gridId,
-            DefaultResultSetConfig<String, GridCustomFilter> resultSetConfig,
-            AsyncCallback<ResultSet<GridCustomFilter>> callback);
+    public void listFilters(
+            String gridId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<GridCustomFilter>> callback);
 
     /**
      * @see ICommonClientService#prepareExportFilters(TableExportCriteria)
      */
-    public void prepareExportFilters(final TableExportCriteria<GridCustomFilter> criteria,
+    public void prepareExportFilters(
+            final TableExportCriteria<TableModelRowWithObject<GridCustomFilter>> criteria,
             AsyncCallback<String> asyncCallback);
 
     /** @see ICommonClientService#registerFilter(NewColumnOrFilter) */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/CustomGridFilterColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/CustomGridFilterColDefKind.java
deleted file mode 100644
index df782c92734..00000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/CustomGridFilterColDefKind.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2009 ETH Zuerich, CISD
- *
- * 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 ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
-
-/**
- * Column definitions for the filters.
- * 
- * @author Izabela Adamczyk
- */
-public enum CustomGridFilterColDefKind implements IColumnDefinitionKind<GridCustomFilter>
-{
-    NAME(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.NAME)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return entity.getName();
-            }
-        }),
-
-    DESCRIPTION(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.DESCRIPTION)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return entity.getDescription();
-            }
-        }),
-
-    EXPRESSION(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.EXPRESSION, true)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return entity.getExpression();
-            }
-        }),
-
-    PUBLIC(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.IS_PUBLIC, true)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return SimpleYesNoRenderer.render(entity.isPublic());
-            }
-        }),
-
-    REGISTRATOR(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.REGISTRATOR, true)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return renderRegistrator(entity);
-            }
-        }),
-
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.REGISTRATION_DATE,
-            AbstractColumnDefinitionKind.DATE_COLUMN_WIDTH, true)
-        {
-            @Override
-            public String tryGetValue(GridCustomFilter entity)
-            {
-                return renderRegistrationDate(entity);
-            }
-        });
-
-    private final AbstractColumnDefinitionKind<GridCustomFilter> columnDefinitionKind;
-
-    private CustomGridFilterColDefKind(
-            AbstractColumnDefinitionKind<GridCustomFilter> columnDefinitionKind)
-    {
-        this.columnDefinitionKind = columnDefinitionKind;
-    }
-
-    public String id()
-    {
-        return name();
-    }
-
-    public AbstractColumnDefinitionKind<GridCustomFilter> getDescriptor()
-    {
-        return columnDefinitionKind;
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/GridCustomFilterGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/GridCustomFilterGrid.java
index 418b90d8413..8fab7cb58f4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/GridCustomFilterGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/GridCustomFilterGrid.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.expressions.filter;
 
+import java.util.Arrays;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.event.ButtonEvent;
@@ -33,33 +34,32 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.CustomGridFilterColDefKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractColumnSettingsDataModelProvider;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractSimpleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.expressions.common.AbstractGridCustomExpressionEditOrRegisterDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExpression;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Allows to display, update, delete and create new custom grid filters.
  * 
  * @author Tomasz Pylak
  */
-public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFilter>
+public class GridCustomFilterGrid extends TypedTableGrid<GridCustomFilter>
 {
     private static final String BROWSER_ID = GenericConstants.ID_PREFIX + "filter-browser";
 
@@ -107,12 +107,12 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
         addButton(addButton);
         final Button editButton =
                 createSelectedItemButton(viewContext.getMessage(Dict.BUTTON_EDIT),
-                        new ISelectedEntityInvoker<BaseEntityModel<GridCustomFilter>>()
+                        new ISelectedEntityInvoker<BaseEntityModel<TableModelRowWithObject<GridCustomFilter>>>()
                             {
-                                public void invoke(BaseEntityModel<GridCustomFilter> selectedItem,
+                                public void invoke(BaseEntityModel<TableModelRowWithObject<GridCustomFilter>> selectedItem,
                                         boolean keyPressed)
                                 {
-                                    final GridCustomFilter selected = selectedItem.getBaseObject();
+                                    final GridCustomFilter selected = selectedItem.getBaseObject().getObjectOrNull();
                                     createEditDialog(selected).show();
                                 }
 
@@ -123,7 +123,7 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
                         new AbstractCreateDialogListener()
                             {
                                 @Override
-                                protected Dialog createDialog(List<GridCustomFilter> selected,
+                                protected Dialog createDialog(List<TableModelRowWithObject<GridCustomFilter>> selected,
                                         IBrowserGridActionInvoker invoker)
                                 {
                                     return new DeletionConfirmationDialog(viewContext, selected,
@@ -210,7 +210,7 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
     }
 
     private static class DeletionConfirmationDialog extends
-            AbstractDataConfirmationDialog<List<GridCustomFilter>>
+            AbstractDataConfirmationDialog<List<TableModelRowWithObject<GridCustomFilter>>>
     {
         private static final int LABEL_WIDTH = 60;
 
@@ -221,7 +221,7 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
         private final AbstractAsyncCallback<Void> callback;
 
         public DeletionConfirmationDialog(IViewContext<ICommonClientServiceAsync> viewContext,
-                List<GridCustomFilter> data, AbstractAsyncCallback<Void> callback)
+                List<TableModelRowWithObject<GridCustomFilter>> data, AbstractAsyncCallback<Void> callback)
         {
             super(viewContext, data, viewContext.getMessage(Dict.DELETE_CONFIRMATION_TITLE));
             this.callback = callback;
@@ -252,7 +252,7 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
     private GridCustomFilterGrid(IViewContext<ICommonClientServiceAsync> viewContext,
             String gridDisplayId, AbstractColumnSettingsDataModelProvider columnDataModelProvider)
     {
-        super(viewContext, createBrowserId(gridDisplayId), createGridId(gridDisplayId),
+        super(viewContext, createBrowserId(gridDisplayId), true,
                 DisplayTypeIDGenerator.FILTER_BROWSER_GRID);
         this.gridDisplayId = gridDisplayId;
         this.columnDataModelProvider = columnDataModelProvider;
@@ -260,43 +260,45 @@ public class GridCustomFilterGrid extends AbstractSimpleBrowserGrid<GridCustomFi
     }
 
     @Override
-    protected IColumnDefinitionKind<GridCustomFilter>[] getStaticColumnsDefinition()
+    protected String translateColumnIdToDictionaryKey(String columnID)
     {
-        return CustomGridFilterColDefKind.values();
+        return columnID.toLowerCase();
     }
-
+    
     @Override
-    protected void listEntities(DefaultResultSetConfig<String, GridCustomFilter> resultSetConfig,
-            AbstractAsyncCallback<ResultSet<GridCustomFilter>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<GridCustomFilter>> callback)
     {
         viewContext.getService().listFilters(gridDisplayId, resultSetConfig, callback);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<GridCustomFilter> exportCriteria,
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<GridCustomFilter>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportFilters(exportCriteria, callback);
     }
 
     @Override
-    protected List<IColumnDefinition<GridCustomFilter>> getInitialFilters()
+    protected List<String> getColumnIdsOfFilters()
     {
-        return asColumnFilters(new CustomGridFilterColDefKind[]
-            { CustomGridFilterColDefKind.NAME, CustomGridFilterColDefKind.PUBLIC });
+        return Arrays.asList(CustomGridColumnGridColumnIDs.NAME, CustomGridColumnGridColumnIDs.IS_PUBLIC);
     }
 
     @Override
-    protected ColumnDefsAndConfigs<GridCustomFilter> createColumnsDefinition()
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<GridCustomFilter>> createColumnsDefinition()
     {
-        ColumnDefsAndConfigs<GridCustomFilter> schema = super.createColumnsDefinition();
-        schema.setGridCellRendererFor(CustomGridFilterColDefKind.DESCRIPTION.id(),
+        ColumnDefsAndConfigs<TableModelRowWithObject<GridCustomFilter>> schema = super.createColumnsDefinition();
+        schema.setGridCellRendererFor(CustomGridColumnGridColumnIDs.DESCRIPTION,
                 createMultilineStringCellRenderer());
-        schema.setGridCellRendererFor(CustomGridFilterColDefKind.EXPRESSION.id(),
+        schema.setGridCellRendererFor(CustomGridColumnGridColumnIDs.EXPRESSION,
                 createMultilineStringCellRenderer());
         return schema;
     }
 
+    @Override
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 41bcbca3e59..42797c1e693 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -75,6 +75,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataSetTypeP
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.EntityTypeProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.ExperimentProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.FileFormatTypesProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.GridCustomFilterProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.MatchingEntitiesProvider;
@@ -2478,23 +2479,17 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
-    public ResultSet<GridCustomFilter> listFilters(final String gridId,
-            DefaultResultSetConfig<String, GridCustomFilter> resultSetConfig)
+    public TypedTableResultSet<GridCustomFilter> listFilters(
+            final String gridId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> resultSetConfig)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
-        return listEntities(resultSetConfig,
-                new AbstractOriginalDataProviderWithoutHeaders<GridCustomFilter>()
-                    {
-                        @Override
-                        public List<GridCustomFilter> getFullOriginalData()
-                                throws UserFailureException
-                        {
-                            return listFilters(gridId);
-                        }
-                    });
+        return listEntities(new GridCustomFilterProvider(commonServer, getSessionToken(), gridId),
+                resultSetConfig);
     }
 
-    public String prepareExportFilters(TableExportCriteria<GridCustomFilter> criteria)
+    public String prepareExportFilters(
+            TableExportCriteria<TableModelRowWithObject<GridCustomFilter>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return prepareExportEntities(criteria);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExpressionProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExpressionProvider.java
new file mode 100644
index 00000000000..14436f8c92f
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExpressionProvider.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * 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 ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
+
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.DESCRIPTION;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.EXPRESSION;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.IS_PUBLIC;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.NAME;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.REGISTRATION_DATE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.REGISTRATOR;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
+import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
+
+/**
+ * Super class of common code for providers of subclasses of {@link AbstractExpression}.
+ *
+ * @author Franz-Josef Elmer
+ */
+public abstract class AbstractExpressionProvider<T extends AbstractExpression> extends AbstractCommonTableModelProvider<T>
+{
+    protected final String gridId;
+
+    public AbstractExpressionProvider(ICommonServer commonServer, String sessionToken, String gridId)
+    {
+        super(commonServer, sessionToken);
+        this.gridId = gridId;
+    }
+
+    @Override
+    protected TypedTableModel<T> createTableModel()
+    {
+        List<T> expressions = listExpressions();
+        TypedTableModelBuilder<T> builder = new TypedTableModelBuilder<T>();
+        addAdditionalColumn(builder);
+        builder.addColumn(NAME);
+        builder.addColumn(DESCRIPTION);
+        builder.addColumn(EXPRESSION).hideByDefault();
+        builder.addColumn(IS_PUBLIC).hideByDefault();
+        builder.addColumn(REGISTRATOR).hideByDefault();
+        builder.addColumn(REGISTRATION_DATE).hideByDefault();
+        for (T expression : expressions)
+        {
+            builder.addRow(expression);
+            addAdditionalColumnValue(builder, expression);
+            builder.column(NAME).addString(expression.getName());
+            builder.column(DESCRIPTION).addString(expression.getDescription());
+            builder.column(EXPRESSION).addString(expression.getExpression());
+            builder.column(IS_PUBLIC).addString(SimpleYesNoRenderer.render(expression.isPublic()));
+            builder.column(REGISTRATOR).addPerson(expression.getRegistrator());
+            builder.column(REGISTRATION_DATE).addDate(expression.getRegistrationDate());
+        }
+        return builder.getModel();
+    }
+    
+    protected void addAdditionalColumn(TypedTableModelBuilder<T> builder)
+    {
+    }
+    
+    protected void addAdditionalColumnValue(TypedTableModelBuilder<T> builder, T expression)
+    {
+    }
+
+    protected abstract List<T> listExpressions();
+    
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CustomGridColumnProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CustomGridColumnProvider.java
index cb68287470a..02081351d09 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CustomGridColumnProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CustomGridColumnProvider.java
@@ -17,60 +17,43 @@
 package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.CODE;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.DESCRIPTION;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.EXPRESSION;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.IS_PUBLIC;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.NAME;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.REGISTRATION_DATE;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomGridColumnGridColumnIDs.REGISTRATOR;
 
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
 
 /**
- * 
+ * Provider of {@link GridCustomColumn} instances.
  *
  * @author Franz-Josef Elmer
  */
-public class CustomGridColumnProvider extends AbstractCommonTableModelProvider<GridCustomColumn>
+public class CustomGridColumnProvider extends AbstractExpressionProvider<GridCustomColumn>
 {
-    private final String gridId;
 
     public CustomGridColumnProvider(ICommonServer commonServer, String sessionToken, String gridId)
     {
-        super(commonServer, sessionToken);
-        this.gridId = gridId;
+        super(commonServer, sessionToken, gridId);
     }
 
     @Override
-    protected TypedTableModel<GridCustomColumn> createTableModel()
+    protected List<GridCustomColumn> listExpressions()
+    {
+        return commonServer.listGridCustomColumns(sessionToken, gridId);
+    }
+
+    @Override
+    protected void addAdditionalColumn(TypedTableModelBuilder<GridCustomColumn> builder)
     {
-        List<GridCustomColumn> customColumns = commonServer.listGridCustomColumns(sessionToken, gridId);
-        TypedTableModelBuilder<GridCustomColumn> builder = new TypedTableModelBuilder<GridCustomColumn>();
         builder.addColumn(CODE);
-        builder.addColumn(NAME);
-        builder.addColumn(DESCRIPTION);
-        builder.addColumn(EXPRESSION).hideByDefault();
-        builder.addColumn(IS_PUBLIC).hideByDefault();
-        builder.addColumn(REGISTRATOR).hideByDefault();
-        builder.addColumn(REGISTRATION_DATE).hideByDefault();
-        for (GridCustomColumn gridCustomColumn : customColumns)
-        {
-            builder.addRow(gridCustomColumn);
-            builder.column(CODE).addString(gridCustomColumn.getCode());
-            builder.column(NAME).addString(gridCustomColumn.getName());
-            builder.column(DESCRIPTION).addString(gridCustomColumn.getDescription());
-            builder.column(EXPRESSION).addString(gridCustomColumn.getExpression());
-            builder.column(IS_PUBLIC).addString(SimpleYesNoRenderer.render(gridCustomColumn.isPublic()));
-            builder.column(REGISTRATOR).addPerson(gridCustomColumn.getRegistrator());
-            builder.column(REGISTRATION_DATE).addDate(gridCustomColumn.getRegistrationDate());
-        }
-        return builder.getModel();
+    }
+
+    @Override
+    protected void addAdditionalColumnValue(TypedTableModelBuilder<GridCustomColumn> builder,
+            GridCustomColumn expression)
+    {
+        builder.column(CODE).addString(expression.getCode());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/GridCustomFilterProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/GridCustomFilterProvider.java
new file mode 100644
index 00000000000..9c31fb9a777
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/GridCustomFilterProvider.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * 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 ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
+
+/**
+ * Provider of {@link GridCustomFilter} instances.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class GridCustomFilterProvider extends AbstractExpressionProvider<GridCustomFilter>
+{
+    public GridCustomFilterProvider(ICommonServer commonServer, String sessionToken, String gridId)
+    {
+        super(commonServer, sessionToken, gridId);
+    }
+
+    @Override
+    protected List<GridCustomFilter> listExpressions()
+    {
+        return commonServer.listFilters(sessionToken, gridId);
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
index 59c0e408887..4fbbefc0b29 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
@@ -34,6 +34,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ParameterWithValue;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Franz-Josef Elmer
@@ -100,23 +101,28 @@ public class FilterSystemTest extends SystemTestCase
         logIntoCommonClientService();
         commonClientService.registerFilter(createFilter());
 
-        DefaultResultSetConfig<String, GridCustomFilter> config = createConfig("24");
-        assertEquals(1, commonClientService.listFilters(GRID_ID, config).getList().size());
+        DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> config =
+                createConfig("24");
+        assertEquals(1, commonClientService.listFilters(GRID_ID, config).getResultSet().getList()
+                .size());
 
         config = createConfig("43");
-        assertEquals(0, commonClientService.listFilters(GRID_ID, config).getList().size());
+        assertEquals(0, commonClientService.listFilters(GRID_ID, config).getResultSet().getList()
+                .size());
 
         Long id = commonClientService.listFilters(GRID_ID).get(0).getId();
         commonClientService.deleteFilters(Arrays.asList(new TechId(id)));
     }
 
-    private DefaultResultSetConfig<String, GridCustomFilter> createConfig(String thresholdValue)
+    private DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> createConfig(
+            String thresholdValue)
     {
-        DefaultResultSetConfig<String, GridCustomFilter> config =
-                new DefaultResultSetConfig<String, GridCustomFilter>();
-        config.setAvailableColumns(Collections.<IColumnDefinition<GridCustomFilter>> emptySet());
-        CustomFilterInfo<GridCustomFilter> customFilterInfo =
-                new CustomFilterInfo<GridCustomFilter>();
+        DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> config =
+                new DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>>();
+        config.setAvailableColumns(Collections
+                .<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> emptySet());
+        CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>> customFilterInfo =
+                new CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>>();
         customFilterInfo.setExpression("${threshold} < 42");
         ParameterWithValue parameterWithValue = new ParameterWithValue();
         parameterWithValue.setParameter("threshold");
-- 
GitLab