From e2b82484d8a34d4e22d8c088124280084c62ca90 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 13 May 2014 10:46:42 +0000
Subject: [PATCH] SSDM-121: Make containers and ordinal in internal data set
 DTO classes available. Data set table views modified by showing all
 containers and the order in the containers. New tab (named: Container (Data
 Sets)) added to Data Set details view. Texts adapted

SVN: 31493
---
 .../shared/HierarchicalContentProvider.java   |  3 +-
 .../HierarchicalContentProviderTest.java      |  2 +-
 .../client/dto/ExternalDataGridColumnIDs.java |  4 +-
 .../AbstractExternalDataProvider.java         | 25 +++++-----
 .../openbis/generic/server/CommonServer.java  |  6 ++-
 .../bo/datasetlister/DatasetLister.java       |  7 +++
 .../DatasetLocationNodeRecord.java            |  2 +
 .../bo/datasetlister/IDatasetLister.java      |  3 ++
 .../basic/dto/AbstractExternalData.java       | 45 ++++++++++--------
 .../basic/dto/DataSetRelationshipRole.java    |  2 +-
 .../shared/basic/dto/DatasetLocation.java     |  2 +-
 .../basic/dto/ExternalDataLocationNode.java   |  2 +-
 .../shared/basic/dto/IDatasetLocation.java    |  2 +-
 .../openbis/generic/shared/dto/DataPE.java    | 18 ++++----
 .../shared/dto/DatasetDescription.java        | 17 +++++--
 .../dto/SimpleDataSetInformationDTO.java      | 17 +++++--
 .../shared/translator/DataSetTranslator.java  | 27 +++++------
 .../translator/SimpleDataSetHelper.java       | 10 +++-
 .../dataset/DataSetContainerSection.java      | 46 +++++++++++++++++++
 .../dataset/DataSetPropertiesPanel.java       |  2 +-
 .../dataset/GenericDataSetViewer.java         | 40 ++++++++--------
 .../cisd/openbis/public/common-dictionary.js  |  5 +-
 .../datasetlister/DatasetListerFastTest.java  | 14 +++---
 .../bo/datasetlister/DatasetListerTest.java   |  2 +-
 .../dto/ExternalDataLocationNodeTest.java     | 12 ++---
 .../ExternalDataHasContainerMatcher.java      |  2 +-
 .../server/logic/ScreeningUtils.java          |  4 +-
 27 files changed, 205 insertions(+), 116 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainerSection.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
index 7575078a46e..87d89a6f584 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
@@ -175,6 +175,7 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider
             if (locationNode.isContainer())
             {
                 List<IHierarchicalContent> componentContents = new ArrayList<IHierarchicalContent>();
+                final String containerDataSetCode = locationNode.getLocation().getDataSetCode();
                 List<IDatasetLocationNode> sortedNodes = new ArrayList<IDatasetLocationNode>(locationNode.getComponents());
                 Collections.sort(sortedNodes, new Comparator<IDatasetLocationNode>()
                     {
@@ -186,7 +187,7 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider
                         
                         private int getOrderInContainer(IDatasetLocationNode node)
                         {
-                            Integer orderInContainer = node.getLocation().getOrderInContainer();
+                            Integer orderInContainer = node.getLocation().getOrderInContainer(containerDataSetCode);
                             return orderInContainer == null ? 0 : orderInContainer;
                         }
                     });
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java
index e0e6f1b8cfb..0fe6311a644 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProviderTest.java
@@ -296,7 +296,7 @@ public class HierarchicalContentProviderTest extends AssertJUnit
                 }
 
                 @Override
-                public Integer getOrderInContainer()
+                public Integer getOrderInContainer(String containerDataSetCode)
                 {
                     return null;
                 }
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 b8e211e0668..03148fcf0cb 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
@@ -31,11 +31,11 @@ public class ExternalDataGridColumnIDs
 
     public static final String DATA_SET_TYPE = "DATA_SET_TYPE";
 
-    public static final String CONTAINER_DATASET = "CONTAINER_DATASET";
+    public static final String CONTAINER_DATASETS = "CONTAINER_DATASETS";
 
     public static final String PARENT_DATASETS = "PARENT_DATASETS";
 
-    public static final String ORDER_IN_CONTAINER = "ORDER_IN_CONTAINER";
+    public static final String ORDER_IN_CONTAINERS = "ORDER_IN_CONTAINERS";
 
     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 2a9f2980ad9..4e64f5cfff2 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
