From b2589113ce6d0919f44664e4fcca4a3fd9a660b0 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Fri, 20 Jul 2012 15:09:03 +0000
Subject: [PATCH] SP-219 / BIS-135: Data set parents are cleared when saving an
 unchanged data set edit form

SVN: 26168
---
 .../bo/AbstractDataSetBusinessObject.java     | 45 +++++++++++++------
 .../generic/server/business/bo/DataBO.java    |  9 ++--
 2 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
index cdd16c045d2..b0f71f6dad3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractDataSetBusinessObject.java
@@ -190,33 +190,50 @@ public abstract class AbstractDataSetBusinessObject extends AbstractSampleIdenti
         {
             checkParentDeletion(parent, child.getCode());
         }
-        List<DataSetRelationshipPE> oldParents = new ArrayList<DataSetRelationshipPE>();
-        for (DataSetRelationshipPE r : child.getParentRelationships())
+
+        // get old parents
+        List<DataPE> oldParents = new ArrayList<DataPE>();
+        for (DataSetRelationshipPE oldParentRelation : child.getParentRelationships())
         {
-            oldParents.add(r);
+            oldParents.add(oldParentRelation.getParentDataSet());
+        }
+
+        Set<DataPE> parentsToRemove = new HashSet<DataPE>();
+        Set<DataPE> parentsToAdd = new HashSet<DataPE>();
+
+        // find parents to be added (exist in newParents but do not exist in old parents)
+        for (DataPE newParent : newParents)
+        {
+            if (oldParents.contains(newParent) == false)
+            {
+                parentsToAdd.add(newParent);
+            }
         }
-        for (DataSetRelationshipPE r : oldParents)
+        // find parents to be removed (exist in oldParents but do not exist in new parents)
+        for (DataPE oldParent : oldParents)
         {
-            if (newParents.contains(r.getParentDataSet()))
+            if (newParents.contains(oldParent) == false)
             {
-                newParents.remove(r.getParentDataSet());
+                parentsToRemove.add(oldParent);
             }
         }
+
+        // check cycles
         if (validate)
         {
-            validateParentsRelationshipGraph(child, newParents);
+            validateParentsRelationshipGraph(child, parentsToAdd);
         }
-        for (DataSetRelationshipPE r : oldParents)
+
+        // remove parents
+        for (DataPE parentToRemove : parentsToRemove)
         {
-            if (false == newParents.contains(r.getParentDataSet()))
-            {
-                relationshipService.removeParentFromDataSet(session, child, r.getParentDataSet());
-            }
+            relationshipService.removeParentFromDataSet(session, child, parentToRemove);
         }
 
-        for (DataPE newParent : newParents)
+        // add parents
+        for (DataPE parentToAdd : parentsToAdd)
         {
-            relationshipService.addParentToDataSet(session, child, newParent);
+            relationshipService.addParentToDataSet(session, child, parentToAdd);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
index 57eb809783c..ba8cc090f33 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -569,7 +568,7 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
             checkSameSpace(data.getContainer(), data);
         }
 
-        setParents(data, asList(updates.getModifiedParentDatasetCodesOrNull()));
+        setParents(data, asListOrNull(updates.getModifiedParentDatasetCodesOrNull()));
         updateComponents(updates.getModifiedContainedDatasetCodesOrNull());
         checkSameSpace(data, data.getContainedDataSets()); // even if components were not changed
         updateFileFormatType(data, updates.getFileFormatTypeCode());
@@ -579,11 +578,11 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
         validateAndSave();
     }
 
-    private List<String> asList(String[] arrayOrNull)
+    private List<String> asListOrNull(String[] arrayOrNull)
     {
         if (arrayOrNull == null)
         {
-            return Collections.emptyList();
+            return null;
         } else
         {
             return Arrays.asList(arrayOrNull);
@@ -614,7 +613,7 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
             removeComponents(currentComponents);
 
             final Set<String> currentCodes = extractCodes(currentComponents);
-            final Set<String> newCodes = asSet(asList(modifiedContainedDatasetCodesOrNull));
+            final Set<String> newCodes = asSet(asListOrNull(modifiedContainedDatasetCodesOrNull));
 
             // quick check for direct cycle
             final Set<String> brandNewCodes = new HashSet<String>(newCodes);
-- 
GitLab