From ff811b0d6ddfffa30139c3a7ed741460de552205 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 20 Jun 2011 14:05:18 +0000
Subject: [PATCH] [LMS-2209] refactorization: reused solution for links in
 query result browser for links in entity browsers (no need to register
 listeners for entity links)

SVN: 21751
---
 .../client/application/ui/TypedTableGrid.java |  2 +-
 .../ui/experiment/ExperimentBrowserGrid.java  | 25 +-----
 .../ui/grid/AbstractBrowserGrid.java          |  9 --
 .../ui/sample/SampleBrowserGrid.java          | 86 ++-----------------
 .../resultset/AbstractTableModelProvider.java | 17 ----
 .../server/resultset/ExperimentProvider.java  | 11 +--
 .../web/server/resultset/SampleProvider.java  | 38 +++-----
 .../shared/basic/dto/EntityTableCell.java     | 13 ---
 .../openbis/generic/shared/util/IColumn.java  |  6 ++
 .../shared/util/TypedTableModelBuilder.java   | 15 ++++
 .../resultset/ExperimentProviderTest.java     |  2 +-
 .../server/resultset/SampleProviderTest.java  | 22 ++---
 12 files changed, 61 insertions(+), 185 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
index 181e3e551a9..8850177845a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
@@ -328,7 +328,7 @@ public abstract class TypedTableGrid<T extends ISerializable>
                     {
                         title = viewContext.getMessage(translateColumnIdToDictionaryKey(columnId));
                     }
-                    // support for links in queries
+                    // support for entity links
                     ICellListenerAndLinkGenerator<T> linkGeneratorOrNull =
                             tryGetCellListenerAndLinkGenerator(columnId);
                     final EntityKind entityKind = header.tryGetEntityKind();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index b386254ef23..57c2aac5855 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -154,34 +154,11 @@ public class ExperimentBrowserGrid extends AbstractEntityGrid<Experiment>
         this.criteriaProvider = criteriaProvider;
         registerLinkClickListenerFor(CommonExperimentColDefKind.EXPERIMENT_IDENTIFIER.id(),
                 showEntityViewerLinkClickListener);
-        linkExperiment();
+        // NOTE: links to experiment are handled by EntityTableCell
         linkProject();
         setId(BROWSER_ID);
     }
 
-    private void linkExperiment()
-    {
-        ICellListenerAndLinkGenerator<Experiment> listenerLinkGenerator =
-                new ICellListenerAndLinkGenerator<Experiment>()
-                    {
-                        public void handle(TableModelRowWithObject<Experiment> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false,
-                                    specialKeyPressed);
-                        }
-
-                        public String tryGetLink(Experiment entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            return LinkExtractor.tryExtract(entity);
-                        }
-                    };
-        registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.CODE, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.EXPERIMENT_IDENTIFIER,
-                listenerLinkGenerator);
-    }
-
     private void linkProject()
     {
         registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.PROJECT,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index 0ff5fa14842..3431fa358e9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -299,15 +299,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
 
         configureLoggingBetweenEvents(logID);
 
-        // this.addListener(Events.BeforeHide, new Listener<ComponentEvent>()
-        // {
-        //
-        // @Override
-        // public void handleEvent(ComponentEvent ce)
-        // {
-        // GWTUtils.displayInfo("BeforeHide main event");
-        // }
-        // });
         grid.addListener(Events.HeaderContextMenu, new Listener<GridEvent<ModelData>>()
             {
                 public void handleEvent(final GridEvent<ModelData> ge)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 5c3699850c9..fb52ef297ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -55,7 +55,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesCriteriaProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesFilterUtil;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
@@ -323,11 +322,9 @@ public class SampleBrowserGrid extends AbstractEntityGrid<Sample>
     {
         super(viewContext, browserId, displayTypeIDGenerator);
         propertyTypesAndCriteriaProvider = criteriaProvider;
-        linkSample();
-        linkExperiment();
+        // NOTE: links to sample, container and experiment are handled by EntityTableCell
         linkProject();
         linkParent();
-        linkContainer();
     }
 
     @Override
@@ -355,54 +352,6 @@ public class SampleBrowserGrid extends AbstractEntityGrid<Sample>
         return suffix;
     }
 
-    private void linkSample()
-    {
-        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false,
-                                    specialKeyPressed);
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            return LinkExtractor.tryExtract(entity);
-                        }
-                    };
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.CODE, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.SUBCODE, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.SAMPLE_IDENTIFIER,
-                listenerLinkGenerator);
-    }
-
-    private void linkExperiment()
-    {
-        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            Experiment experiment = rowItem.getObjectOrNull().getExperiment();
-                            new OpenEntityDetailsTabAction(experiment, viewContext,
-                                    specialKeyPressed).execute();
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            return LinkExtractor.tryExtract(entity.getExperiment());
-                        }
-                    };
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT_IDENTIFIER,
-                listenerLinkGenerator);
-    }
-
     private void linkProject()
     {
         registerListenerAndLinkGenerator(SampleGridColumnIDs.PROJECT,
@@ -460,27 +409,6 @@ public class SampleBrowserGrid extends AbstractEntityGrid<Sample>
                     });
     }
 
