From e1f2746e50f449c83ed106a3dad9f0507a959811 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 29 Sep 2011 06:49:27 +0000
Subject: [PATCH] Refactoring ProteinByExperimentBrowserGrid to TypedTableGrid
 Part II

SVN: 23147
---
 .../web/client/IPhosphoNetXClientService.java |   5 +-
 .../IPhosphoNetXClientServiceAsync.java       |   6 +-
 .../ProteinByExperimentBrowerToolBar.java     |  14 ++
 .../ProteinByExperimentBrowserGrid.java       | 151 ++++--------------
 .../dto/ListProteinByExperimentCriteria.java  |   6 +-
 .../web/server/PhosphoNetXClientService.java  |  10 +-
 .../server/PhosphoNetXClientServiceTest.java  |   8 +-
 7 files changed, 68 insertions(+), 132 deletions(-)

diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientService.java
index b38417ced37..089e99fbe88 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientService.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientService.java
@@ -21,7 +21,6 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.client.web.client.IClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
-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.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
@@ -73,10 +72,10 @@ public interface IPhosphoNetXClientService extends IClientService
     public List<AbundanceColumnDefinition> getAbundanceColumnDefinitionsForProteinByExperiment(
             TechId experimentID, String treatmentTypeOrNull) throws UserFailureException;
 
-    public ResultSet<ProteinInfo> listProteinsByExperiment(ListProteinByExperimentCriteria criteria)
+    public TypedTableResultSet<ProteinInfo> listProteinsByExperiment(ListProteinByExperimentCriteria criteria)
             throws UserFailureException;
 
-    public String prepareExportProteins(TableExportCriteria<ProteinInfo> exportCriteria)
+    public String prepareExportProteins(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria)
             throws UserFailureException;
 
     public TypedTableResultSet<ProteinSummary> listProteinSummariesByExperiment(
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientServiceAsync.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientServiceAsync.java
index 9d4d652f903..e433c9dcf50 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientServiceAsync.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/IPhosphoNetXClientServiceAsync.java
@@ -23,7 +23,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.IClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
-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.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -79,10 +78,11 @@ public interface IPhosphoNetXClientServiceAsync extends IClientServiceAsync
 
     /** @see IPhosphoNetXClientService#listProteinsByExperiment(ListProteinByExperimentCriteria) */
     public void listProteinsByExperiment(ListProteinByExperimentCriteria criteria,
-            AsyncCallback<ResultSet<ProteinInfo>> callback);
+            AsyncCallback<TypedTableResultSet<ProteinInfo>> callback);
 
     /** @see IPhosphoNetXClientService#prepareExportProteins(TableExportCriteria) */
-    public void prepareExportProteins(TableExportCriteria<ProteinInfo> exportCriteria,
+    public void prepareExportProteins(
+            TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria,
             AsyncCallback<String> callback);
 
     /** @see IPhosphoNetXClientService#listProteinSummariesByExperiment(ListProteinSummaryByExperimentCriteria) */
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowerToolBar.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowerToolBar.java
index 9e109bc1a20..b4880fb6885 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowerToolBar.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowerToolBar.java
@@ -43,6 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentCriteria;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.AbundanceColumnDefinition;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.AggregateFunction;
 
@@ -320,6 +321,19 @@ class ProteinByExperimentBrowerToolBar extends ToolBar
                     experimentID, treatmentTypeCode, callback);
         }
     }
