From 52c0089d600d0627036fb77808b6ec92ae923ea4 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 12 Oct 2010 15:35:25 +0000
Subject: [PATCH] LMS-1782 RawDataSampleGrid is now subclass of TypedTableGrid

SVN: 18272
---
 .../web/client/IPhosphoNetXClientService.java |  11 +-
 .../IPhosphoNetXClientServiceAsync.java       |  11 +-
 .../application/RawDataProcessingMenu.java    |  24 ++--
 .../client/application/RawDataSampleGrid.java | 123 ++++++++---------
 .../web/server/PhosphoNetXClientService.java  |  19 ++-
 .../web/server/RawDataSampleProvider.java     | 124 +++++-------------
 .../basic/dto/RawDataSampleGridIDs.java       |  40 ++++++
 .../web/server/RawDataSampleProviderTest.java |  64 +++++----
 8 files changed, 202 insertions(+), 214 deletions(-)
 create mode 100644 rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/basic/dto/RawDataSampleGridIDs.java

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 1ac8e9d605c..a96a353f59c 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
@@ -19,13 +19,14 @@ package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.IClientService;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericTableResultSet;
 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;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentCriteria;
@@ -91,10 +92,10 @@ public interface IPhosphoNetXClientService extends IClientService
             TableExportCriteria<SampleWithPropertiesAndAbundance> exportCriteria)
             throws UserFailureException;
 
-    public GenericTableResultSet listRawDataSamples(
-            IResultSetConfig<String, TableModelRow> criteria) throws UserFailureException;
+    public TypedTableResultSet<Sample> listRawDataSamples(
+            IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria) throws UserFailureException;
 
-    public String prepareExportRawDataSamples(TableExportCriteria<TableModelRow> exportCriteria)
+    public String prepareExportRawDataSamples(TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria)
             throws UserFailureException;
 
     public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs,
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 6070c64ed03..58fa462c1c2 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
@@ -21,12 +21,13 @@ import java.util.List;
 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.GenericTableResultSet;
 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;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentAndReferenceCriteria;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.dto.ListProteinByExperimentCriteria;
@@ -104,11 +105,11 @@ public interface IPhosphoNetXClientServiceAsync extends IClientServiceAsync
             AsyncCallback<String> callback);
 
     /** @see IPhosphoNetXClientService#listRawDataSamples(IResultSetConfig) */
-    public void listRawDataSamples(IResultSetConfig<String, TableModelRow> criteria,
-            AsyncCallback<GenericTableResultSet> callback);
+    public void listRawDataSamples(IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria,
+            AsyncCallback<TypedTableResultSet<Sample>> callback);
     
     /** @see IPhosphoNetXClientService#prepareExportRawDataSamples(TableExportCriteria) */
