From f79880b7ac59f9a4721c3deaa8c2e527724e92dd Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 15 Feb 2011 12:58:47 +0000
Subject: [PATCH] LMS-2040 bug fixing
 HCSImageDatasetLoader.getSegmentationImageDatasets. Tests written for loading
 child data sets like segmentation images and feature vectors.

SVN: 19976
---
 .../api/v1/ScreeningClientApiTester.java      |  40 +++++
 .../logic/FeatureVectorDatasetLoader.java     |  80 +---------
 .../server/logic/HCSImageDatasetLoader.java   | 103 ++++++++++--
 .../logic/FeatureVectorDatasetLoaderTest.java | 125 +++++++++++++++
 .../logic/HCSImageDatasetLoaderTest.java      | 148 ++++++++++++++++++
 5 files changed, 403 insertions(+), 93 deletions(-)
 create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
 create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java
index 135f28e0036..371787ab23d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java
@@ -46,6 +46,7 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPasswordField;
 import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.text.JTextComponent;
 
@@ -153,6 +154,15 @@ public class ScreeningClientApiTester
                         loadImagesByDataSetCode();
                     }
                 });
+            JMenuItem overlayItem = new JMenuItem("List Overlay Data Sets");
+            callApiMenu.add(overlayItem);
+            overlayItem.addActionListener(new ActionListener()
+                {
+                    public void actionPerformed(ActionEvent e)
+                    {
+                        loadOverlays();
+                    }
+                });
         }
         
         void setUp(String[] args)
@@ -180,6 +190,36 @@ public class ScreeningClientApiTester
             }
         }
         
+        private void loadOverlays()
+        {
+            content.removeAll();
+            final JPanel panel = new JPanel();
+            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+            content.add(panel, BorderLayout.NORTH);
+            JTextArea textArea = new JTextArea();
+            textArea.setEditable(false);
+            content.add(textArea, BorderLayout.CENTER);
+            List<Plate> plates = facade.listPlates();
+            panel.add(new JLabel(plates.size() + " plates", JLabel.LEFT));
+            validate(panel);
+            List<ImageDatasetReference> rawImageDatasets = facade.listRawImageDatasets(plates);
+            panel.add(new JLabel(rawImageDatasets.size() + " raw image data sets", JLabel.LEFT));
+            validate(panel);
+            List<ImageDatasetReference> overlays = facade.listSegmentationImageDatasets(plates);
+            panel.add(new JLabel(overlays.size() + " overlay data sets:", JLabel.LEFT));
+            StringBuilder builder = new StringBuilder();
+            for (ImageDatasetReference overlay : overlays)
+            {
+                builder.append(overlay).append('\n');
+                ImageDatasetReference parent = overlay.getParentImageDatasetReference();
+                if (parent != null)
+                {
+                    builder.append("      overlay data set of ").append(parent).append('\n');
+                }
+            }
+            textArea.setText(builder.toString());
+        }
+        
         private void loadPlates()
         {
             content.removeAll();
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
index cc4381c9cfa..af7ae73c799 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
@@ -21,10 +21,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
-import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
@@ -103,7 +100,6 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
     private void loadFeatureVectorDatasets()
     {
         final Map<Long, ExternalData> featureVectorDatasetSet = new HashMap<Long, ExternalData>();
-        IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
 
         List<ExternalData> imageDatasets = new ArrayList<ExternalData>();
         for (ExternalData dataset : getDatasets())
@@ -118,83 +114,11 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
                 imageDatasets.add(dataset);
             }
         }
-
-        List<ExternalData> connectedFeatureVectorDatasets =
-                listChildrenFeatureVectorDatasets(datasetLister, extractIds(imageDatasets));
-        Map<Long, Set<Long>> featureVectorToImageDatasetIdsMap =
-                datasetLister.listParentIds(extractIds(connectedFeatureVectorDatasets));
-        Map<Long, List<ExternalData>> featureVectorToImageDatasetsMap =
-                createFeatureVectorToImageDatasetsMap(featureVectorToImageDatasetIdsMap,
-                        imageDatasets);
-        // Implementation note: some data sets in this loop may overwrite data from the first loop.
-        // This is intended as we want to keep the parent relationship of the feature vector data
-        // sets, if they exist.
-        for (ExternalData fv : connectedFeatureVectorDatasets)
-        {
-            List<ExternalData> parentImageDatasets =
-                    featureVectorToImageDatasetsMap.get(fv.getId());
-            if (parentImageDatasets != null)
-            {
-                fv.setParents(parentImageDatasets);
-            }
-            featureVectorDatasetSet.put(fv.getId(), fv);
-        }
+        
+        gatherChildrenDataSets(featureVectorDatasetSet, imageDatasets, featureVectorDatasetTypeCode);
         featureVectorDatasets = featureVectorDatasetSet.values();
     }
 
