From 89c6624169af3f18b27c7bb7f4b93dedf5c549fc Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 12 Nov 2010 09:12:39 +0000
Subject: [PATCH] [LMS-1772] tests of registration/update of samples with many
 parents

SVN: 18649
---
 .../generic/shared/basic/dto/NewSample.java   |  13 +-
 .../web/server/GenericClientServiceTest.java  | 171 +++++++++++++++++-
 .../CinaBundleRegistrationTest.java           |   3 +-
 3 files changed, 176 insertions(+), 11 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
index 3ca2619cefa..9168598c802 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
@@ -152,8 +152,17 @@ public class NewSample extends Identifier<NewSample> implements Comparable<NewSa
     @Deprecated
     public final String getParentIdentifier()
     {
-        return getParentsOrNull() == null || getParentsOrNull().length == 0 ? null
-                : getParentsOrNull()[0];
+        if (getParentsOrNull() == null || getParentsOrNull().length == 0)
+        {
+            return null;
+        } else if (getParentsOrNull().length > 1)
+        {
+            throw new IllegalStateException("Sample " + getIdentifier()
+                    + " has more than one parent");
+        } else
+        {
+            return getParentsOrNull()[0];
+        }
     }
 
     /**
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
index 97161fc1917..8c0beb436de 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
@@ -80,18 +80,14 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
 
     private GenericClientService genericClientService;
 
-    @SuppressWarnings("deprecation")
     private final static NewSample createNewSample(final String sampleIdentifier,
-            final String sampleTypeCode, final IEntityProperty[] properties, final String parent,
-            final String container)
+            final String sampleTypeCode, final IEntityProperty[] properties)
     {
         final NewSample newSample = new NewSample();
         newSample.setIdentifier(sampleIdentifier);
         final SampleType sampleType = createSampleType(sampleTypeCode);
         newSample.setSampleType(sampleType);
         newSample.setProperties(properties);
-        newSample.setParentIdentifier(parent);
-        newSample.setContainerIdentifier(container);
         return newSample;
     }
 
@@ -236,8 +232,7 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
     {
         final String sessionKey = "some-session-key";
         final NewSample newSample =
-                createNewSample("/group1/sample1", "MASTER_PLATE", IEntityProperty.EMPTY_ARRAY,
-                        null, null);
+                createNewSample("/group1/sample1", "MASTER_PLATE", IEntityProperty.EMPTY_ARRAY);
         context.checking(new Expectations()
             {
                 {
@@ -367,6 +362,89 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
         context.assertIsSatisfied();
     }
 
+    @Test
+    public final void testRegisterSamplesWithParents() throws IOException
+    {
+        final UploadedFilesBean uploadedFilesBean = new UploadedFilesBean();
+        final String sessionKey = "uploaded-files";
+        final NewSample newSample = new NewSample();
+        newSample.setIdentifier("MP");
+        newSample.setParentsOrNull(new String[]
+            { "MP_1", "MP_2" });
+        newSample.setProperties(new IEntityProperty[0]);
+        final SampleType sampleType = createSampleType("MASTER_PLATE");
+        final String fileName = "originalFileName.txt";
+
+        final List<NewSamplesWithTypes> samplesWithType = new ArrayList<NewSamplesWithTypes>();
+        List<NewSample> newSamples = new ArrayList<NewSample>();
+        newSamples.add(newSample);
+        samplesWithType.add(new NewSamplesWithTypes(sampleType, newSamples));
+        context.checking(new Expectations()
+            {
+                {
+                    prepareGetHttpSession(this);
+                    prepareGetSessionToken(this);
+
+                    allowing(httpSession).getAttribute(sessionKey);
+                    will(returnValue(uploadedFilesBean));
+
+                    allowing(httpSession).removeAttribute(sessionKey);
+
+                    exactly(1).of(multipartFile).getOriginalFilename();
+                    will(returnValue(fileName));
+
+                    one(multipartFile).transferTo(with(any(File.class)));
+                    will(new CustomAction("copy content")
+                        {
+                            public Object invoke(Invocation invocation) throws Throwable
+                            {
+                                final File target = (File) invocation.getParameter(0);
+                                FileUtilities.writeToFile(target,
+                                        "identifier\tparents\nMP\tMP_1,MP_2");
+                                return null;
+                            }
+                        });
+
+                    one(genericServer).registerSamples(with(equal(SESSION_TOKEN)),
+                            with(newSampleWithTypesList()));
+                    will(new CustomAction("check sample")
+                        {
+
+                            @SuppressWarnings(
+                                { "unchecked" })
+                            public Object invoke(Invocation invocation) throws Throwable
+                            {
+                                final List<NewSamplesWithTypes> samplesSecions =
+                                        (List<NewSamplesWithTypes>) invocation.getParameter(1);
+                                assertEquals(1, samplesSecions.size());
+                                final NewSamplesWithTypes samples = samplesSecions.get(0);
+                                // Do not compare sampleType, as the registration code doesn't set
+                                // the database instance.
+                                assertEquals(sampleType.getCode(), samples.getSampleType()
+                                        .getCode());
+                                assertEquals(1, samples.getNewSamples().size());
+                                final NewSample sample = samples.getNewSamples().get(0);
+                                assertEquals("MP", sample.getIdentifier());
+                                assertEquals(2, sample.getParentsOrNull().length);
+                                assertEquals("MP_1", sample.getParentsOrNull()[0]);
+                                assertEquals("MP_2", sample.getParentsOrNull()[1]);
+                                assertEquals(0, sample.getProperties().length);
+                                return null;
+                            }
+                        });
+                }
+            });
+        uploadedFilesBean.addMultipartFile(multipartFile);
+        final List<BatchRegistrationResult> result =
+                genericClientService.registerSamples(sampleType, sessionKey, null);
+        assertEquals(1, result.size());
+        final BatchRegistrationResult batchRegistrationResult = result.get(0);
+        assertEquals(fileName, batchRegistrationResult.getFileName());
+        assertEquals("Registration of 1 sample(s) is complete.",
+                batchRegistrationResult.getMessage());
+        context.assertIsSatisfied();
+    }
+
     @Test
     public final void testUpdateSamples() throws IOException
     {
@@ -424,7 +502,7 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
                                 final NewSample sample1 = samples.getNewSamples().get(0);
                                 assertEquals("/G1/MP1", sample1.getIdentifier());
                                 assertEquals("/G1/MP2", sample1.getContainerIdentifier());
-                                assertEquals(0, sample1.getParentsOrNull().length);
+                                assertEquals(null, sample1.getParentIdentifier());
                                 assertEquals("EXP1", sample1.getExperimentIdentifier());
                                 assertEquals(1, sample1.getProperties().length);
                                 final IEntityProperty prop1 = sample1.getProperties()[0];
@@ -454,6 +532,83 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
         context.assertIsSatisfied();
     }
 
+    @Test
+    public final void testUpdateSamplesWithParents() throws IOException
+    {
+        final UploadedFilesBean uploadedFilesBean = new UploadedFilesBean();
+        final String sessionKey = "uploaded-files";
+
+        final SampleType sampleType = createSampleType("MASTER_PLATE");
+        final String defaultGroupIdentifier = "/G1";
+        final String fileName = "fileName.txt";
+
+        context.checking(new Expectations()
+            {
+                {
+                    prepareGetHttpSession(this);
+                    prepareGetSessionToken(this);
+
+                    allowing(httpSession).getAttribute(sessionKey);
+                    will(returnValue(uploadedFilesBean));
+
+                    allowing(httpSession).removeAttribute(sessionKey);
+
+                    exactly(1).of(multipartFile).getOriginalFilename();
+                    will(returnValue(fileName));
+
+                    one(multipartFile).transferTo(with(any(File.class)));
+                    will(new CustomAction("copy content")
+                        {
+                            public Object invoke(Invocation invocation) throws Throwable
+                            {
+                                final File target = (File) invocation.getParameter(0);
+                                FileUtilities.writeToFile(target, "identifier\tparents\n"
+                                        + "MP_1\t/G1/MP_11, /G1/MP_12\n" + "/G2/MP_2\t/G2/MP_21");
+                                return null;
+                            }
+                        });
+
+                    one(genericServer).updateSamples(with(equal(SESSION_TOKEN)),
+                            with(newSampleWithTypesList()));
+                    will(new CustomAction("check sample")
+                        {
+
+                            @SuppressWarnings("unchecked")
+                            public Object invoke(Invocation invocation) throws Throwable
+                            {
+                                final List<NewSamplesWithTypes> samplesSecions =
+                                        (List<NewSamplesWithTypes>) invocation.getParameter(1);
+                                assertEquals(1, samplesSecions.size());
+                                final NewSamplesWithTypes samples = samplesSecions.get(0);
+                                // Do not compare sampleType, as the update code doesn't check it
+                                assertEquals(2, samples.getNewSamples().size());
+
+                                final NewSample sample1 = samples.getNewSamples().get(0);
+                                assertEquals("/G1/MP_1", sample1.getIdentifier());
+                                assertEquals(2, sample1.getParentsOrNull().length);
+                                assertEquals("/G1/MP_11", sample1.getParentsOrNull()[0]);
+                                assertEquals("/G1/MP_12", sample1.getParentsOrNull()[1]);
+
+                                final NewSample sample2 = samples.getNewSamples().get(1);
+                                assertEquals("/G2/MP_2", sample2.getIdentifier());
+                                assertEquals(1, sample2.getParentsOrNull().length);
+                                assertEquals("/G2/MP_21", sample2.getParentsOrNull()[0]);
+
+                                return null;
+                            }
+                        });
+                }
+            });
+        uploadedFilesBean.addMultipartFile(multipartFile);
+        final List<BatchRegistrationResult> result =
+                genericClientService.updateSamples(sampleType, sessionKey, defaultGroupIdentifier);
+        assertEquals(1, result.size());
+        final BatchRegistrationResult batchRegistrationResult = result.get(0);
+        assertEquals(fileName, batchRegistrationResult.getFileName());
+        assertEquals("Update of 2 sample(s) is complete.", batchRegistrationResult.getMessage());
+        context.assertIsSatisfied();
+    }
+
     @Test
     public void testUpdateMaterials() throws IOException
     {
diff --git a/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CinaBundleRegistrationTest.java b/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CinaBundleRegistrationTest.java
index 4ca8165ea20..36d8c8f7507 100644
--- a/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CinaBundleRegistrationTest.java
+++ b/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CinaBundleRegistrationTest.java
@@ -434,7 +434,7 @@ public abstract class CinaBundleRegistrationTest extends AbstractFileSystemTestC
                                     assertEquals(GRID_SAMPLE_IDENTIFIER, newSample.getIdentifier());
                                     assertEquals(EXPERIMENT_IDENTIFIER.toString(),
                                             newSample.getExperimentIdentifier());
-                                    assertEquals(null, newSample.getParentIdentifier());
+                                    assertEquals(null, newSample.getParentsOrNull());
                                     return true;
                                 }
                                 return false;
@@ -455,6 +455,7 @@ public abstract class CinaBundleRegistrationTest extends AbstractFileSystemTestC
                     // Create the Replica
                     one(openbisService).registerSample(with(new MatcherNoDesc<NewSample>()
                         {
+                            @SuppressWarnings("deprecation")
                             public boolean matches(Object item)
                             {
                                 if (item instanceof NewSample)
-- 
GitLab