-    public void prepareExportRawDataSamples(TableExportCriteria<TableModelRow> exportCriteria,
+    public void prepareExportRawDataSamples(TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria,
             AsyncCallback<String> callback);
     
     /** @see IPhosphoNetXClientService#processRawData(String, long[], String) */
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataProcessingMenu.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataProcessingMenu.java
index c5b6a051489..be8e69c95c8 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataProcessingMenu.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataProcessingMenu.java
@@ -37,9 +37,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.TextToolItem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SerializableComparableIDDecorator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 
 /**
@@ -50,11 +50,11 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNet
 public class RawDataProcessingMenu extends TextToolItem
 {
     private static final class CopyConfirmationDialog extends
-            AbstractDataConfirmationDialog<List<TableModelRow>>
+            AbstractDataConfirmationDialog<List<TableModelRowWithObject<Sample>>>
     {
         private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
 
-        private final List<TableModelRow> samples;
+        private final List<TableModelRowWithObject<Sample>> samples;
 
         private final DatastoreServiceDescription datastoreServiceDescription;
 
@@ -63,7 +63,7 @@ public class RawDataProcessingMenu extends TextToolItem
         private CopyConfirmationDialog(
                 IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext,
                 DatastoreServiceDescription datastoreServiceDescription,
-                List<TableModelRow> samples, String title)
+                List<TableModelRowWithObject<Sample>> samples, String title)
         {
             super(specificViewContext, samples, title);
             this.specificViewContext = specificViewContext;
@@ -93,13 +93,7 @@ public class RawDataProcessingMenu extends TextToolItem
             long[] rawDataSampleIDs = new long[samples.size()];
             for (int i = 0; i < samples.size(); i++)
             {
-                TableModelRow row = samples.get(i);
-                ISerializableComparable c = row.getValues().get(0);
-                if (c instanceof SerializableComparableIDDecorator == false)
-                {
-                    throw new IllegalArgumentException("Missing id: " + c);
-                }
-                rawDataSampleIDs[i] = ((SerializableComparableIDDecorator) c).getID();
+                rawDataSampleIDs[i] = samples.get(i).getObjectOrNull().getId();
             }
             specificViewContext.getService().processRawData(datastoreServiceDescription.getKey(),
                     rawDataSampleIDs, dataSetTypeField.getValue(),
@@ -120,10 +114,10 @@ public class RawDataProcessingMenu extends TextToolItem
     }
 
     private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext;
-    private final IDelegatedActionWithResult<List<TableModelRow>> selectedDataProvider;
+    private final IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>> selectedDataProvider;
     
     public RawDataProcessingMenu(IViewContext<IPhosphoNetXClientServiceAsync> viewContext,
-            IDelegatedActionWithResult<List<TableModelRow>> selectedDataProvider)
+            IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>> selectedDataProvider)
     {
         super(viewContext.getMessage(Dict.COPY_DATA_SETS_BUTTON_LABEL));
         this.viewContext = viewContext;
@@ -166,7 +160,7 @@ public class RawDataProcessingMenu extends TextToolItem
                     public void execute()
                     {
                         String title = viewContext.getMessage(COPY_DATA_SETS_TITLE);
-                        List<TableModelRow> selectedSamples = selectedDataProvider.execute();
+                        List<TableModelRowWithObject<Sample>> selectedSamples = selectedDataProvider.execute();
                         new CopyConfirmationDialog(viewContext, datastoreServiceDescription,
                                 selectedSamples, title).show();
                     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataSampleGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataSampleGrid.java
index aaa17d03e99..bdb907fef27 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataSampleGrid.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/RawDataSampleGrid.java
@@ -24,39 +24,35 @@ import java.util.List;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.GenericTableBrowserGrid;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericTableResultSet;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 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.EntityKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SerializableComparableIDDecorator;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+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.shared.basic.dto.RawDataSampleGridIDs;
 
 /**
  * @author Franz-Josef Elmer
  */
-class RawDataSampleGrid extends GenericTableBrowserGrid
+class RawDataSampleGrid extends TypedTableGrid<Sample>
 {
-    public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "raw_data_sample_browser";
-
-    public static final String GRID_ID = BROWSER_ID + "-grid";
+    public static final String GRID_ID = RawDataSampleGridIDs.BROWSER_ID + "-grid";
 
     public static DatabaseModificationAwareComponent create(
             final IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
     {
         RawDataSampleGrid grid = new RawDataSampleGrid(viewContext);
-        DisposableEntityChooser<TableModelRow> disposable = grid.asDisposableWithoutToolbar();
+        DisposableEntityChooser<TableModelRowWithObject<Sample>> disposable = grid.asDisposableWithoutToolbar();
         return new DatabaseModificationAwareComponent(disposable.getComponent(), disposable);
     }
 
@@ -64,45 +60,83 @@ class RawDataSampleGrid extends GenericTableBrowserGrid
 
     RawDataSampleGrid(IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
     {
-        super(viewContext.getCommonViewContext(), BROWSER_ID, GRID_ID, true,
+        super(viewContext.getCommonViewContext(), GRID_ID, true,
                 PhosphoNetXDisplayTypeIDGenerator.RAW_DATA_SAMPLE_BROWSER_GRID);
         specificViewContext = viewContext;
-        registerLinkClickListenerFor("CODE", new ICellListener<TableModelRow>()
-            {
-                public void handle(TableModelRow rowItem, boolean keyPressed)
-                {
-                    showEntityViewer(rowItem, false, keyPressed);
-                }
-            });
         allowMultipleSelection();
         addEntityOperationsLabel();
         RawDataProcessingMenu button =
                 new RawDataProcessingMenu(viewContext,
-                        new IDelegatedActionWithResult<List<TableModelRow>>()
+                        new IDelegatedActionWithResult<List<TableModelRowWithObject<Sample>>>()
                             {
-                                public List<TableModelRow> execute()
+                                public List<TableModelRowWithObject<Sample>> execute()
                                 {
                                     return getSelectedBaseObjects();
                                 }
                             });
         enableButtonOnSelectedItems(button);
         addButton(button);
+        linkMSInjectionSample();
+        linkBiologicalSample();
+    }
+    
+    private void linkMSInjectionSample()
+    {
+        registerListenerAndLinkGenerator(RawDataSampleGridIDs.CODE,
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false,
+                                    specialKeyPressed);
+                        }
+
+                        public String tryGetLink(Sample entity)
+                        {
+                            return LinkExtractor.tryExtract(entity);
+                        }
+                    });
+    }
+
+    private void linkBiologicalSample()
+    {
+        registerListenerAndLinkGenerator(RawDataSampleGridIDs.PARENT,
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull()
+                                    .getGeneratedFrom(), false, specialKeyPressed);
+                        }
+
+                        public String tryGetLink(Sample entity)
+                        {
+                            return LinkExtractor.tryExtract(entity.getGeneratedFrom());
+                        }
+                    });
     }
 
     @Override
