From aa0c3c52c820b31aa54734d92a80477a981f02a5 Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Thu, 14 Jul 2011 13:45:51 +0000 Subject: [PATCH] [LMS-2366] changed business rule - deletion of data set parent doesn't require deletion of children (the same as with container-components); - changed deletion code in DAO + tests SVN: 22145 --- .../generic/server/dataaccess/db/DataDAO.java | 19 +++++++---------- .../server/dataaccess/db/DataDAOTest.java | 21 +++++++++++++------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java index d4d05f93949..8eb96cea930 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java @@ -35,7 +35,6 @@ import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.dao.DataAccessException; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; @@ -52,9 +51,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE; -import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE; import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE; import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames; import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; @@ -446,28 +445,26 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple public void delete(DataPE entity) throws DataAccessException { assert entity != null : "entity unspecified"; - if (entity.getChildren().size() > 0) + // Remove children & components and flush changes before deletion. + // Otherwise constraint violation exception will be thrown. + List<DataPE> children = new ArrayList<DataPE>(entity.getChildren()); + for (DataPE child : children) { - throw new DataIntegrityViolationException(String.format( - "Data Set '%s' cannot be deleted because children datasets are connected.", - entity.getCode())); + child.removeParent(entity); } if (entity.isContainer()) { - // Remove components and flush changes before deletion of the container. - // Otherwise constraint violation exception will be thrown. List<DataPE> components = new ArrayList<DataPE>(entity.getContainedDataSets()); for (DataPE component : components) { entity.removeComponent(component); } - flush(); } + flush(); super.delete(entity); } - public void trash(List<DataPE> dataSets, DeletionPE deletion) - throws DataAccessException + public void trash(List<DataPE> dataSets, DeletionPE deletion) throws DataAccessException { // TODO 2011-06-16, Piotr Buczek: could be done faster with bulk update for (DataPE dataSet : dataSets) diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java index 7355cf145b4..95528b00e52 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java @@ -28,7 +28,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.springframework.dao.DataIntegrityViolationException; import org.testng.AssertJUnit; import org.testng.annotations.Test; @@ -40,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ILocatorTypeDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO; import ch.systemsx.cisd.openbis.generic.shared.Constants; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetPropertyPE; @@ -80,7 +80,6 @@ public final class DataDAOTest extends AbstractDAOTest private final String VIRTUAL_DATA_SET_TYPE_CODE = "CONTAINER_TYPE"; - @Test public final void testListSampleDataSets() { @@ -366,7 +365,7 @@ public final class DataDAOTest extends AbstractDAOTest assertFalse(retrievedPropertyType.getPropertyValues().contains(property)); } - // deleted sample had parent connected that should not have been deleted + // deleted data set had parent connected that should not have been deleted // NOTE: somehow cannot get parents even though connection is the same as with children // DataPE parent = deletedData.tryGetParent(); // assertNotNull(parent); @@ -392,17 +391,27 @@ public final class DataDAOTest extends AbstractDAOTest assertNull(preservedComponent.getContainer()); } - @Test(expectedExceptions = DataIntegrityViolationException.class) - public final void testDeleteFailWithChildrenDatasets() + @Test + public final void testDeleteParentPreservesChildren() { final IDataDAO dataDAO = daoFactory.getDataDAO(); final DataPE deletedData = findData(PARENT_CODE); - // Deleted data set should have 'child' data sets which prevent it from deletion. + // Deleted data set should have 'child' data sets. assertFalse(deletedData.getChildren().isEmpty()); + List<String> childrenCodes = Code.extractCodes(deletedData.getChildren()); // delete dataDAO.delete(deletedData); + + // test successful deletion of data set + assertNull(dataDAO.tryGetByTechId(TechId.create(deletedData))); + + // deleted data set had child connected that should not have been deleted + for (String child : childrenCodes) + { + findData(child); + } } protected VocabularyTermPE pickAStorageFormatVocabularyTerm() -- GitLab