From 2c8aa0cb4c8a1694bfd50277954c9855a82bdef4 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Tue, 21 Feb 2012 12:42:17 +0000
Subject: [PATCH] LMS-2801 - Bring Back Data Sets Parents Column

SVN: 24515
---
 .../client/dto/ExternalDataGridColumnIDs.java |  2 +
 .../AbstractExternalDataProvider.java         |  4 ++
 .../web/server/resultset/SampleProvider.java  | 45 +------------------
 .../bo/datasetlister/DatasetLister.java       | 40 +++++++++++++++++
 .../openbis/generic/shared/util/IColumn.java  |  6 +++
 .../shared/util/TypedTableModelBuilder.java   | 40 +++++++++++++++++
 .../cisd/openbis/public/common-dictionary.js  |  3 +-
 7 files changed, 96 insertions(+), 44 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
index 0f11feebc06..b4e7296b29f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
@@ -27,6 +27,8 @@ public class ExternalDataGridColumnIDs
 
     public static final String CONTAINER_DATASET = "CONTAINER_DATASET";
 
+    public static final String PARENT_DATASETS = "PARENT_DATASETS";
+
     public static final String ORDER_IN_CONTAINER = "ORDER_IN_CONTAINER";
 
     public static final String SAMPLE = "SAMPLE";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
index 233b9ebaebd..098ad4ae57f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
@@ -31,6 +31,7 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDat
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.IS_DELETED;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.LOCATION;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.ORDER_IN_CONTAINER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.PARENT_DATASETS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.PERM_ID;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.PRESENT_IN_ARCHIVE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.PRODUCTION_DATE;
@@ -81,6 +82,7 @@ public abstract class AbstractExternalDataProvider extends
         builder.addColumn(DATA_SET_TYPE).withDefaultWidth(200);
         builder.addColumn(CONTAINER_DATASET).withDefaultWidth(150).hideByDefault();
         builder.addColumn(ORDER_IN_CONTAINER).withDefaultWidth(100).hideByDefault();
+        builder.addColumn(PARENT_DATASETS).withDefaultWidth(150).hideByDefault();
         builder.addColumn(SAMPLE).withDefaultWidth(100).hideByDefault();
         builder.addColumn(EXTERNAL_DATA_SAMPLE_IDENTIFIER).withDefaultWidth(200);
         builder.addColumn(SAMPLE_TYPE);
@@ -115,6 +117,8 @@ public abstract class AbstractExternalDataProvider extends
             Integer orderInContainer = dataSet.getOrderInContainer();
             builder.column(ORDER_IN_CONTAINER).addString(
                     orderInContainer == null ? "" : orderInContainer.toString());
+            builder.column(PARENT_DATASETS).addEntityLink(dataSet.getParents());
+
             Sample sample = dataSet.getSample();
             if (sample != null)
             {
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 d94d1011679..b4894b60798 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
@@ -36,7 +36,6 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridC
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs.SUBCODE;
 
 import java.util.List;
-import java.util.Set;
 
 import ch.systemsx.cisd.common.collections.IKeyExtractor;
 import ch.systemsx.cisd.common.collections.TableMap;
@@ -45,8 +44,6 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.DeletionUtils;
 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.EntityKind;
-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.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
@@ -59,8 +56,6 @@ import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
  */
 public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
 {
-    private static final int MAX_PARENTS = 4;
-
     private final ListSampleDisplayCriteria2 criteria;
 
     public SampleProvider(ICommonServer commonServer, String sessionToken,
@@ -120,20 +115,8 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
             builder.column(PROJECT).addString(getProjectCode(sample));
             builder.column(PERM_ID).addString(sample.getPermId());
             builder.column(SHOW_DETAILS_LINK_COLUMN_NAME).addString(sample.getPermlink());
-            final Sample parentOrNull = tryGetParent(sample);
-            if (parentOrNull != null)
-            {
-                final Sample parent = parentOrNull;
-                builder.column(PARENTS).addEntityLink(parent, parent.getIdentifier());
-            } else
-            {
-                // WORKAROUND we have no way to create cells with multiple links.
-                // This is an ugly way not to display multiple parents as single link.
-                EntityTableCell fakeEntityTableCell =
-                        new EntityTableCell(EntityKind.SAMPLE, getParentsString(sample));
-                fakeEntityTableCell.setFake(true);
-                builder.column(PARENTS).addValue(fakeEntityTableCell);
-            }
+            builder.column(PARENTS).addEntityLink(sample.getParents());
+
             final Sample containerOrNull = sample.getContainer();
             if (containerOrNull != null)
             {
@@ -167,30 +150,6 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
         return sampleTypMap;
     }
 
-    private String getParentsString(Sample sample)
-    {
-        Set<Sample> parents = sample.getParents();
-        int parentsSize = parents.size();
-        StringBuilder builder = new StringBuilder();
-        int counter = 0;
-        for (Sample parent : parents)
-        {
-            if (counter == MAX_PARENTS)
-            {
-                builder.append("... (").append(parentsSize - MAX_PARENTS).append(" more)");
-                break;
-            }
-            builder.append(parent.getIdentifier()).append("\n");
-            counter++;
-        }
-        return builder.toString();
-    }
-
-    private Sample tryGetParent(Sample sample)
-    {
-        return (sample.getParents().size() == 1) ? sample.getGeneratedFrom() : null;
-    }
-
     private String getProjectCode(Sample sample)
     {
         Experiment experiment = sample.getExperiment();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
index 6ffb52d3ed5..0fecdbfaef6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
@@ -450,6 +450,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         enrichWithSamples(datasetMap);
         enrichWithContainers(datasetMap);
         enrichWithContainedDataSets(datasetMap);
+        enrichWithParents(datasetMap);
         return asList(datasetMap);
     }
 
@@ -541,6 +542,45 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             });
     }
 