-    protected void listTableRows(IResultSetConfig<String, TableModelRow> resultSetConfig,
-            AsyncCallback<GenericTableResultSet> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<Sample>> callback)
     {
         specificViewContext.getService().listRawDataSamples(resultSetConfig, callback);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<TableModelRow> exportCriteria,
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         specificViewContext.getService().prepareExportRawDataSamples(exportCriteria, callback);
     }
 
+    @Override
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
@@ -112,37 +146,4 @@ class RawDataSampleGrid extends GenericTableBrowserGrid
                     edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT) };
     }
 
-    @Override
-    protected void showEntityViewer(final TableModelRow entity, boolean editMode, boolean active)
-    {
-        showEntityInformationHolderViewer(new IEntityInformationHolderWithPermId()
-            {
-
-                public String getCode()
-                {
-                    return entity.getValues().get(0).toString();
-                }
-
-                public Long getId()
-                {
-                    return ((SerializableComparableIDDecorator) entity.getValues().get(0)).getID();
-                }
-
-                public BasicEntityType getEntityType()
-                {
-                    return new BasicEntityType("MS_INJECTION");
-                }
-
-                public EntityKind getEntityKind()
-                {
-                    return EntityKind.SAMPLE;
-                }
-
-                public String getPermId()
-                {
-                    return null;
-                }
-
-            }, editMode, active);
-    }
 }
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 3ff68d5ee71..7617666ad7e 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
@@ -25,15 +25,17 @@ import org.springframework.stereotype.Component;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericTableResultSet;
 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.server.AbstractClientService;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataProviderAdapter;
 import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailureExceptionTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.BuildAndEnvironmentInfo;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientService;
@@ -210,17 +212,20 @@ public class PhosphoNetXClientService extends AbstractClientService implements
         return prepareExportEntities(exportCriteria);
     }
 
-    public GenericTableResultSet listRawDataSamples(
-            IResultSetConfig<String, TableModelRow> criteria)
+    public TypedTableResultSet<Sample> listRawDataSamples(
+            IResultSetConfig<String, TableModelRowWithObject<Sample>> criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         final String sessionToken = getSessionToken();
         RawDataSampleProvider rawDataSampleProvider =
                 new RawDataSampleProvider(proteomicsDataService, sessionToken);
-        ResultSet<TableModelRow> resultSet = listEntities(criteria, rawDataSampleProvider);
-        return new GenericTableResultSet(resultSet, rawDataSampleProvider.getGenericHeaders());
+        DataProviderAdapter<Sample> dataProvider =
+                new DataProviderAdapter<Sample>(rawDataSampleProvider);
+        ResultSet<TableModelRowWithObject<Sample>> resultSet = listEntities(criteria, dataProvider);
+        return new TypedTableResultSet<Sample>(resultSet);
     }
 