+    
+    ListProteinByExperimentCriteria getCriteria()
+    {
+        ListProteinByExperimentCriteria criteria = new ListProteinByExperimentCriteria();
+        criteria.setExperimentID(TechId.create(experiment));
+        criteria.setFalseDiscoveryRate(getSelection(fdrComboBox, 0.0));
+        criteria.setAggregateFunction(getSelection(aggregateFunctionComboBox, DEFAULT_AGGREGATE_FUNCTION));
+        VocabularyTermModel value = treatmentTypeComboBox.getValue();
+        String treatmentTypeCode = value == null ? null : value.getTerm().getCode();
+        criteria.setTreatmentTypeCode(treatmentTypeCode);
+        criteria.setAggregateOriginal(aggregateOriginalCheckBox.getValue());
+        return criteria;
+    }
 
     private <T> T getSelection(ComboBox<? extends SimpleModel<T>> comboBox, T defaultValue)
     {
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowserGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowserGrid.java
index 2364e3929cc..6ec219f2f27 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowserGrid.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinByExperimentBrowserGrid.java
@@ -16,10 +16,8 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application;
 
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import com.extjs.gxt.ui.client.widget.Component;
@@ -35,49 +33,40 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericCon
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.RealNumberRenderer;
-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.framework.IColumnDefinitionUI;
-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.ICellListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 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.GridRowModel;
-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.BasicEntityType;
 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.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
-import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.columns.InternalAbundanceColumnDefinition;
-import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.columns.ProteinColDefKind;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentCriteria;
+import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ProteinBrowserColumnIDs;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.AbundanceColumnDefinition;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.AggregateFunction;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.ProteinInfo;
-import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.Treatment;
 
 /**
  * @author Franz-Josef Elmer
  */
-class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinInfo>
+class ProteinByExperimentBrowserGrid extends TypedTableGrid<ProteinInfo>
 {
-    private static final String ABUNDANCE_PROPERTY_KEY = "ABUNDANCE";
-
     private static final String PREFIX = GenericConstants.ID_PREFIX
             + "protein-by-experiment-browser";
 
     // browser consists of the grid and additional toolbars (paging, filtering)
     public static final String BROWSER_ID = PREFIX + "_main";
 
-    public static final String GRID_ID = PREFIX + "_grid";
+    public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX;
 
     private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
 
@@ -85,12 +74,6 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
 
     private ListProteinByExperimentCriteria criteria;
 
-    private List<AbundanceColumnDefinition> abundanceColumnDefinitions;
-
-    private boolean abundanceColumnDefinitionsChanged = true;
-
-    private ColumnDefsAndConfigs<ProteinInfo> columnDefinitionsAndConfigs;
-
     private IDataRefreshCallback postRefreshCallback = new IDataRefreshCallback()
         {
             public void postRefresh(boolean wasSuccessful)
@@ -98,8 +81,6 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
             }
         };
 
-    private List<IColumnDefinition<ProteinInfo>> visibleColumnDefinitions;
-
     static IDisposableComponent create(
             final IViewContext<IPhosphoNetXClientServiceAsync> viewContext,
             BasicEntityType experimentType, Experiment experiment)
@@ -158,22 +139,30 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
     private ProteinByExperimentBrowserGrid(
             final IViewContext<IPhosphoNetXClientServiceAsync> viewContext, Experiment experiment)
     {
-        super(viewContext.getCommonViewContext(), BROWSER_ID, GRID_ID, false,
+        super(viewContext.getCommonViewContext(), BROWSER_ID, true,
                 PhosphoNetXDisplayTypeIDGenerator.PROTEIN_BY_EXPERIMENT_BROWSER_GRID);
         specificViewContext = viewContext;
         toolbar = new ProteinByExperimentBrowerToolBar(viewContext, experiment);
         toolbar.setBrowserGrid(this);
-        registerLinkClickListenerFor(ProteinColDefKind.ACCESSION_NUMBER.id(),
-                new ICellListener<ProteinInfo>()
+        registerListenerAndLinkGenerator(ProteinBrowserColumnIDs.ACCESSION_NUMBER,
+                new ICellListenerAndLinkGenerator<ProteinInfo>()
                     {
-                        public void handle(ProteinInfo rowItem, boolean keyPressed)
+                        public void handle(TableModelRowWithObject<ProteinInfo> rowItem,
+                                boolean keyPressed)
                         {
                             AbstractTabItemFactory tabItemFactory =
                                     ProteinViewer.createTabItemFactory(viewContext,
-                                            toolbar.getExperimentOrNull(), rowItem);
+                                            toolbar.getExperimentOrNull(),
+                                            rowItem.getObjectOrNull());
                             tabItemFactory.setInBackground(keyPressed);
                             DispatcherHelper.dispatchNaviEvent(tabItemFactory);
                         }
+
+                        public String tryGetLink(ProteinInfo entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return null;
+                        }
                     });
     }
 
@@ -187,8 +176,6 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
         criteria.setAggregateFunction(aggregateFunction);
         criteria.setTreatmentTypeCode(treatmentTypeCode);
         criteria.setAggregateOriginal(aggregateOriginal);
-        abundanceColumnDefinitions = definitions;
-        abundanceColumnDefinitionsChanged  = true;
         refresh(postRefreshCallback, true);
     }
 
@@ -198,101 +185,32 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
     }
 
     @Override
