minor
[cdmlib.git] / cdmlib-persistence / src / test / java / eu / etaxonomy / cdm / persistence / dao / hibernate / common / CdmGenericDaoImplTest.java
index 22b00daa7f646c2473ae6f62cd58837d7b30a08c..3085af8727b854972d7140121a060390e7482117 100644 (file)
@@ -24,12 +24,14 @@ import org.junit.AfterClass;
 import org.junit.Assert;\r
 import org.junit.Before;\r
 import org.junit.BeforeClass;\r
+import org.junit.Ignore;\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.agent.Address;\r
 import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.agent.Contact;\r
 import eu.etaxonomy.cdm.model.agent.Institution;\r
 import eu.etaxonomy.cdm.model.agent.InstitutionType;\r
 import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;\r
@@ -46,7 +48,7 @@ import eu.etaxonomy.cdm.model.common.ExtensionType;
 import eu.etaxonomy.cdm.model.common.Figure;\r
 import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;\r
 import eu.etaxonomy.cdm.model.common.Group;\r
-import eu.etaxonomy.cdm.model.common.Keyword;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
 import eu.etaxonomy.cdm.model.common.LSIDAuthority;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.LanguageString;\r
@@ -54,10 +56,11 @@ import eu.etaxonomy.cdm.model.common.Marker;
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermBase;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
-import eu.etaxonomy.cdm.model.common.OriginalSource;\r
+import eu.etaxonomy.cdm.model.common.OriginalSourceBase;\r
 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;\r
 import eu.etaxonomy.cdm.model.common.Representation;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.common.TimePeriod;\r
 import eu.etaxonomy.cdm.model.common.User;\r
 import eu.etaxonomy.cdm.model.description.AbsenceTerm;\r
 import eu.etaxonomy.cdm.model.description.CategoricalData;\r
@@ -68,9 +71,9 @@ import eu.etaxonomy.cdm.model.description.Distribution;
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.FeatureNode;\r
 import eu.etaxonomy.cdm.model.description.FeatureTree;\r
-import eu.etaxonomy.cdm.model.description.IdentificationKey;\r
 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;\r
 import eu.etaxonomy.cdm.model.description.MeasurementUnit;\r
+import eu.etaxonomy.cdm.model.description.MediaKey;\r
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
 import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
 import eu.etaxonomy.cdm.model.description.QuantitativeData;\r
@@ -91,6 +94,7 @@ import eu.etaxonomy.cdm.model.location.Continent;
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;\r
 import eu.etaxonomy.cdm.model.location.NamedAreaType;\r
+import eu.etaxonomy.cdm.model.location.Point;\r
 import eu.etaxonomy.cdm.model.location.ReferenceSystem;\r
 import eu.etaxonomy.cdm.model.location.TdwgArea;\r
 import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
@@ -143,29 +147,10 @@ import eu.etaxonomy.cdm.model.occurrence.Observation;
 import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;\r
 import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-import eu.etaxonomy.cdm.model.reference.Article;\r
-import eu.etaxonomy.cdm.model.reference.BibtexEntryType;\r
-import eu.etaxonomy.cdm.model.reference.BibtexReference;\r
-import eu.etaxonomy.cdm.model.reference.Book;\r
-import eu.etaxonomy.cdm.model.reference.BookSection;\r
-import eu.etaxonomy.cdm.model.reference.CdDvd;\r
-import eu.etaxonomy.cdm.model.reference.Database;\r
-import eu.etaxonomy.cdm.model.reference.Generic;\r
-import eu.etaxonomy.cdm.model.reference.InProceedings;\r
-import eu.etaxonomy.cdm.model.reference.Journal;\r
-import eu.etaxonomy.cdm.model.reference.Map;\r
-import eu.etaxonomy.cdm.model.reference.Patent;\r
-import eu.etaxonomy.cdm.model.reference.PersonalCommunication;\r
-import eu.etaxonomy.cdm.model.reference.PrintSeries;\r
-import eu.etaxonomy.cdm.model.reference.PrintedUnitBase;\r
-import eu.etaxonomy.cdm.model.reference.Proceedings;\r
-import eu.etaxonomy.cdm.model.reference.Publisher;\r
+import eu.etaxonomy.cdm.model.reference.IBook;\r
+import eu.etaxonomy.cdm.model.reference.IBookSection;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.cdm.model.reference.Report;\r
-import eu.etaxonomy.cdm.model.reference.SectionBase;\r
-import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;\r
-import eu.etaxonomy.cdm.model.reference.Thesis;\r
-import eu.etaxonomy.cdm.model.reference.WebPage;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
@@ -176,9 +161,17 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
 import eu.etaxonomy.cdm.model.view.AuditEvent;\r
