From d7bd34e06f60453b7ce8a85fac91983ef3c770b3 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Wed, 18 Nov 2009 08:51:24 +0000
Subject: [PATCH] [LMS-1263] enriched samples connected to tracked datasets

SVN: 13441
---
 .../generic/server/TrackingServer.java        | 60 ++++++++++++++++---
 .../generic/shared/ITrackingServer.java       |  2 +-
 .../openbis/generic/OpenbisClientTest.java    |  7 ++-
 3 files changed, 58 insertions(+), 11 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
index c6a9146e7bf..a3324303257 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
@@ -16,7 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory;
@@ -65,22 +68,65 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
     // ITrackingServer
     //
 
-    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
+    public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria)
     {
         final Session session = getSession(sessionToken);
 
-        final IDatasetLister datasetLister =
-                businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL());
-        return datasetLister.listByTrackingCriteria(criteria);
+        final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
+        final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria);
+        listerCriteria.setEnrichDependentSamplesWithProperties(true);
+        return sampleLister.list(listerCriteria);
     }
 
-    public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria)
+    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
     {
         final Session session = getSession(sessionToken);
 
+        // retrieve data sets connected to samples of type specified in criteria
+        // (these samples don't have properties loaded but ids are loaded)
+        final IDatasetLister datasetLister =
+                businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL());
+        final List<ExternalData> dataSets = datasetLister.listByTrackingCriteria(criteria);
+        // retrieve samples enriched with their dependent samples and properties
+        // (drawback - samples directly connected to data sets are retrieved twice)
         final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
-        final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria);
+        final ListOrSearchSampleCriteria listerCriteria =
+                new ListOrSearchSampleCriteria(extractConnectedSampleIds(dataSets));
         listerCriteria.setEnrichDependentSamplesWithProperties(true);
-        return sampleLister.list(listerCriteria);
+        final List<Sample> enrichedSamples = sampleLister.list(listerCriteria);
+        // replace data set samples with enriched ones
+        replaceConnectedSamples(dataSets, enrichedSamples);
+        return dataSets;
+    }
+
+    private List<Long> extractConnectedSampleIds(List<ExternalData> dataSets)
+    {
+        final List<Long> sampleIds = new ArrayList<Long>();
+        for (ExternalData dataSet : dataSets)
+        {
+            assert dataSet.getSample() != null : "data set is not connected to a sample";
+            sampleIds.add(dataSet.getSample().getId());
+        }
+        return sampleIds;
     }
+
+    private void replaceConnectedSamples(List<ExternalData> dataSets, List<Sample> enrichedSamples)
+    {
+        // list orders are not the same - map is needed for quick search
+        // <sample id, sample>
+        final Map<Long, Sample> enrichedSamplesMap =
+                new HashMap<Long, Sample>(enrichedSamples.size());
+        for (Sample sample : enrichedSamples)
+        {
+            enrichedSamplesMap.put(sample.getId(), sample);
+        }
+
+        for (ExternalData dataSet : dataSets)
+        {
+            final Sample enrichedSample = enrichedSamplesMap.get(dataSet.getSample().getId());
+            assert enrichedSample != null;
+            dataSet.setSample(enrichedSample);
+        }
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
index daa92d1625c..823fc721c5c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
 
 /**
- * Definition of the client-server interface.
+ * Definition of the client-server interface for tracking creation of samples and datasets.
  * 
  * @author Piotr Buczek
  */
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
index 42c3b79fae0..5e3adc14e50 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
@@ -104,7 +104,7 @@ public class OpenbisClientTest
 
         final String sampleTypeCode = "CELL_PLATE";
         final int lastSeenSampleId = 1000; // compare with 0
-        final int lastSeenDataSetId = 3; // compare with 0
+        final int lastSeenDataSetId = 0; // compare with 3
 
         final TrackingSampleCriteria sampleCriteria =
                 new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId);
@@ -202,10 +202,11 @@ public class OpenbisClientTest
             builder.append(" type", dataSet.getDataSetType());
             builder.append(" properties", toString(dataSet.getProperties()));
             sb.append(builder.toString());
-            final String indent = INDENT;
             if (dataSet.getSample() != null)
             {
-                sb.append("\n" + indent + toString(dataSet.getSample()));
+                final String indent = INDENT;
+                final String newIndent = indent + INDENT;
+                sb.append("\n" + indent + toString(dataSet.getSample(), newIndent));
             }
             return sb.toString();
         }
-- 
GitLab