@@ -20,7 +20,7 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CommonGridC
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.CommonGridColumnIDs.MODIFIER;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.ARCHIVING_STATUS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CODE;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CONTAINER_DATASET;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CONTAINER_DATASETS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_PRODUCER_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_SET_TYPE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_STORE_CODE;
@@ -36,7 +36,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.METAPROJECTS;
-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.ORDER_IN_CONTAINERS;
 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;
@@ -53,19 +53,20 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDat
 
 import java.util.List;
 
+import ch.systemsx.cisd.common.shared.basic.string.CommaSeparatedListBuilder;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSetUrl;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkTableCell;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 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;
@@ -91,8 +92,8 @@ public abstract class AbstractExternalDataProvider extends
         builder.addColumn(CODE).withDefaultWidth(150);
         builder.addColumn(EXTERNAL_CODE).withDefaultWidth(150).hideByDefault();
         builder.addColumn(DATA_SET_TYPE).withDefaultWidth(200);
-        builder.addColumn(CONTAINER_DATASET).withDefaultWidth(150).hideByDefault();
-        builder.addColumn(ORDER_IN_CONTAINER).withDefaultWidth(100).hideByDefault();
+        builder.addColumn(CONTAINER_DATASETS).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(ORDER_IN_CONTAINERS).withDefaultWidth(100).hideByDefault();
         builder.addColumn(PARENT_DATASETS).withDefaultWidth(150).hideByDefault();
         builder.addColumn(SAMPLE).withDefaultWidth(100).hideByDefault();
         builder.addColumn(EXTERNAL_DATA_SAMPLE_IDENTIFIER).withDefaultWidth(200);
@@ -153,14 +154,14 @@ public abstract class AbstractExternalDataProvider extends
                         metaProjectsToString(dataSet.getMetaprojects()));
 
                 builder.column(DATA_SET_TYPE).addString(dataSet.getDataSetType().getCode());
-                ContainerDataSet container = dataSet.tryGetContainer();
-                if (container != null)
+                List<ContainerDataSet> containerDataSets = dataSet.getContainerDataSets();
+                builder.column(CONTAINER_DATASETS).addEntityLink(containerDataSets);
+                CommaSeparatedListBuilder listBuilder = new CommaSeparatedListBuilder();
+                for (ContainerDataSet containerDataSet : containerDataSets)
                 {
-                    builder.column(CONTAINER_DATASET).addEntityLink(container, container.getCode());
+                    listBuilder.append(dataSet.getOrderInContainer(containerDataSet.getCode()));
                 }
-                Integer orderInContainer = dataSet.getOrderInContainer();
-                builder.column(ORDER_IN_CONTAINER).addString(
-                        orderInContainer == null ? "" : orderInContainer.toString());
+                builder.column(ORDER_IN_CONTAINERS).addString(listBuilder.toString());
                 builder.column(PARENT_DATASETS).addEntityLink(dataSet.getParents());
 
                 Sample sample = dataSet.getSample();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index ce8151e663e..58a2d77e328 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -870,7 +870,11 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         {
             case CONTAINER:
                 datasets = datasetLister.listByContainerTechId(datasetId);
-                Collections.sort(datasets, AbstractExternalData.DATA_SET_COMPONENTS_COMPARATOR);
+                Collections.sort(datasets, new AbstractExternalData.DataSetComponentsComparator(datasetId));
+                break;
+            case COMPONENT:
+                datasets = datasetLister.listByComponentTechId(datasetId);
+                Collections.sort(datasets);
                 break;
             case CHILD:
                 datasets = datasetLister.listByChildTechId(datasetId);
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 894b8ec2d38..000ade4d9f1 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
@@ -407,6 +407,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
                 getParentChildRelationshipTypeId()));
     }
 
+    @Override
+    public List<AbstractExternalData> listByComponentTechId(TechId componentDatasetId)
+    {
+        return enrichDatasets(query.getParentsOf(new LongOpenHashSet(Arrays.asList(componentDatasetId.getId())),
+                getContainerComponentRelationshipTypeId()));
+    }
+
     @Override
     public List<AbstractExternalData> listByContainerTechId(TechId containerDatasetId)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLocationNodeRecord.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLocationNodeRecord.java
index 8c895449670..b7b252266b4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLocationNodeRecord.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLocationNodeRecord.java
@@ -28,6 +28,8 @@ public class DatasetLocationNodeRecord
 
     public Long container_id;
 
+    public String container_code;
+
     public Integer ordinal;
 
     public String location;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