+import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;\r
+import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
 import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
+import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;\r
+import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;\r
+import eu.etaxonomy.cdm.strategy.match.MatchException;\r
+import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;\r
+import eu.etaxonomy.cdm.strategy.merge.MergeException;\r
 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;\r
 \r
 /**\r
@@ -197,7 +190,15 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
        \r
        @SpringBeanByType\r
        private IOccurrenceDao occurrenceDao;\r
+\r
+       \r
+       @SpringBeanByType\r
+       private ITaxonNameDao nameDao;\r
+\r
+       @SpringBeanByType\r
+       private IAgentDao agentDao;\r
        \r
+       ReferenceFactory refFactory = ReferenceFactory.newInstance();\r
        /**\r
         * @throws java.lang.Exception\r
         */\r
@@ -228,6 +229,78 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
 \r
 // ***************** TESTS **************************************************  \r
        \r
+       @Test\r
+       @Ignore\r
+       public void testDelete(){\r
+               ReferenceBase ref1 = refFactory.newBook();\r
+               ReferenceBase ref2 = refFactory.newBook();\r
+               Annotation annotation = Annotation.NewInstance("Anno1", null);\r
+               ref1.addAnnotation(annotation);\r
+               cdmGenericDao.saveOrUpdate(ref1);\r
+               cdmGenericDao.saveOrUpdate(ref2);\r
+               taxonDao.flush();\r
+               try {\r
+                       cdmGenericDao.merge(ref2, ref1, null);\r
+                       taxonDao.flush();\r
+               } catch (MergeException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               }\r
+               //cdmGenericDao.delete(ref1);\r
+               taxonDao.flush();\r
+               System.out.println("OK");\r
+               //Assert.fail("Failed for testing");\r
+       }\r
+       \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.\r
+        * @throws MergeException \r
+        */\r
+       @Test\r
+       @Ignore\r
+       public void testDelete2() throws MergeException {\r
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name1.setTitleCache("BotanicalName1");\r
+               \r
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name2.setTitleCache("BotanicalName2");\r
+               \r
+               ReferenceBase article1 = refFactory.newArticle();\r
+               ReferenceBase article2 = refFactory.newArticle();\r
+               \r
+               \r
+               name1.setNomenclaturalReference(article1);\r
+               name2.setNomenclaturalReference(article2);\r
+               \r
+               \r
+               Taxon taxon1 = Taxon.NewInstance(name1, article1);\r
+               \r
+//             Person author = Person.NewInstance();\r
+//             author.setTitleCache("Author");\r
+               Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());\r
+               Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());\r
+               \r
+               article1.addAnnotation(annotation1);\r
+               article2.addAnnotation(annotation2);\r
+               \r
+               nameDao.save(name1);\r
+               nameDao.save(name2);\r
+               cdmGenericDao.saveOrUpdate(article2);\r
+               \r
+               taxonDao.save(taxon1);\r
+\r
+               //unidircetional reference to the merged object should be redirected\r
+               cdmGenericDao.merge(article1, article2, null);\r
+               Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());\r
+               //TODO microCitations!! -> warning      \r
+               \r
+               //Annotations\r
+               Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());\r
+       }\r
+\r
+       \r
+       \r
+       \r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#CdmGenericDaoImpl()}.\r
         */\r