-    protected IColumnDefinitionKind<ProteinInfo>[] getStaticColumnsDefinition()
+    protected String translateColumnIdToDictionaryKey(String columnID)
     {
-        return ProteinColDefKind.values();
+        return columnID.toLowerCase();
     }
     
     @Override
-    protected ColumnDefsAndConfigs<ProteinInfo> createColumnsDefinition()
-    {
-        if (columnDefinitionsAndConfigs == null || abundanceColumnDefinitionsChanged)
-        {
-            columnDefinitionsAndConfigs = super.createColumnsDefinition();
-            List<IColumnDefinitionUI<ProteinInfo>> columns =
-                new ArrayList<IColumnDefinitionUI<ProteinInfo>>();
-            List<String> abundanceColumnIDs = new ArrayList<String>();
-            for (AbundanceColumnDefinition definition : abundanceColumnDefinitions)
-            {
-                String header = definition.getSampleCode();
-                Map<String, String> properties = new HashMap<String, String>();
-                properties.put(ABUNDANCE_PROPERTY_KEY, header);
-                List<Treatment> treatments = definition.getTreatments();
-                if (treatments.isEmpty() == false)
-                {
-                    header = "";
-                    String delim = "";
-                    for (Treatment treatment : treatments)
-                    {
-                        header += delim + treatment;
-                        delim = ", ";
-                        properties.put(treatment.getTypeCode(), treatment.getValue());
-                    }
-                }
-                final long sampleID = definition.getID();
-                IColumnDefinitionUI<ProteinInfo> columnDefinition =
-                    new InternalAbundanceColumnDefinition(header, properties, 100, false, sampleID);
-                abundanceColumnIDs.add(columnDefinition.getIdentifier());
-                columns.add(columnDefinition);
-            }
-            columnDefinitionsAndConfigs.addColumns(columns, viewContext);
-            columnDefinitionsAndConfigs.setGridCellRendererFor(ProteinColDefKind.ACCESSION_NUMBER.id(),
-                    createInternalLinkCellRenderer());
-            RealNumberRenderer renderer =
-                new RealNumberRenderer(viewContext.getDisplaySettingsManager()
-                        .getRealNumberFormatingParameters());
-            for (String abundanceColumneID : abundanceColumnIDs)
-            {
-                columnDefinitionsAndConfigs.setGridCellRendererFor(abundanceColumneID, renderer);
-            }
-            columnDefinitionsAndConfigs.setGridCellRendererFor(ProteinColDefKind.COVERAGE.id(), renderer);
-            abundanceColumnDefinitionsChanged = false;
-        }
-        return columnDefinitionsAndConfigs;
-    }
-
-    @Override
-    protected void initializeModelCreation()
+    protected List<String> getColumnIdsOfFilters()
     {
-        Set<String> visibleColumnIds = getIDsOfVisibleColumns();
-        visibleColumnDefinitions = new ArrayList<IColumnDefinition<ProteinInfo>>();
-        Set<IColumnDefinition<ProteinInfo>> columnDefs = createColumnsDefinition().getColumnDefs();
-        for (IColumnDefinition<ProteinInfo> columnDefinition : columnDefs)
-        {
-            if (columnDefinition instanceof IColumnDefinitionUI == false
-                    || visibleColumnIds.contains(columnDefinition.getIdentifier()))
-            {
-                visibleColumnDefinitions.add(columnDefinition);
-            }
-        }
+        return Arrays.asList(ProteinBrowserColumnIDs.PROTEIN_DESCRIPTION);
     }
 
     @Override