index 71c7481456a..69979a9e06a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
@@ -57,6 +57,9 @@ public interface IDatasetLister
     /** @return datasets that are parents of a dataset with the specified id */
     List<AbstractExternalData> listByChildTechId(TechId childDatasetId);
 
+    /** @return datasets that are containers of a dataset with the specified id */
+    List<AbstractExternalData> listByComponentTechId(TechId componentDatasetId);
+
     /** @return datasets that are components of a dataset with the specified id */
     List<AbstractExternalData> listByContainerTechId(TechId containerDatasetId);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
index 706fc4fc55b..63286c01c61 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
@@ -31,6 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIsStub;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IPermIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ITaggable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 
 /**
  * A DTO for any kind of data set.
@@ -75,14 +76,10 @@ public abstract class AbstractExternalData extends
 
     }
 
-    /**
-     * {@link Comparator} for data sets contained in a (virtual) container which uses ascending order in container.
-     */
-    public static final Comparator<AbstractExternalData> DATA_SET_COMPONENTS_COMPARATOR =
-            new DataSetComponentsComparator();
-
     private Map<String, ContainerAndOrder> containersAndOrderByContainerId = new TreeMap<String, ContainerAndOrder>();
 
+    private Map<Long, ContainerAndOrder> containersAndOrderByContainerTechId = new TreeMap<Long, ContainerAndOrder>();
+
     private boolean derived;
 
     private Long id;
@@ -401,13 +398,6 @@ public abstract class AbstractExternalData extends
         return containersAndOrderByContainerId.values().iterator().next().getContainerDataSet();
     }
 
-    @Deprecated
-    public Integer getOrderInContainer()
-    {
-        ContainerDataSet container = tryGetContainer();
-        return container == null ? null : getOrderIn(container.getCode());
-    }
-
     public void addContainer(ContainerDataSet containerDataSet, Integer orderInContainer)
     {
         List<AbstractExternalData> components = containerDataSet.getContainedDataSets();
@@ -415,7 +405,9 @@ public abstract class AbstractExternalData extends
         {
             components.add(this);
         }
-        containersAndOrderByContainerId.put(containerDataSet.getCode(), new ContainerAndOrder(containerDataSet, orderInContainer));
+        ContainerAndOrder containerAndOrder = new ContainerAndOrder(containerDataSet, orderInContainer);
+        containersAndOrderByContainerId.put(containerDataSet.getCode(), containerAndOrder);
+        containersAndOrderByContainerTechId.put(containerDataSet.getId(), containerAndOrder);
     }
 
     public List<ContainerDataSet> getContainerDataSets()
@@ -429,7 +421,13 @@ public abstract class AbstractExternalData extends
         return containers;
     }
 
-    public Integer getOrderIn(String containerDataSetCode)
+    public Integer getOrderInContainer(Long containerDataSetTechId)
+    {
+        ContainerAndOrder containerAndOrder = containersAndOrderByContainerTechId.get(containerDataSetTechId);
+        return containerAndOrder == null ? null : containerAndOrder.getOrderInContainer();
+    }
+
+    public Integer getOrderInContainer(String containerDataSetCode)
     {
         ContainerAndOrder containerAndOrder = containersAndOrderByContainerId.get(containerDataSetCode);
         return containerAndOrder == null ? null : containerAndOrder.getOrderInContainer();
@@ -474,14 +472,23 @@ public abstract class AbstractExternalData extends
         return this.isStub;
     }
 