-    private List<ExternalData> listChildrenFeatureVectorDatasets(IDatasetLister datasetLister,
-            Collection<Long> imageDatasetIds)
-    {
-        List<ExternalData> datasets = datasetLister.listByParentTechIds(imageDatasetIds);
-        return ScreeningUtils.filterExternalDataByTypePattern(datasets,
-                featureVectorDatasetTypeCode);
-    }
-
-    private static Map<Long/* feature vector dataset id */, List<ExternalData/* image dataset */>> createFeatureVectorToImageDatasetsMap(
-            Map<Long, Set<Long>> featureVectorToImageDatasetsMap, List<ExternalData> imageDatasets)
-    {
-        Map<Long, List<ExternalData>> featureVectorToImageDatasetMap =
-                new HashMap<Long, List<ExternalData>>();
-        for (Entry<Long, Set<Long>> entry : featureVectorToImageDatasetsMap.entrySet())
-        {
-            List<ExternalData> parentImageDatasets =
-                    findDatasetsWithIds(entry.getValue(), imageDatasets);
-            // NOTE: if a feature vector dataset has more than one image dataset parent, all the
-            // parents will be ignored.
-            if (parentImageDatasets.size() == 1)
-            {
-                Long featureVectorDatasetId = entry.getKey();
-                featureVectorToImageDatasetMap.put(featureVectorDatasetId, parentImageDatasets);
-            }
-        }
-        return featureVectorToImageDatasetMap;
-    }
-
-    // returns all dataset which have an id contained in the specified id set
-    private static List<ExternalData> findDatasetsWithIds(Set<Long> datasetIds,
-            List<ExternalData> datasets)
-    {
-        List<ExternalData> found = new ArrayList<ExternalData>();
-        for (ExternalData dataset : datasets)
-        {
-            if (datasetIds.contains(dataset.getId()))
-            {
-                found.add(dataset);
-            }
-        }
-        return found;
-    }
-
-    private static Collection<Long> extractIds(List<ExternalData> datasets)
-    {
-        List<Long> ids = new ArrayList<Long>();
-        for (ExternalData dataset : datasets)
-        {
-            ids.add(dataset.getId());
-        }
-        return ids;
-    }
-
     private List<FeatureVectorDatasetReference> asFeatureVectorDatasetReferences()
     {
         List<FeatureVectorDatasetReference> result = new ArrayList<FeatureVectorDatasetReference>();
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
index 98810053aa9..625579a46b1 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
@@ -18,8 +18,13 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 
+import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
@@ -37,6 +42,49 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
 {
     // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment
 
+    protected static Collection<Long> extractIds(List<ExternalData> datasets)
+    {
+        List<Long> ids = new ArrayList<Long>();
+        for (ExternalData dataset : datasets)
+        {
+            ids.add(dataset.getId());
+        }
+        return ids;
+    }
+
+    private static Map<Long/* child data set id */, List<ExternalData/* parent data sets */>> createChildDataSetToParentDataSetsMap(
+            Map<Long, Set<Long>> childIdToParentIdsMap, List<ExternalData> parentDatasets)
+    {
+        Map<Long, List<ExternalData>> childDataSetToParentDataSetsMap =
+                new HashMap<Long, List<ExternalData>>();
+        for (Entry<Long, Set<Long>> entry : childIdToParentIdsMap.entrySet())
+        {
+            List<ExternalData> parents =
+                    findDatasetsWithIds(entry.getValue(), parentDatasets);
+            // NOTE: if a child data set has more than one parent data set, all the
+            // parents will be ignored.
+            if (parents.size() == 1)
+            {
+                Long childId = entry.getKey();
+                childDataSetToParentDataSetsMap.put(childId, parents);
+            }
+        }
+        return childDataSetToParentDataSetsMap;
+    }
+
+    private static List<ExternalData> findDatasetsWithIds(Set<Long> datasetIds, List<ExternalData> datasets)
+    {
+        List<ExternalData> found = new ArrayList<ExternalData>();
+        for (ExternalData dataset : datasets)
+        {
+            if (datasetIds.contains(dataset.getId()))
+            {
+                found.add(dataset);
+            }
+        }
+        return found;
+    }
+
     HCSImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
             String homeSpaceOrNull, Collection<? extends PlateIdentifier> plates,
             String... datasetTypeCodes)
@@ -70,9 +118,20 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
     private List<ExternalData> getSegmentationImageDatasets()
     {
         load();
-        return filterSegmententationImageDatasets();
+        List<ExternalData> imageDatasets = new ArrayList<ExternalData>();
+        for (ExternalData dataset : getDatasets())
+        {
+            if (ScreeningUtils.isBasicHcsImageDataset(dataset))
+            {
+                imageDatasets.add(dataset);
+            }
+        }
+        Map<Long, ExternalData> segmentationImageDataSets = new HashMap<Long, ExternalData>();
+        gatherChildrenDataSets(segmentationImageDataSets, imageDatasets,
+                ScreeningConstants.HCS_SEGMENTATION_IMAGE_DATASET_TYPE_PATTERN);
+        return new ArrayList<ExternalData>(segmentationImageDataSets.values());
     }
-
+    
     /**
      * Return the image datasets references for the specified plates.
      */
@@ -123,19 +182,6 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return result;
     }
 
