From 247a0b5876d7bd9bb9ef8285ebaec00feb5f721f Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Tue, 8 Jun 2010 07:57:44 +0000
Subject: [PATCH] [LMS-1570] decrease number of loaded samples (load by
 containers)

SVN: 16315
---
 .../plugin/generic/server/GenericServer.java  | 21 +++++++--
 .../server/SampleRegisterOrUpdateUtil.java    | 46 +++++++++++++------
 .../generic/server/GenericServerTest.java     | 25 ++++++++++
 3 files changed, 76 insertions(+), 16 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 1edcea074df..4ce8a4a0883 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -57,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -274,10 +275,24 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
 
     private void registerOrUpdate(final Session session, NewSamplesWithTypes samples)
     {
-        List<Sample> existingSamples =
+        List<Sample> existingSamples = new ArrayList<Sample>();
+        List<String> extractCodes =
+                SampleRegisterOrUpdateUtil.extractCodes(samples.getNewSamples(), false);
+        List<Sample> list =
                 businessObjectFactory.createSampleLister(session).list(
-                        SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(samples
-                                .getNewSamples()));
+                        SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(extractCodes));
+        existingSamples.addAll(list);
+        List<String> codes = SampleRegisterOrUpdateUtil.extractCodes(samples.getNewSamples(), true);
+        ListOrSearchSampleCriteria criteria =
+                SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(codes);
+        List<Sample> existingContainers =
+                businessObjectFactory.createSampleLister(session).list(criteria);
+        for (Sample s : existingContainers)
+        {
+            existingSamples.addAll(businessObjectFactory.createSampleLister(session).list(
+                    new ListOrSearchSampleCriteria(ListOrSearchSampleCriteria
+                            .createForContainer(new TechId(s.getId())))));
+        }
         List<NewSample> samplesToUpdate =
                 SampleRegisterOrUpdateUtil.getSamplesToUpdate(samples, existingSamples);
         List<NewSample> samplesToRegister = new ArrayList<NewSample>(samples.getNewSamples());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
index 1a6748dd991..ab9fd599696 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
@@ -17,10 +17,9 @@
 package ch.systemsx.cisd.openbis.plugin.generic.server;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
-
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
@@ -35,6 +34,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFa
  */
 public class SampleRegisterOrUpdateUtil
 {
+    private static final String CODE_SEPARATOR = ":";
+
     private static final String INSTANCE_SEPARATOR = "/";
 
     /**
@@ -60,13 +61,8 @@ public class SampleRegisterOrUpdateUtil
     /**
      * Creates {@link ListOrSearchSampleCriteria} narrowing listing result to samples given codes.
      */
-    static ListOrSearchSampleCriteria createListSamplesByCodeCriteria(List<NewSample> samples)
+    static ListOrSearchSampleCriteria createListSamplesByCodeCriteria(List<String> codes)
     {
-        List<String> codes = new ArrayList<String>();
-        for (NewSample s : samples)
-        {
-            codes.add(extractCodeForSampleListingCriteria(s));
-        }
         String[] codesAsArray = codes.toArray(new String[0]);
         ListOrSearchSampleCriteria criteria = new ListOrSearchSampleCriteria(codesAsArray);
         return criteria;
@@ -100,11 +96,35 @@ public class SampleRegisterOrUpdateUtil
 
     }
 
-    private static String extractCodeForSampleListingCriteria(NewSample s)
+    private static String extractCode(String id)
     {
-        SampleIdentifier parsedIdentifier = SampleIdentifierFactory.parse(s.getIdentifier());
-        String subcode = parsedIdentifier.getSampleSubCode();
-        String code = parsedIdentifier.getSampleCode();
-        return StringUtils.isBlank(subcode) ? code : subcode;
+        assert id != null;
+        if (id.contains(CODE_SEPARATOR))
+        {
+            return id.substring(0, id.indexOf(CODE_SEPARATOR));
+        } else
+        {
+            return id;
+        }
+    }
+
+    /**
+     * If <var>withContainers</var> is true, containers codes are extracted, otherwise - sample
+     * codes.
+     */
+    public static List<String> extractCodes(List<NewSample> newSamples, boolean withContainers)
+    {
+        HashSet<String> set = new HashSet<String>();
+        for (NewSample s : newSamples)
+        {
+            String identifierWithoutInstance = dropDatabaseInstance(s.getIdentifier());
+            boolean hasContainer = identifierWithoutInstance.contains(CODE_SEPARATOR);
+            if (hasContainer == withContainers)
+            {
+                SampleIdentifier parsed = SampleIdentifierFactory.parse(s.getIdentifier());
+                set.add(extractCode(parsed.getSampleCode()));
+            }
+        }
+        return new ArrayList<String>(set);
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index 585cdfbaeb5..320e5b588a9 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -232,6 +232,31 @@ public final class GenericServerTest extends AbstractServerTestCase
         context.assertIsSatisfied();
     }
 
+    @Test
+    public final void testRegisterOrUpdateSamplesWithoutUpdate()
+    {
+        prepareGetSession();
+        final SampleTypePE sampleTypePE = CommonTestUtils.createSampleType();
+        final SampleType sampleType = new SampleType();
+        sampleType.setCode(sampleTypePE.getCode());
+        final List<NewSample> newSamples = new ArrayList<NewSample>();
+        newSamples.add(createNewSample("one"));
+        newSamples.add(createNewSample("two"));
+        List<NewSamplesWithTypes> samplesWithTypes = new ArrayList<NewSamplesWithTypes>();
+        samplesWithTypes.add(new NewSamplesWithTypes(sampleType, newSamples));
+        context.checking(new Expectations()
+            {
+                {
+                    one(sampleTypeDAO).tryFindSampleTypeByCode(sampleTypePE.getCode());
+                    will(returnValue(sampleTypePE));
+
+                    one(sampleTypeSlaveServerPlugin).registerSamples(SESSION, newSamples);
+                }
+            });
+        createServer().registerOrUpdateSamples(SESSION_TOKEN, samplesWithTypes);
+        context.assertIsSatisfied();
+    }
+
     @Test
     public final void testRegisterSamples()
     {
-- 
GitLab