-    private static final class DataSetComponentsComparator implements
-            Comparator<AbstractExternalData>
+    /**
+     * {@link Comparator} for data sets contained in a (virtual) container which uses ascending order in container.
+     */
+    public static final class DataSetComponentsComparator implements Comparator<AbstractExternalData>
     {
+        private Long id;
+
+        public DataSetComponentsComparator(TechId techId)
+        {
+            id = techId.getId();
+        }
+
         @Override
         public int compare(AbstractExternalData o1, AbstractExternalData o2)
         {
-            Integer order1 = o1.getOrderInContainer();
-            Integer order2 = o2.getOrderInContainer();
+            Integer order1 = o1.getOrderInContainer(id);
+            Integer order2 = o2.getOrderInContainer(id);
             // sanity check
             if (order1 == null || order2 == null)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetRelationshipRole.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetRelationshipRole.java
index 8e53888ff0e..ad5394cd197 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetRelationshipRole.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetRelationshipRole.java
@@ -23,5 +23,5 @@ import java.io.Serializable;
  */
 public enum DataSetRelationshipRole implements Serializable
 {
-    CONTAINER, PARENT, CHILD;
+    CONTAINER, COMPONENT, PARENT, CHILD;
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocation.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocation.java
index 0ef65e2535b..699457012d5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocation.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocation.java
@@ -60,7 +60,7 @@ public class DatasetLocation implements IDatasetLocation, Serializable, ICodeHol
     }
 
     @Override
-    public Integer getOrderInContainer()
+    public Integer getOrderInContainer(String containerDataSetCode)
     {
         return orderInContainer;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
index b9d07e5b87b..ef5b273f4f3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
@@ -86,7 +86,7 @@ public class ExternalDataLocationNode implements IDatasetLocationNode
             for (AbstractExternalData component : components)
             {
                 componentsLocationNodes.put(component.getCode(),
-                        new ExternalDataLocationNode(component, component.getOrderIn(containerCode)));
+                        new ExternalDataLocationNode(component, component.getOrderInContainer(containerCode)));
             }
 
             return componentsLocationNodes.values();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocation.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocation.java
index e67cd84e84c..32ba2368124 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocation.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocation.java
@@ -31,5 +31,5 @@ public interface IDatasetLocation
 
     String getDataStoreCode();
 
-    Integer getOrderInContainer();
+    Integer getOrderInContainer(String containerDataSetCode);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index 0dde3d12cb1..224e4d919ee 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -70,7 +70,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
-import ch.systemsx.cisd.openbis.generic.shared.util.RelationshipUtils;
 
 /**
  * Kind of <i>Java Bean</i> or <i>Value Object</i> which contains any information we would like to know about one DATA.
@@ -230,21 +229,24 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
     @Field(index = Index.UN_TOKENIZED, store = Store.YES, name = SearchFieldConstants.CONTAINER_ID)
     private Long getContainerId()
     {
-        DataPE container = getContainer();
-        return container != null ? container.getId() : null;
+        List<DataPE> containers = getContainers();
+        return containers.isEmpty() ? null : containers.get(0).getId();
     }
 
     @Transient
-    public DataPE getContainer()
+    public List<DataPE> getContainers()
     {
-        for (DataSetRelationshipPE relationship : getParentRelationships())
+        final Set<DataSetRelationshipPE> relationships = getParentRelationships();
+        final List<DataPE> containers = new ArrayList<DataPE>();
+        for (DataSetRelationshipPE r : relationships)
         {
-            if (RelationshipUtils.isContainerComponentRelationship(relationship))
+            if (isContainerComponentRelationship(r))
             {
-                return relationship.getParentDataSet();
+                assert r.getChildDataSet().equals(this);
+                containers.add(r.getParentDataSet());
             }
         }
-        return null;
+        return containers;
     }
 
     public void addParentRelationship(final DataSetRelationshipPE relationship)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DatasetDescription.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DatasetDescription.java
index afa7d781c94..3078b507a31 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DatasetDescription.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DatasetDescription.java
@@ -19,7 +19,9 @@ package ch.systemsx.cisd.openbis.generic.shared.dto;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 
@@ -40,7 +42,7 @@ public class DatasetDescription implements Serializable, IDatasetLocation
 
     private String dataSetLocation;
 
-    private Integer orderInContainer;
+    private final Map<String, Integer> orderInContainers = new HashMap<String, Integer>();
 
     private Date registrationTimestamp;
 
@@ -312,14 +314,19 @@ public class DatasetDescription implements Serializable, IDatasetLocation
     }
 
     @Override
-    public Integer getOrderInContainer()
+    public Integer getOrderInContainer(String containerDataSetCode)
     {
-        return orderInContainer;
+        return orderInContainers.get(containerDataSetCode);
     }
 
-    public void setOrderInContainer(Integer orderInContainer)
+    public void addOrderInContainer(String containerDataSetCode, Integer orderInContainer)
     {
-        this.orderInContainer = orderInContainer;
+        orderInContainers.put(containerDataSetCode, orderInContainer);
+    }
+
+    public Map<String, Integer> getOrderInContainers()
+    {
+        return orderInContainers;
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SimpleDataSetInformationDTO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SimpleDataSetInformationDTO.java
index e20f363b05c..f100956f7aa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SimpleDataSetInformationDTO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SimpleDataSetInformationDTO.java
@@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.generic.shared.dto;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
@@ -59,7 +61,7 @@ public class SimpleDataSetInformationDTO implements Serializable, IDatasetLocati
 
     private String dataStoreUrl;
 
-    private Integer orderInContainer;
+    private Map<String, Integer> orderInContainers = new HashMap<String, Integer>();
 
     public void setDataStoreCode(String dataStoreCode)
     {
@@ -207,14 +209,19 @@ public class SimpleDataSetInformationDTO implements Serializable, IDatasetLocati
     }
 
     @Override
-    public Integer getOrderInContainer()
+    public Integer getOrderInContainer(String containerDataSetCode)
     {
-        return orderInContainer;
+        return orderInContainers.get(containerDataSetCode);
     }
 
-    public void setOrderInContainer(Integer orderInContainer)
+    public void addOrderInContainer(String containerDataSetCode, Integer orderInContainer)
     {
-        this.orderInContainer = orderInContainer;
+        orderInContainers.put(containerDataSetCode, orderInContainer);
+    }
+
+    public void setOrderInContainers(Map<String, Integer> orderInContainers)
+    {
+        this.orderInContainers = orderInContainers;
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index dcae0c60c23..f0524205765 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -76,7 +76,12 @@ public class DataSetTranslator
 
         description.setDataStoreCode(data.getDataStore().getCode());
         description.setRegistrationTimestamp(data.getRegistrationDate());
-        description.setOrderInContainer(data.getOrderInContainer());
+        List<ContainerDataSet> containerDataSets = data.getContainerDataSets();
+        for (ContainerDataSet containerDataSet : containerDataSets)
+        {
+            String containerDataSetCode = containerDataSet.getCode();
+            description.addOrderInContainer(containerDataSetCode, data.getOrderInContainer(containerDataSetCode));
+        }
 
         PhysicalDataSet dataSet = data.tryGetAsDataSet();
         if (dataSet != null)
@@ -281,17 +286,6 @@ public class DataSetTranslator
         }
     }
 
-    private static DataSetRelationshipPE getContainerRelationshipOrNull(DataPE dataPE)
-    {
-        List<DataSetRelationshipPE> containerComponentRelationships =
-                RelationshipUtils.getContainerComponentRelationships(dataPE.getParentRelationships());
-        if (containerComponentRelationships.isEmpty() == false)
-        {
-            return containerComponentRelationships.get(0);
-        }
-        return null;
-    }
-
     private static ContainerDataSet tryToTranslateContainer(DataPE containerOrNull,
             String baseIndexURL, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
@@ -447,12 +441,13 @@ public class DataSetTranslator
 
         DatasetDescription description = new DatasetDescription();
         description.setDataSetCode(dataSet.getCode());
-        DataSetRelationshipPE relationship = getContainerRelationshipOrNull(dataSet);
-        if (relationship != null)
+        List<DataSetRelationshipPE> containerComponentRelationships =
+                RelationshipUtils.getContainerComponentRelationships(dataSet.getParentRelationships());
+        for (DataSetRelationshipPE relationship : containerComponentRelationships)
         {
-            description.setOrderInContainer(relationship.getOrdinal());
+            String containerDataSetCode = relationship.getParentDataSet().getCode();
+            description.addOrderInContainer(containerDataSetCode, relationship.getOrdinal());
         }
-
         description.setRegistrationTimestamp(dataSet.getRegistrationDate());
         if (dataSet.isExternalData())
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
index d3bb435fbfb..984218728e3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
@@ -71,7 +72,12 @@ public class SimpleDataSetHelper
         result.setSampleCode(data.getSampleCode());
         result.setDataSetType(data.getDataSetType().getCode());
         result.setDataStoreUrl(data.getDataStore().getHostUrl());
-        result.setOrderInContainer(data.getOrderInContainer());
+        List<ContainerDataSet> containerDataSets = data.getContainerDataSets();
+        for (ContainerDataSet containerDataSet : containerDataSets)
+        {
+            String containerDataSetCode = containerDataSet.getCode();
+            result.addOrderInContainer(containerDataSetCode, data.getOrderInContainer(containerDataSetCode));
+        }
         return result;
     }
 
@@ -89,7 +95,7 @@ public class SimpleDataSetHelper
         result.setSpaceCode(datasetDescription.getSpaceCode());
         result.setProjectCode(datasetDescription.getProjectCode());
         result.setSampleCode(datasetDescription.getSampleCode());
-        result.setOrderInContainer(datasetDescription.getOrderInContainer());
+        result.setOrderInContainers(datasetDescription.getOrderInContainers());
         return result;
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainerSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainerSection.java
new file mode 100644
index 00000000000..c83bdefef1e
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainerSection.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2014 ETH Zuerich, SIS
+ *
+ * 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.generic.client.web.client.application.dataset;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
+
+/**
+ * @author Franz-Josef Elmer
+ */
+class DataSetContainerSection extends AbstractDataSetsSection
+{
+    private final AbstractExternalData dataset;
+
+    DataSetContainerSection(IViewContext<?> viewContext, AbstractExternalData dataset)
+    {
+        super("Container (Data Sets)", viewContext, dataset);
+        this.dataset = dataset;
+        setIds(DisplayTypeIDGenerator.DATA_SET_CONTAINED_SECTION);
+    }
+
+    @Override
+    protected IDisposableComponent createDatasetBrowserComponent()
+    {
+        return DataSetRelationshipBrowser.create(viewContext, TechId.create(dataset),
+                DataSetRelationshipRole.COMPONENT, dataset.getDataSetType());
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
index 53b43d85207..42198fee0e3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
@@ -112,7 +112,7 @@ public class DataSetPropertiesPanel extends ContentPanel
         properties.put(messageProvider.getMessage(Dict.REGISTRATION_DATE),
                 dataset.getRegistrationDate());
         List<ContainerDataSet> containerDataSets = dataset.getContainerDataSets();
-        if (containerDataSets.isEmpty() == false)
+        if (containerDataSets.size() == 1)
         {
             properties.put(messageProvider.getMessage(Dict.CONTAINER_DATA_SET), containerDataSets.get(0));
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index 3f228771184..a3e9d5de4be 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -57,14 +57,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 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.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebAppContext;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
@@ -117,8 +117,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             AsyncCallback<AbstractExternalData> asyncCallback);
 
     /**
-     * To be subclassed. Creates additional panels of the viewer in the right side section besides
-     * components, datasets and attachments
+     * To be subclassed. Creates additional panels of the viewer in the right side section besides components, datasets and attachments
      */
     protected List<TabContent> createAdditionalSectionPanels(AbstractExternalData dataset)
     {
@@ -275,6 +274,8 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             final TabContent containedSection = new DataSetContainedSection(context, dataset);
             container.addSection(containedSection);
         }
+        final TabContent containerSection = new DataSetContainerSection(context, dataset);
+        container.addSection(containerSection);
 
         // parents
         final TabContent parentsSection = new DataSetParentsSection(context, dataset);
@@ -370,18 +371,18 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
-            { DatabaseModificationKind.edit(ObjectKind.DATA_SET),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.DATA_SET),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
-                    DatabaseModificationKind.edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.VOCABULARY_TERM),
-                    DatabaseModificationKind.edit(ObjectKind.VOCABULARY_TERM),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.EXPERIMENT),
-                    DatabaseModificationKind.edit(ObjectKind.EXPERIMENT),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.SAMPLE),
-                    DatabaseModificationKind.edit(ObjectKind.SAMPLE),
-                    DatabaseModificationKind.createOrDelete(ObjectKind.METAPROJECT),
-                    DatabaseModificationKind.edit(ObjectKind.METAPROJECT) };
+        { DatabaseModificationKind.edit(ObjectKind.DATA_SET),
+                DatabaseModificationKind.createOrDelete(ObjectKind.DATA_SET),
+                DatabaseModificationKind.createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
+                DatabaseModificationKind.edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
+                DatabaseModificationKind.createOrDelete(ObjectKind.VOCABULARY_TERM),
+                DatabaseModificationKind.edit(ObjectKind.VOCABULARY_TERM),
+                DatabaseModificationKind.createOrDelete(ObjectKind.EXPERIMENT),
+                DatabaseModificationKind.edit(ObjectKind.EXPERIMENT),
+                DatabaseModificationKind.createOrDelete(ObjectKind.SAMPLE),
+                DatabaseModificationKind.edit(ObjectKind.SAMPLE),
+                DatabaseModificationKind.createOrDelete(ObjectKind.METAPROJECT),
+                DatabaseModificationKind.edit(ObjectKind.METAPROJECT) };
     }
 
     @Override