-    public String prepareExportRawDataSamples(TableExportCriteria<TableModelRow> exportCriteria)
+    public String prepareExportRawDataSamples(TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria)
     {
         return prepareExportEntities(exportCriteria);
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
index fa2a5b588ed..2bb47a0b14e 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
@@ -16,120 +16,68 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server;
 
-import java.util.ArrayList;
-import java.util.HashSet;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.CODE;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.EXPERIMENT;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.PARENT;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.REGISTRATION_DATE;
+
 import java.util.List;
 
-import ch.rinn.restrictions.Private;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractOriginalDataProviderWithoutHeaders;
-import ch.systemsx.cisd.openbis.generic.client.web.server.GenericColumnsHelper;
-import ch.systemsx.cisd.openbis.generic.client.web.server.GenericColumnsHelper.Column;
-import ch.systemsx.cisd.openbis.generic.client.web.server.GenericColumnsHelper.PropertyColumns;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.ITableModelProvider;
+import ch.systemsx.cisd.openbis.generic.server.util.TypedTableModelBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.IProteomicsDataServiceInternal;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.MsInjectionSample;
 
 /**
  * @author Franz-Josef Elmer
  */
-class RawDataSampleProvider extends AbstractOriginalDataProviderWithoutHeaders<TableModelRow>
+class RawDataSampleProvider implements ITableModelProvider<Sample>
 {
-
-    @Private
-    static final String EXPERIMENT = "EXPERIMENT";
-    
-    @Private
-    static final String PARENT = "PARENT";
-
-    @Private
-    static final String REGISTRATION_DATE = "REGISTRATION_DATE";
-
-    @Private
-    static final String CODE = "CODE";
-
     private final IProteomicsDataServiceInternal service;
 
     private final String sessionToken;
 
+    private TypedTableModel<Sample> model;
+
     RawDataSampleProvider(IProteomicsDataServiceInternal service, String sessionToken)
     {
         this.service = service;
         this.sessionToken = sessionToken;
     }
 
-    public List<TableModelRow> getOriginalData() throws UserFailureException
+    public TypedTableModel<Sample> getTableModel()
     {
-        return GenericColumnsHelper.createTableRows(getColumns());
-    }
-
-    public List<TableModelColumnHeader> getGenericHeaders()
-    {
-        List<Column> columns = getColumns();
-        List<TableModelColumnHeader> headers =
-                new ArrayList<TableModelColumnHeader>(columns.size());
-        for (Column column : columns)
+        if (model == null)
         {
-            headers.add(column.getHeader());
-        }
-        return headers;
-    }
-
-    private List<Column> getColumns()
-    {
-        List<MsInjectionSample> samples = service.listRawDataSamples(sessionToken);
-        Column codeColumn =
-                new Column(TableModelColumnHeader.untitledLinkableStringHeader(0, CODE));
-        Column dateColumn =
-                new Column(TableModelColumnHeader.untitledStringHeader(1, REGISTRATION_DATE));
-        Column parentColumn = new Column(TableModelColumnHeader.untitledStringHeader(2, PARENT));
-        Column experimentColumn = new Column(TableModelColumnHeader.untitledStringHeader(3, EXPERIMENT));
-        List<Column> columns = new ArrayList<Column>();
-        columns.add(codeColumn);
-        columns.add(dateColumn);
-        columns.add(parentColumn);
-        columns.add(experimentColumn);
-        int fixedColumns = columns.size();
-        PropertyColumns samplePropertyColumns = new PropertyColumns();
-        PropertyColumns parentPropertyColumns = new PropertyColumns();
-        for (int i = 0; i < samples.size(); i++)
-        {
-            Sample sample = samples.get(i).getSample();
-            codeColumn.addStringWithID(i, sample.getCode(), sample.getId());
-            dateColumn.addDate(i, sample.getRegistrationDate());
-            Sample parent = sample.getGeneratedFrom();
-            parentColumn.addStringWithID(i, parent.getIdentifier(), parent.getId());
-            Experiment experiment = parent.getExperiment();
-            if (experiment != null)
+            List<MsInjectionSample> samples = service.listRawDataSamples(sessionToken);
+            TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>();
+            builder.addColumn(CODE).withDataType(DataTypeCode.VARCHAR);
+            builder.addColumn(REGISTRATION_DATE).withDataType(DataTypeCode.TIMESTAMP).withDefaultWidth(190);
+            builder.addColumn(PARENT).withDataType(DataTypeCode.VARCHAR);
+            builder.addColumn(EXPERIMENT).withDataType(DataTypeCode.VARCHAR);
+            for (MsInjectionSample msInjectionSample : samples)
             {
-                experimentColumn.addStringWithID(i, experiment.getIdentifier(), experiment.getId());
+                Sample sample = msInjectionSample.getSample();
+                builder.addRow(sample);
+                builder.column(CODE).addString(sample.getCode());
+                builder.column(REGISTRATION_DATE).addDate(sample.getRegistrationDate());
+                Sample parent = sample.getGeneratedFrom();
+                builder.column(PARENT).addString(parent.getIdentifier());
+                Experiment experiment = parent.getExperiment();
+                if (experiment != null)
+                {
+                    builder.column(EXPERIMENT).addString(experiment.getIdentifier());
+                }
+                builder.columnGroup("MS").addProperties("", sample.getProperties());
+                builder.columnGroup("BIO_").addProperties(parent.getProperties());
             }
-            addPropertyTypes(samplePropertyColumns, i, sample);
-            addPropertyTypes(parentPropertyColumns, i, sample.getGeneratedFrom());
-        }
-        int nextIndex = samplePropertyColumns.reindexColumns(fixedColumns);
-        parentPropertyColumns.reindexColumns(nextIndex);
-        HashSet<String> commonColumns = new HashSet<String>(samplePropertyColumns.getColumnCodes());
-        commonColumns.retainAll(parentPropertyColumns.getColumnCodes());
-        if (commonColumns.isEmpty() == false)
-        {
-            parentPropertyColumns.addPrefixToColumnHeaderCodes("BIO_");
-        }
-        columns.addAll(samplePropertyColumns.getColumns());
-        columns.addAll(parentPropertyColumns.getColumns());
-        return columns;
-    }
-
-    private void addPropertyTypes(PropertyColumns columns, int index, Sample sample)
-    {
-        for (IEntityProperty property : sample.getProperties())
-        {
-            columns.add(index, property);
+            model = builder.getModel();
         }
+        return model;
     }
 
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/basic/dto/RawDataSampleGridIDs.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/basic/dto/RawDataSampleGridIDs.java
new file mode 100644
index 00000000000..448c219661a
--- /dev/null
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/basic/dto/RawDataSampleGridIDs.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2010 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.plugin.phosphonetx.shared.basic.dto;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class RawDataSampleGridIDs
+{
+    public static final String BROWSER_ID = GenericConstants.ID_PREFIX + "raw_data_sample_browser";
+
+    public static final String EXPERIMENT = BROWSER_ID + "_" + "EXPERIMENT";
+    
+    public static final String PARENT = BROWSER_ID + "_" + "PARENT";
+
+    public static final String REGISTRATION_DATE = BROWSER_ID + "_" + "REGISTRATION_DATE";
+
+    public static final String CODE = BROWSER_ID + "_" + "CODE";
+
+
+}
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
index aca3bb7dec8..61c92451561 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
@@ -16,9 +16,9 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server;
 
-import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.RawDataSampleProvider.CODE;
-import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.RawDataSampleProvider.PARENT;
-import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.server.RawDataSampleProvider.REGISTRATION_DATE;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.CODE;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.PARENT;
+import static ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.RawDataSampleGridIDs.REGISTRATION_DATE;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -39,6 +39,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.IProteomicsDataServiceInternal;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.MsInjectionSample;
 
@@ -67,9 +69,10 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
     {
         prepareListRawDataSamples();
         
-        List<TableModelColumnHeader> headers = provider.getGenericHeaders();
+        List<TableModelColumnHeader> headers = provider.getTableModel().getHeader();
         
-        assertColumns(headers);
+        assertFixedColumns(headers);
+        assertEquals(4, headers.size());
         context.assertIsSatisfied();
     }
 
@@ -81,9 +84,15 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
         Sample ms3 = sample("MS3", sample("DE", "gamma", "alpha"), "two");
         prepareListRawDataSamples(ms1, ms2, ms3);
         
-        List<TableModelColumnHeader> headers = provider.getGenericHeaders();
+        List<TableModelColumnHeader> headers = provider.getTableModel().getHeader();
         
-        assertColumns(headers, "one", "two", "alpha", "beta", "gamma");
+        assertFixedColumns(headers);
+        assertPropertyHeader("one", "ONE", 4, headers);
+        assertPropertyHeader("two", "TWO", 5, headers);
+        assertPropertyHeader("alpha", "BIO_ALPHA", 6, headers);
+        assertPropertyHeader("beta", "BIO_BETA", 7, headers);
+        assertPropertyHeader("gamma", "BIO_GAMMA", 8, headers);
+        assertEquals(9, headers.size());
         context.assertIsSatisfied();
     }
     
@@ -92,7 +101,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
     {
         prepareListRawDataSamples();
         
-        List<TableModelRow> data = provider.getOriginalData();
+        List<TableModelRowWithObject<Sample>> data = provider.getTableModel().getRows();
         
         assertEquals(0, data.size());
         context.assertIsSatisfied();
@@ -110,12 +119,14 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
         Sample ms3 = sample("MS3", parent, "2");
         prepareListRawDataSamples(ms1, ms2, ms3);
         
-        List<TableModelRow> data = provider.getOriginalData();
+        TypedTableModel<Sample> tableModel = provider.getTableModel();
+        List<TableModelRowWithObject<Sample>> data = tableModel.getRows();
         
         assertEquals(3, data.size());
-        assertRow("MS1, Mon Mar 30 17:18:20 CET 1970, /G/ABC, null, null, 3.0, 6, 4, null", data.get(0));
-        assertRow("MS2, Mon Mar 30 17:20:00 CET 1970, /G/DE, null, null, 3.0, null, 5, 5", data.get(1));
-        assertRow("MS3, Mon Mar 30 17:21:40 CET 1970, /G/FG, /G/P/E1, 1, null, 5, null, 6", data.get(2));
+        assertEquals("[null, null, null, null, 2, one, alpha, beta, gamma]", tableModel.getHeader().toString());
+        assertRow("MS1, Mon Mar 30 17:18:20 CET 1970, /G/ABC, , , 3.0, 6, 4, ", data.get(0));
+        assertRow("MS2, Mon Mar 30 17:20:00 CET 1970, /G/DE, , , 3.0, , 5, 5", data.get(1));
+        assertRow("MS3, Mon Mar 30 17:21:40 CET 1970, /G/FG, /G/P/E1, 1, , 5, , 6", data.get(2));
         context.assertIsSatisfied();
     }
     
@@ -134,45 +145,32 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
         assertEquals(expectedRow, builder.toString());
     }
     