-    protected BaseEntityModel<ProteinInfo> createModel(GridRowModel<ProteinInfo> entity)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ProteinInfo>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ProteinInfo>> callback)
     {
-        return new BaseEntityModel<ProteinInfo>(entity, visibleColumnDefinitions, true);
-    }
-
-    @Override
-    protected List<IColumnDefinition<ProteinInfo>> getInitialFilters()
-    {
-        return asColumnFilters(new ProteinColDefKind[]
-            { ProteinColDefKind.DESCRIPTION });
-    }
-
-    @Override
-    protected void listEntities(DefaultResultSetConfig<String, ProteinInfo> resultSetConfig,
-            AbstractAsyncCallback<ResultSet<ProteinInfo>> callback)
-    {
-        if (criteria != null)
+        if (criteria == null)
         {
-            criteria.copyPagingConfig(resultSetConfig);
-            specificViewContext.getService().listProteinsByExperiment(criteria, callback);
+            criteria = toolbar.getCriteria();
         }
+        criteria.copyPagingConfig(resultSetConfig);
+        specificViewContext.getService().listProteinsByExperiment(criteria, callback);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<ProteinInfo> exportCriteria,
+    protected void prepareExportEntities(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         specificViewContext.getService().prepareExportProteins(exportCriteria, callback);
@@ -304,6 +222,7 @@ class ProteinByExperimentBrowserGrid extends AbstractSimpleBrowserGrid<ProteinIn
         toolbar.update();
     }
 
+    @Override
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/dto/ListProteinByExperimentCriteria.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/dto/ListProteinByExperimentCriteria.java
index f3a627fea9a..32329607ec5 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/dto/ListProteinByExperimentCriteria.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/dto/ListProteinByExperimentCriteria.java
@@ -20,6 +20,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.AggregateFunction;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.ProteinInfo;
 
@@ -28,8 +29,9 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.ProteinInfo;
  *
  * @author Franz-Josef Elmer
  */
-public class ListProteinByExperimentCriteria extends DefaultResultSetConfig<String, ProteinInfo>
-        implements IsSerializable
+public class ListProteinByExperimentCriteria extends
+        DefaultResultSetConfig<String, TableModelRowWithObject<ProteinInfo>> implements
+        IsSerializable
 {
     private TechId experimentID;
     private double falseDiscoveryRate;
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientService.java
index 309833ec8ec..c938b297c42 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientService.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientService.java
@@ -74,6 +74,7 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListSam
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.BiologicalSampleProvider;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.DataSetProteinProvider;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.ParentlessMsInjectionSampleProvider;
+import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.ProteinProvider;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.ProteinRelatedSampleProvider;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.ProteinSequenceProvider;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.resultset.ProteinSummaryProvider;
@@ -246,7 +247,8 @@ public class PhosphoNetXClientService extends AbstractClientService implements
         }
     }
 
-    public ResultSet<ProteinInfo> listProteinsByExperiment(ListProteinByExperimentCriteria criteria)
+    public TypedTableResultSet<ProteinInfo> listProteinsByExperiment(
+            ListProteinByExperimentCriteria criteria)
     {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -258,15 +260,15 @@ public class PhosphoNetXClientService extends AbstractClientService implements
             AggregateFunction aggregateFunction = criteria.getAggregateFunction();
             String treatmentTypeCode = criteria.getTreatmentTypeCode();
             boolean aggregateOnOriginal = criteria.isAggregateOriginal();
-            return listEntities(criteria, new ListProteinOriginalDataProvider(server, sessionToken,
-                    experimentID, fdr, aggregateFunction, treatmentTypeCode, aggregateOnOriginal));
+            return listEntities(new ProteinProvider(server, sessionToken, experimentID, fdr,
+                    aggregateFunction, treatmentTypeCode, aggregateOnOriginal), criteria);
         } finally
         {
             operationLog.info(stopWatch.getTime() + " msec for listProteinsByExperiment");
         }
     }
 
-    public String prepareExportProteins(TableExportCriteria<ProteinInfo> exportCriteria)
+    public String prepareExportProteins(TableExportCriteria<TableModelRowWithObject<ProteinInfo>> exportCriteria)
     {
         return prepareExportEntities(exportCriteria);
     }
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
index 3c8c1617966..2e4efa31014 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
@@ -38,8 +38,8 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridRowModels;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetFetchConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.server.WebClientConfigurationProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DefaultResultSet;
@@ -255,11 +255,11 @@ public class PhosphoNetXClientServiceTest extends AbstractFileSystemTestCase
         criteria.setAggregateFunction(function);
         criteria.setTreatmentTypeCode(treatmentTypeCode);
         criteria.setAggregateOriginal(aggregateOnOriginal);
-        ResultSet<ProteinInfo> rs = clientService.listProteinsByExperiment(criteria);
-        ProteinInfo actualProtein = rs.getList().get(0).getOriginalObject();
+        TypedTableResultSet<ProteinInfo> rs = clientService.listProteinsByExperiment(criteria);
+        ProteinInfo actualProtein = rs.getResultSet().getList().get(0).getOriginalObject().getObjectOrNull();
         assertEquals(protein.getId(), actualProtein.getId());
         assertEquals(protein.getDescription(), actualProtein.getDescription());
-        assertEquals(1, rs.getTotalLength());
+        assertEquals(1, rs.getResultSet().getTotalLength());
     }
 
     private ProteinInfo createProtein(long id)
-- 
GitLab