From b44203110980a1010de68943bd7f3cdaac3944e0 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Tue, 2 Oct 2012 14:06:05 +0000
Subject: [PATCH] SP-302 / BIS-214 : Improvements to PathInfoDb - junits

SVN: 26940
---
 .../shared/basic/dto/DatasetLocationNode.java | 13 +--
 .../basic/dto/ExternalDataLocationNode.java   | 14 ++--
 .../basic/dto/IDatasetLocationNode.java       | 10 +--
 .../bo/datasetlister/DatasetListerTest.java   | 80 ++++++++++++++++++-
 .../sql/postgresql/122/008=data_all.tsv       |  6 ++
 .../sql/postgresql/122/030=external_data.tsv  |  3 +
 6 files changed, 106 insertions(+), 20 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocationNode.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocationNode.java
index 4fd7fc659a7..eae3c6b3251 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocationNode.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatasetLocationNode.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
+import java.util.TreeMap;
 
 /**
  * Simple implementation of {@link IDatasetLocationNode}.
@@ -32,7 +32,8 @@ public class DatasetLocationNode implements IDatasetLocationNode, Serializable
 
     private IDatasetLocation location;
 
-    private List<IDatasetLocationNode> contained = new ArrayList<IDatasetLocationNode>();
+    private TreeMap<String, IDatasetLocationNode> contained =
+            new TreeMap<String, IDatasetLocationNode>();
 
     public DatasetLocationNode(IDatasetLocation location)
     {
@@ -56,9 +57,9 @@ public class DatasetLocationNode implements IDatasetLocationNode, Serializable
     }
 
     @Override
-    public List<IDatasetLocationNode> getComponents()
+    public Collection<IDatasetLocationNode> getComponents()
     {
-        return contained;
+        return contained.values();
     }
 
     public void addContained(IDatasetLocationNode node)
@@ -67,7 +68,7 @@ public class DatasetLocationNode implements IDatasetLocationNode, Serializable
         {
             throw new IllegalArgumentException("Node cannot be null");
         }
-        contained.add(node);
+        contained.put(node.getLocation().getDataSetCode(), node);
     }
 
 }
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 5af6e2f7146..2d6d8def603 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
@@ -16,9 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.TreeMap;
 
 /**
  * Implementation of {@link IDatasetLocationNode} that uses {@link ExternalData} object as a source
@@ -60,7 +61,7 @@ public class ExternalDataLocationNode implements IDatasetLocationNode
     }
 
     @Override
-    public List<IDatasetLocationNode> getComponents()
+    public Collection<IDatasetLocationNode> getComponents()
     {
         if (isContainer() == false)
         {
@@ -72,15 +73,16 @@ public class ExternalDataLocationNode implements IDatasetLocationNode
 
         if (containedExternalDatas != null)
         {
-            List<IDatasetLocationNode> containedLocationNodes =
-                    new ArrayList<IDatasetLocationNode>(containedExternalDatas.size());
+            TreeMap<String, IDatasetLocationNode> containedLocationNodes =
+                    new TreeMap<String, IDatasetLocationNode>();
 
             for (ExternalData containedExternalData : containedExternalDatas)
             {
-                containedLocationNodes.add(new ExternalDataLocationNode(containedExternalData));
+                containedLocationNodes.put(containedExternalData.getCode(),
+                        new ExternalDataLocationNode(containedExternalData));
             }
 
-            return containedLocationNodes;
+            return containedLocationNodes.values();
         } else
         {
             return Collections.emptyList();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocationNode.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocationNode.java
index 0eb60b52fbd..dfe3c184f44 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocationNode.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IDatasetLocationNode.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
-import java.util.List;
+import java.util.Collection;
 
 /**
- * Stores information about a location of a data sets and its components.
+ * Stores information about a location of a data set and its components.
  * 
  * @author pkupczyk
  */
@@ -37,9 +37,9 @@ public interface IDatasetLocationNode
     boolean isContainer();
 
     /**
-     * Returns a list of component locations. For a data set that is not a container always returns
-     * an empty list. Never returns null.
+     * Returns a collection of component locations. For a data set that is not a container always
+     * returns an empty collection. Never returns null.
      */
-    List<IDatasetLocationNode> getComponents();
+    Collection<IDatasetLocationNode> getComponents();
 
 }
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 7be7ea17d0d..81b06885675 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
@@ -29,10 +29,13 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import junit.framework.Assert;
+
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -47,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
@@ -221,7 +225,7 @@ public class DatasetListerTest extends AbstractDAOTest
         assertEquals("20081105092259900-0", dataSets.get(0).getCode());
         assertEquals("STANDARD", dataSets.get(0).getDataStore().getCode());
         assertEquals(0, dataSets.get(0).getProperties().size());
-        assertEquals(17, dataSets.size());
+        assertEquals(23, dataSets.size());
     }
 
     @Test
@@ -383,7 +387,7 @@ public class DatasetListerTest extends AbstractDAOTest
         assertEquals("42", ((DataSet) dataSet).getShareId());
         assertEquals(4711L, ((DataSet) dataSet).getSize().longValue());
         assertEquals(DataSetArchivingStatus.AVAILABLE, ((DataSet) dataSet).getStatus());
-        assertEquals(23, list.size());
+        assertEquals(29, list.size());
     }
 
     @Test
@@ -406,7 +410,77 @@ public class DatasetListerTest extends AbstractDAOTest
         DataSetShareId dataSet2 = list.get(1);
         assertEquals("20081105092159111-1", dataSet2.getDataSetCode());
         assertEquals("42", dataSet2.getShareId());