@@ -391,10 +392,9 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
     }
 
     /**
-     * Holder of a {@link Button} that has a menu with items that schedule dataset plugin
-     * processing. The button is hidden at the beginning. When data set is successfully loaded by
-     * the viewer and there is a nonempty list of plugins assigned to its data type data then the
-     * menu is filled and button is shown.
+     * Holder of a {@link Button} that has a menu with items that schedule dataset plugin processing. The button is hidden at the beginning. When data
+     * set is successfully loaded by the viewer and there is a nonempty list of plugins assigned to its data type data then the menu is filled and
+     * button is shown.
      */
     private class ProcessButtonHolder
     {
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 3c153d78214..10bea9f946d 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
@@ -328,9 +328,9 @@ var common = {
   // DataSet Browser
   //
   
-  container_dataset: "Container",
+  container_datasets: "Containers",
   parent_datasets: "Parents",
-  order_in_container: "Order in Container",
+  order_in_containers: "Order in Containers",
   children_datasets: "Children",
   no_datasets_selected: "No Data Sets were selected.",
   datasets_from_different_stores_selected: "Data Sets from different Data Stores were selected, so no operation can be performed on all of them.",
@@ -823,6 +823,7 @@ var common = {
  file_format_type: "File Type",
  production_date: "Production Date",
  data_producer_code: "Producer",
+ container_dataset: "Container",
  data_store_code: "Data Store",
  button_upload_datasets: "Export Data",
  confirm_dataset_upload_title: "Uploading Confirmation and Authentication",
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerFastTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerFastTest.java
index f8b5b0f9e20..73147316402 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerFastTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerFastTest.java
@@ -127,10 +127,10 @@ public class DatasetListerFastTest extends AssertJUnit
                 new ArrayList<IDatasetLocationNode>(location.getComponents());
         Collections.sort(components, DATA_SET_LOCATION_NODE_COMPARATOR);
         assertEquals("ds-c1", components.get(0).getLocation().getDataSetCode());
-        assertEquals(new Integer(0), components.get(0).getLocation().getOrderInContainer());
+        assertEquals(new Integer(0), components.get(0).getLocation().getOrderInContainer("ds-1"));
         assertEquals("a/b/c/1", components.get(0).getLocation().getDataSetLocation());
         assertEquals("ds-c2", components.get(1).getLocation().getDataSetCode());
-        assertEquals(new Integer(1), components.get(1).getLocation().getOrderInContainer());
+        assertEquals(new Integer(1), components.get(1).getLocation().getOrderInContainer("ds-1"));
         assertEquals("a/b/c/2", components.get(1).getLocation().getDataSetLocation());
     }
 
@@ -163,23 +163,23 @@ public class DatasetListerFastTest extends AssertJUnit
                 new ArrayList<IDatasetLocationNode>(location.getComponents());
         Collections.sort(components, DATA_SET_LOCATION_NODE_COMPARATOR);
         assertEquals("-2303", components.get(0).getLocation().getDataSetCode());
-        assertEquals(new Integer(1), components.get(0).getLocation().getOrderInContainer());
+        assertEquals(new Integer(1), components.get(0).getLocation().getOrderInContainer("-2306"));
         assertEquals("a/b/c/2303", components.get(0).getLocation().getDataSetLocation());
         assertEquals("[]", components.get(0).getComponents().toString());
         assertEquals("-2304", components.get(1).getLocation().getDataSetCode());
-        assertEquals(new Integer(0), components.get(1).getLocation().getOrderInContainer());
+        assertEquals(new Integer(0), components.get(1).getLocation().getOrderInContainer("-2306"));
         assertEquals(null, components.get(1).getLocation().getDataSetLocation());
         List<IDatasetLocationNode> subComponents =
                 new ArrayList<IDatasetLocationNode>(components.get(1).getComponents());
         Collections.sort(subComponents, DATA_SET_LOCATION_NODE_COMPARATOR);
         assertEquals("-2302", subComponents.get(0).getLocation().getDataSetCode());
-        assertEquals(new Integer(1), subComponents.get(0).getLocation().getOrderInContainer());
+        assertEquals(new Integer(1), subComponents.get(0).getLocation().getOrderInContainer("-2304"));
         assertEquals("a/b/c/2302", subComponents.get(0).getLocation().getDataSetLocation());
         assertEquals("-2303", subComponents.get(1).getLocation().getDataSetCode());
-        assertEquals(new Integer(2), subComponents.get(1).getLocation().getOrderInContainer());
+        assertEquals(new Integer(2), subComponents.get(1).getLocation().getOrderInContainer("-2304"));
         assertEquals("a/b/c/2303", subComponents.get(1).getLocation().getDataSetLocation());
         assertEquals("-2305", components.get(2).getLocation().getDataSetCode());
-        assertEquals(new Integer(2), components.get(2).getLocation().getOrderInContainer());
+        assertEquals(new Integer(2), components.get(2).getLocation().getOrderInContainer("-2306"));
         assertEquals("a/b/c/2305", components.get(2).getLocation().getDataSetLocation());
         assertEquals("[]", components.get(2).getComponents().toString());
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
index 9ecb4c11b4b..b3c4e946a5f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
@@ -290,7 +290,7 @@ public class DatasetListerTest extends AbstractDAOTest
 
         PhysicalDataSet dataset1 = datasets.get(1).tryGetAsDataSet();
         assertNotNull(dataset1);
-        assertEquals(2, (int) dataset1.getOrderIn(containerDataSet.getCode()));
+        assertEquals(2, (int) dataset1.getOrderInContainer(containerDataSet.getCode()));
         assertEquals(dataset1.getContainerDataSets().get(0), containerDataSet);
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNodeTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNodeTest.java
index db471d61738..f4574bc5ba9 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNodeTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNodeTest.java
@@ -34,10 +34,10 @@ public class ExternalDataLocationNodeTest extends AssertJUnit
     @Test
     public void test()
     {
-        ContainerDataSetBuilder rootContainer = new ContainerDataSetBuilder().code("c1");
+        ContainerDataSetBuilder rootContainer = new ContainerDataSetBuilder(1).code("c1");
         DataStore store = new DataStoreBuilder("DSS").getStore();
         rootContainer.component(new DataSetBuilder().code("p1").store(store).location("a/b/c/1").getDataSet());
-        ContainerDataSetBuilder subContainer = new ContainerDataSetBuilder().code("c2");
+        ContainerDataSetBuilder subContainer = new ContainerDataSetBuilder(2).code("c2");
         PhysicalDataSet component2 = new DataSetBuilder().code("p2").store(store).location("a/b/c/2").getDataSet();
         subContainer.component(component2);
         subContainer.component(new DataSetBuilder().code("p3").store(store).location("a/b/c/3").getDataSet());
@@ -52,18 +52,18 @@ public class ExternalDataLocationNodeTest extends AssertJUnit
         assertEquals("p1", components.get(1).getLocation().getDataSetCode());
         assertEquals("DSS", components.get(1).getLocation().getDataStoreCode());
         assertEquals("a/b/c/1", components.get(1).getLocation().getDataSetLocation());
-        assertEquals(0, components.get(1).getLocation().getOrderInContainer().intValue());
+        assertEquals(0, components.get(1).getLocation().getOrderInContainer("c1").intValue());
         assertEquals("p2", components.get(2).getLocation().getDataSetCode());
         assertEquals("a/b/c/2", components.get(2).getLocation().getDataSetLocation());
-        assertEquals(2, components.get(2).getLocation().getOrderInContainer().intValue());
+        assertEquals(2, components.get(2).getLocation().getOrderInContainer("c1").intValue());
         assertEquals(3, components.size());
         components = new ArrayList<IDatasetLocationNode>(components.get(0).getComponents());
         assertEquals("p2", components.get(0).getLocation().getDataSetCode());
         assertEquals("a/b/c/2", components.get(0).getLocation().getDataSetLocation());
-        assertEquals(0, components.get(0).getLocation().getOrderInContainer().intValue());
+        assertEquals(0, components.get(0).getLocation().getOrderInContainer("c2").intValue());
         assertEquals("p3", components.get(1).getLocation().getDataSetCode());
         assertEquals("a/b/c/3", components.get(1).getLocation().getDataSetLocation());
-        assertEquals(1, components.get(1).getLocation().getOrderInContainer().intValue());
+        assertEquals(1, components.get(1).getLocation().getOrderInContainer("c2").intValue());
         assertEquals(2, components.size());
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
index 0c1d7d769d9..6be3efc37fb 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
@@ -57,7 +57,7 @@ public class ExternalDataHasContainerMatcher extends TypeSafeMatcher<AbstractExt
             String containerCode = container.getCode();
             if (expectedContainer.getCode().equals(containerCode))
             {
-                Integer order = actual.getOrderIn(containerCode);
+                Integer order = actual.getOrderInContainer(containerCode);
                 return expectedOrder == null || expectedOrder.equals(order);
             }
         }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
index ed3c49cd2bc..8619b91e9e0 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
@@ -216,8 +216,8 @@ public class ScreeningUtils
     private static <T extends DataPE> boolean isContainerMatching(T dataset,
             String... datasetTypeCodePatterns)
     {
-        DataPE container = dataset.getContainer();
-        return container != null && isOneOfTypesMatching(container, datasetTypeCodePatterns);
+        List<DataPE> containers = dataset.getContainers();
+        return containers.isEmpty() == false && isOneOfTypesMatching(containers.get(0), datasetTypeCodePatterns);
     }
 
     private static boolean isNotEmpty(AbstractExternalData dataset)
-- 
GitLab