-    private List<ExternalData> filterSegmententationImageDatasets()
-    {
-        List<ExternalData> result = new ArrayList<ExternalData>();
-        for (ExternalData externalData : getDatasets())
-        {
-            if (ScreeningUtils.isSegmentationHcsImageDataset(externalData))
-            {
-                result.add(externalData);
-            }
-        }
-        return result;
-    }
-
     private List<ImageDatasetReference> asImageDatasetReferences(List<ExternalData> imageDatasets)
     {
         List<ImageDatasetReference> references = new ArrayList<ImageDatasetReference>();
@@ -150,6 +196,33 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return references;
     }
 
+    protected void gatherChildrenDataSets(final Map<Long, ExternalData> childrenDataSets,
+            List<ExternalData> parentDataSets, String childTypePattern)
+    {
+        IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
+        List<ExternalData> filteredChildrenDataSets =
+                ScreeningUtils.filterExternalDataByTypePattern(
+                        datasetLister.listByParentTechIds(extractIds(parentDataSets)),
+                        childTypePattern);
+        Map<Long, Set<Long>> childIdToParentIdsMap =
+                datasetLister.listParentIds(extractIds(filteredChildrenDataSets));
+        Map<Long, List<ExternalData>> childIdToParentDataSetsMap =
+                createChildDataSetToParentDataSetsMap(childIdToParentIdsMap, parentDataSets);
+        // Implementation note: some data sets in this loop may overwrite data from the first loop.
+        // This is intended as we want to keep the parent relationship of the feature vector data
+        // sets, if they exist.
+        for (ExternalData child : filteredChildrenDataSets)
+        {
+            List<ExternalData> parentImageDatasets =
+                    childIdToParentDataSetsMap.get(child.getId());
+            if (parentImageDatasets != null)
+            {
+                child.setParents(parentImageDatasets);
+            }
+            childrenDataSets.put(child.getId(), child);
+        }
+    }
+
     private ExternalData tryGetParent(ExternalData externalData)
     {
         if (externalData.getParents() != null && externalData.getParents().size() == 1)
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
new file mode 100644
index 00000000000..99b15b63391
--- /dev/null
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.jmock.Expectations;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.test.RecordingMatcher;
+import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
+import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class FeatureVectorDatasetLoaderTest extends AbstractServerTestCase
+{
+    private IScreeningBusinessObjectFactory screeningBOFactory;
+
+    @BeforeMethod
+    public void beforeMethod()
+    {
+        screeningBOFactory = context.mock(IScreeningBusinessObjectFactory.class);
+    }
+    
+    @Test
+    public void testGetFeatureVectorDatasets()
+    {
+        final RecordingMatcher<ListOrSearchSampleCriteria> recordingCriteriaMatcher =
+                new RecordingMatcher<ListOrSearchSampleCriteria>();
+        final ExternalData ids1 = new DataSetBuilder(1l).code("ids1").type("HCS_IMAGE").getDataSet();
+        final ExternalData fds1 = new DataSetBuilder(11l).code("fds1").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet();
+        final ExternalData fds2 = new DataSetBuilder(12l).code("fds2").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet();
+        final ExternalData ids2 = new DataSetBuilder(2l).code("ids2").type("HCS_IMAGE").getDataSet();
+        final ExternalData fds3 = new DataSetBuilder(21l).code("fds3").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet();
+        final ExternalData fds4 = new DataSetBuilder(100l).code("fds4").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet();
+        final ExternalData ds1 = new DataSetBuilder(101l).code("ds1").type("BLABLA").getDataSet();
+        context.checking(new Expectations()
+            {
+                {
+                    one(screeningBOFactory).createSampleLister(SESSION);
+                    will(returnValue(sampleLister));
+                    allowing(screeningBOFactory).createDatasetLister(SESSION);
+                    will(returnValue(datasetLister));
+                    
+                    one(sampleLister).list(with(recordingCriteriaMatcher));
+                    ArrayList<Sample> samples = new ArrayList<Sample>();
+                    samples.add(new SampleBuilder("/S/P1").id(42l).permID("s-1").getSample());
+                    will(returnValue(samples));
+                    
+                    one(datasetLister).listBySampleIds(Arrays.asList(42l));
+                    will(returnValue(Arrays.asList(ids1, fds1, fds2, ids2, fds3, fds4, ds1)));
+                    
+                    one(datasetLister).listByParentTechIds(Arrays.asList(1l, 2l));
+                    will(returnValue(Arrays.asList(fds1, fds2, fds3, ds1)));
+                    
+                    one(datasetLister).listParentIds(Arrays.asList(11l, 12l, 21l));
+                    HashMap<Long, Set<Long>> map = new HashMap<Long, Set<Long>>();
+                    map.put(11l, Collections.singleton(1l));
+                    map.put(12l, Collections.singleton(1l));
+                    map.put(21l, Collections.singleton(2l));
+                    will(returnValue(map));
+                }
+            });
+        List<PlateIdentifier> plateIdentifiers =
+                Arrays.<PlateIdentifier> asList(new PlateIdentifier("P1", "S", "s-1"));
+        FeatureVectorDatasetLoader loader =
+                new FeatureVectorDatasetLoader(SESSION, screeningBOFactory, null, plateIdentifiers);
+        
+        List<ExternalData> datasets = new ArrayList<ExternalData>(loader.getFeatureVectorDatasets());
+        
+        assertEquals("[]", Arrays.asList(recordingCriteriaMatcher.recordedObject().trySampleCodes()).toString());
+        assertEquals("[s-1]", Arrays.asList(recordingCriteriaMatcher.recordedObject().trySamplePermIds()).toString());
+        Collections.sort(datasets, new Comparator<ExternalData>()
+            {
+                public int compare(ExternalData o1, ExternalData o2)
+                {
+                    return o1.getCode().compareTo(o2.getCode());
+                }
+            });
+        assertSame(fds1, datasets.get(0));
+        assertSame(ids1, datasets.get(0).getParents().iterator().next());
+        assertEquals(1, datasets.get(0).getParents().size());
+        assertSame(fds2, datasets.get(1));
+        assertSame(ids1, datasets.get(1).getParents().iterator().next());
+        assertEquals(1, datasets.get(1).getParents().size());
+        assertSame(fds3, datasets.get(2));
+        assertSame(ids2, datasets.get(2).getParents().iterator().next());
+        assertEquals(1, datasets.get(2).getParents().size());
+        assertSame(fds4, datasets.get(3));
+        assertEquals(null, datasets.get(3).getParents());
+        assertEquals(4, datasets.size());
+        context.assertIsSatisfied();
+    }
+}
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java
new file mode 100644
index 00000000000..8ad5b2c618a
--- /dev/null
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.jmock.Expectations;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.test.RecordingMatcher;
+import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataStoreBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
+import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetReference;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class HCSImageDatasetLoaderTest extends AbstractServerTestCase
+{
+    private static final String STORE_CODE = "store-1";
+    private static final String DOWNLOAD_URL = "http://download";
+    private static final String HOST_URL = "http://host";
+    
+    private IScreeningBusinessObjectFactory screeningBOFactory;
+
+    @BeforeMethod
+    public void beforeMethod()
+    {
+        screeningBOFactory = context.mock(IScreeningBusinessObjectFactory.class);
+    }
+    
+    private DataSetBuilder dataSet(long id)
+    {
+        DataStoreBuilder dataStoreBuilder = new DataStoreBuilder(STORE_CODE);
+        dataStoreBuilder.hostUrl(HOST_URL).downloadUrl(DOWNLOAD_URL);
+        Experiment experiment = new ExperimentBuilder().identifier("/S/P/E1").getExperiment();
+        return new DataSetBuilder(id).store(dataStoreBuilder.getStore()).experiment(experiment);
+    }
+    
+    @Test
+    public void testGetSegmentationImageDatasetReferences()
+    {
+        final RecordingMatcher<ListOrSearchSampleCriteria> recordingCriteriaMatcher =
+            new RecordingMatcher<ListOrSearchSampleCriteria>();
+        SampleBuilder sampleBuilder = new SampleBuilder("/S/P1").id(42l).permID("s-1");
+        VocabularyTerm value = new VocabularyTerm();
+        value.setCode("96_WELLS_8X12");
+        sampleBuilder.property(ScreeningConstants.PLATE_GEOMETRY).value(value);
+        final Sample sample = sampleBuilder.getSample();
+        final ExternalData ids1 = dataSet(1l).code("ids1").type("HCS_IMAGE").sample(sample).getDataSet();
+        final ExternalData sds1 = dataSet(11l).code("sds1").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet();
+        final ExternalData sds2 = dataSet(12l).code("sds2").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet();
+        final ExternalData ids2 = dataSet(2l).code("ids2").type("HCS_IMAGE").sample(sample).getDataSet();
+        final ExternalData sds3 = dataSet(21l).code("sds3").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet();
+        final ExternalData sds4 = dataSet(100l).code("sds4").type("HCS_IMAGE_SEGMENTATION").getDataSet();
+        final ExternalData ds1 = dataSet(101l).code("ds1").type("BLABLA").sample(sample).getDataSet();
+        context.checking(new Expectations()
+            {
+                {
+                    one(screeningBOFactory).createSampleLister(SESSION);
+                    will(returnValue(sampleLister));
+                    allowing(screeningBOFactory).createDatasetLister(SESSION);
+                    will(returnValue(datasetLister));
+
+                    one(sampleLister).list(with(recordingCriteriaMatcher));
+                    ArrayList<Sample> samples = new ArrayList<Sample>();
+                    samples.add(sample);
+                    will(returnValue(samples));
+
+                    one(datasetLister).listBySampleIds(Arrays.asList(42l));
+                    will(returnValue(Arrays.asList(ids1, sds1, sds2, ids2, sds3, sds4, ds1)));
+
+                    one(datasetLister).listByParentTechIds(Arrays.asList(1l, 2l));
+                    will(returnValue(Arrays.asList(sds1, sds2, sds3, ds1)));
+
+                    one(datasetLister).listParentIds(Arrays.asList(11l, 12l, 21l));
+                    HashMap<Long, Set<Long>> map = new HashMap<Long, Set<Long>>();
+                    map.put(11l, Collections.singleton(1l));
+                    map.put(12l, Collections.singleton(1l));
+                    map.put(21l, Collections.singleton(2l));
+                    will(returnValue(map));
+                }
+            });
+        List<PlateIdentifier> plateIdentifiers =
+                Arrays.<PlateIdentifier> asList(new PlateIdentifier("P1", "S", "s-1"));
+        HCSImageDatasetLoader loader =
+                new HCSImageDatasetLoader(SESSION, screeningBOFactory, null, plateIdentifiers);
+
+        List<ImageDatasetReference> references = loader.getSegmentationImageDatasetReferences();
+
+        assertEquals("[]", Arrays
+                .asList(recordingCriteriaMatcher.recordedObject().trySampleCodes()).toString());
+        assertEquals("[s-1]",
+                Arrays.asList(recordingCriteriaMatcher.recordedObject().trySamplePermIds())
+                        .toString());
+        Collections.sort(references, new Comparator<ImageDatasetReference>()
+            {
+                public int compare(ImageDatasetReference o1, ImageDatasetReference o2)
+                {
+                    return o1.getDatasetCode().compareTo(o2.getDatasetCode());
+                }
+            });
+        assertEquals("sds1 (plate: /S/P1 [s-1])", references.get(0).toString());
+        assertEquals("ids1 (plate: /S/P1 [s-1])", references.get(0).getParentImageDatasetReference().toString());
+        assertEquals("sds2 (plate: /S/P1 [s-1])", references.get(1).toString());
+        assertEquals("ids1 (plate: /S/P1 [s-1])", references.get(1).getParentImageDatasetReference().toString());
+        assertEquals("sds3 (plate: /S/P1 [s-1])", references.get(2).toString());
+        assertEquals("ids2 (plate: /S/P1 [s-1])", references.get(2).getParentImageDatasetReference().toString());
+        assertEquals(3, references.size());
+        context.assertIsSatisfied();
+
+    }
+
+}
-- 
GitLab