Javadoc
[cdmlib.git] / cdmlib-persistence / src / test / java / eu / etaxonomy / cdm / persistence / dao / hibernate / common / CdmGenericDaoImplTest.java
index 2ff6f26a7fda6de0200f1387eb91594aba0ea749..615b0d9e2316270f56b9c6208b6f26a6e78f6267 100644 (file)
-// $Id$\r
-/**\r
-* Copyright (C) 2007 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
-\r
-package eu.etaxonomy.cdm.persistence.dao.hibernate.common;\r
-\r
-import static org.junit.Assert.assertEquals;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
-import org.apache.log4j.Logger;\r
-import org.junit.After;\r
-import org.junit.AfterClass;\r
-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.InstitutionalMembership;\r
-import eu.etaxonomy.cdm.model.agent.Person;\r
-import eu.etaxonomy.cdm.model.agent.Team;\r
-import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
-import eu.etaxonomy.cdm.model.common.Annotation;\r
-import eu.etaxonomy.cdm.model.common.AnnotationType;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.Credit;\r
-import eu.etaxonomy.cdm.model.common.DefinedTerm;\r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
-import eu.etaxonomy.cdm.model.common.Extension;\r
-import eu.etaxonomy.cdm.model.common.ExtensionType;\r
-import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;\r
-import eu.etaxonomy.cdm.model.common.Group;\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
-import eu.etaxonomy.cdm.model.common.Marker;\r
-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.OriginalSourceBase;\r
-import eu.etaxonomy.cdm.model.common.OriginalSourceType;\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
-import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
-import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
-import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
-import eu.etaxonomy.cdm.model.description.Distribution;\r
-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.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
-import eu.etaxonomy.cdm.model.description.SpecimenDescription;\r
-import eu.etaxonomy.cdm.model.description.State;\r
-import eu.etaxonomy.cdm.model.description.StateData;\r
-import eu.etaxonomy.cdm.model.description.StatisticalMeasure;\r
-import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
-import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
-import eu.etaxonomy.cdm.model.description.TaxonInteraction;\r
-import eu.etaxonomy.cdm.model.description.TaxonNameDescription;\r
-import eu.etaxonomy.cdm.model.description.TextData;\r
-import eu.etaxonomy.cdm.model.description.TextFormat;\r
-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.Country;\r
-import eu.etaxonomy.cdm.model.media.AudioFile;\r
-import eu.etaxonomy.cdm.model.media.ImageFile;\r
-import eu.etaxonomy.cdm.model.media.Media;\r
-import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
-import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;\r
-import eu.etaxonomy.cdm.model.media.MovieFile;\r
-import eu.etaxonomy.cdm.model.media.Rights;\r
-import eu.etaxonomy.cdm.model.media.RightsType;\r
-import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
-import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;\r
-import eu.etaxonomy.cdm.model.molecular.Sequence;\r
-import eu.etaxonomy.cdm.model.name.BacterialName;\r
-import eu.etaxonomy.cdm.model.name.BotanicalName;\r
-import eu.etaxonomy.cdm.model.name.CultivarPlantName;\r
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.name.HybridRelationship;\r
-import eu.etaxonomy.cdm.model.name.HybridRelationshipType;\r
-import eu.etaxonomy.cdm.model.name.NameRelationship;\r
-import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
-import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\r
-import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
-import eu.etaxonomy.cdm.model.name.NonViralName;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;\r
-import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.name.TypeDesignationBase;\r
-import eu.etaxonomy.cdm.model.name.ViralName;\r
-import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
-import eu.etaxonomy.cdm.model.occurrence.Collection;\r
-import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
-import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;\r
-import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
-import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
-import eu.etaxonomy.cdm.model.occurrence.FieldUnit;\r
-import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;\r
-import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;\r
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-import eu.etaxonomy.cdm.model.reference.IBook;\r
-import eu.etaxonomy.cdm.model.reference.IBookSection;\r
-import eu.etaxonomy.cdm.model.reference.Reference;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
-import eu.etaxonomy.cdm.model.taxon.Classification;\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
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\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
- * @author a.mueller\r
- * @created 27.07.2009\r
- */\r
-@Ignore\r
-public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{\r
-       private static final Logger logger = Logger.getLogger(CdmGenericDaoImplTest.class);\r
-       \r
-       @SpringBeanByType\r
-       private ICdmGenericDao cdmGenericDao;\r
-       \r
-       @SpringBeanByType\r
-       private ITaxonDao taxonDao;\r
-       \r
-       @SpringBeanByType\r
-       private IOccurrenceDao occurrenceDao;\r
-\r
-       \r
-       @SpringBeanByType\r
-       private ITaxonNameDao nameDao; \r
-\r
-       @SpringBeanByType\r
-       private IAgentDao agentDao;\r
-       \r
-       \r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @BeforeClass\r
-       public static void setUpBeforeClass() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @AfterClass\r
-       public static void tearDownAfterClass() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @Before\r
-       public void setUp() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @After\r
-       public void tearDown() throws Exception {\r
-       }\r
-\r
-// ***************** TESTS **************************************************  \r
-       \r
-       @Test\r
-       @Ignore\r
-       public void testDelete(){\r
-               Reference<?> ref1 = ReferenceFactory.newBook();\r
-               Reference<?> ref2 = ReferenceFactory.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", true);\r
-               \r
-               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name2.setTitleCache("BotanicalName2", true);\r
-               \r
-               Reference article1 = ReferenceFactory.newArticle();\r
-               Reference article2 = ReferenceFactory.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
-       @Test\r
-       public void testCdmGenericDaoImpl() {\r
-               logger.warn("Not yet implemented");\r
-       }\r
-\r
-       /**\r
-        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesByFieldAndClass(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.\r
-        */\r
-       @Test\r
-       public void testGetCdmBasesByFieldAndClass() {\r
-               logger.warn("Not yet implemented");\r
-       }\r
-\r
-       /**\r
-        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesWithItemInCollection(java.lang.Class, java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.\r
-        */\r
-       @Test\r
-       public void testGetCdmBasesWithItemInCollection() {\r
-               logger.warn("Not yet implemented");\r
-       }\r
-\r
-       /**\r
-        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getAllCdmClasses(boolean)}.\r
-        */\r
-       @Test\r
-       public void testGetAllCdmClasses() {\r
-               Class[] existingClassesArray = {\r
-                               Address.class,\r
-                               AgentBase.class,\r
-                               Institution.class, \r
-                               InstitutionalMembership.class, \r
-                               Person.class, \r
-                               Team.class, \r
-                               TeamOrPersonBase.class, \r
-                               Annotation.class, \r
-                               AnnotationType.class, \r
-                               Credit.class,\r
-                               DefinedTermBase.class, \r
-                               Extension.class, \r
-                               ExtensionType.class, \r
-                               GrantedAuthorityImpl.class, \r
-                               Group.class, \r
-                               IdentifiableSource.class,\r
-                               Language.class, \r
-                               LanguageString.class, \r
-                               LSIDAuthority.class, \r
-                               Marker.class, \r
-                               MarkerType.class, \r
-                               OrderedTermBase.class, \r
-                               OrderedTermVocabulary.class, \r
-                               OriginalSourceBase.class,\r
-                               RelationshipTermBase.class, \r
-                               Representation.class, \r
-                               TermVocabulary.class, \r
-                               User.class, \r
-                               DefinedTerm.class,\r
-                               \r
-                               AbsenceTerm.class, \r
-                               CategoricalData.class, \r
-                               CommonTaxonName.class, \r
-                               DescriptionBase.class, \r
-                               DescriptionElementBase.class, \r
-                               Distribution.class, \r
-                               Feature.class, \r
-                               FeatureNode.class, \r
-                               FeatureTree.class, \r
-                               MediaKey.class, \r
-                               IndividualsAssociation.class, \r
-                               MeasurementUnit.class, \r
-                               PresenceAbsenceTermBase.class, \r
-                               PresenceTerm.class, \r
-                               QuantitativeData.class, \r
-                               SpecimenDescription.class, \r
-                               State.class, \r
-                               StateData.class, \r
-                               StatisticalMeasure.class, \r
-                               StatisticalMeasurementValue.class, \r
-                               TaxonDescription.class, \r
-                               TaxonInteraction.class, \r
-                               TaxonNameDescription.class, \r
-                               TextData.class, \r
-                               TextFormat.class, \r
-                               NamedArea.class, \r
-                               NamedAreaLevel.class, \r
-                               NamedAreaType.class, \r
-                               ReferenceSystem.class, \r
-                               Country.class, \r
-                               AudioFile.class, \r
-                               ImageFile.class, \r
-                               Media.class, \r
-                               MediaRepresentation.class, \r
-                               MediaRepresentationPart.class, \r
-                               MovieFile.class, \r
-                               Rights.class, \r
-                               RightsType.class, \r
-                               DnaSample.class, \r
-                               PhylogeneticTree.class, \r
-                               Sequence.class, \r
-                               BacterialName.class, \r
-                               BotanicalName.class, \r
-                               CultivarPlantName.class, \r
-                               HomotypicalGroup.class, \r
-                               HybridRelationship.class, \r
-                               HybridRelationshipType.class, \r
-                               NameRelationship.class, \r
-                               NameRelationshipType.class, \r
-                               NameTypeDesignation.class, \r
-                               NameTypeDesignationStatus.class, \r
-                               NomenclaturalStatus.class, \r
-                               NomenclaturalStatusType.class, \r
-                               NonViralName.class, \r
-                               Rank.class, \r
-                               SpecimenTypeDesignation.class, \r
-                               SpecimenTypeDesignationStatus.class, \r
-                               TaxonNameBase.class, \r
-                               TypeDesignationBase.class, \r
-                               ViralName.class, \r
-                               ZoologicalName.class, \r
-                               Collection.class, \r
-                               DerivationEvent.class, \r
-                               DerivationEventType.class, \r
-                               DerivedUnit.class, \r
-                               DeterminationEvent.class, \r
-                               FieldUnit.class, \r
-                               GatheringEvent.class, \r
-                               PreservationMethod.class, \r
-                               SpecimenOrObservationBase.class, \r
-                               Reference.class, \r
-                               Synonym.class, \r
-                               SynonymRelationship.class, \r
-                               SynonymRelationshipType.class, \r
-                               Taxon.class, \r
-                               TaxonBase.class, \r
-                               TaxonNode.class, \r
-                               Classification.class, \r
-                               TaxonRelationship.class, \r
-                               TaxonRelationshipType.class \r
-                               //Contact.class, \r
-                               //LSID.class, \r
-                               //Modifier.class, \r
-                               //Point.class, \r
-                               //NomenclaturalCode.class, \r
-               }       ;\r
-               List<Class> existingClassesList = new ArrayList<Class>();\r
-               existingClassesList.addAll(Arrays.asList(existingClassesArray));\r
-               boolean includeAbstractClasses = true;\r
-               Set<Class<? extends CdmBase>> foundClasses = cdmGenericDao.getAllCdmClasses(includeAbstractClasses);\r
-               \r
-               //for debugging only            \r
-               //              for (Class existingClass : existingClassesList){\r
-               //                      if (! foundClasses.contains(existingClass)){\r
-               //                              logger.warn("Class not found: " + existingClass.getCanonicalName());\r
-               //                      }\r
-               //              }\r
-               \r
-               //All classes must be found\r
-               Assert.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses.containsAll(existingClassesList));\r
-               \r
-               \r
-               //No extra classes must be found\r
-               for (Class clazz : foundClasses){\r
-                       if (! CdmBase.class.isAssignableFrom(clazz)&& !( AuditEvent.class == clazz)  ){ //OLD: && !( LSID.class == clazz)&& !( NomenclaturalCode.class == clazz) && !( Point.class == clazz) && !( Modifier.class == clazz) && !( Contact.class == clazz) \r
-                               Assert.fail("Class " + clazz.getName() + " is not assignable from CdmBase");\r
-                       }\r
-               }\r
-               \r
-               includeAbstractClasses = false;\r
-               Set<Class<? extends CdmBase>> noAbstractClasses = cdmGenericDao.getAllCdmClasses(includeAbstractClasses);\r
-               Class abstractClassToTest = TaxonNameBase.class;\r
-               Assert.assertFalse("Abstract class " + abstractClassToTest.getName() + " may not be in set ", noAbstractClasses.contains(abstractClassToTest));\r
-       }\r
-\r
-       /**\r
-        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.\r
-        */\r
-       @Test\r
-       public void testGetReferencingObjectsCdmBase() {\r
-               BotanicalName name = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name.setTitleCache("A name", true);\r
-               Reference ref1 = ReferenceFactory.newArticle();\r
-               Taxon taxon = Taxon.NewInstance(name, ref1);\r
-               Person author = Person.NewInstance();\r
-               author.setTitleCache("Author", true);\r
-               ref1.addAnnotation(Annotation.NewInstance("A1", Language.DEFAULT()));\r
-               ref1.setAuthorship(author);\r
-               name.setBasionymAuthorTeam(author);\r
-               \r
-               name.setNomenclaturalReference(ref1);\r
-               \r
-               taxonDao.save(taxon);\r
-//             UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");\r
-//             Reference ref1 = referenceService.findByUuid(uuid);\r
-               \r
-       \r
-               Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(ref1);\r
-               System.out.println("############## RESULT ###################");\r
-               for (CdmBase obj: referencedObjects){\r
-                       System.out.println("Object1: " + obj.getClass().getSimpleName() + " - " + obj);\r
-               }\r
-               assertEquals(3, referencedObjects.size());\r
-               System.out.println("############## ENDE ###################");\r
-               \r
-//             UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");\r
-//             AgentBase author = agentService.findByUuid(uuidAuthor);\r
-               \r
-               referencedObjects = cdmGenericDao.getReferencingObjects(author);\r
-               System.out.println("############## RESULT ###################");\r
-               for (CdmBase obj: referencedObjects){\r
-                       System.out.println("Object2: " + obj.getClass().getSimpleName() + " - " + obj);\r
-               }\r
-               assertEquals(2, referencedObjects.size());\r
-               System.out.println("############## ENDE ###################");\r
-       }\r
-       \r
-       /**\r
-        * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.\r
-        * \r
-        */\r
-       @Test\r
-       @DataSet\r
-       public final void testGetReferencingObjects2() {\r
-//             SpecimenDescription desc1 = SpecimenDescription.NewInstance();\r
-//             desc1.setTitleCache("desc1");\r
-//             SpecimenDescription desc2 = SpecimenDescription.NewInstance();\r
-//             desc2.setTitleCache("desc2");\r
-//             \r
-//             SpecimenOrObservationBase spec1 = Specimen.NewInstance();\r
-//             \r
-//             desc1.addDescribedSpecimenOrObservation(spec1);\r
-//             //Taxon taxon = Taxon.NewInstance(taxonNameBase, sec)\r
-//             spec1.addDescription(desc2);\r
-//             \r
-//             occurrenceService.save(spec1);\r
-               \r
-               UUID uuidSpec = UUID.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");\r
-               SpecimenOrObservationBase spec1 = occurrenceDao.findByUuid(uuidSpec);\r
-               \r
-       \r
-               Set<CdmBase> referencingObjects = cdmGenericDao.getReferencingObjects(spec1);\r
-//             System.out.println("############## RESULT ###################");\r
-//             for (CdmBase obj: referencingObjects){\r
-//                     System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);\r
-//             }\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
-                               \r
-               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name1.setTitleCache("BotanicalName1", true);\r
-               \r
-               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name2.setTitleCache("BotanicalName2", true);\r
-               \r
-               ZoologicalName zooName1 = ZoologicalName.NewInstance(Rank.SPECIES());\r
-               name1.setTitleCache("ZoologicalName1", true);\r
-\r
-               Reference article1 = ReferenceFactory.newArticle();\r
-               Reference article2 = ReferenceFactory.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(OriginalSourceType.Unknown);\r
-               IdentifiableSource source2 = IdentifiableSource.NewInstance(OriginalSourceType.Unknown);\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", true);\r
-               taxDesc.addSource(OriginalSourceType.Unknown, null, null, article2, null);\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.getSources().size());\r
-               Assert.assertEquals("Taxon description must have article1 as source", taxDesc.getSources().iterator().next().getCitation(),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", true);\r
-               \r
-               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name2.setTitleCache("BotanicalName2", true);\r
-\r
-               BotanicalName name3 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name3.setTitleCache("BotanicalName3", true);\r
-               \r
-               Reference database = ReferenceFactory.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", true);\r
-               \r
-               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());\r
-               name2.setTitleCache("BotanicalName2", true);\r
-\r
-               IBook book1 = ReferenceFactory.newBook();\r
-               IBook book2 = ReferenceFactory.newBook();\r
-               \r
-               Team team1 = Team.NewInstance();\r
-               Team team2 = Team.NewInstance();\r
-               Team team3 = Team.NewInstance();\r
-               team1.setTitleCache("team1", true);\r
-               team2.setTitleCache("team2", true);\r
-               team3.setTitleCache("team3", true);\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", Country.ARGENTINAARGENTINEREPUBLIC(),"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.setAuthorship(team2);\r
-               book2.setAuthorship(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((Reference)book1);\r
-               cdmGenericDao.save((Reference)book2);\r
-                               \r
-               cdmGenericDao.merge(team2, team3, null);\r
-               \r
-               Assert.assertSame("Author of book1 must be team2.", team2, book1.getAuthorship());\r
-               Assert.assertSame("Author of book2 must be team2.", team2, book2.getAuthorship());\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 (Country.ARGENTINAARGENTINEREPUBLIC() == 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", true);\r
-               Institution institution2 = Institution.NewInstance();\r
-               institution2.setTitleCache("inst2", true);\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 = ReferenceFactory.newBook();\r
-               IBook book2 = ReferenceFactory.newBook();\r
-               IBook book3 = ReferenceFactory.newBook();\r
-               IBook book4 = ReferenceFactory.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((Reference)book1);\r
-               cdmGenericDao.saveOrUpdate((Reference)book2);\r
-               cdmGenericDao.saveOrUpdate((Reference)book3);\r
-               \r
-               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(Reference.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 = ReferenceFactory.newBookSection();\r
-                       section1.setInBook(book1);\r
-                       section1.setTitle("SecTitle");\r
-                       section1.setPages("22-33");\r
-                       IBookSection section2 = ReferenceFactory.newBookSection();\r
-                       section2.setInBook(book2);\r
-                       section2.setTitle("SecTitle");\r
-                       section2.setPages("22-33");\r
-                       IBookSection section3 = ReferenceFactory.newBookSection();\r
-                       section3.setInBook(book1);\r
-                       section3.setTitle("SecTitle");\r
-                       section3.setPages("22-33");\r
-                       cdmGenericDao.saveOrUpdate((Reference)section1);\r
-                       cdmGenericDao.saveOrUpdate((Reference)section2);\r
-                       cdmGenericDao.saveOrUpdate((Reference)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)((Reference) book1).clone());\r
-                       cdmGenericDao.saveOrUpdate((Reference)book2);\r
-                       cdmGenericDao.saveOrUpdate((Reference)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
-//                     matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
-//                     Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
-                       \r
-                       book1.setAuthorship(person1);\r
-                       book2.setAuthorship(person1);\r
-                       book3.setAuthorship(person1);\r
-                       \r
-                       boolean m = matchStrategy.invoke(book1, book3);\r
-                       boolean m2 = matchStrategy.invoke(book2, book3);\r
-                       \r
-                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);\r
-                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());\r
-                       \r
-                       book2.setAuthorship(person2);\r
-                       book3.setAuthorship(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 = ReferenceFactory.newBook();\r
-               Team team1 = Team.NewInstance();\r
-               Team team2 = Team.NewInstance();\r
-               team1.setTitleCache("Team1", true);\r
-               team2.setTitleCache("Team1", true);\r
-               \r
-               book1.setTitle("Title1");\r
-               book1.setEdition("Edition1");\r
-               book1.setAuthorship(team1);\r
-               \r
-               \r
-               IBook book2 = (IBook) ((Reference)book1).clone();\r
-               IBook book3 = (IBook) ((Reference)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((Reference)book1);\r
-               cdmGenericDao.saveOrUpdate((Reference)book2);\r
-               cdmGenericDao.saveOrUpdate((Reference)book3);\r
-               cdmGenericDao.saveOrUpdate(team1);\r
-               cdmGenericDao.saveOrUpdate(team2);\r
-               \r
-               \r
-               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(Reference.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", true);\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", true);\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.setAuthorship(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.setAuthorship(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(), true);\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", true);\r
-                       teamsMatch = teamMatcher.invoke(team1, team2);\r
-                       Assert.assertFalse("Team1 and team2 should not match" ,teamsMatch);\r
-                       \r
-                       book3.setAuthorship(team1);\r
-                       book2.setAuthorship(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
-        */\r
-       @Test\r
-       public void testGetHqlResult() {\r
-               logger.warn("Not yet implemented");\r
-       }\r
-}\r
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.cdm.persistence.dao.hibernate.common;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileNotFoundException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.hibernate.MappingException;
+import org.hibernate.internal.SessionFactoryImpl;
+import org.hibernate.persister.collection.CollectionPersister;
+import org.hibernate.stat.Statistics;
+import org.hibernate.type.Type;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.unitils.dbunit.annotation.DataSet;
+import org.unitils.spring.annotation.SpringBeanByType;
+
+import eu.etaxonomy.cdm.model.agent.Address;
+import eu.etaxonomy.cdm.model.agent.AgentBase;
+import eu.etaxonomy.cdm.model.agent.Contact;
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
+import eu.etaxonomy.cdm.model.agent.Person;
+import eu.etaxonomy.cdm.model.agent.Team;
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
+import eu.etaxonomy.cdm.model.common.Annotation;
+import eu.etaxonomy.cdm.model.common.AnnotationType;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.Credit;
+import eu.etaxonomy.cdm.model.common.DefinedTerm;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.common.Extension;
+import eu.etaxonomy.cdm.model.common.ExtensionType;
+import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;
+import eu.etaxonomy.cdm.model.common.Group;
+import eu.etaxonomy.cdm.model.common.IdentifiableSource;
+import eu.etaxonomy.cdm.model.common.Identifier;
+import eu.etaxonomy.cdm.model.common.LSIDAuthority;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.common.LanguageString;
+import eu.etaxonomy.cdm.model.common.Marker;
+import eu.etaxonomy.cdm.model.common.MarkerType;
+import eu.etaxonomy.cdm.model.common.OrderedTermBase;
+import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
+import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
+import eu.etaxonomy.cdm.model.common.OriginalSourceType;
+import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
+import eu.etaxonomy.cdm.model.common.Representation;
+import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.model.common.TimePeriod;
+import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.cdm.model.description.CategoricalData;
+import eu.etaxonomy.cdm.model.description.CommonTaxonName;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.Distribution;
+import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
+import eu.etaxonomy.cdm.model.description.MeasurementUnit;
+import eu.etaxonomy.cdm.model.description.MediaKey;
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
+import eu.etaxonomy.cdm.model.description.QuantitativeData;
+import eu.etaxonomy.cdm.model.description.SpecimenDescription;
+import eu.etaxonomy.cdm.model.description.State;
+import eu.etaxonomy.cdm.model.description.StateData;
+import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
+import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
+import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.cdm.model.description.TaxonInteraction;
+import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
+import eu.etaxonomy.cdm.model.description.TextData;
+import eu.etaxonomy.cdm.model.description.TextFormat;
+import eu.etaxonomy.cdm.model.location.Country;
+import eu.etaxonomy.cdm.model.location.NamedArea;
+import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
+import eu.etaxonomy.cdm.model.location.NamedAreaType;
+import eu.etaxonomy.cdm.model.location.Point;
+import eu.etaxonomy.cdm.model.location.ReferenceSystem;
+import eu.etaxonomy.cdm.model.media.AudioFile;
+import eu.etaxonomy.cdm.model.media.ImageFile;
+import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.media.MediaRepresentation;
+import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
+import eu.etaxonomy.cdm.model.media.MovieFile;
+import eu.etaxonomy.cdm.model.media.Rights;
+import eu.etaxonomy.cdm.model.media.RightsType;
+import eu.etaxonomy.cdm.model.metadata.CdmPreference;
+import eu.etaxonomy.cdm.model.molecular.Amplification;
+import eu.etaxonomy.cdm.model.molecular.DnaSample;
+import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;
+import eu.etaxonomy.cdm.model.molecular.Primer;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.molecular.SingleReadAlignment;
+import eu.etaxonomy.cdm.model.name.BacterialName;
+import eu.etaxonomy.cdm.model.name.BotanicalName;
+import eu.etaxonomy.cdm.model.name.CultivarPlantName;
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
+import eu.etaxonomy.cdm.model.name.HybridRelationship;
+import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
+import eu.etaxonomy.cdm.model.name.NameRelationship;
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;
+import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
+import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
+import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
+import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
+import eu.etaxonomy.cdm.model.name.NonViralName;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
+import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
+import eu.etaxonomy.cdm.model.name.ViralName;
+import eu.etaxonomy.cdm.model.name.ZoologicalName;
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
+import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
+import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
+import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
+import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.reference.IBook;
+import eu.etaxonomy.cdm.model.reference.IBookSection;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
+import eu.etaxonomy.cdm.model.view.AuditEvent;
+import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;
+import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
+import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
+import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
+import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
+import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
+import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
+import eu.etaxonomy.cdm.strategy.match.MatchException;
+import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;
+import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
+import eu.etaxonomy.cdm.strategy.merge.MergeException;
+import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
+
+/**
+ * @author a.mueller
+ * @created 27.07.2009
+ */
+public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest {
+       private static final Logger logger = Logger.getLogger(CdmGenericDaoImplTest.class);
+
+       @SpringBeanByType
+       private ICdmGenericDao cdmGenericDao;
+
+       @SpringBeanByType
+       private ITaxonDao taxonDao;
+
+       @SpringBeanByType
+       private IOccurrenceDao occurrenceDao;
+
+       @SpringBeanByType
+       private ITaxonNameDao nameDao;
+
+       @SpringBeanByType
+       private IAgentDao agentDao;
+
+       /**
+        * @throws java.lang.Exception
+        */
+       @Before
+       public void setUp() throws Exception {}
+
+// ***************** TESTS **************************************************
+
+       @Test
+       public void testDelete(){
+               Reference<?> ref1 = ReferenceFactory.newBook();
+               Reference<?> ref2 = ReferenceFactory.newBook();
+               Annotation annotation = Annotation.NewInstance("Anno1", null);
+               ref1.addAnnotation(annotation);
+               cdmGenericDao.saveOrUpdate(ref1);
+               cdmGenericDao.saveOrUpdate(ref2);
+               taxonDao.flush();
+               try {
+                       cdmGenericDao.merge(ref2, ref1, null);
+                       taxonDao.flush();
+               } catch (MergeException e) {
+                       Assert.fail();
+               }
+               cdmGenericDao.delete(ref1);
+               taxonDao.flush();
+       }
+
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesByFieldAndClass(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.
+        */
+       @Test
+       public void testGetCdmBasesByFieldAndClass() {
+               logger.warn("Not yet implemented");
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesWithItemInCollection(java.lang.Class, java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.
+        */
+       @Test
+       public void testGetCdmBasesWithItemInCollection() {
+               logger.warn("Not yet implemented");
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getAllPersistedClasses(boolean)}.
+        */
+       @Test
+       public void testGetAllPersistedClasses() {
+               Class<?>[] existingClassesArray = {
+                               Address.class,
+                               AgentBase.class,
+                               Institution.class,
+                               InstitutionalMembership.class,
+                               Person.class,
+                               Team.class,
+                               TeamOrPersonBase.class,
+                               Annotation.class,
+                               AnnotationType.class,
+                               Credit.class,
+                               DefinedTermBase.class,
+                               Extension.class,
+                               ExtensionType.class,
+                               GrantedAuthorityImpl.class,
+                               Group.class,
+                               IdentifiableSource.class,
+                               Identifier.class,
+                               Language.class,
+                               LanguageString.class,
+                               LSIDAuthority.class,
+                               Marker.class,
+                               MarkerType.class,
+                               OrderedTermBase.class,
+                               OrderedTermVocabulary.class,
+                               OriginalSourceBase.class,
+                               RelationshipTermBase.class,
+                               Representation.class,
+                               TermVocabulary.class,
+                               User.class,
+                               DefinedTerm.class,
+
+                               CategoricalData.class,
+                               CommonTaxonName.class,
+                               DescriptionBase.class,
+                               DescriptionElementBase.class,
+                               Distribution.class,
+                               Feature.class,
+                               FeatureNode.class,
+                               FeatureTree.class,
+                               MediaKey.class,
+                               IndividualsAssociation.class,
+                               MeasurementUnit.class,
+                               PresenceAbsenceTerm.class,
+                               QuantitativeData.class,
+                               SpecimenDescription.class,
+                               State.class,
+                               StateData.class,
+                               StatisticalMeasure.class,
+                               StatisticalMeasurementValue.class,
+                               TaxonDescription.class,
+                               TaxonInteraction.class,
+                               TaxonNameDescription.class,
+                               TextData.class,
+                               TextFormat.class,
+                               NamedArea.class,
+                               NamedAreaLevel.class,
+                               NamedAreaType.class,
+                               ReferenceSystem.class,
+                               Country.class,
+                               AudioFile.class,
+                               ImageFile.class,
+                               Media.class,
+                               MediaRepresentation.class,
+                               MediaRepresentationPart.class,
+                               MovieFile.class,
+                               Rights.class,
+                               RightsType.class,
+                               Amplification.class,
+                               DnaSample.class,
+                               SingleRead.class,
+                               SingleReadAlignment.class,
+                               Primer.class,
+                               Sequence.class,
+                               PhylogeneticTree.class,
+                               Sequence.class,
+                               BacterialName.class,
+                               BotanicalName.class,
+                               CultivarPlantName.class,
+                               HomotypicalGroup.class,
+                               HybridRelationship.class,
+                               HybridRelationshipType.class,
+                               NameRelationship.class,
+                               NameRelationshipType.class,
+                               NameTypeDesignation.class,
+                               NameTypeDesignationStatus.class,
+                               NomenclaturalStatus.class,
+                               NomenclaturalStatusType.class,
+                               NonViralName.class,
+                               Rank.class,
+                               SpecimenTypeDesignation.class,
+                               SpecimenTypeDesignationStatus.class,
+                               TaxonNameBase.class,
+                               TypeDesignationBase.class,
+                               ViralName.class,
+                               ZoologicalName.class,
+                               Collection.class,
+                               DerivationEvent.class,
+                               DerivationEventType.class,
+                               DerivedUnit.class,
+                               DeterminationEvent.class,
+                               FieldUnit.class,
+                               GatheringEvent.class,
+                               PreservationMethod.class,
+                               SpecimenOrObservationBase.class,
+                               Reference.class,
+                               Synonym.class,
+                               SynonymRelationship.class,
+                               SynonymRelationshipType.class,
+                               Taxon.class,
+                               TaxonBase.class,
+                               TaxonNode.class,
+                               Classification.class,
+                               TaxonRelationship.class,
+                               TaxonRelationshipType.class ,
+                               //Contact.class,  //these are embedabble classes
+                               //LSID.class,
+                               //Point.class,
+                               //NomenclaturalCode.class,
+               }       ;
+               List<Class<?>> existingClassesList = new ArrayList<Class<?>>();
+               existingClassesList.addAll(Arrays.asList(existingClassesArray));
+               boolean includeAbstractClasses = true;
+               Set<Class<? extends CdmBase>> foundClasses = cdmGenericDao.getAllPersistedClasses(includeAbstractClasses);
+
+               //for debugging only
+               //              for (Class existingClass : existingClassesList){
+               //                      if (! foundClasses.contains(existingClass)){
+               //                              logger.warn("Class not found: " + existingClass.getCanonicalName());
+               //                      }
+               //              }
+
+               //All classes must be found
+               Assert.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses.containsAll(existingClassesList));
+
+
+               //No extra classes must be found
+               for (Class<?> clazz : foundClasses){
+                       if (! CdmBase.class.isAssignableFrom(clazz)&& !( AuditEvent.class == clazz) && !( CdmPreference.class == clazz)  ){ //OLD: && !( LSID.class == clazz)&& !( NomenclaturalCode.class == clazz) && !( Point.class == clazz) && !( Modifier.class == clazz) && !( Contact.class == clazz)
+                               Assert.fail("Class " + clazz.getName() + " is not assignable from CdmBase");
+                       }
+               }
+
+               includeAbstractClasses = false;
+               Set<Class<? extends CdmBase>> noAbstractClasses = cdmGenericDao.getAllPersistedClasses(includeAbstractClasses);
+               Class<?> abstractClassToTest = TaxonNameBase.class;
+               Assert.assertFalse("Abstract class " + abstractClassToTest.getName() + " may not be in set ", noAbstractClasses.contains(abstractClassToTest));
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
+        */
+       @Test
+       public void testGetReferencingObjectsCdmBase() {
+               BotanicalName name = BotanicalName.NewInstance(Rank.SPECIES());
+               name.setTitleCache("A name", true);
+               Reference<?> ref1 = ReferenceFactory.newArticle();
+               Taxon taxon = Taxon.NewInstance(name, ref1);
+               Person author = Person.NewInstance();
+               author.setTitleCache("Author", true);
+               ref1.addAnnotation(Annotation.NewInstance("A1", Language.DEFAULT()));
+               ref1.setAuthorship(author);
+               name.setBasionymAuthorship(author);
+
+               name.setNomenclaturalReference(ref1);
+
+               taxonDao.save(taxon);
+//             UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
+//             Reference ref1 = referenceService.findByUuid(uuid);
+
+
+               Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(ref1);
+               System.out.println("############## RESULT ###################");
+               for (CdmBase obj: referencedObjects){
+                       System.out.println("Object1: " + obj.getClass().getSimpleName() + " - " + obj);
+               }
+               assertEquals(3, referencedObjects.size());
+               System.out.println("############## ENDE ###################");
+
+//             UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
+//             AgentBase author = agentService.findByUuid(uuidAuthor);
+
+               referencedObjects = cdmGenericDao.getReferencingObjects(author);
+               System.out.println("############## RESULT ###################");
+               for (CdmBase obj: referencedObjects){
+                       System.out.println("Object2: " + obj.getClass().getSimpleName() + " - " + obj);
+               }
+               assertEquals(2, referencedObjects.size());
+               System.out.println("############## ENDE ###################");
+       }
+
+       /**
+        * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
+        *
+        */
+       @Test
+       @DataSet
+       public final void testGetReferencingObjects2() {
+//             SpecimenDescription desc1 = SpecimenDescription.NewInstance();
+//             desc1.setTitleCache("desc1");
+//             SpecimenDescription desc2 = SpecimenDescription.NewInstance();
+//             desc2.setTitleCache("desc2");
+//
+//             SpecimenOrObservationBase spec1 = Specimen.NewInstance();
+//
+//             desc1.addDescribedSpecimenOrObservation(spec1);
+//             //Taxon taxon = Taxon.NewInstance(taxonNameBase, sec)
+//             spec1.addDescription(desc2);
+//
+//             occurrenceService.save(spec1);
+
+               UUID uuidSpec = UUID.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");
+               SpecimenOrObservationBase<?> spec1 = occurrenceDao.findByUuid(uuidSpec);
+
+
+               Set<CdmBase> referencingObjects = cdmGenericDao.getReferencingObjects(spec1);
+//             System.out.println("############## RESULT ###################");
+//             for (CdmBase obj: referencingObjects){
+//                     System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);
+//             }
+//             System.out.println("############## ENDE ###################");
+               assertEquals("Number of referencing objects must be 2.", 2, referencingObjects.size());
+
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
+        * @throws MergeException
+        */
+       @Test
+//     @Ignore
+       public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException {
+
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
+               name1.setTitleCache("BotanicalName1", true);
+
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
+               name2.setTitleCache("BotanicalName2", true);
+
+               ZoologicalName zooName1 = ZoologicalName.NewInstance(Rank.SPECIES());
+               name1.setTitleCache("ZoologicalName1", true);
+
+               Reference<?> article1 = ReferenceFactory.newArticle();
+               Reference<?> article2 = ReferenceFactory.newArticle();
+
+
+               name1.setNomenclaturalReference(article1);
+               name2.setNomenclaturalReference(article2);
+
+
+               Taxon taxon1 = Taxon.NewInstance(name1, article1);
+               Taxon taxon2 = Taxon.NewInstance(name2, article2);
+
+
+//             Person author = Person.NewInstance();
+//             author.setTitleCache("Author");
+               Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());
+               Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());
+
+               article1.addAnnotation(annotation1);
+               article2.addAnnotation(annotation2);
+
+               Marker marker1 = Marker.NewInstance(MarkerType.COMPLETE(), false);
+               Marker marker2 = Marker.NewInstance(MarkerType.IMPORTED(), false);
+
+               article1.addMarker(marker1);
+               article2.addMarker(marker2);
+
+               Rights rights1 = Rights.NewInstance();
+               Rights rights2 = Rights.NewInstance();
+
+               article1.addRights(rights1);
+               article2.addRights(rights2);
+
+               Credit credit1 = Credit.NewInstance(Team.NewInstance(), "credit1");
+               Credit credit2 = Credit.NewInstance(Team.NewInstance(), "credit2");
+
+               article1.addCredit(credit1);
+               article2.addCredit(credit2);
+
+               Extension extension1 = Extension.NewInstance();
+               Extension extension2 = Extension.NewInstance();
+
+               article1.addExtension(extension1);
+               article2.addExtension(extension2);
+
+               IdentifiableSource source1 = IdentifiableSource.NewInstance(OriginalSourceType.Unknown);
+               IdentifiableSource source2 = IdentifiableSource.NewInstance(OriginalSourceType.Unknown);
+
+               article1.addSource(source1);
+               article2.addSource(source2);
+
+               Media media1 = Media.NewInstance();
+               Media media2 = Media.NewInstance();
+
+               article1.addMedia(media1);
+               article2.addMedia(media2);
+
+//             ref1.setAuthorship(author);
+//             name1.setBasionymAuthorship(author);
+
+               name1.setNomenclaturalReference(article1);
+
+               nameDao.save(name1);
+               nameDao.save(name2);
+               nameDao.save(zooName1);
+
+               TaxonDescription taxDesc = TaxonDescription.NewInstance(taxon1);
+               taxDesc.setTitleCache("taxDesc", true);
+               taxDesc.addSource(OriginalSourceType.Unknown, null, null, article2, null);
+
+               taxonDao.save(taxon1);
+
+               //unidircetional reference to the merged object should be redirected
+               cdmGenericDao.merge(article1, article2, null);
+               Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());
+               //TODO microCitations!! -> warning
+
+               //Annotations
+               Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());
+
+               //Marker
+               Assert.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1.getMarkers().size());
+
+               //Rights
+               Assert.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1.getRights().size());
+
+               //Credits
+               Assert.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1.getCredits().size());
+
+               //Extensions
+               Assert.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1.getExtensions().size());
+
+               //Sources
+               Assert.assertEquals("Sources number should be 2 (1 from each of the merged objects)", 2, article1.getSources().size());
+
+               //Media
+               Assert.assertEquals("Media number should be 2 (1 from each of the merged objects)", 2, article1.getMedia().size());
+
+               //Description sources
+               Assert.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc.getSources().size());
+               Assert.assertEquals("Taxon description must have article1 as source", taxDesc.getSources().iterator().next().getCitation(),article1);
+
+               //test exceptions
+               testMergeExceptions(name1, name2, taxon1, zooName1);
+
+
+               //FIXME TO BE IMPLEMENTED
+               //current defalt implementation for rights, credits and media is ADD_CLONE and therefore the below tests don't work
+               //TODO is this the wanted default behaviour?
+//             Assert.assertTrue("Rights2 must be contained in the rights", article1.getRights().contains(rights2));
+//             Assert.assertTrue("Credits2 must be contained in the credits", article1.getCredits().contains(credit2));
+//             Assert.assertTrue("Media2 must be contained in the media", article1.getMedia().contains(media2));
+
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
+        * @throws MergeException
+        */
+       @Test
+//     @Ignore
+       public void testMergeTaxonNameAndTaxon() throws MergeException {
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
+               name1.setTitleCache("BotanicalName1", true);
+
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
+               name2.setTitleCache("BotanicalName2", true);
+
+               BotanicalName name3 = BotanicalName.NewInstance(Rank.SPECIES());
+               name3.setTitleCache("BotanicalName3", true);
+
+               Reference<?> database = ReferenceFactory.newDatabase();
+
+               Taxon taxon1 = Taxon.NewInstance(name1, database);
+               Taxon taxon2 = Taxon.NewInstance(name2, database);
+               Taxon taxon3 = Taxon.NewInstance(name3, database);
+
+               taxonDao.save(taxon1);
+               taxonDao.save(taxon2);
+               taxonDao.save(taxon3);
+
+               cdmGenericDao.merge(name1, name2, null);
+               Assert.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1.getTaxonBases().size());
+               Assert.assertEquals("Taxon2 must have name1 as new name.", name1 ,taxon2.getName());
+
+//TODO
+//             cdmGenericDao.merge(taxon1, taxon3, null);
+//             Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());
+
+
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
+        * @throws MergeException
+        */
+       @Test
+       public void testMergeAuthors() throws MergeException {
+
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
+               name1.setTitleCache("BotanicalName1", true);
+
+               BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
+               name2.setTitleCache("BotanicalName2", true);
+
+               IBook book1 = ReferenceFactory.newBook();
+               IBook book2 = ReferenceFactory.newBook();
+
+               Team team1 = Team.NewInstance();
+               Team team2 = Team.NewInstance();
+               Team team3 = Team.NewInstance();
+               team1.setTitleCache("team1", true);
+               team2.setTitleCache("team2", true);
+               team3.setTitleCache("team3", true);
+
+               Person person1 = Person.NewTitledInstance("person1");
+               Person person2 = Person.NewTitledInstance("person2");
+               Person person3 = Person.NewTitledInstance("person3");
+
+               team1.setNomenclaturalTitle("T.1");
+               String street1 = "Strasse1";
+               team1.setContact(Contact.NewInstance(street1, "12345", "Berlin", Country.ARGENTINAARGENTINEREPUBLIC(),"pobox" , "Region", "a@b.de", "f12345", "+49-30-123456", URI.create("www.abc.de"), Point.NewInstance(2.4, 3.2, ReferenceSystem.WGS84(), 3)));
+               team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
+               String street3 = "Street3";
+               team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));
+               String emailAddress1 = "Email1";
+               team1.addEmailAddress(emailAddress1);
+
+               team2.addTeamMember(person1);
+               team2.addTeamMember(person2);
+               String emailAddress2 = "Email2";
+               team2.addEmailAddress(emailAddress2);
+
+               team3.addTeamMember(person3);
+               team3.addEmailAddress("emailAddress3");
+
+               book1.setAuthorship(team2);
+               book2.setAuthorship(team3);
+
+               Credit credit1 = Credit.NewInstance(team3, "credit1");
+               book2.addCredit(credit1);
+
+               agentDao.save(team1);
+               agentDao.save(team2);
+               agentDao.save(team3);
+               cdmGenericDao.save((Reference<?>)book1);
+               cdmGenericDao.save((Reference<?>)book2);
+
+               cdmGenericDao.merge(team2, team3, null);
+
+               Assert.assertSame("Author of book1 must be team2.", team2, book1.getAuthorship());
+               Assert.assertSame("Author of book2 must be team2.", team2, book2.getAuthorship());
+               Assert.assertSame("Agent of credit1 must be team2.", team2, credit1.getAgent());
+
+               Assert.assertEquals("Team2 must have 3 persons as members.",3, team2.getTeamMembers().size());
+               Assert.assertTrue("Team2 must have person3 as new member.", team2.getTeamMembers().contains(person3));
+               Assert.assertSame("Team2 must have person3 as third member.",person3, team2.getTeamMembers().get(2));
+
+
+               //Contact
+               cdmGenericDao.merge(team2, team1, null);
+               Contact team2Contact = team2.getContact();
+               Assert.assertNotNull("team2Contact must not be null", team2Contact);
+               Assert.assertNotNull("Addresses must not be null", team2Contact.getAddresses());
+               Assert.assertEquals("Number of addresses must be 3", 3, team2Contact.getAddresses().size());
+               Assert.assertEquals("Number of email addresses must be 4", 4, team2Contact.getEmailAddresses().size());
+
+               boolean street1Exists = false;
+               boolean street3Exists = false;
+               boolean country1Exists = false;
+               for  (Address address : team2Contact.getAddresses()){
+                       if (street1.equals(address.getStreet())){
+                               street1Exists = true;
+                       }
+                       if (street3.equals(address.getStreet())){
+                               street3Exists = true;
+                       }
+                       if (Country.ARGENTINAARGENTINEREPUBLIC() == address.getCountry()){
+                               country1Exists = true;
+                       }
+               }
+               Assert.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists);
+               Assert.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists);
+               Assert.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists);
+
+               //Person
+               Institution institution1 = Institution.NewInstance();
+               institution1.setTitleCache("inst1", true);
+               Institution institution2 = Institution.NewInstance();
+               institution2.setTitleCache("inst2", true);
+
+               TimePeriod period1 = TimePeriod.NewInstance(2002, 2004);
+               TimePeriod period2 = TimePeriod.NewInstance(2004, 2006);
+
+               person1.addInstitutionalMembership(institution1, period1, "departement1", "role1");
+               person2.addInstitutionalMembership(institution2, period2, "departement2", "role2");
+
+               IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);
+               personMergeStrategy.invoke(person1, person2);
+
+               Assert.assertEquals("Number of institutional memberships must be 2", 2, person1.getInstitutionalMemberships().size());
+               for (InstitutionalMembership institutionalMembership : person1.getInstitutionalMemberships()){
+                       Assert.assertSame("Person of institutional memebership must be person1", person1, institutionalMembership.getPerson());
+               }
+       }
+
+       /**
+     * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
+     *
+     * Test for  http://dev.e-taxonomy.eu/trac/ticket/5652
+     *
+     * @throws MergeException
+     */
+    @Test
+    public void testMergePersons() throws MergeException {
+        Team team1 = Team.NewInstance();
+        Team team2 = Team.NewInstance();
+        Team team3 = Team.NewInstance();
+        team1.setTitleCache("team1", true);
+        team2.setTitleCache("team2", true);
+        team3.setTitleCache("team3", true);
+
+        Person person1a = Person.NewTitledInstance("person1a");
+        Person person1b = Person.NewTitledInstance("person1b");
+        Person person2 = Person.NewTitledInstance("person2");
+        Person person3 = Person.NewTitledInstance("person3");
+
+        team1.addTeamMember(person1a);
+        team1.addTeamMember(person2);
+
+
+        team2.addTeamMember(person2);
+        team2.addTeamMember(person1a);
+        team2.addTeamMember(person3);
+
+        team3.addTeamMember(person3);
+
+        agentDao.save(team1);
+        agentDao.save(team2);
+        agentDao.save(team3);
+        agentDao.save(person1b);
+        commitAndStartNewTransaction(null);
+
+        IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);
+        cdmGenericDao.merge(person1b, person1a, personMergeStrategy);
+
+        team1 = (Team)agentDao.load(team1.getUuid());
+        team2 = (Team)agentDao.load(team2.getUuid());
+
+        //order should not change and 1a should be replaced by 1b
+        Assert.assertEquals("person1b", team1.getTeamMembers().get(0).getTitleCache());
+        Assert.assertEquals("person2", team1.getTeamMembers().get(1).getTitleCache());
+
+        Assert.assertEquals("person2", team2.getTeamMembers().get(0).getTitleCache());
+        Assert.assertEquals("person1b", team2.getTeamMembers().get(1).getTitleCache());
+        Assert.assertEquals("person3", team2.getTeamMembers().get(2).getTitleCache());
+
+    }
+
+
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
+        * @throws MergeException
+        */
+       @Test
+       public void testReallocatePersonTeam() throws MergeException {
+
+               BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
+               name1.setTitleCache("BotanicalName1", true);
+
+               IBook book1 = ReferenceFactory.newBook();
+
+               Team team1 = Team.NewInstance();
+               Team team2 = Team.NewInstance();
+               team1.setTitleCache("team1", true);
+               team2.setTitleCache("team2", true);
+
+               Person person1 = Person.NewTitledInstance("person1");
+               Person person2 = Person.NewTitledInstance("person2");
+
+               team1.setNomenclaturalTitle("T.1");
+               String street1 = "Strasse1";
+               person1.setContact(Contact.NewInstance(street1, "12345", "Berlin", Country.ARGENTINAARGENTINEREPUBLIC(),"pobox" , "Region", "a@b.de", "f12345", "+49-30-123456", URI.create("www.abc.de"), Point.NewInstance(2.4, 3.2, ReferenceSystem.WGS84(), 3)));
+               team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
+               String street3 = "Street3";
+               team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));
+               String emailAddress1 = "Email1";
+               team1.addEmailAddress(emailAddress1);
+
+
+               //FIXME
+//             team2.addTeamMember(person1);
+               team2.addTeamMember(person2);
+               String emailAddress2 = "Email2";
+               team2.addEmailAddress(emailAddress2);
+
+               Credit credit1 = Credit.NewInstance(team2, "credit1");
+               book1.addCredit(credit1);
+
+               agentDao.save(team1);
+               agentDao.save(team2);
+               agentDao.save(person1);
+               agentDao.save(person2);
+
+               cdmGenericDao.save((Reference<?>)book1);
+
+               //starting condition
+               name1.setCombinationAuthorship(person1);
+               Assert.assertEquals("Name1 should have person1 as combination author", person1, name1.getCombinationAuthorship());
+
+               DefaultMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class);
+//             strategy.setOnlyReallocateLinks(true);
+
+               FieldUnit fieldUnit1 = FieldUnit.NewInstance();
+               fieldUnit1.setPrimaryCollector(person1);
+               cdmGenericDao.save(fieldUnit1);
+               try {
+                       cdmGenericDao.merge(team2, person1, strategy);
+                       Assert.fail("We expect exception because fieldunit.primaryCollector is of type person");
+               } catch (MergeException e) {
+                       if (! e.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
+                               Assert.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
+                       }
+                       fieldUnit1.setPrimaryCollector(null);  //clean up for next test
+               } catch (Exception e) {
+                       Assert.fail("Unhandled exception during merge");
+               }
+               Assert.assertEquals("Name1 should still have person1 as combination author", person1, name1.getCombinationAuthorship());
+
+               //test collections
+               team1.addTeamMember(person1);
+               try {
+                       cdmGenericDao.merge(team2, person1, strategy);
+                       Assert.fail("We expect exception because fieldunit.primaryCollector is of type person");
+               } catch (MergeException e) {
+                       if (! e.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
+                               Assert.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
+                       }
+                       team1.removeTeamMember(person1); //clean up for next test
+               } catch (Exception e) {
+                       Assert.fail("Unhandled exception during merge");
+               }
+               Assert.assertEquals("Name1 should still have person1 as combination author", person1, name1.getCombinationAuthorship());
+
+               //test successful merge
+               cdmGenericDao.save(name1);
+               cdmGenericDao.merge(team2, person1, strategy);
+               Assert.assertEquals("Name1 should have team2 as combination author now", team2, name1.getCombinationAuthorship());
+
+       }
+
+
+       private void testMergeExceptions(CdmBase name1, CdmBase name2, CdmBase taxon,CdmBase zooName1) throws MergeException{
+               //
+               try {
+                       cdmGenericDao.merge(name1, null, null);
+                       Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
+               } catch (NullPointerException e) {
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
+               }
+               //
+               try {
+                       cdmGenericDao.merge(null, name1, null);
+                       Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
+               } catch (NullPointerException e) {
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
+               }
+               //exceptions to be thrown
+               try {
+                       cdmGenericDao.merge(name1, taxon, null);
+                       //this is not fully true anymore !! In certain cases merging of objects of different classes is allowed
+                       Assert.fail("Merging of 2 objects of different types must throw an exception");
+               } catch (MergeException e) {
+                       Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
+               }
+               //next exception
+               //for names this is not the case anymore
+//             try {
+//                     cdmGenericDao.merge(name1, zooName1, null);
+//                     Assert.fail("Merging of 2 objects of different types must throw an exception");
+//             } catch (MergeException e) {
+//                     Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
+//             }
+       }
+
+       @Test
+       public void findMatching(){
+               IBook book1 = ReferenceFactory.newBook();
+               IBook book2 = ReferenceFactory.newBook();
+               IBook book3 = ReferenceFactory.newBook();
+
+               String title1 = "title1";
+               String title2 = "title2";
+               book1.setTitle(title1);
+               book2.setTitle(title2);
+               book3.setTitle(title1);
+
+               cdmGenericDao.saveOrUpdate((Reference<?>)book1);
+               cdmGenericDao.saveOrUpdate((Reference<?>)book2);
+               cdmGenericDao.saveOrUpdate((Reference<?>)book3);
+
+               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(Reference.class);
+
+               try {
+                       List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertNotNull("Resultlist must not be null", matchResult);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
+
+                       book1.setDatePublished(TimePeriod.NewInstance(1999, 2002));
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
+
+                       book3.setDatePublished(TimePeriod.NewInstance(1999));
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
+
+                       book3.setDatePublished(TimePeriod.NewInstance(1999,2002));
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
+
+                       //BookSection
+                       IBookSection section1 = ReferenceFactory.newBookSection();
+                       section1.setInBook(book1);
+                       section1.setTitle("SecTitle");
+                       section1.setPages("22-33");
+                       IBookSection section2 = ReferenceFactory.newBookSection();
+                       section2.setInBook(book2);
+                       section2.setTitle("SecTitle");
+                       section2.setPages("22-33");
+                       IBookSection section3 = ReferenceFactory.newBookSection();
+                       section3.setInBook(book1);
+                       section3.setTitle("SecTitle");
+                       section3.setPages("22-33");
+                       cdmGenericDao.saveOrUpdate((Reference<?>)section1);
+                       cdmGenericDao.saveOrUpdate((Reference<?>)section2);
+                       cdmGenericDao.saveOrUpdate((Reference<?>)section3);
+
+                       List<IBookSection> sectionResult = cdmGenericDao.findMatching(section3, null);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, sectionResult.size());
+                       Assert.assertSame("Resultlist entry must be section1", section1, sectionResult.get(0));
+
+                       section2.setInBook(book2 = (IBook)book1.clone());
+                       cdmGenericDao.saveOrUpdate((Reference<?>)book2);
+                       cdmGenericDao.saveOrUpdate((Reference<?>)book1);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
+                       sectionResult = cdmGenericDao.findMatching(section3, null);
+                       Assert.assertEquals("Resultlist must have 1 entries", 2, sectionResult.size());
+
+
+                       Person person1 = Person.NewTitledInstance("person");
+                       Person person2 = Person.NewTitledInstance("person");
+                       Person person3 = Person.NewTitledInstance("person");
+
+                       person1.setPrefix("pre1");
+                       person2.setPrefix("pre2");
+                       person3.setPrefix("pre3");
+
+//                     matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+//                     Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
+
+                       book1.setAuthorship(person1);
+                       book2.setAuthorship(person1);
+                       book3.setAuthorship(person1);
+
+                       boolean m = matchStrategy.invoke(book1, book3);
+                       boolean m2 = matchStrategy.invoke(book2, book3);
+
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
+
+                       book2.setAuthorship(person2);
+                       book3.setAuthorship(person3);
+                       matchResult = cdmGenericDao.findMatching(book3, null);
+                       Assert.assertEquals("Resultlist must have no entries", 0, matchResult.size());
+
+                       person3.setPrefix("pre1");
+                       matchResult = cdmGenericDao.findMatching(book3, null);
+                       Assert.assertEquals("Resultlist must have 1 entry", 1, matchResult.size());
+                       Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
+
+               } catch (MatchException e) {
+                       Assert.fail("Find match must not throw Exception: " + e.getMessage());
+                       e.printStackTrace();
+               }
+
+       }
+
+
+       @Test
+       public void findMatchingCache(){
+               IBook book1 = ReferenceFactory.newBook();
+               Team team1 = Team.NewInstance();
+               Team team2 = Team.NewInstance();
+               team1.setTitleCache("Team1", true);
+               team2.setTitleCache("Team1", true);
+
+               book1.setTitle("Title1");
+               book1.setEdition("Edition1");
+               book1.setAuthorship(team1);
+
+
+               IBook book2 = (IBook) ((Reference<?>)book1).clone();
+               IBook book3 = (IBook) ((Reference<?>)book1).clone();
+
+//             Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));
+//             book1.setTitleCache("cache1");
+//             Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));
+//
+//             bookClone.setTitleCache("cache1");
+//             Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));
+//
+//             bookClone.setTitleCache("cache2");
+//             Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));
+//             bookClone.setTitleCache("cache1"); //restore
+//
+//             bookClone.setEdition(null);
+//             Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));
+
+               cdmGenericDao.saveOrUpdate((Reference<?>)book1);
+               cdmGenericDao.saveOrUpdate((Reference<?>)book2);
+               cdmGenericDao.saveOrUpdate((Reference<?>)book3);
+               cdmGenericDao.saveOrUpdate(team1);
+               cdmGenericDao.saveOrUpdate(team2);
+
+
+               IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(Reference.class);
+
+               try {
+                       List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertNotNull("Resultlist must not be null", matchResult);
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
+
+                       book1.setTitleCache("cache1", true);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
+
+                       book2.setTitleCache("cache2", false);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
+
+                       book2.setEdition(null);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 0 entries", 0, matchResult.size());
+
+                       book3.setTitleCache("cache1", true);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+
+                       IMatchStrategy teamMatcher = DefaultMatchStrategy.NewInstance(Team.class);
+                       boolean teamsMatch = teamMatcher.invoke(team1, team2);
+                       Assert.assertTrue("Team1 and team2 should match" ,teamsMatch);
+
+                       book3.setAuthorship(team2);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+
+                       book3.setAuthorship(null);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+
+                       book2.setTitleCache(book3.getTitleCache(), true);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+                       Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
+
+                       team2.setTitleCache("team2", true);
+                       teamsMatch = teamMatcher.invoke(team1, team2);
+                       Assert.assertFalse("Team1 and team2 should not match" ,teamsMatch);
+
+                       book3.setAuthorship(team1);
+                       book2.setAuthorship(team2);
+                       matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
+                       Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
+                       Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
+
+
+               } catch (MatchException e) {
+                       Assert.fail("Find match must not throw Exception: " + e.getMessage());
+                       e.printStackTrace();
+               }
+       }
+
+       //from original testing within class, can be removed if not needed anymore
+       private void test() {
+               SessionFactoryImpl factory = (SessionFactoryImpl)((CdmGenericDaoImpl)cdmGenericDao).getSession().getSessionFactory();
+               Type propType = factory.getReferencedPropertyType(BotanicalName.class.getCanonicalName(), "titleCache");
+               Map<?,?> collMetadata = factory.getAllCollectionMetadata();
+               Object roles = factory.getCollectionRolesByEntityParticipant("eu.etaxonomy.cdm.model.name.BotanicalName");
+               CollectionPersister collPersister;
+               try {
+                       collPersister = factory.getCollectionPersister(TaxonNameBase.class.getCanonicalName()+".annotations");
+               } catch (MappingException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               Statistics statistics = factory.getStatistics();
+               Map<?,?> allClassMetadata = factory.getAllClassMetadata();
+               logger.debug("");
+
+       }
+
+       /**
+        * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getHqlResult(java.lang.String)}.
+        */
+       @Test
+       public void testGetHqlResult() {
+               logger.warn("Not yet implemented");
+       }
+
+    @Override
+    public void createTestDataSet() throws FileNotFoundException {}
+}