@@ -275,7 +348,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                                Figure.class, \r
                                GrantedAuthorityImpl.class, \r
                                Group.class, \r
-                               Keyword.class, \r
+                               IdentifiableSource.class,\r
                                Language.class, \r
                                LanguageString.class, \r
                                LSIDAuthority.class, \r
@@ -283,7 +356,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                                MarkerType.class, \r
                                OrderedTermBase.class, \r
                                OrderedTermVocabulary.class, \r
-                               OriginalSource.class, \r
+                               OriginalSourceBase.class,\r
                                RelationshipTermBase.class, \r
                                Representation.class, \r
                                TermVocabulary.class, \r
@@ -298,7 +371,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                                Feature.class, \r
                                FeatureNode.class, \r
                                FeatureTree.class, \r
-                               IdentificationKey.class, \r
+                               MediaKey.class, \r
                                IndividualsAssociation.class, \r
                                MeasurementUnit.class, \r
                                PresenceAbsenceTermBase.class, \r
@@ -373,29 +446,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                                PreservationMethod.class, \r
                                Specimen.class, \r
                                SpecimenOrObservationBase.class, \r
-                               Article.class, \r
-                               BibtexEntryType.class, \r
-                               BibtexReference.class, \r
-                               Book.class, \r
-                               BookSection.class, \r
-                               CdDvd.class, \r
-                               Database.class, \r
-                               Generic.class, \r
-                               InProceedings.class, \r
-                               Journal.class, \r
-                               Map.class, \r
-                               Patent.class, \r
-                               PersonalCommunication.class, \r
-                               PrintedUnitBase.class, \r
-                               PrintSeries.class, \r
-                               Proceedings.class, \r
                                ReferenceBase.class, \r
-                               Publisher.class, \r
-                               Report.class, \r
-                               SectionBase.class, \r
-                               StrictReferenceBase.class, \r
-                               Thesis.class, \r
-                               WebPage.class, \r
                                Synonym.class, \r
                                SynonymRelationship.class, \r
                                SynonymRelationshipType.class, \r
@@ -447,7 +498,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
        public void testGetReferencingObjectsCdmBase() {\r
                BotanicalName name = BotanicalName.NewInstance(Rank.SPECIES());\r
                name.setTitleCache("A name");\r
-               ReferenceBase ref1 = Article.NewInstance();\r
+               ReferenceBase ref1 = refFactory.newArticle();\r
                Taxon taxon = Taxon.NewInstance(name, ref1);\r
                Person author = Person.NewInstance();\r
                author.setTitleCache("Author");\r
@@ -465,7 +516,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(ref1);\r
                System.out.println("############## RESULT ###################");\r
                for (CdmBase obj: referencedObjects){\r
-                       System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);\r
+                       System.out.println("Object1: " + obj.getClass().getSimpleName() + " - " + obj);\r
                }\r
                assertEquals(3, referencedObjects.size());\r
                System.out.println("############## ENDE ###################");\r
@@ -476,7 +527,7 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                referencedObjects = cdmGenericDao.getReferencingObjects(author);\r
                System.out.println("############## RESULT ###################");\r
                for (CdmBase obj: referencedObjects){\r
-                       System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);\r
+                       System.out.println("Object2: " + obj.getClass().getSimpleName() + " - " + obj);\r
                }\r
                assertEquals(2, referencedObjects.size());\r
                System.out.println("############## ENDE ###################");\r
@@ -506,19 +557,533 @@ public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
                SpecimenOrObservationBase spec1 = occurrenceDao.findByUuid(uuidSpec);\r
                \r
        \r
-               Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(spec1);\r
+               Set<CdmBase> referencingObjects = cdmGenericDao.getReferencingObjects(spec1);\r
                System.out.println("############## RESULT ###################");\r
-               for (CdmBase obj: referencedObjects){\r
+               for (CdmBase obj: referencingObjects){\r
                        System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);\r
                }\r
-               assertEquals(2, referencedObjects.size());\r
                System.out.println("############## ENDE ###################");\r
