From 30a2453492321ee94cc640428756d23a3d593159 Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Tue, 31 Jul 2012 11:57:19 +0000
Subject: [PATCH] MINOR : Fix bug that causes loss of sample parents in sample
 update from DSS transaction

SVN: 26291
---
 .../api/v1/impl/ConversionUtils.java          | 17 +++++++---
 .../registrator/api/v1/impl/Sample.java       | 31 ++++++++++++++++++-
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
index 26ddfa67f5b..1a9a3a66cd0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
@@ -83,7 +83,7 @@ public class ConversionUtils
     {
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment =
                 apiExperiment.getExperiment();
-        
+
         ExperimentUpdatesDTO updates = new ExperimentUpdatesDTO();
 
         updates.setVersion(experiment.getModificationDate());
@@ -138,11 +138,18 @@ public class ConversionUtils
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample = apiSample.getSample();
         Set<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample> sampleParents =
                 sample.getParents();
-        String[] parentIdentifiers = new String[sampleParents.size()];
-        int i = 0;
-        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample parent : sampleParents)
+        String[] parentIdentifiers;
+        if (apiSample.getUpdateDetails().isParentsUpdateRequested())
+        {
+            parentIdentifiers = new String[sampleParents.size()];
+            int i = 0;
+            for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample parent : sampleParents)
+            {
+                parentIdentifiers[i++] = parent.getIdentifier();
+            }
+        } else
         {
-            parentIdentifiers[i++] = parent.getIdentifier();
+            parentIdentifiers = null;
         }
 
         List<NewAttachment> attachments = Collections.emptyList();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Sample.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Sample.java
index e9e568d7c25..db6990810ae 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Sample.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/Sample.java
@@ -19,12 +19,14 @@ package ch.systemsx.cisd.etlserver.registrator.api.v1.impl;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleBatchUpdateDetails;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
@@ -38,6 +40,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 public class Sample extends SampleImmutable implements ISample
 {
 
+    private final SampleBatchUpdateDetails updateDetails;
+
     /**
      * This code is derived from
      * {@link ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder}, which is in
@@ -77,17 +81,29 @@ public class Sample extends SampleImmutable implements ISample
     public Sample(ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample)
     {
         super(sample);
+        updateDetails = new SampleBatchUpdateDetails();
+        initializeUpdateDetails();
     }
 
     public Sample(SampleImmutable sample)
     {
-        super(sample.getSample());
+        this(sample.getSample());
     }
 
     public Sample(String sampleIdentifier, String permId)
     {
         super(buildSampleWithIdentifier(sampleIdentifier), false);
         getSample().setPermId(permId);
+        updateDetails = new SampleBatchUpdateDetails();
+        initializeUpdateDetails();
+    }
+
+    private void initializeUpdateDetails()
+    {
+        updateDetails.setExperimentUpdateRequested(false);
+        updateDetails.setContainerUpdateRequested(false);
+        updateDetails.setParentsUpdateRequested(false);
+        updateDetails.setPropertiesToUpdate(new HashSet<String>());
     }
 
     @Override
@@ -95,12 +111,15 @@ public class Sample extends SampleImmutable implements ISample
     {
         ExperimentImmutable exp = (ExperimentImmutable) experiment;
         getSample().setExperiment(exp.getExperiment());
+        updateDetails.setExperimentUpdateRequested(true);
     }
 
     @Override
     public void setPropertyValue(String propertyCode, String propertyValue)
     {
         EntityHelper.createOrUpdateProperty(getSample(), propertyCode, propertyValue);
+        Set<String> propertiesToUpdate = updateDetails.getPropertiesToUpdate();
+        propertiesToUpdate.add(propertyCode);
     }
 
     @Override
@@ -117,6 +136,7 @@ public class Sample extends SampleImmutable implements ISample
     {
         SampleImmutable containerImpl = (SampleImmutable) container;
         getSample().setContainer(containerImpl.getSample());
+        updateDetails.setContainerUpdateRequested(true);
     }
 
     @Override
@@ -130,6 +150,15 @@ public class Sample extends SampleImmutable implements ISample
         }
 
         getSample().setParents(parents);
+        updateDetails.setParentsUpdateRequested(true);
+    }
+
+    /**
+     * Package-visible accessor for use in converting the Sample to an updates DTO.
+     */
+    SampleBatchUpdateDetails getUpdateDetails()
+    {
+        return updateDetails;
     }
 
 }
-- 
GitLab