new tests for TaxonServiceImpl (delete synonym tests)
authorAndreas Müller <a.mueller@bgbm.org>
Thu, 13 Oct 2011 23:46:26 +0000 (23:46 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Thu, 13 Oct 2011 23:46:26 +0000 (23:46 +0000)
.gitattributes
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameDeletionConfigurator.java [deleted file]
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.java
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.testDeleteSynonym.xml [new file with mode: 0644]

index 976843ef51e59e876622c63e94753bc32a2b4743..1ea21085784408cbb15ce8027eacf7e455d75a94 100644 (file)
@@ -1780,7 +1780,6 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MarkerServiceImpl.jav
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MediaServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MicroFormatCategoricalDescriptionBuilder.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MicroFormatQuantitativeDescriptionBuilder.java -text
-cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameDeletionConfigurator.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaNodeComparator.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaTree.java -text
@@ -1898,6 +1897,7 @@ cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/OregonScientific
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/OregonScientificDS6639-DSC_0307-small.tif -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/PolytomousKeyServiceImplTest.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImplTest.xml -text
+cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.testDeleteSynonym.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceSearchTest.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TermServiceImplTest.xml -text
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameDeletionConfigurator.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameDeletionConfigurator.java
deleted file mode 100644 (file)
index 262bdef..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-// $Id$\r
-/**\r
-* Copyright (C) 2009 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-package eu.etaxonomy.cdm.api.service;\r
-\r
-import org.apache.log4j.Logger;\r
-\r
-/**\r
- * This class is used to configure name deletion.\r
- * \r
- * @see INameService#delete(eu.etaxonomy.cdm.model.name.TaxonNameBase)\r
- * \r
- * @author a.mueller\r
- * @date 19.09.2011\r
- *\r
- */\r
-public class NameDeletionConfigurator {\r
-       @SuppressWarnings("unused")\r
-       private static final Logger logger = Logger.getLogger(NameDeletionConfigurator.class);\r
-\r
-\r
-       private boolean removeAllNameRelationships = false;\r
-       \r
-       private boolean ignoreIsBasionymFor = false;\r
-       \r
-       private boolean ignoreIsReplacedSynonymFor = false;\r
-\r
-       private boolean ignoreHasBasionym = true;\r
-       \r
-       private boolean ignoreHasReplacedSynonym = true;\r
-       \r
-       /**\r
-        * If true, all name relationships will be deleted prior to deleting the name.\r
-        * Exceptions will not be thrown due to existing name relationships.\r
-        * @return the removeAllNameRelationships\r
-        */\r
-       public boolean isRemoveAllNameRelationships() {\r
-               return removeAllNameRelationships;\r
-       }\r
-\r
-       /**\r
-        * @param removeAllNameRelationships the removeAllNameRelationships to set\r
-        */\r
-       public void setRemoveAllNameRelationships(boolean removeAllNameRelationships) {\r
-               this.removeAllNameRelationships = removeAllNameRelationships;\r
-       }\r
-\r
-       /**\r
-        * If true, all basionym relationships in which this name is the basionym/original name will be removed.\r
-        * Exceptions will not be thrown due to existing basionym relationships.\r
-        * This value is neglected if {@link #isRemoveAllNameRelationships()} is true.\r
-        * @see #setIgnoreIsBasionymFor(boolean)\r
-        * @return the ignoreIsBasionymFor\r
-        */\r
-       public boolean isIgnoreIsBasionymFor() {\r
-               return ignoreIsBasionymFor;\r
-       }\r
-\r
-       /**\r
-        * @see #isIgnoreIsBasionymFor()\r
-        * @param ignoreIsBasionymFor the ignoreIsBasionymFor to set\r
-        */\r
-       public void setIgnoreIsBasionymFor(boolean ignoreIsBasionymFor) {\r
-               this.ignoreIsBasionymFor = ignoreIsBasionymFor;\r
-       }\r
-\r
-       /**\r
-        * If true, all name relationships in which this name is a replaced synonym will be removed.\r
-        * Exceptions will not be thrown due to existing isReplacedSynonym relationships.\r
-        * This value is neglected if {@link #isRemoveAllNameRelationships()} is true.\r
-        * @see #setIgnoreIsReplacedSynonymFor(boolean)\r
-        * @return the ignoreIsReplacedSynonymFor\r
-        */\r
-       public boolean isIgnoreIsReplacedSynonymFor() {\r
-               return ignoreIsReplacedSynonymFor;\r
-       }\r
-\r
-       /**\r
-        * @see #isIgnoreIsReplacedSynonymFor()\r
-        * @param ignoreIsReplacedSynonymFor the ignoreIsReplacedSynonymFor to set\r
-        */\r
-       public void setIgnoreIsReplacedSynonymFor(boolean ignoreIsReplacedSynonymFor) {\r
-               this.ignoreIsReplacedSynonymFor = ignoreIsReplacedSynonymFor;\r
-       }\r
-       \r
-       /**\r
-        * If true, all basionym relationships in which this name has a basionym/original name will \r
-        * be removed.<BR>\r
-        * Exceptions will not be thrown due to existing hasBasionym relationships.<BR>\r
-        * This value is neglected if {@link #isRemoveAllNameRelationships()} is true.<BR>\r
-        * Default value is <code>true</code>.<BR>\r
-        * @see #setIgnoreHasBasionym(boolean)\r
-        * @return the ignoreHasBasionym\r
-        */\r
-       public boolean isIgnoreHasBasionym() {\r
-               return ignoreHasBasionym;\r
-       }\r
-\r
-       /**\r
-        * @see #isIgnoreHasBasionym()\r
-        * @param ignoreHasBasionym the ignoreHasBasionym to set\r
-        */\r
-       public void setIgnoreHasBasionym(boolean ignoreHasBasionym) {\r
-               this.ignoreHasBasionym = ignoreHasBasionym;\r
-       }\r
-\r
-       /**\r
-        * If true, all replaced synonym relationships in which this name has a \r
-        * replaced synonym will be removed.<BR>\r
-        * Exceptions will not be thrown due to existing hasReplacedSynonym relationships.<BR>\r
-        * This value is neglected if {@link #isRemoveAllNameRelationships()} is true.<BR>\r
-        * Default value is <code>true</code>.<BR>\r
-        * @see #setIgnoreHasBasionym(boolean)\r
-        * @return the ignoreHasReplacedSynonym\r
-        */\r
-       public boolean isIgnoreHasReplacedSynonym() {\r
-               return ignoreHasReplacedSynonym;\r
-       }\r
-\r
-       /**\r
-        * @see #isIgnoreHasReplacedSynonym()\r
-        * @param ignoreHasReplacedSynonym the ignoreHasReplacedSynonym to set\r
-        */\r
-       public void setIgnoreHasReplacedSynonym(boolean ignoreHasReplacedSynonym) {\r
-               this.ignoreHasReplacedSynonym = ignoreHasReplacedSynonym;\r
-       }\r
-       \r
-}\r
index 8d1de12e4bd01ba35df425d42c315cede01d7605..454ad6cc7908e3720b02f8149a01b39adbe9877b 100644 (file)
@@ -18,24 +18,29 @@ import java.util.UUID;
 import org.apache.log4j.Logger;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
+import org.unitils.dbunit.annotation.DataSet;\r
 import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
+import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;\r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
-public class TaxonServiceImplTest extends CdmIntegrationTest {\r
+public class TaxonServiceImplTest extends CdmTransactionalIntegrationTest {\r
        private static final Logger logger = Logger.getLogger(TaxonServiceImplTest.class);\r
        \r
        @SpringBeanByType\r
@@ -224,5 +229,269 @@ public class TaxonServiceImplTest extends CdmIntegrationTest {
        \r
        }\r
        \r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBoolean(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+//             BotanicalName taxonName1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+//             taxonName1.setTitleCache("TaxonName1",true);\r
+//             BotanicalName taxonName2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+//             taxonName2.setTitleCache("TaxonName2",true);\r
+//             BotanicalName synonymName1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+//             synonymName1.setTitleCache("Synonym1",true);\r
+//             BotanicalName synonymName2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+//             synonymName2.setTitleCache("Synonym2",true);\r
+//             \r
+//             Reference<?> sec = null;\r
+//             Taxon taxon1 = Taxon.NewInstance(taxonName1, sec);\r
+//             Taxon taxon2 = Taxon.NewInstance(taxonName2, sec);\r
+//             Synonym synonym1 = Synonym.NewInstance(synonymName1, sec);\r
+//             Synonym synonym2 = Synonym.NewInstance(synonymName2, sec);\r
+//             \r
+//             SynonymRelationship rel1 = taxon1.addSynonym(synonym1, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF());\r
+//             SynonymRelationship rel = taxon2.addSynonym(synonym1, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF());\r
+//             rel.setProParte(true);\r
+//             rel1.setProParte(true);\r
+//             \r
+//             service.save(taxon1);\r
+//             service.save(synonym2);\r
+//             \r
+//             this.setComplete();\r
+//             this.endTransaction();\r
+//             \r
+//             \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               \r
+//             UUID uuidTaxon1=UUID.fromString("c47fdb72-f32c-452e-8305-4b44f01179d0");\r
+//             UUID uuidTaxon2=UUID.fromString("2d9a642d-5a82-442d-8fec-95efa978e8f8");\r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+//             UUID uuidSynonym2=UUID.fromString("f8d86dc9-5f18-4877-be46-fbb9412465e4");\r
+               \r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               service.deleteSynonym(synonym1, null, true);\r
+               \r
+               this.commitAndStartNewTransaction(tableNames);\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 1 synonym left in the database", 1, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 3 names left in the database", 3, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               Assert.assertEquals("There should be no relationship left in the database", 0, nRelations);\r
+       }\r
+       \r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBooleanRelToOneTaxon(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+               \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               \r
+               UUID uuidTaxon1=UUID.fromString("c47fdb72-f32c-452e-8305-4b44f01179d0");\r
+               UUID uuidTaxon2=UUID.fromString("2d9a642d-5a82-442d-8fec-95efa978e8f8");\r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+//             UUID uuidSynonym2=UUID.fromString("f8d86dc9-5f18-4877-be46-fbb9412465e4");\r
+               \r
+               Taxon taxon2 = (Taxon)service.load(uuidTaxon2);\r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               \r
+               taxon2.removeSynonym(synonym1, false);\r
+               service.saveOrUpdate(taxon2);\r
+               this.setComplete();\r
+               this.endTransaction();\r
+               \r
+               this.startNewTransaction();\r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               Assert.assertEquals("There should be 1 relationship left in the database", 1, nRelations);\r
+\r
+               taxon2 = (Taxon)service.load(uuidTaxon2);\r
+               synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               \r
+               service.deleteSynonym(synonym1, null, true);\r
+               \r
+               this.commitAndStartNewTransaction(tableNames);\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 1 synonym left in the database", 1, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 3 names left in the database", 3, nNames);\r
+               nRelations = service.countAllRelationships();\r
+               Assert.assertEquals("There should be no relationship left in the database", 0, nRelations);\r
+\r
+       }\r
+       \r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBooleanDeleteOneTaxon(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+               \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               \r
+               UUID uuidTaxon1=UUID.fromString("c47fdb72-f32c-452e-8305-4b44f01179d0");\r
+               UUID uuidTaxon2=UUID.fromString("2d9a642d-5a82-442d-8fec-95efa978e8f8");\r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+               UUID uuidSynonym2=UUID.fromString("f8d86dc9-5f18-4877-be46-fbb9412465e4");\r
+               \r
+               Taxon taxon1 = (Taxon)service.load(uuidTaxon1);\r
+               Taxon taxon2 = (Taxon)service.load(uuidTaxon2);\r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               \r
+               service.deleteSynonym(synonym1, taxon1, true);\r
+               \r
+               this.commitAndStartNewTransaction(tableNames);\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should still be 2 synonyms left in the database (synonym is related to taxon2)", 2, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 4 names left in the database (name not deleted as synonym was not deleted)", 4, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               Assert.assertEquals("There should be 1 relationship left in the database", 1, nRelations);\r
+               \r
+       }\r
+       \r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBooleanWithRelatedName(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+               \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               \r
+               UUID uuidTaxon1=UUID.fromString("c47fdb72-f32c-452e-8305-4b44f01179d0");\r
+               UUID uuidTaxon2=UUID.fromString("2d9a642d-5a82-442d-8fec-95efa978e8f8");\r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+               UUID uuidSynonym2=UUID.fromString("f8d86dc9-5f18-4877-be46-fbb9412465e4");\r
+               UUID uuidSynonymName2=UUID.fromString("613f3c93-013e-4ffc-aadc-1c98d71c335e");\r
+               \r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               TaxonNameBase name2 = (TaxonNameBase)nameService.load(uuidSynonymName2);\r
+               synonym1.getName().addRelationshipFromName(name2, NameRelationshipType.LATER_HOMONYM(), null);\r
+               \r
+               service.deleteSynonym(synonym1, null, true);\r
+               \r
+               this.commitAndStartNewTransaction(tableNames);\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should still be 1 synonyms left in the database", 1, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 4 names left in the database (name is related to synonymName2)", 4, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               //may change with better implementation of countAllRelationships (see #2653)\r
+               Assert.assertEquals("There should be 1 relationship left in the database (the name relationship)", 1, nRelations);\r
+\r
+               //clean up database\r
+               name2 = (TaxonNameBase)nameService.load(uuidSynonymName2);\r
+               NameRelationship rel = CdmBase.deproxy(name2.getNameRelations().iterator().next(), NameRelationship.class);\r
+               name2.removeNameRelationship(rel);\r
+               nameService.save(name2);\r
+               this.setComplete();\r
+               this.endTransaction();\r
+               \r
+       }\r
+\r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBooleanWithRollback(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+               \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               //may change with better implementation of countAllRelationships (see #2653)\r
+               Assert.assertEquals("There should be 2 relationship in the database (the 2 synonym relationship) but no name relationship", 2, nRelations);\r
+               \r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+               UUID uuidSynonymName2=UUID.fromString("613f3c93-013e-4ffc-aadc-1c98d71c335e");\r
+               \r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               TaxonNameBase name2 = (TaxonNameBase)nameService.load(uuidSynonymName2);\r
+               synonym1.getName().addRelationshipFromName(name2, NameRelationshipType.LATER_HOMONYM(), null);\r
+               \r
+               service.deleteSynonym(synonym1, null, true);\r
+               \r
+               this.rollback();\r
+//             printDataSet(System.out, tableNames);\r
+               this.startNewTransaction();\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should still be 2 synonyms left in the database", 2, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 4 names left in the database", 4, nNames);\r
+               nRelations = service.countAllRelationships();\r
+               //may change with better implementation of countAllRelationships (see #2653)\r
+               Assert.assertEquals("There should be 2 relationship in the database (the 2 synonym relationship) but no name relationship", 2, nRelations);\r
+               \r
+       }\r
+       \r
+       @Test\r
+       @DataSet("TaxonServiceImplTest.testDeleteSynonym.xml")\r
+       public final void testDeleteSynonymSynonymTaxonBooleanWithoutTransaction(){\r
+               final String[]tableNames = {"TaxonBase","TaxonBase_AUD", "TaxonNameBase","TaxonNameBase_AUD",\r
+                               "SynonymRelationship","SynonymRelationship_AUD",\r
+                               "HomotypicalGroup","HomotypicalGroup_AUD"};\r
+               \r
+               int nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should be 2 synonyms in the database", 2, nSynonyms);\r
+               int nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should  be 4 names in the database", 4, nNames);\r
+               int nRelations = service.countAllRelationships();\r
+               //may change with better implementation of countAllRelationships (see #2653)\r
+               Assert.assertEquals("There should be 2 relationship in the database (the 2 synonym relationship) but no name relationship", 2, nRelations);\r
+               \r
+               UUID uuidSynonym1=UUID.fromString("7da85381-ad9d-4886-9d4d-0eeef40e3d88");\r
+               UUID uuidSynonymName2=UUID.fromString("613f3c93-013e-4ffc-aadc-1c98d71c335e");\r
+               \r
+               Synonym synonym1 = (Synonym)service.load(uuidSynonym1);\r
+               TaxonNameBase name2 = (TaxonNameBase)nameService.load(uuidSynonymName2);\r
+               synonym1.getName().addRelationshipFromName(name2, NameRelationshipType.LATER_HOMONYM(), null);\r
+               \r
+               service.saveOrUpdate(synonym1);\r
+               \r
+               this.setComplete();\r
+               this.endTransaction();\r
+               \r
+               printDataSet(System.out, tableNames);\r
+               \r
+               //out of wrapping transaction\r
+               service.deleteSynonym(synonym1, null, true);\r
+               \r
+               this.startNewTransaction();\r
+               \r
+               nSynonyms = service.count(Synonym.class);\r
+               Assert.assertEquals("There should still be 1 synonyms left in the database. The rollback on name delete should not lead to rollback in synonym delete.", 1, nSynonyms);\r
+               nNames = nameService.count(TaxonNameBase.class);\r
+               Assert.assertEquals("There should be 4 names left in the database", 4, nNames);\r
+               nRelations = service.countAllRelationships();\r
+               //may change with better implementation of countAllRelationships (see #2653)\r
+               Assert.assertEquals("There should be 1 name relationship and no synonym relationship in the database", 1, nRelations);\r
+               \r
+       }\r
        \r
 }\r