+               assertEquals("Number of referencing objects must be 2.", 2, referencingObjects.size());\r
+\r
+       }\r
+       \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.\r
+        * @throws MergeException \r
+        */\r
+       @Test\r
+       @Ignore\r
+       public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException {\r
+               cdmGenericDao.test();\r
+               \r
+               \r
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name1.setTitleCache("BotanicalName1");\r
+               \r
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name2.setTitleCache("BotanicalName2");\r
+               \r
+               ZoologicalName zooName1 = ZoologicalName.NewInstance(Rank.SPECIES());\r
+               name1.setTitleCache("ZoologicalName1");\r
+\r
+               ReferenceBase article1 = refFactory.newArticle();\r
+               ReferenceBase article2 = refFactory.newArticle();\r
+               \r
+               \r
+               name1.setNomenclaturalReference(article1);\r
+               name2.setNomenclaturalReference(article2);\r
+               \r
+               \r
+               Taxon taxon1 = Taxon.NewInstance(name1, article1);\r
+               Taxon taxon2 = Taxon.NewInstance(name2, article2);\r
+               \r
+               \r
+//             Person author = Person.NewInstance();\r
+//             author.setTitleCache("Author");\r
+               Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());\r
+               Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());\r
+               \r
+               article1.addAnnotation(annotation1);\r
+               article2.addAnnotation(annotation2);\r
+               \r
+               Marker marker1 = Marker.NewInstance(MarkerType.COMPLETE(), false);\r
+               Marker marker2 = Marker.NewInstance(MarkerType.IMPORTED(), false);\r
+               \r
+               article1.addMarker(marker1);\r
+               article2.addMarker(marker2);\r
+\r
+               Rights rights1 = Rights.NewInstance();\r
+               Rights rights2 = Rights.NewInstance();\r
+               \r
+               article1.addRights(rights1);\r
+               article2.addRights(rights2);\r
+\r
+               \r
+               Credit credit1 = Credit.NewInstance(Team.NewInstance(), "credit1");\r
+               Credit credit2 = Credit.NewInstance(Team.NewInstance(), "credit2");\r
+               \r
+               article1.addCredit(credit1);\r
+               article2.addCredit(credit2);\r
+\r
+               Extension extension1 = Extension.NewInstance();\r
+               Extension extension2 = Extension.NewInstance();\r
+               \r
+               article1.addExtension(extension1);\r
+               article2.addExtension(extension2);\r
+               \r
+               IdentifiableSource source1 = IdentifiableSource.NewInstance();\r
+               IdentifiableSource source2 = IdentifiableSource.NewInstance();\r
+               \r
+               article1.addSource(source1);\r
+               article2.addSource(source2);\r
+\r
+               Media media1 = Media.NewInstance();\r
+               Media media2 = Media.NewInstance();\r
+               \r
+               article1.addMedia(media1);\r
+               article2.addMedia(media2);\r
+               \r
+//             ref1.setAuthorTeam(author);\r
+//             name1.setBasionymAuthorTeam(author);\r
+               \r
+               name1.setNomenclaturalReference(article1);\r
+\r
+               nameDao.save(name1);\r
+               nameDao.save(name2);\r
+               nameDao.save(zooName1);\r
+               \r
+               TaxonDescription taxDesc = TaxonDescription.NewInstance(taxon1);\r
+               taxDesc.setTitleCache("taxDesc");\r
+               taxDesc.addDescriptionSource(article2);\r
+\r
+               taxonDao.save(taxon1);\r
+\r
+               //unidircetional reference to the merged object should be redirected\r
+               cdmGenericDao.merge(article1, article2, null);\r
+               Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());\r
+               //TODO microCitations!! -> warning      \r
+               \r
+               //Annotations\r
+               Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());\r
+               \r
+               //Marker\r
+               Assert.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1.getMarkers().size());\r
+\r
+               //Rights\r
+               Assert.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1.getRights().size());\r
+               \r
+               //Credits\r
+               Assert.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1.getCredits().size());\r
+               \r
+               //Extensions\r
+               Assert.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1.getExtensions().size());\r
+\r
+               //Sources\r
+               Assert.assertEquals("Sources number should be 2 (1 from each of the merged objects)", 2, article1.getSources().size());\r
+\r
+               //Media\r
+               Assert.assertEquals("Media number should be 2 (1 from each of the merged objects)", 2, article1.getMedia().size());\r
+\r
+               //Description sources\r
+               Assert.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc.getDescriptionSources().size());\r
+               Assert.assertTrue("Taxon description must have article1 as source", taxDesc.getDescriptionSources().contains(article1));\r
+       \r
+               //test exceptions\r
+               testMergeExceptions(name1, name2, taxon1, zooName1);\r
+\r
+               \r
+               //TO BE IMPLEMENTED \r
+               Assert.assertTrue("Rights2 must be contained in the rights", article1.getRights().contains(rights2));\r
+               Assert.assertTrue("Credits2 must be contained in the credits", article1.getCredits().contains(credit2));\r
+               Assert.assertTrue("Media2 must be contained in the media", article1.getMedia().contains(media2));\r
+       \r
+       }\r
+       \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.\r
+        * @throws MergeException \r
+        */\r
+       @Test\r
+       @Ignore\r
+       public void testMergeTaxonNameAndTaxon() throws MergeException {\r
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name1.setTitleCache("BotanicalName1");\r
                \r
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name2.setTitleCache("BotanicalName2");\r
+\r
+               BotanicalName name3 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name3.setTitleCache("BotanicalName3");\r
                \r
+               ReferenceBase database = refFactory.newDatabase();\r
                \r
+               Taxon taxon1 = Taxon.NewInstance(name1, database);\r
+               Taxon taxon2 = Taxon.NewInstance(name2, database);\r
+               Taxon taxon3 = Taxon.NewInstance(name3, database);\r
+\r
+               taxonDao.save(taxon1);\r
+               taxonDao.save(taxon2);\r
+               taxonDao.save(taxon3);\r
 \r
+               cdmGenericDao.merge(name1, name2, null);\r
+               Assert.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1.getTaxonBases().size());\r
+               Assert.assertEquals("Taxon2 must have name1 as new name.", name1 ,taxon2.getName());\r
+       \r
+//TODO         \r
+//             cdmGenericDao.merge(taxon1, taxon3, null);\r
+//             Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());\r
+               \r
+               \r
        }\r
        \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.\r