+    private void enrichWithParents(Long2ObjectMap<ExternalData> datasetMap)
+    {
+        Map<Long, Set<Long>> parentIdsMap = listParentIds(datasetMap.keySet());
+        Set<Long> allParentIds = new HashSet<Long>();
+
+        for (Set<Long> parentIds : parentIdsMap.values())
+        {
+            allParentIds.addAll(parentIds);
+        }
+
+        DataIterator<DatasetRecord> parentIterator =
+                query.getDatasets(new LongOpenHashSet(allParentIds));
+
+        if (parentIterator != null)
+        {
+            Long2ObjectMap<ExternalData> parentMap = createPrimaryDatasets(parentIterator);
+
+            for (Entry<Long, Set<Long>> parentIdsEntry : parentIdsMap.entrySet())
+            {
+                Long datasetId = parentIdsEntry.getKey();
+                Set<Long> parentIds = parentIdsEntry.getValue();
+
+                ExternalData dataset = datasetMap.get(datasetId);
+                Collection<ExternalData> parents = new ArrayList<ExternalData>();
+
+                for (Long parentId : parentIds)
+                {
+                    ExternalData parent = parentMap.get(parentId);
+                    if (parent != null)
+                    {
+                        parents.add(parent);
+                    }
+                }
+
+                dataset.setParents(parents);
+            }
+        }
+    }
+
     private void enrichWithContainers(Long2ObjectMap<ExternalData> datasetMap)
     {
 
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 25ee04ab529..64ac5119c5d 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
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.util;
 
+import java.util.Collection;
 import java.util.Date;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
@@ -98,6 +99,11 @@ public interface IColumn
      */
     public void addEntityLink(IEntityInformationHolderWithIdentifier entity, String linkText);
 
+    /**
+     * Adds a link to entities to the column.
+     */
+    public void addEntityLink(Collection<? extends IEntityInformationHolderWithIdentifier> entities);
+
     /**
      * 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 db5327628cd..06ba2ffa81a 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
@@ -362,6 +362,46 @@ public class TypedTableModelBuilder<T extends Serializable>
             addValue(cell);
         }
 
+        public void addEntityLink(
+                Collection<? extends IEntityInformationHolderWithIdentifier> entities)
+        {
+            if (entities != null && !entities.isEmpty())
+            {
+                IEntityInformationHolderWithIdentifier firstEntity = entities.iterator().next();
+
+                if (entities.size() == 1)
+                {
+                    addEntityLink(firstEntity, firstEntity.getIdentifier());
+                } else
+                {
+                    // WORKAROUND we have no way to create cells with multiple links.
+                    // This is an ugly way not to display multiple entities as single link.
+
+                    final int MAX_ENTITIES = 4;
+
+                    StringBuilder builder = new StringBuilder();
+                    int counter = 0;
+
+                    for (IEntityInformationHolderWithIdentifier entity : entities)
+                    {
+                        if (counter == MAX_ENTITIES)
+                        {
+                            builder.append("... (").append(entities.size() - MAX_ENTITIES)
+                                    .append(" more)");
+                            break;
+                        }
+                        builder.append(entity.getIdentifier()).append("\n");
+                        counter++;
+                    }
+
+                    EntityTableCell fakeEntityTableCell =
+                            new EntityTableCell(firstEntity.getEntityKind(), builder.toString());
+                    fakeEntityTableCell.setFake(true);
+                    addValue(fakeEntityTableCell);
+                }
+            }
+        }
+
         private void setDataType(DataTypeCode dataType)
         {
             header.setDataType(DataTypeUtils.getCompatibleDataType(header.getDataType(), dataType));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 6a83a7adce6..989253b7c29 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -272,7 +272,8 @@ var common = {
   // DataSet Browser
   //
   
-  container_dataset: "Container",
+  container_dataset: "Container",
+  parent_datasets: "Parents",
   order_in_container: "Order in Container",
   children_datasets: "Children",
   no_datasets_selected: "No Data Sets were selected.",
-- 
GitLab