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