+        * @throws MergeException \r
+        */\r
+       @Test\r
+       public void testMergeAuthors() throws MergeException {\r
+               \r
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name1.setTitleCache("BotanicalName1");\r
+               \r
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
+               name2.setTitleCache("BotanicalName2");\r
+\r
+               IBook book1 = refFactory.newBook();\r
+               IBook book2 = refFactory.newBook();\r
+               \r
+               Team team1 = Team.NewInstance();\r
+               Team team2 = Team.NewInstance();\r
+               Team team3 = Team.NewInstance();\r
+               team1.setTitleCache("team1");\r
+               team2.setTitleCache("team2");\r
+               team3.setTitleCache("team3");\r
+               \r
+               Person person1 = Person.NewTitledInstance("person1");\r
+               Person person2 = Person.NewTitledInstance("person2");\r
+               Person person3 = Person.NewTitledInstance("person3");\r
+               \r
+               team1.setNomenclaturalTitle("T.1");\r
+               String street1 = "Strasse1";\r
+               team1.setContact(Contact.NewInstance(street1, "12345", "Berlin", WaterbodyOrCountry.ARGENTINA_ARGENTINE_REPUBLIC(),"pobox" , "Region", "a@b.de", "f12345", "+49-30-123456", "www.abc.de", Point.NewInstance(2.4, 3.2, ReferenceSystem.WGS84(), 3)));\r
+               team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));\r
+               String street3 = "Street3";\r
+               team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));\r
+               String emailAddress1 = "Email1";\r
+               team1.addEmailAddress(emailAddress1);\r
+               \r
+               team2.addTeamMember(person1);\r
+               team2.addTeamMember(person2);\r
+               String emailAddress2 = "Email2";\r
+               team2.addEmailAddress(emailAddress2);\r
+               \r
+               team3.addTeamMember(person3);\r
+               team3.addEmailAddress("emailAddress3");\r
+               \r
+               book1.setAuthorTeam(team2);\r
+               book2.setAuthorTeam(team3);\r
+               \r
+               Credit credit1 = Credit.NewInstance(team3, "credit1");\r
+               book2.addCredit(credit1);\r
+               \r
+               agentDao.save(team1);\r
+               agentDao.save(team2);\r
+               agentDao.save(team3);\r
+               cdmGenericDao.save((ReferenceBase)book1);\r
+               cdmGenericDao.save((ReferenceBase)book2);\r
+                               \r
+               cdmGenericDao.merge(team2, team3, null);\r
+               \r
+               Assert.assertSame("Author of book1 must be team2.", team2, book1.getAuthorTeam());\r
+               Assert.assertSame("Author of book2 must be team2.", team2, book2.getAuthorTeam());\r
+               Assert.assertSame("Agent of credit1 must be team2.", team2, credit1.getAgent());\r
+\r
+               Assert.assertEquals("Team2 must have 3 persons as members.",3, team2.getTeamMembers().size());\r
+               Assert.assertTrue("Team2 must have person3 as new member.", team2.getTeamMembers().contains(person3));\r
+               Assert.assertSame("Team2 must have person3 as third member.",person3, team2.getTeamMembers().get(2));\r
+               \r
+               \r
+               //Contact \r
+               cdmGenericDao.merge(team2, team1, null);\r
+               Contact team2Contact = team2.getContact();\r
+               Assert.assertNotNull("team2Contact must not be null", team2Contact);\r
+               Assert.assertNotNull("Addresses must not be null", team2Contact.getAddresses());\r
+               Assert.assertEquals("Number of addresses must be 3", 3, team2Contact.getAddresses().size());\r
+               Assert.assertEquals("Number of email addresses must be 4", 4, team2Contact.getEmailAddresses().size());\r
+               \r
+               boolean street1Exists = false;\r
+               boolean street3Exists = false;\r
+               boolean country1Exists = false;\r
+               for  (Address address : team2Contact.getAddresses()){\r
+                       if (street1.equals(address.getStreet())){\r
+                               street1Exists = true;\r
+                       }\r
+                       if (street3.equals(address.getStreet())){\r
+                               street3Exists = true;\r
+                       }\r
+                       if (WaterbodyOrCountry.ARGENTINA_ARGENTINE_REPUBLIC() == address.getCountry()){\r
+                               country1Exists = true;\r
+                       }\r
+               }\r
+               Assert.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists);\r
+               Assert.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists);\r
+               Assert.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists);\r
+               \r
+               //Person\r
+               Institution institution1 = Institution.NewInstance();\r
+               institution1.setTitleCache("inst1");\r
+               Institution institution2 = Institution.NewInstance();\r
+               institution2.setTitleCache("inst2");\r
+               \r
+               TimePeriod period1 = TimePeriod.NewInstance(2002, 2004);\r
+               TimePeriod period2 = TimePeriod.NewInstance(2004, 2006);\r
+               \r
+               person1.addInstitutionalMembership(institution1, period1, "departement1", "role1");\r
+               person2.addInstitutionalMembership(institution2, period2, "departement2", "role2");\r
+\r
+               IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);\r
+               personMergeStrategy.invoke(person1, person2);\r
+               \r
+               Assert.assertEquals("Number of institutional memberships must be 2", 2, person1.getInstitutionalMemberships().size());\r
+               for (InstitutionalMembership institutionalMembership : person1.getInstitutionalMemberships()){\r
+                       Assert.assertSame("Person of institutional memebership must be person1", person1, institutionalMembership.getPerson());\r
+               }\r
+               \r
+       }\r
+       \r
+       private void testMergeExceptions(CdmBase name1, CdmBase name2, CdmBase taxon,CdmBase zooName1) throws MergeException{\r
+               //\r
+               try {\r
+                       cdmGenericDao.merge(name1, null, null);\r
+                       Assert.fail("Merging of 2 objects one or both of them null must throw an exception");\r
+               } catch (MergeException e) {\r
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);\r
+               }\r
+               //\r
+               try {\r
+                       cdmGenericDao.merge(null, name1, null);\r
+                       Assert.fail("Merging of 2 objects one or both of them null must throw an exception");\r
+               } catch (NullPointerException e) {\r
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);\r
+               }\r
+               //exceptions to be thrown\r
+               try {\r
+                       cdmGenericDao.merge(name1, taxon, null);\r
+                       Assert.fail("Merging of 2 objects of different types must throw an exception");\r
+               } catch (MergeException e) {\r
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);\r
+               }\r
+               //next exception\r
+               try {\r
+                       cdmGenericDao.merge(name1, zooName1, null);\r
+                       Assert.fail("Merging of 2 objects of different types must throw an exception");\r
+               } catch (MergeException e) {\r
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);\r
+               }\r
+       }\r
+       \r
+       @Test\r
+       public void findMatching(){\r
+               IBook book1 = refFactory.newBook();\r
+               IBook book2 = refFactory.newBook();\r
+               IBook book3 = refFactory.newBook();\r
+               IBook book4 = refFactory.newBook();\r
+               \r
+               String title1 = "title1";\r
+               String title2 = "title2";\r
+               book1.setTitle(title1);\r
+               book2.setTitle(title2);\r
+               book3.setTitle(title1);\r
+               \r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book1);\r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book2);\r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book3);\r
+               \r
+               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(ReferenceBase.class);\r
+               \r
+               try {\r
+                       List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertNotNull("Resultlist must not be null", matchResult);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));\r
+                       \r
+                       book1.setDatePublished(TimePeriod.NewInstance(1999, 2002));\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());\r
+                       \r
+                       book3.setDatePublished(TimePeriod.NewInstance(1999));\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());\r
+\r
+                       book3.setDatePublished(TimePeriod.NewInstance(1999,2002));\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));\r
+                       \r
+                       //BookSection\r
+                       IBookSection section1 = refFactory.newBookSection();\r
+                       section1.setInBook(book1);\r
+                       section1.setTitle("SecTitle");\r
+                       section1.setPages("22-33");\r
+                       IBookSection section2 = refFactory.newBookSection();\r
+                       section2.setInBook(book2);\r
+                       section2.setTitle("SecTitle");\r
+                       section2.setPages("22-33");\r
+                       IBookSection section3 = refFactory.newBookSection();\r
+                       section3.setInBook(book1);\r
+                       section3.setTitle("SecTitle");\r
+                       section3.setPages("22-33");\r
+                       cdmGenericDao.saveOrUpdate((ReferenceBase)section1);\r
+                       cdmGenericDao.saveOrUpdate((ReferenceBase)section2);\r
+                       cdmGenericDao.saveOrUpdate((ReferenceBase)section3);\r
+                       \r
+                       List<IBookSection> sectionResult = cdmGenericDao.findMatching(section3, null);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, sectionResult.size());\r
+                       Assert.assertSame("Resultlist entry must be section1", section1, sectionResult.get(0));\r
+                       section2.setInBook(book2 = (IBook)((ReferenceBase) book1).clone());\r
+                       cdmGenericDao.saveOrUpdate((ReferenceBase)book2);\r
+                       cdmGenericDao.saveOrUpdate((ReferenceBase)book1);\r
+                       \r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
+                       sectionResult = cdmGenericDao.findMatching(section3, null);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 2, sectionResult.size());\r
+                       \r
+                       \r
+                       Person person1 = Person.NewTitledInstance("person");\r
+                       Person person2 = Person.NewTitledInstance("person");\r
+                       Person person3 = Person.NewTitledInstance("person");\r
+                       \r
+                       person1.setPrefix("pre1");\r
+                       person2.setPrefix("pre2");\r
+                       person3.setPrefix("pre3");\r
+                       \r
+                       book1.setAuthorTeam(person1);\r
+                       book2.setAuthorTeam(person1);\r
+                       book3.setAuthorTeam(person1);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
+                       \r
+                       book2.setAuthorTeam(person2);\r
+                       book3.setAuthorTeam(person3);\r
+                       matchResult = cdmGenericDao.findMatching(book3, null);\r
+                       Assert.assertEquals("Resultlist must have no entries", 0, matchResult.size());\r
+                       \r
+                       person3.setPrefix("pre1");\r
+                       matchResult = cdmGenericDao.findMatching(book3, null);\r
+                       Assert.assertEquals("Resultlist must have 1 entry", 1, matchResult.size());\r
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));\r
+\r
+               } catch (MatchException e) {\r
+                       Assert.fail("Find match must not throw Exception: " + e.getMessage());\r
+                       e.printStackTrace();\r
+               }\r
+\r
+       }\r
+       \r
+       \r
+       @Test\r
+       public void findMatchingCache(){\r
+               IBook book1 = refFactory.newBook();\r
+               Team team1 = Team.NewInstance();\r
+               Team team2 = Team.NewInstance();\r
+               team1.setTitleCache("Team1");\r
+               team2.setTitleCache("Team1");\r
+               \r
+               book1.setTitle("Title1");\r
+               book1.setEdition("Edition1");\r
+               book1.setAuthorTeam(team1);\r
+               \r
+               \r
+               IBook book2 = (IBook) ((ReferenceBase)book1).clone();\r
+               IBook book3 = (IBook) ((ReferenceBase)book1).clone();\r
+               \r
+//             Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));\r
+//             book1.setTitleCache("cache1");\r
+//             Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));\r
+//             \r
+//             bookClone.setTitleCache("cache1");\r
+//             Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));\r
+//                     \r
+//             bookClone.setTitleCache("cache2");\r
+//             Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));\r
+//             bookClone.setTitleCache("cache1"); //restore\r
+//             \r
+//             bookClone.setEdition(null);\r
+//             Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));\r
+\r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book1);\r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book2);\r
+               cdmGenericDao.saveOrUpdate((ReferenceBase)book3);\r
+               cdmGenericDao.saveOrUpdate(team1);\r
+               cdmGenericDao.saveOrUpdate(team2);\r
+               \r
+               \r
+               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(ReferenceBase.class);\r
+               \r
+               try {\r
+                       List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertNotNull("Resultlist must not be null", matchResult);\r
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));\r
+                       \r
+                       book1.setTitleCache("cache1");\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));\r
+                       \r
+                       book2.setTitleCache("cache2", false);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));\r
+                       \r
+                       book2.setEdition(null);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 0 entries", 0, matchResult.size());\r
+                       \r
+                       book3.setTitleCache("cache1");\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+                       \r
+                       IMatchStrategy teamMatcher = DefaultMatchStrategy.NewInstance(Team.class);\r
+                       boolean teamsMatch = teamMatcher.invoke(team1, team2);\r
+                       Assert.assertTrue("Team1 and team2 should match" ,teamsMatch);\r
+                       \r
+                       book3.setAuthorTeam(team2);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+\r
+                       book3.setAuthorTeam(null);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+                       \r
+                       book2.setTitleCache(book3.getTitleCache());\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));\r
+                       \r
+                       team2.setTitleCache("team2");\r
+                       teamsMatch = teamMatcher.invoke(team1, team2);\r
+                       Assert.assertFalse("Team1 and team2 should not match" ,teamsMatch);\r
+                       \r
+                       book3.setAuthorTeam(team1);\r
+                       book2.setAuthorTeam(team2);\r
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());\r
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));\r
+                       \r
+                       \r
+               } catch (MatchException e) {\r
+                       Assert.fail("Find match must not throw Exception: " + e.getMessage());\r
+                       e.printStackTrace();\r
+               }\r
+\r
+       }\r
        \r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getHqlResult(java.lang.String)}.\r