-    private void assertColumns(List<TableModelColumnHeader> headers,
-            String... expectedTitles)
-    {
-        assertFixedColumns(headers);
-        for (int i = 0; i < expectedTitles.length; i++)
-        {
-            assertPropertyHeader(expectedTitles[i], i + 4, headers);
-        }
-        assertEquals(expectedTitles.length + 4, headers.size());
-    }
-    
     private void assertFixedColumns(List<TableModelColumnHeader> headers)
     {
-        assertUntitledHeader(CODE, 0, true, DataTypeCode.VARCHAR, headers.get(0));
-        assertUntitledHeader(REGISTRATION_DATE, 1, false, DataTypeCode.VARCHAR, headers.get(1));
-        assertUntitledHeader(PARENT, 2, false, DataTypeCode.VARCHAR, headers.get(2));
+        assertUntitledHeader(CODE, 0, DataTypeCode.VARCHAR, headers.get(0));
+        assertUntitledHeader(REGISTRATION_DATE, 1, DataTypeCode.TIMESTAMP, headers.get(1));
+        assertUntitledHeader(PARENT, 2, DataTypeCode.VARCHAR, headers.get(2));
     }
     
     private void assertUntitledHeader(String expectedCode, int expectedIndex,
-            boolean expectedlinkableFlag, DataTypeCode expectedType, TableModelColumnHeader header)
+            DataTypeCode expectedType, TableModelColumnHeader header)
     {
-        assertHeader(null, expectedCode, expectedIndex, expectedlinkableFlag, expectedType,
-                header);
+        assertHeader(null, expectedCode, expectedIndex, expectedType, header);
     }
 
-    private void assertPropertyHeader(String expectedLabel, int index, List<TableModelColumnHeader> headers)
+    private void assertPropertyHeader(String expectedLabel, String expectedCode, int index, List<TableModelColumnHeader> headers)
     {
         DataTypeCode type = DataTypeCode.values()[expectedLabel.length()];
         TableModelColumnHeader header = headers.get(index);
-        assertHeader(expectedLabel, expectedLabel.toUpperCase(), index, false, type, header);
+        assertHeader(expectedLabel, expectedCode, index, type, header);
     }
     
     private void assertHeader(String expectedTitle, String expectedCode, int expectedIndex,
-            boolean expectedlinkableFlag, DataTypeCode expectedType, TableModelColumnHeader header)
+            DataTypeCode expectedType, TableModelColumnHeader header)
     {
         assertEquals(expectedTitle, header.getTitle());
         assertEquals(expectedCode, header.getId());
         assertEquals(expectedIndex, header.getIndex());
-        assertEquals(expectedlinkableFlag, header.isLinkable());
         assertEquals(expectedType, header.getDataType());
     }
     
-- 
GitLab