diff --git a/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.testDeleteSynonym.xml b/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.testDeleteSynonym.xml
new file mode 100644 (file)
index 0000000..cab4cb8
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>\r
+<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dataset.xsd">\r
+  <TAXONBASE DTYPE="Taxon" ID="1" CREATED="2011-10-12 19:57:31.0" UUID="c47fdb72-f32c-452e-8305-4b44f01179d0" PROTECTEDTITLECACHE="false" TITLECACHE="TaxonName1 sec. ???" DOUBTFUL="false" USENAMECACHE="false" TAXONSTATUSUNKNOWN="false" UNPLACED="false" EXCLUDED="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="1"/>\r
+  <TAXONBASE DTYPE="Synonym" ID="2" CREATED="2011-10-12 19:57:31.0" UUID="7da85381-ad9d-4886-9d4d-0eeef40e3d88" PROTECTEDTITLECACHE="false" TITLECACHE="Synonym1 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="3"/>\r
+  <TAXONBASE DTYPE="Taxon" ID="3" CREATED="2011-10-12 19:57:31.0" UUID="2d9a642d-5a82-442d-8fec-95efa978e8f8" PROTECTEDTITLECACHE="false" TITLECACHE="TaxonName2 sec. ???" DOUBTFUL="false" USENAMECACHE="false" TAXONSTATUSUNKNOWN="false" UNPLACED="false" EXCLUDED="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="2"/>\r
+  <TAXONBASE DTYPE="Synonym" ID="4" CREATED="2011-10-12 19:57:31.0" UUID="f8d86dc9-5f18-4877-be46-fbb9412465e4" PROTECTEDTITLECACHE="false" TITLECACHE="Synonym2 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="4"/>\r
+  <TAXONBASE_AUD DTYPE="Taxon" ID="1" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="c47fdb72-f32c-452e-8305-4b44f01179d0" PROTECTEDTITLECACHE="false" TITLECACHE="TaxonName1 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="1" TAXONSTATUSUNKNOWN="false" UNPLACED="false" EXCLUDED="false" TAXONOMICCHILDRENCOUNT="0"/>\r
+  <TAXONBASE_AUD DTYPE="Synonym" ID="2" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="7da85381-ad9d-4886-9d4d-0eeef40e3d88" PROTECTEDTITLECACHE="false" TITLECACHE="Synonym1 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="2"/>\r
+  <TAXONBASE_AUD DTYPE="Taxon" ID="3" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="2d9a642d-5a82-442d-8fec-95efa978e8f8" PROTECTEDTITLECACHE="false" TITLECACHE="TaxonName2 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="3" TAXONSTATUSUNKNOWN="false" UNPLACED="false" EXCLUDED="false" TAXONOMICCHILDRENCOUNT="0"/>\r
+  <TAXONBASE_AUD DTYPE="Synonym" ID="4" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="f8d86dc9-5f18-4877-be46-fbb9412465e4" PROTECTEDTITLECACHE="false" TITLECACHE="Synonym2 sec. ???" DOUBTFUL="false" USENAMECACHE="false" NAME_ID="4"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1" CREATED="2011-10-12 19:57:31.0" UUID="3f3c5808-de2b-44cc-b738-6ebaf8f32377" PROTECTEDTITLECACHE="true" TITLECACHE="TaxonName1" FULLTITLECACHE="TaxonName1" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false" HOMOTYPICALGROUP_ID="1" RANK_ID="777"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2" CREATED="2011-10-12 19:57:31.0" UUID="9e9a3cad-3888-46ab-bb26-f06ddfd21e0c" PROTECTEDTITLECACHE="true" TITLECACHE="Synonym1" FULLTITLECACHE="Synonym1" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false" HOMOTYPICALGROUP_ID="2" RANK_ID="777"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="3" CREATED="2011-10-12 19:57:31.0" UUID="1b2aa952-41de-4249-8345-dccc32ee7cf9" PROTECTEDTITLECACHE="true" TITLECACHE="TaxonName2" FULLTITLECACHE="TaxonName2" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false" HOMOTYPICALGROUP_ID="3" RANK_ID="777"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="4" CREATED="2011-10-12 19:57:31.0" UUID="613f3c93-013e-4ffc-aadc-1c98d71c335e" PROTECTEDTITLECACHE="true" TITLECACHE="Synonym2" FULLTITLECACHE="Synonym2" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false" HOMOTYPICALGROUP_ID="4" RANK_ID="777"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" ID="1" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="3f3c5808-de2b-44cc-b738-6ebaf8f32377" PROTECTEDTITLECACHE="true" TITLECACHE="TaxonName1" FULLTITLECACHE="TaxonName1" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" HOMOTYPICALGROUP_ID="1" RANK_ID="777" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" ID="2" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="9e9a3cad-3888-46ab-bb26-f06ddfd21e0c" PROTECTEDTITLECACHE="true" TITLECACHE="Synonym1" FULLTITLECACHE="Synonym1" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" HOMOTYPICALGROUP_ID="2" RANK_ID="777" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" ID="3" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="1b2aa952-41de-4249-8345-dccc32ee7cf9" PROTECTEDTITLECACHE="true" TITLECACHE="TaxonName2" FULLTITLECACHE="TaxonName2" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" HOMOTYPICALGROUP_ID="3" RANK_ID="777" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" ID="4" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="613f3c93-013e-4ffc-aadc-1c98d71c335e" PROTECTEDTITLECACHE="true" TITLECACHE="Synonym2" FULLTITLECACHE="Synonym2" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="false" HOMOTYPICALGROUP_ID="4" RANK_ID="777" AUTHORSHIPCACHE="" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" NAMECACHE="" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDNAMECACHE="false" TRINOMHYBRID="false" ANAMORPHIC="false"/>\r
+  <SYNONYMRELATIONSHIP ID="1" CREATED="2011-10-12 19:57:31.0" UUID="980fb6a3-04f0-4f58-b69d-5d8838ed6022" DOUBTFUL="false" PARTIAL="false" PROPARTE="false" RELATEDFROM_ID="2" RELATEDTO_ID="1" TYPE_ID="870"/>\r
+  <SYNONYMRELATIONSHIP ID="2" CREATED="2011-10-12 19:57:31.0" UUID="347c620e-10e5-46de-a47d-0ce26492fe90" DOUBTFUL="false" PARTIAL="false" PROPARTE="true" RELATEDFROM_ID="2" RELATEDTO_ID="3" TYPE_ID="870"/>\r
+  <SYNONYMRELATIONSHIP_AUD ID="1" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="980fb6a3-04f0-4f58-b69d-5d8838ed6022" DOUBTFUL="false" PARTIAL="false" PROPARTE="false" RELATEDFROM_ID="2" RELATEDTO_ID="1" TYPE_ID="870"/>\r
+  <SYNONYMRELATIONSHIP_AUD ID="2" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="347c620e-10e5-46de-a47d-0ce26492fe90" DOUBTFUL="false" PARTIAL="false" PROPARTE="true" RELATEDFROM_ID="2" RELATEDTO_ID="3" TYPE_ID="870"/>\r
+  <HOMOTYPICALGROUP ID="1" CREATED="2011-10-12 19:57:31.0" UUID="d8652fa0-eff9-460d-8990-aed0ebf1322e"/>\r
+  <HOMOTYPICALGROUP ID="2" CREATED="2011-10-12 19:57:31.0" UUID="2a1b0776-b4b5-462a-9be7-f88378ebd732"/>\r
+  <HOMOTYPICALGROUP ID="3" CREATED="2011-10-12 19:57:31.0" UUID="3ac4e376-31cd-47fd-9dd6-eaff415ff0e7"/>\r
+  <HOMOTYPICALGROUP ID="4" CREATED="2011-10-12 19:57:31.0" UUID="76258671-07cf-40f3-a9eb-af286b5945ec"/>\r
+  <HOMOTYPICALGROUP_AUD ID="1" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="d8652fa0-eff9-460d-8990-aed0ebf1322e"/>\r
+  <HOMOTYPICALGROUP_AUD ID="2" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="2a1b0776-b4b5-462a-9be7-f88378ebd732"/>\r
+  <HOMOTYPICALGROUP_AUD ID="3" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="3ac4e376-31cd-47fd-9dd6-eaff415ff0e7"/>\r
+  <HOMOTYPICALGROUP_AUD ID="4" REV="1001" REVTYPE="0" CREATED="2011-10-12 19:57:31.0" UUID="76258671-07cf-40f3-a9eb-af286b5945ec"/>\r
+\r
+\r
+</dataset>
\ No newline at end of file