-        assertEquals(25, list.size());
+        assertEquals(31, list.size());
+    }
+
+    @Test
+    public void testListLocationsByDatasetCodeForRootContainer()
+    {
+        IDatasetLocationNode root = lister.listLocationsByDatasetCode("ROOT_CONTAINER");
+        Iterator<IDatasetLocationNode> rootComponents = root.getComponents().iterator();
+        assertContainerLocation(root, "ROOT_CONTAINER", 2);
+
+        IDatasetLocationNode container1 = rootComponents.next();
+        Iterator<IDatasetLocationNode> container1Components = container1.getComponents().iterator();
+
+        assertContainerLocation(container1, "CONTAINER_1", 2);
+        assertComponentLocation(container1Components.next(), "COMPONENT_1A",
+                "contained/COMPONENT_1A");
+        assertComponentLocation(container1Components.next(), "COMPONENT_1B",
+                "contained/COMPONENT_1B");
+
+        IDatasetLocationNode container2 = rootComponents.next();
+        Iterator<IDatasetLocationNode> container2Components = container2.getComponents().iterator();
+
+        assertContainerLocation(container2, "CONTAINER_2", 1);
+        assertComponentLocation(container2Components.next(), "COMPONENT_2A",
+                "contained/COMPONENT_2A");
+    }
+
+    @Test
+    public void testListLocationsByDatasetCodeForContainer()
+    {
+        IDatasetLocationNode container = lister.listLocationsByDatasetCode("CONTAINER_1");
+        Iterator<IDatasetLocationNode> containerComponents = container.getComponents().iterator();
+        assertContainerLocation(container, "CONTAINER_1", 2);
+
+        assertComponentLocation(containerComponents.next(), "COMPONENT_1A",
+                "contained/COMPONENT_1A");
+        assertComponentLocation(containerComponents.next(), "COMPONENT_1B",
+                "contained/COMPONENT_1B");
+    }
+
+    @Test
+    public void testListLocationsByDatasetCodeForComponent()
+    {
+        IDatasetLocationNode component = lister.listLocationsByDatasetCode("COMPONENT_1A");
+        assertComponentLocation(component, "COMPONENT_1A", "contained/COMPONENT_1A");
+    }
+
+    @Test
+    public void testListLocationsByDatasetCodeForNotExisting()
+    {
+        IDatasetLocationNode component =
+                lister.listLocationsByDatasetCode("COMPONENT_NOT_EXISTING");
+        Assert.assertNull(component);
+    }
+
+    private void assertContainerLocation(IDatasetLocationNode containerNode, String containerCode,
+            int numberOfComponents)
+    {
+        Assert.assertTrue(containerNode.isContainer());
+        Assert.assertEquals(containerCode, containerNode.getLocation().getDataSetCode());
+        Assert.assertNull(containerNode.getLocation().getDataSetLocation());
+        Assert.assertEquals(numberOfComponents, containerNode.getComponents().size());
+    }
+
+    private void assertComponentLocation(IDatasetLocationNode componentNode, String componentCode,
+            String componentLocation)
+    {
+        Assert.assertFalse(componentNode.isContainer());
+        Assert.assertEquals(componentCode, componentNode.getLocation().getDataSetCode());
+        Assert.assertEquals(componentLocation, componentNode.getLocation().getDataSetLocation());
+        Assert.assertEquals(0, componentNode.getComponents().size());
     }
 
     private void assertSameDataSetsForSameCode(Map<String, ExternalData> dataSetsByCode,
diff --git a/openbis/sourceTest/sql/postgresql/122/008=data_all.tsv b/openbis/sourceTest/sql/postgresql/122/008=data_all.tsv
index a97b64a436c..54f81a845de 100644
--- a/openbis/sourceTest/sql/postgresql/122/008=data_all.tsv
+++ b/openbis/sourceTest/sql/postgresql/122/008=data_all.tsv
@@ -23,3 +23,9 @@
 26	VALIDATIONS_CNTNR-26	6	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	23	1	t	\N	2	\N	\N	\N	\N
 27	VALIDATIONS_IMPOS-27	7	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	23	1	t	\N	2	1	26	\N	\N
 28	VALIDATIONS_PARENT-28	8	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	23	1	t	\N	2	\N	\N	\N	\N
+29	ROOT_CONTAINER	4	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	\N	\N	\N	\N
+30	CONTAINER_1	4	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	\N	29	\N	\N
+31	CONTAINER_2	4	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	\N	29	\N	\N
+32	COMPONENT_1A	2	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	1	30	\N	\N
+33	COMPONENT_2A	2	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	1	31	\N	\N
+34	COMPONENT_1B	2	\N	2011-05-09 10:22:59.203+02	2011-05-09 10:22:59.313+02	f	t	2011-05-09 16:34:44.462776+02	8	1	t	\N	\N	1	30	\N	\N
diff --git a/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv b/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
index 13ee74f4cad..62d8e8972a9 100644
--- a/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
+++ b/openbis/sourceTest/sql/postgresql/122/030=external_data.tsv
@@ -16,3 +16,6 @@
 21	xml/result-21	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
 27	xml/result-27	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
 28	xml/result-28	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
+32	contained/COMPONENT_1A	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
+33	contained/COMPONENT_2A	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
+34	contained/COMPONENT_1B	8	1	4	U	\N	AVAILABLE	\N	\N	f	-50	t
-- 
GitLab