-    private void linkContainer()
-    {
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.CONTAINER_SAMPLE,
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull()
-                                    .getContainer(), false, specialKeyPressed);
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            Sample container = entity.getContainer();
-                            return LinkExtractor.tryExtract(container);
-                        }
-                    });
-    }
-
     @Override
     protected GridCellRenderer<BaseEntityModel<?>> createInternalLinkCellRenderer()
     {
@@ -511,15 +439,19 @@ public class SampleBrowserGrid extends AbstractEntityGrid<Sample>
                 .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE));
     }
 
-    protected boolean isPropertyEditable(EntityType entityType, String propertyColumnNameWithoutPrefix)
+    protected boolean isPropertyEditable(EntityType entityType,
+            String propertyColumnNameWithoutPrefix)
     {
-        String propertyTypeCode = CodeConverter.getPropertyTypeCode(propertyColumnNameWithoutPrefix);
-        List<? extends EntityTypePropertyType<?>> assignedPropertyTypes = entityType.getAssignedPropertyTypes();
+        String propertyTypeCode =
+                CodeConverter.getPropertyTypeCode(propertyColumnNameWithoutPrefix);
+        List<? extends EntityTypePropertyType<?>> assignedPropertyTypes =
+                entityType.getAssignedPropertyTypes();
         for (EntityTypePropertyType<?> entityTypePropertyType : assignedPropertyTypes)
         {
             if (entityTypePropertyType.getPropertyType().getCode().equals(propertyTypeCode))
             {
-                return entityTypePropertyType.isDynamic() == false && entityTypePropertyType.isManaged() == false;
+                return entityTypePropertyType.isDynamic() == false
+                        && entityTypePropertyType.isManaged() == false;
             }
         }
         return false;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
index 6f04341bedc..940363ee6d3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
@@ -19,10 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 import java.util.ArrayList;
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.InvalidationUtils;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
@@ -67,18 +64,4 @@ public abstract class AbstractTableModelProvider<T extends ISerializable> implem
      */
     protected abstract TypedTableModel<T> createTableModel();
 
-    /**
-     * Creates a template of a cell for displaying links to entities. Identifier of the entity will
-     * be used as the link's text. To override the text its best to call
-     * {@link EntityTableCell#createCopyWithLinkText(String)} on the template.
-     */
-    protected EntityTableCell createEntityTableCellTemplate(
-            final IEntityInformationHolderWithIdentifier entity)
-    {
-        final EntityTableCell cell =
-                new EntityTableCell(entity.getEntityKind(), entity.getPermId(),
-                        entity.getIdentifier());
-        cell.setInvalid(InvalidationUtils.isInvalid(entity));
-        return cell;
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java
index 93010a06f5c..db356b6d368 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java
@@ -37,7 +37,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListExperimentsCri
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.InvalidationUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
@@ -94,15 +93,11 @@ public class ExperimentProvider extends AbstractCommonTableModelProvider<Experim
         TableMap<String, ExperimentType> experimentTypes = getExperimentTypes();
         for (Experiment experiment : experiments)
         {
-            final EntityTableCell experimentCellTemplate =
-                    createEntityTableCellTemplate(experiment);
-
             builder.addRow(experiment);
-            builder.column(CODE).addValue(
-                    experimentCellTemplate.createCopyWithLinkText(experiment.getCode()));
+            builder.column(CODE).addEntityLink(experiment, experiment.getCode());
             builder.column(EXPERIMENT_TYPE).addString(experiment.getExperimentType().getCode());
-            builder.column(EXPERIMENT_IDENTIFIER).addValue(
-                    experimentCellTemplate.createCopyWithLinkText(experiment.getIdentifier()));
+            builder.column(EXPERIMENT_IDENTIFIER).addEntityLink(experiment,
+                    experiment.getIdentifier());
             builder.column(DATABASE_INSTANCE).addString(
                     experiment.getProject().getSpace().getInstance().getCode());
             builder.column(SPACE).addString(experiment.getProject().getSpace().getCode());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
index f2667fb4d23..98a5426c33b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
@@ -45,8 +45,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.InvalidationUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+mport ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
@@ -94,18 +93,13 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
         TableMap<String, SampleType> sampleTypes = getSampleTypes();
         for (Sample sample : samples)
         {
-            final EntityTableCell sampleCellTemplate = createEntityTableCellTemplate(sample);
-
             builder.addRow(sample);
-            builder.column(CODE).addValue(
-                    sampleCellTemplate.createCopyWithLinkText(sample.getCode()));
-            builder.column(SUBCODE).addValue(
-                    sampleCellTemplate.createCopyWithLinkText(sample.getSubCode()));
+            builder.column(CODE).addEntityLink(sample, sample.getCode());
+            builder.column(SUBCODE).addEntityLink(sample, sample.getSubCode());
             builder.column(DATABASE_INSTANCE).addString(getDatabaseInstance(sample).getCode());
             builder.column(SPACE).addString(
                     sample.getSpace() == null ? "" : sample.getSpace().getCode());
-            builder.column(SAMPLE_IDENTIFIER).addValue(
-                    sampleCellTemplate.createCopyWithLinkText(sample.getIdentifier()));
+            builder.column(SAMPLE_IDENTIFIER).addEntityLink(sample, sample.getIdentifier());
             builder.column(SAMPLE_TYPE).addString(sample.getSampleType().getCode());
             builder.column(IS_INSTANCE_SAMPLE).addString(
                     SimpleYesNoRenderer.render(sample.getDatabaseInstance() != null));
@@ -113,23 +107,25 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
                     SimpleYesNoRenderer.render(InvalidationUtils.isInvalid(sample)));
             builder.column(REGISTRATOR).addPerson(sample.getRegistrator());
             builder.column(REGISTRATION_DATE).addDate(sample.getRegistrationDate());
-
             final Experiment experimentOrNull = sample.getExperiment();
             if (experimentOrNull != null)
             {
                 final Experiment experiment = experimentOrNull;
-                final EntityTableCell experimentCellTemplate =
-                        createEntityTableCellTemplate(experiment);
-                builder.column(EXPERIMENT).addValue(
-                        experimentCellTemplate.createCopyWithLinkText(experiment.getCode()));
-                builder.column(EXPERIMENT_IDENTIFIER).addValue(
-                        experimentCellTemplate.createCopyWithLinkText(experiment.getIdentifier()));
+                builder.column(EXPERIMENT).addEntityLink(experiment, experiment.getCode());
+                builder.column(EXPERIMENT_IDENTIFIER).addEntityLink(experiment,
+                        experiment.getIdentifier());
             }
             builder.column(PROJECT).addString(getProjectCode(sample));
             builder.column(PERM_ID).addString(sample.getPermId());
             builder.column(SHOW_DETAILS_LINK_COLUMN_NAME).addString(sample.getPermlink());
             builder.column(PARENTS).addString(getParents(sample));
-            builder.column(CONTAINER_SAMPLE).addString(getContainer(sample));
+            final Sample containerOrNull = sample.getContainer();
+            if (containerOrNull != null)
+            {
+                final Sample container = containerOrNull;
+                builder.column(CONTAINER_SAMPLE)
+                        .addEntityLink(container, container.getIdentifier());
+            }
             SampleType sampleType = sampleTypes.tryGet(sample.getSampleType().getCode());
             IColumnGroup columnGroup = builder.columnGroup(PROPERTIES_PREFIX);
             if (sampleType != null)
@@ -179,12 +175,6 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
         return builder.toString();
     }
 
-    private String getContainer(Sample sample)
-    {
-        Sample container = sample.getContainer();
-        return container == null ? "" : container.getIdentifier();
-    }
-
     private String getProjectCode(Sample sample)
     {
         Experiment experiment = sample.getExperiment();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
index 526bdac0c3f..91491c5917f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTableCell.java
@@ -57,19 +57,6 @@ public class EntityTableCell implements ISerializableComparable
         this.identifierOrNull = identifierOrNull;
     }
 
-    /** copy constructor overwriting link's text */
-    private EntityTableCell(EntityTableCell entityCell, String linkText)
-    {
-        this(entityCell.entityKind, entityCell.permId, entityCell.identifierOrNull);
-        setInvalid(entityCell.invalid);
-        setLinkText(linkText);
-    }
-
-    public EntityTableCell createCopyWithLinkText(String linkText)
-    {
-        return new EntityTableCell(this, linkText);
-    }
-
     public int compareTo(ISerializableComparable o)
     {
         return this.toString().compareTo(o.toString());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/IColumn.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/IColumn.java
index 3922b76ded7..25ee04ab529 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/IColumn.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/IColumn.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.util;
 
 import java.util.Date;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
@@ -92,6 +93,11 @@ public interface IColumn
      */
     public void addDate(Date valueOrNull);
 
+    /**
+     * Adds a link to an entity to the column.
+     */
+    public void addEntityLink(IEntityInformationHolderWithIdentifier entity, String linkText);
+
     /**
      * Adds a person to the column as a string.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/TypedTableModelBuilder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/TypedTableModelBuilder.java
index 7f5f5f58360..28ea7878698 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/TypedTableModelBuilder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/TypedTableModelBuilder.java
@@ -30,7 +30,9 @@ import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.InvalidationUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SimplePersonRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TableCellUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
@@ -344,6 +346,19 @@ public class TypedTableModelBuilder<T extends ISerializable>
             addValue(value);
         }
 
+        public void addEntityLink(IEntityInformationHolderWithIdentifier entity, String linkText)
+        {
+            assert entity != null;
+            // TODO 2011-06-20, Piotr Buczek: extend DataType with ENTITY and set the type here
+            header.setEntityKind(entity.getEntityKind());
+            final EntityTableCell cell =
+                    new EntityTableCell(entity.getEntityKind(), entity.getPermId(),
+                            entity.getIdentifier());
+            cell.setInvalid(InvalidationUtils.isInvalid(entity));
+            cell.setLinkText(linkText);
+            addValue(cell);
+        }
+
         private void setDataType(DataTypeCode dataType)
         {
             header.setDataType(DataTypeUtils.getCompatibleDataType(header.getDataType(), dataType));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProviderTest.java
index dc62a01f9bc..9e8e9f34d79 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProviderTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProviderTest.java
@@ -90,7 +90,7 @@ public class ExperimentProviderTest extends AbstractProviderTest
         assertEquals("[null, VARCHAR, null, VARCHAR, VARCHAR, VARCHAR, VARCHAR, TIMESTAMP, "
                 + "VARCHAR, VARCHAR, VARCHAR, VARCHAR, MULTILINE_VARCHAR]",
                 getHeaderDataTypes(tableModel).toString());
-        assertEquals("[null, null, null, null, null, null, null, null, null, null, "
+        assertEquals("[EXPERIMENT, null, EXPERIMENT, null, null, null, null, null, null, null, "
                 + "null, null, null]", getHeaderEntityKinds(tableModel).toString());
         List<TableModelRowWithObject<Experiment>> rows = tableModel.getRows();
         assertSame(e1.getExperiment(), rows.get(0).getObjectOrNull());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
index 93dbe414623..59a27236fad 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
@@ -92,10 +92,11 @@ public class SampleProviderTest extends AbstractProviderTest
         assertEquals(
                 "[null, null, VARCHAR, VARCHAR, null, VARCHAR, "
                         + "VARCHAR, VARCHAR, VARCHAR, TIMESTAMP, null, null, VARCHAR, "
-                        + "VARCHAR, VARCHAR, VARCHAR, VARCHAR, REAL, TIMESTAMP, VARCHAR, MATERIAL, MULTILINE_VARCHAR]",
+                        + "VARCHAR, VARCHAR, VARCHAR, null, REAL, TIMESTAMP, VARCHAR, MATERIAL, MULTILINE_VARCHAR]",
                 getHeaderDataTypes(tableModel).toString());
-        assertEquals("[null, null, null, null, null, null, null, null, null, null, null, null, "
-                + "null, null, null, null, null, null, null, null, MATERIAL, null]",
+        assertEquals("[SAMPLE, SAMPLE, null, null, SAMPLE, null, "
+                + "null, null, null, null, null, null, null, "
+                + "null, null, null, null, null, null, null, MATERIAL, null]",
                 getHeaderEntityKinds(tableModel).toString());
         List<TableModelRowWithObject<Sample>> rows = tableModel.getRows();
         assertSame(s1.getSample(), rows.get(0).getObjectOrNull());
@@ -126,7 +127,7 @@ public class SampleProviderTest extends AbstractProviderTest
         s2.experiment(new ExperimentBuilder().identifier("DB:/SPACE1/P1/EXP1").permID("e-123")
                 .getExperiment());
         Sample p2 = new SampleBuilder("/DE/FG").getSample();
-        s2.partOf(new SampleBuilder("DB:/A/B").getSample()).childOf(p1, p2);
+        s2.partOf(new SampleBuilder("DB:/A/B").permID("c-456").getSample()).childOf(p1, p2);
         context.checking(new Expectations()
             {
                 {
@@ -144,14 +145,13 @@ public class SampleProviderTest extends AbstractProviderTest
                         + "PERM_ID, SHOW_DETAILS_LINK, generatedFromParent, containerParent, "
                         + "property-USER-NAME, property-USER-TIMESTAMP, property-USER-NUMBER, property-USER-TEXT]",
                 getHeaderIDs(tableModel).toString());
-        assertEquals(
-                "[null, null, VARCHAR, VARCHAR, null, VARCHAR, "
-                        + "VARCHAR, VARCHAR, VARCHAR, TIMESTAMP, null, null, VARCHAR, "
-                        + "VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, TIMESTAMP, REAL, MULTILINE_VARCHAR]",
+        assertEquals("[null, null, VARCHAR, VARCHAR, null, VARCHAR, "
+                + "VARCHAR, VARCHAR, VARCHAR, TIMESTAMP, null, null, VARCHAR, "
+                + "VARCHAR, VARCHAR, VARCHAR, null, VARCHAR, TIMESTAMP, REAL, MULTILINE_VARCHAR]",
                 getHeaderDataTypes(tableModel).toString());
-        assertEquals(
-                "[null, null, null, null, null, null, null, null, null, null, null, null, null, "
-                        + "null, null, null, null, null, null, null, null]",
+        assertEquals("[SAMPLE, SAMPLE, null, null, SAMPLE, null, "
+                + "null, null, null, null, EXPERIMENT, EXPERIMENT, null, "
+                + "null, null, null, SAMPLE, null, null, null, null]",
                 getHeaderEntityKinds(tableModel).toString());
         List<TableModelRowWithObject<Sample>> rows = tableModel.getRows();
         assertSame(s1.getSample(), rows.get(0).getObjectOrNull());
-- 
GitLab