3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
;
13 import static org
.junit
.Assert
.assertEquals
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Arrays
;
17 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import org
.apache
.log4j
.Logger
;
22 import org
.junit
.After
;
23 import org
.junit
.AfterClass
;
24 import org
.junit
.Assert
;
25 import org
.junit
.Before
;
26 import org
.junit
.BeforeClass
;
27 import org
.junit
.Ignore
;
28 import org
.junit
.Test
;
29 import org
.unitils
.dbunit
.annotation
.DataSet
;
30 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
32 import eu
.etaxonomy
.cdm
.model
.agent
.Address
;
33 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
34 import eu
.etaxonomy
.cdm
.model
.agent
.Contact
;
35 import eu
.etaxonomy
.cdm
.model
.agent
.Institution
;
36 import eu
.etaxonomy
.cdm
.model
.agent
.InstitutionType
;
37 import eu
.etaxonomy
.cdm
.model
.agent
.InstitutionalMembership
;
38 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
39 import eu
.etaxonomy
.cdm
.model
.agent
.Team
;
40 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
41 import eu
.etaxonomy
.cdm
.model
.common
.Annotation
;
42 import eu
.etaxonomy
.cdm
.model
.common
.AnnotationType
;
43 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
44 import eu
.etaxonomy
.cdm
.model
.common
.Credit
;
45 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTerm
;
46 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
47 import eu
.etaxonomy
.cdm
.model
.common
.Extension
;
48 import eu
.etaxonomy
.cdm
.model
.common
.ExtensionType
;
49 import eu
.etaxonomy
.cdm
.model
.common
.GrantedAuthorityImpl
;
50 import eu
.etaxonomy
.cdm
.model
.common
.Group
;
51 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableSource
;
52 import eu
.etaxonomy
.cdm
.model
.common
.LSIDAuthority
;
53 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
54 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
55 import eu
.etaxonomy
.cdm
.model
.common
.Marker
;
56 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
57 import eu
.etaxonomy
.cdm
.model
.common
.OrderedTermBase
;
58 import eu
.etaxonomy
.cdm
.model
.common
.OrderedTermVocabulary
;
59 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSourceBase
;
60 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSourceType
;
61 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipTermBase
;
62 import eu
.etaxonomy
.cdm
.model
.common
.Representation
;
63 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
64 import eu
.etaxonomy
.cdm
.model
.common
.TimePeriod
;
65 import eu
.etaxonomy
.cdm
.model
.common
.User
;
66 import eu
.etaxonomy
.cdm
.model
.description
.AbsenceTerm
;
67 import eu
.etaxonomy
.cdm
.model
.description
.CategoricalData
;
68 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
69 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
70 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
71 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
72 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
73 import eu
.etaxonomy
.cdm
.model
.description
.FeatureNode
;
74 import eu
.etaxonomy
.cdm
.model
.description
.FeatureTree
;
75 import eu
.etaxonomy
.cdm
.model
.description
.IndividualsAssociation
;
76 import eu
.etaxonomy
.cdm
.model
.description
.MeasurementUnit
;
77 import eu
.etaxonomy
.cdm
.model
.description
.MediaKey
;
78 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTermBase
;
79 import eu
.etaxonomy
.cdm
.model
.description
.PresenceTerm
;
80 import eu
.etaxonomy
.cdm
.model
.description
.QuantitativeData
;
81 import eu
.etaxonomy
.cdm
.model
.description
.SpecimenDescription
;
82 import eu
.etaxonomy
.cdm
.model
.description
.State
;
83 import eu
.etaxonomy
.cdm
.model
.description
.StateData
;
84 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasure
;
85 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasurementValue
;
86 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
87 import eu
.etaxonomy
.cdm
.model
.description
.TaxonInteraction
;
88 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
89 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
90 import eu
.etaxonomy
.cdm
.model
.description
.TextFormat
;
91 import eu
.etaxonomy
.cdm
.model
.location
.Continent
;
92 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
93 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaLevel
;
94 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaType
;
95 import eu
.etaxonomy
.cdm
.model
.location
.Point
;
96 import eu
.etaxonomy
.cdm
.model
.location
.ReferenceSystem
;
97 import eu
.etaxonomy
.cdm
.model
.location
.WaterbodyOrCountry
;
98 import eu
.etaxonomy
.cdm
.model
.media
.AudioFile
;
99 import eu
.etaxonomy
.cdm
.model
.media
.ImageFile
;
100 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
101 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
102 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
103 import eu
.etaxonomy
.cdm
.model
.media
.MovieFile
;
104 import eu
.etaxonomy
.cdm
.model
.media
.Rights
;
105 import eu
.etaxonomy
.cdm
.model
.media
.RightsTerm
;
106 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
107 import eu
.etaxonomy
.cdm
.model
.molecular
.Locus
;
108 import eu
.etaxonomy
.cdm
.model
.molecular
.PhylogeneticTree
;
109 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
110 import eu
.etaxonomy
.cdm
.model
.name
.BacterialName
;
111 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
112 import eu
.etaxonomy
.cdm
.model
.name
.CultivarPlantName
;
113 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
114 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationship
;
115 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
116 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationship
;
117 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
118 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignation
;
119 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
120 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
121 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
122 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
123 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
124 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
125 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
126 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
127 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
128 import eu
.etaxonomy
.cdm
.model
.name
.ViralName
;
129 import eu
.etaxonomy
.cdm
.model
.name
.ZoologicalName
;
130 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
131 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
132 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
133 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
134 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
135 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldUnit
;
136 import eu
.etaxonomy
.cdm
.model
.occurrence
.GatheringEvent
;
137 import eu
.etaxonomy
.cdm
.model
.occurrence
.PreservationMethod
;
138 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
139 import eu
.etaxonomy
.cdm
.model
.reference
.IBook
;
140 import eu
.etaxonomy
.cdm
.model
.reference
.IBookSection
;
141 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
142 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
143 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
144 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
145 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
146 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
147 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
148 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
149 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
150 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
151 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
152 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
153 import eu
.etaxonomy
.cdm
.persistence
.dao
.agent
.IAgentDao
;
154 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.ICdmGenericDao
;
155 import eu
.etaxonomy
.cdm
.persistence
.dao
.name
.ITaxonNameDao
;
156 import eu
.etaxonomy
.cdm
.persistence
.dao
.occurrence
.IOccurrenceDao
;
157 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
158 import eu
.etaxonomy
.cdm
.strategy
.match
.DefaultMatchStrategy
;
159 import eu
.etaxonomy
.cdm
.strategy
.match
.IMatchStrategy
;
160 import eu
.etaxonomy
.cdm
.strategy
.match
.MatchException
;
161 import eu
.etaxonomy
.cdm
.strategy
.merge
.DefaultMergeStrategy
;
162 import eu
.etaxonomy
.cdm
.strategy
.merge
.IMergeStrategy
;
163 import eu
.etaxonomy
.cdm
.strategy
.merge
.MergeException
;
164 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
168 * @created 27.07.2009
171 public class CdmGenericDaoImplTest
extends CdmTransactionalIntegrationTest
{
172 private static final Logger logger
= Logger
.getLogger(CdmGenericDaoImplTest
.class);
175 private ICdmGenericDao cdmGenericDao
;
178 private ITaxonDao taxonDao
;
181 private IOccurrenceDao occurrenceDao
;
185 private ITaxonNameDao nameDao
;
188 private IAgentDao agentDao
;
192 * @throws java.lang.Exception
195 public static void setUpBeforeClass() throws Exception
{
199 * @throws java.lang.Exception
202 public static void tearDownAfterClass() throws Exception
{
206 * @throws java.lang.Exception
209 public void setUp() throws Exception
{
213 * @throws java.lang.Exception
216 public void tearDown() throws Exception
{
219 // ***************** TESTS **************************************************
223 public void testDelete(){
224 Reference
<?
> ref1
= ReferenceFactory
.newBook();
225 Reference
<?
> ref2
= ReferenceFactory
.newBook();
226 Annotation annotation
= Annotation
.NewInstance("Anno1", null);
227 ref1
.addAnnotation(annotation
);
228 cdmGenericDao
.saveOrUpdate(ref1
);
229 cdmGenericDao
.saveOrUpdate(ref2
);
232 cdmGenericDao
.merge(ref2
, ref1
, null);
234 } catch (MergeException e
) {
235 // TODO Auto-generated catch block
238 //cdmGenericDao.delete(ref1);
240 System
.out
.println("OK");
241 //Assert.fail("Failed for testing");
245 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
246 * @throws MergeException
250 public void testDelete2() throws MergeException
{
251 BotanicalName name1
= BotanicalName
.NewInstance(Rank
.SPECIES());
252 name1
.setTitleCache("BotanicalName1", true);
254 BotanicalName name2
= BotanicalName
.NewInstance(Rank
.SPECIES());
255 name2
.setTitleCache("BotanicalName2", true);
257 Reference article1
= ReferenceFactory
.newArticle();
258 Reference article2
= ReferenceFactory
.newArticle();
261 name1
.setNomenclaturalReference(article1
);
262 name2
.setNomenclaturalReference(article2
);
265 Taxon taxon1
= Taxon
.NewInstance(name1
, article1
);
267 // Person author = Person.NewInstance();
268 // author.setTitleCache("Author");
269 Annotation annotation1
= Annotation
.NewInstance("A1", Language
.DEFAULT());
270 Annotation annotation2
= Annotation
.NewInstance("A2", Language
.DEFAULT());
272 article1
.addAnnotation(annotation1
);
273 article2
.addAnnotation(annotation2
);
277 cdmGenericDao
.saveOrUpdate(article2
);
279 taxonDao
.save(taxon1
);
281 //unidircetional reference to the merged object should be redirected
282 cdmGenericDao
.merge(article1
, article2
, null);
283 Assert
.assertEquals("Name2 must have article 1 as new nomRef", article1
,name2
.getNomenclaturalReference());
284 //TODO microCitations!! -> warning
287 Assert
.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1
.getAnnotations().size());
294 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#CdmGenericDaoImpl()}.
297 public void testCdmGenericDaoImpl() {
298 logger
.warn("Not yet implemented");
302 * 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)}.
305 public void testGetCdmBasesByFieldAndClass() {
306 logger
.warn("Not yet implemented");
310 * 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)}.
313 public void testGetCdmBasesWithItemInCollection() {
314 logger
.warn("Not yet implemented");
318 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getAllCdmClasses(boolean)}.
321 public void testGetAllCdmClasses() {
322 Class
[] existingClassesArray
= {
326 InstitutionalMembership
.class,
327 InstitutionType
.class,
330 TeamOrPersonBase
.class,
332 AnnotationType
.class,
334 DefinedTermBase
.class,
337 GrantedAuthorityImpl
.class,
339 IdentifiableSource
.class,
341 LanguageString
.class,
345 OrderedTermBase
.class,
346 OrderedTermVocabulary
.class,
347 OriginalSourceBase
.class,
348 RelationshipTermBase
.class,
349 Representation
.class,
350 TermVocabulary
.class,
355 CategoricalData
.class,
356 CommonTaxonName
.class,
357 DescriptionBase
.class,
358 DescriptionElementBase
.class,
364 IndividualsAssociation
.class,
365 MeasurementUnit
.class,
366 PresenceAbsenceTermBase
.class,
368 QuantitativeData
.class,
369 SpecimenDescription
.class,
372 StatisticalMeasure
.class,
373 StatisticalMeasurementValue
.class,
374 TaxonDescription
.class,
375 TaxonInteraction
.class,
376 TaxonNameDescription
.class,
381 NamedAreaLevel
.class,
383 ReferenceSystem
.class,
384 WaterbodyOrCountry
.class,
388 MediaRepresentation
.class,
389 MediaRepresentationPart
.class,
395 PhylogeneticTree
.class,
399 CultivarPlantName
.class,
400 HomotypicalGroup
.class,
401 HybridRelationship
.class,
402 HybridRelationshipType
.class,
403 NameRelationship
.class,
404 NameRelationshipType
.class,
405 NameTypeDesignation
.class,
406 NameTypeDesignationStatus
.class,
407 NomenclaturalStatus
.class,
408 NomenclaturalStatusType
.class,
411 SpecimenTypeDesignation
.class,
412 SpecimenTypeDesignationStatus
.class,
414 TypeDesignationBase
.class,
416 ZoologicalName
.class,
418 DerivationEvent
.class,
419 DerivationEventType
.class,
421 DeterminationEvent
.class,
423 GatheringEvent
.class,
424 PreservationMethod
.class,
425 SpecimenOrObservationBase
.class,
428 SynonymRelationship
.class,
429 SynonymRelationshipType
.class,
433 Classification
.class,
434 TaxonRelationship
.class,
435 TaxonRelationshipType
.class
440 //NomenclaturalCode.class,
442 List
<Class
> existingClassesList
= new ArrayList
<Class
>();
443 existingClassesList
.addAll(Arrays
.asList(existingClassesArray
));
444 boolean includeAbstractClasses
= true;
445 Set
<Class
<?
extends CdmBase
>> foundClasses
= cdmGenericDao
.getAllCdmClasses(includeAbstractClasses
);
448 // for (Class existingClass : existingClassesList){
449 // if (! foundClasses.contains(existingClass)){
450 // logger.warn("Class not found: " + existingClass.getCanonicalName());
454 //All classes must be found
455 Assert
.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses
.containsAll(existingClassesList
));
458 //No extra classes must be found
459 for (Class clazz
: foundClasses
){
460 if (! CdmBase
.class.isAssignableFrom(clazz
)&& !( AuditEvent
.class == clazz
) ){ //OLD: && !( LSID.class == clazz)&& !( NomenclaturalCode.class == clazz) && !( Point.class == clazz) && !( Modifier.class == clazz) && !( Contact.class == clazz)
461 Assert
.fail("Class " + clazz
.getName() + " is not assignable from CdmBase");
465 includeAbstractClasses
= false;
466 Set
<Class
<?
extends CdmBase
>> noAbstractClasses
= cdmGenericDao
.getAllCdmClasses(includeAbstractClasses
);
467 Class abstractClassToTest
= TaxonNameBase
.class;
468 Assert
.assertFalse("Abstract class " + abstractClassToTest
.getName() + " may not be in set ", noAbstractClasses
.contains(abstractClassToTest
));
472 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
475 public void testGetReferencingObjectsCdmBase() {
476 BotanicalName name
= BotanicalName
.NewInstance(Rank
.SPECIES());
477 name
.setTitleCache("A name", true);
478 Reference ref1
= ReferenceFactory
.newArticle();
479 Taxon taxon
= Taxon
.NewInstance(name
, ref1
);
480 Person author
= Person
.NewInstance();
481 author
.setTitleCache("Author", true);
482 ref1
.addAnnotation(Annotation
.NewInstance("A1", Language
.DEFAULT()));
483 ref1
.setAuthorTeam(author
);
484 name
.setBasionymAuthorTeam(author
);
486 name
.setNomenclaturalReference(ref1
);
488 taxonDao
.save(taxon
);
489 // UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
490 // Reference ref1 = referenceService.findByUuid(uuid);
493 Set
<CdmBase
> referencedObjects
= cdmGenericDao
.getReferencingObjects(ref1
);
494 System
.out
.println("############## RESULT ###################");
495 for (CdmBase obj
: referencedObjects
){
496 System
.out
.println("Object1: " + obj
.getClass().getSimpleName() + " - " + obj
);
498 assertEquals(3, referencedObjects
.size());
499 System
.out
.println("############## ENDE ###################");
501 // UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
502 // AgentBase author = agentService.findByUuid(uuidAuthor);
504 referencedObjects
= cdmGenericDao
.getReferencingObjects(author
);
505 System
.out
.println("############## RESULT ###################");
506 for (CdmBase obj
: referencedObjects
){
507 System
.out
.println("Object2: " + obj
.getClass().getSimpleName() + " - " + obj
);
509 assertEquals(2, referencedObjects
.size());
510 System
.out
.println("############## ENDE ###################");
514 * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
519 public final void testGetReferencingObjects2() {
520 // SpecimenDescription desc1 = SpecimenDescription.NewInstance();
521 // desc1.setTitleCache("desc1");
522 // SpecimenDescription desc2 = SpecimenDescription.NewInstance();
523 // desc2.setTitleCache("desc2");
525 // SpecimenOrObservationBase spec1 = Specimen.NewInstance();
527 // desc1.addDescribedSpecimenOrObservation(spec1);
528 // //Taxon taxon = Taxon.NewInstance(taxonNameBase, sec)
529 // spec1.addDescription(desc2);
531 // occurrenceService.save(spec1);
533 UUID uuidSpec
= UUID
.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");
534 SpecimenOrObservationBase spec1
= occurrenceDao
.findByUuid(uuidSpec
);
537 Set
<CdmBase
> referencingObjects
= cdmGenericDao
.getReferencingObjects(spec1
);
538 // System.out.println("############## RESULT ###################");
539 // for (CdmBase obj: referencingObjects){
540 // System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);
542 // System.out.println("############## ENDE ###################");
543 assertEquals("Number of referencing objects must be 2.", 2, referencingObjects
.size());
548 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
549 * @throws MergeException
553 public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException
{
554 cdmGenericDao
.test();
557 BotanicalName name1
= BotanicalName
.NewInstance(Rank
.SPECIES());
558 name1
.setTitleCache("BotanicalName1", true);
560 BotanicalName name2
= BotanicalName
.NewInstance(Rank
.SPECIES());
561 name2
.setTitleCache("BotanicalName2", true);
563 ZoologicalName zooName1
= ZoologicalName
.NewInstance(Rank
.SPECIES());
564 name1
.setTitleCache("ZoologicalName1", true);
566 Reference article1
= ReferenceFactory
.newArticle();
567 Reference article2
= ReferenceFactory
.newArticle();
570 name1
.setNomenclaturalReference(article1
);
571 name2
.setNomenclaturalReference(article2
);
574 Taxon taxon1
= Taxon
.NewInstance(name1
, article1
);
575 Taxon taxon2
= Taxon
.NewInstance(name2
, article2
);
578 // Person author = Person.NewInstance();
579 // author.setTitleCache("Author");
580 Annotation annotation1
= Annotation
.NewInstance("A1", Language
.DEFAULT());
581 Annotation annotation2
= Annotation
.NewInstance("A2", Language
.DEFAULT());
583 article1
.addAnnotation(annotation1
);
584 article2
.addAnnotation(annotation2
);
586 Marker marker1
= Marker
.NewInstance(MarkerType
.COMPLETE(), false);
587 Marker marker2
= Marker
.NewInstance(MarkerType
.IMPORTED(), false);
589 article1
.addMarker(marker1
);
590 article2
.addMarker(marker2
);
592 Rights rights1
= Rights
.NewInstance();
593 Rights rights2
= Rights
.NewInstance();
595 article1
.addRights(rights1
);
596 article2
.addRights(rights2
);
599 Credit credit1
= Credit
.NewInstance(Team
.NewInstance(), "credit1");
600 Credit credit2
= Credit
.NewInstance(Team
.NewInstance(), "credit2");
602 article1
.addCredit(credit1
);
603 article2
.addCredit(credit2
);
605 Extension extension1
= Extension
.NewInstance();
606 Extension extension2
= Extension
.NewInstance();
608 article1
.addExtension(extension1
);
609 article2
.addExtension(extension2
);
611 IdentifiableSource source1
= IdentifiableSource
.NewInstance(OriginalSourceType
.Unknown
);
612 IdentifiableSource source2
= IdentifiableSource
.NewInstance(OriginalSourceType
.Unknown
);
614 article1
.addSource(source1
);
615 article2
.addSource(source2
);
617 Media media1
= Media
.NewInstance();
618 Media media2
= Media
.NewInstance();
620 article1
.addMedia(media1
);
621 article2
.addMedia(media2
);
623 // ref1.setAuthorTeam(author);
624 // name1.setBasionymAuthorTeam(author);
626 name1
.setNomenclaturalReference(article1
);
630 nameDao
.save(zooName1
);
632 TaxonDescription taxDesc
= TaxonDescription
.NewInstance(taxon1
);
633 taxDesc
.setTitleCache("taxDesc", true);
634 taxDesc
.addSource(OriginalSourceType
.Unknown
, null, null, article2
, null);
636 taxonDao
.save(taxon1
);
638 //unidircetional reference to the merged object should be redirected
639 cdmGenericDao
.merge(article1
, article2
, null);
640 Assert
.assertEquals("Name2 must have article 1 as new nomRef", article1
,name2
.getNomenclaturalReference());
641 //TODO microCitations!! -> warning
644 Assert
.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1
.getAnnotations().size());
647 Assert
.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1
.getMarkers().size());
650 Assert
.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1
.getRights().size());
653 Assert
.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1
.getCredits().size());
656 Assert
.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1
.getExtensions().size());
659 Assert
.assertEquals("Sources number should be 2 (1 from each of the merged objects)", 2, article1
.getSources().size());
662 Assert
.assertEquals("Media number should be 2 (1 from each of the merged objects)", 2, article1
.getMedia().size());
664 //Description sources
665 Assert
.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc
.getSources().size());
666 Assert
.assertEquals("Taxon description must have article1 as source", taxDesc
.getSources().iterator().next().getCitation(),article1
);
669 testMergeExceptions(name1
, name2
, taxon1
, zooName1
);
673 Assert
.assertTrue("Rights2 must be contained in the rights", article1
.getRights().contains(rights2
));
674 Assert
.assertTrue("Credits2 must be contained in the credits", article1
.getCredits().contains(credit2
));
675 Assert
.assertTrue("Media2 must be contained in the media", article1
.getMedia().contains(media2
));
680 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
681 * @throws MergeException
685 public void testMergeTaxonNameAndTaxon() throws MergeException
{
686 BotanicalName name1
= BotanicalName
.NewInstance(Rank
.SPECIES());
687 name1
.setTitleCache("BotanicalName1", true);
689 BotanicalName name2
= BotanicalName
.NewInstance(Rank
.SPECIES());
690 name2
.setTitleCache("BotanicalName2", true);
692 BotanicalName name3
= BotanicalName
.NewInstance(Rank
.SPECIES());
693 name3
.setTitleCache("BotanicalName3", true);
695 Reference database
= ReferenceFactory
.newDatabase();
697 Taxon taxon1
= Taxon
.NewInstance(name1
, database
);
698 Taxon taxon2
= Taxon
.NewInstance(name2
, database
);
699 Taxon taxon3
= Taxon
.NewInstance(name3
, database
);
701 taxonDao
.save(taxon1
);
702 taxonDao
.save(taxon2
);
703 taxonDao
.save(taxon3
);
705 cdmGenericDao
.merge(name1
, name2
, null);
706 Assert
.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1
.getTaxonBases().size());
707 Assert
.assertEquals("Taxon2 must have name1 as new name.", name1
,taxon2
.getName());
710 // cdmGenericDao.merge(taxon1, taxon3, null);
711 // Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());
717 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
718 * @throws MergeException
721 public void testMergeAuthors() throws MergeException
{
723 BotanicalName name1
= BotanicalName
.NewInstance(Rank
.SPECIES());
724 name1
.setTitleCache("BotanicalName1", true);
726 BotanicalName name2
= BotanicalName
.NewInstance(Rank
.SPECIES());
727 name2
.setTitleCache("BotanicalName2", true);
729 IBook book1
= ReferenceFactory
.newBook();
730 IBook book2
= ReferenceFactory
.newBook();
732 Team team1
= Team
.NewInstance();
733 Team team2
= Team
.NewInstance();
734 Team team3
= Team
.NewInstance();
735 team1
.setTitleCache("team1", true);
736 team2
.setTitleCache("team2", true);
737 team3
.setTitleCache("team3", true);
739 Person person1
= Person
.NewTitledInstance("person1");
740 Person person2
= Person
.NewTitledInstance("person2");
741 Person person3
= Person
.NewTitledInstance("person3");
743 team1
.setNomenclaturalTitle("T.1");
744 String street1
= "Strasse1";
745 team1
.setContact(Contact
.NewInstance(street1
, "12345", "Berlin", WaterbodyOrCountry
.ARGENTINAARGENTINEREPUBLIC(),"pobox" , "Region", "a@b.de", "f12345", "+49-30-123456", "www.abc.de", Point
.NewInstance(2.4, 3.2, ReferenceSystem
.WGS84(), 3)));
746 team2
.setContact(Contact
.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
747 String street3
= "Street3";
748 team2
.addAddress(street3
, null, null, null, null, null, Point
.NewInstance(1.1, 2.2, null, 4));
749 String emailAddress1
= "Email1";
750 team1
.addEmailAddress(emailAddress1
);
752 team2
.addTeamMember(person1
);
753 team2
.addTeamMember(person2
);
754 String emailAddress2
= "Email2";
755 team2
.addEmailAddress(emailAddress2
);
757 team3
.addTeamMember(person3
);
758 team3
.addEmailAddress("emailAddress3");
760 book1
.setAuthorTeam(team2
);
761 book2
.setAuthorTeam(team3
);
763 Credit credit1
= Credit
.NewInstance(team3
, "credit1");
764 book2
.addCredit(credit1
);
766 agentDao
.save(team1
);
767 agentDao
.save(team2
);
768 agentDao
.save(team3
);
769 cdmGenericDao
.save((Reference
)book1
);
770 cdmGenericDao
.save((Reference
)book2
);
772 cdmGenericDao
.merge(team2
, team3
, null);
774 Assert
.assertSame("Author of book1 must be team2.", team2
, book1
.getAuthorTeam());
775 Assert
.assertSame("Author of book2 must be team2.", team2
, book2
.getAuthorTeam());
776 Assert
.assertSame("Agent of credit1 must be team2.", team2
, credit1
.getAgent());
778 Assert
.assertEquals("Team2 must have 3 persons as members.",3, team2
.getTeamMembers().size());
779 Assert
.assertTrue("Team2 must have person3 as new member.", team2
.getTeamMembers().contains(person3
));
780 Assert
.assertSame("Team2 must have person3 as third member.",person3
, team2
.getTeamMembers().get(2));
784 cdmGenericDao
.merge(team2
, team1
, null);
785 Contact team2Contact
= team2
.getContact();
786 Assert
.assertNotNull("team2Contact must not be null", team2Contact
);
787 Assert
.assertNotNull("Addresses must not be null", team2Contact
.getAddresses());
788 Assert
.assertEquals("Number of addresses must be 3", 3, team2Contact
.getAddresses().size());
789 Assert
.assertEquals("Number of email addresses must be 4", 4, team2Contact
.getEmailAddresses().size());
791 boolean street1Exists
= false;
792 boolean street3Exists
= false;
793 boolean country1Exists
= false;
794 for (Address address
: team2Contact
.getAddresses()){
795 if (street1
.equals(address
.getStreet())){
796 street1Exists
= true;
798 if (street3
.equals(address
.getStreet())){
799 street3Exists
= true;
801 if (WaterbodyOrCountry
.ARGENTINAARGENTINEREPUBLIC() == address
.getCountry()){
802 country1Exists
= true;
805 Assert
.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists
);
806 Assert
.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists
);
807 Assert
.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists
);
810 Institution institution1
= Institution
.NewInstance();
811 institution1
.setTitleCache("inst1", true);
812 Institution institution2
= Institution
.NewInstance();
813 institution2
.setTitleCache("inst2", true);
815 TimePeriod period1
= TimePeriod
.NewInstance(2002, 2004);
816 TimePeriod period2
= TimePeriod
.NewInstance(2004, 2006);
818 person1
.addInstitutionalMembership(institution1
, period1
, "departement1", "role1");
819 person2
.addInstitutionalMembership(institution2
, period2
, "departement2", "role2");
821 IMergeStrategy personMergeStrategy
= DefaultMergeStrategy
.NewInstance(Person
.class);
822 personMergeStrategy
.invoke(person1
, person2
);
824 Assert
.assertEquals("Number of institutional memberships must be 2", 2, person1
.getInstitutionalMemberships().size());
825 for (InstitutionalMembership institutionalMembership
: person1
.getInstitutionalMemberships()){
826 Assert
.assertSame("Person of institutional memebership must be person1", person1
, institutionalMembership
.getPerson());
831 private void testMergeExceptions(CdmBase name1
, CdmBase name2
, CdmBase taxon
,CdmBase zooName1
) throws MergeException
{
834 cdmGenericDao
.merge(name1
, null, null);
835 Assert
.fail("Merging of 2 objects one or both of them null must throw an exception");
836 } catch (MergeException e
) {
837 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
841 cdmGenericDao
.merge(null, name1
, null);
842 Assert
.fail("Merging of 2 objects one or both of them null must throw an exception");
843 } catch (NullPointerException e
) {
844 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
846 //exceptions to be thrown
848 cdmGenericDao
.merge(name1
, taxon
, null);
849 Assert
.fail("Merging of 2 objects of different types must throw an exception");
850 } catch (MergeException e
) {
851 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
855 cdmGenericDao
.merge(name1
, zooName1
, null);
856 Assert
.fail("Merging of 2 objects of different types must throw an exception");
857 } catch (MergeException e
) {
858 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
863 public void findMatching(){
864 IBook book1
= ReferenceFactory
.newBook();
865 IBook book2
= ReferenceFactory
.newBook();
866 IBook book3
= ReferenceFactory
.newBook();
867 IBook book4
= ReferenceFactory
.newBook();
869 String title1
= "title1";
870 String title2
= "title2";
871 book1
.setTitle(title1
);
872 book2
.setTitle(title2
);
873 book3
.setTitle(title1
);
875 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
876 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
877 cdmGenericDao
.saveOrUpdate((Reference
)book3
);
879 IMatchStrategy matchStrategy
= DefaultMatchStrategy
.NewInstance(Reference
.class);
882 List
<IBook
> matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
883 Assert
.assertNotNull("Resultlist must not be null", matchResult
);
884 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
885 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
887 book1
.setDatePublished(TimePeriod
.NewInstance(1999, 2002));
888 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
889 Assert
.assertTrue("Resultlist must have no entries", matchResult
.isEmpty());
891 book3
.setDatePublished(TimePeriod
.NewInstance(1999));
892 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
893 Assert
.assertTrue("Resultlist must have no entries", matchResult
.isEmpty());
895 book3
.setDatePublished(TimePeriod
.NewInstance(1999,2002));
896 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
897 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
898 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
901 IBookSection section1
= ReferenceFactory
.newBookSection();
902 section1
.setInBook(book1
);
903 section1
.setTitle("SecTitle");
904 section1
.setPages("22-33");
905 IBookSection section2
= ReferenceFactory
.newBookSection();
906 section2
.setInBook(book2
);
907 section2
.setTitle("SecTitle");
908 section2
.setPages("22-33");
909 IBookSection section3
= ReferenceFactory
.newBookSection();
910 section3
.setInBook(book1
);
911 section3
.setTitle("SecTitle");
912 section3
.setPages("22-33");
913 cdmGenericDao
.saveOrUpdate((Reference
)section1
);
914 cdmGenericDao
.saveOrUpdate((Reference
)section2
);
915 cdmGenericDao
.saveOrUpdate((Reference
)section3
);
917 List
<IBookSection
> sectionResult
= cdmGenericDao
.findMatching(section3
, null);
918 Assert
.assertEquals("Resultlist must have 1 entries", 1, sectionResult
.size());
919 Assert
.assertSame("Resultlist entry must be section1", section1
, sectionResult
.get(0));
920 section2
.setInBook(book2
= (IBook
)((Reference
) book1
).clone());
921 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
922 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
924 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
925 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
926 sectionResult
= cdmGenericDao
.findMatching(section3
, null);
927 Assert
.assertEquals("Resultlist must have 1 entries", 2, sectionResult
.size());
930 Person person1
= Person
.NewTitledInstance("person");
931 Person person2
= Person
.NewTitledInstance("person");
932 Person person3
= Person
.NewTitledInstance("person");
934 person1
.setPrefix("pre1");
935 person2
.setPrefix("pre2");
936 person3
.setPrefix("pre3");
938 // matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
939 // Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
941 book1
.setAuthorTeam(person1
);
942 book2
.setAuthorTeam(person1
);
943 book3
.setAuthorTeam(person1
);
945 boolean m
= matchStrategy
.invoke(book1
, book3
);
946 boolean m2
= matchStrategy
.invoke(book2
, book3
);
948 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
949 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
951 book2
.setAuthorTeam(person2
);
952 book3
.setAuthorTeam(person3
);
953 matchResult
= cdmGenericDao
.findMatching(book3
, null);
954 Assert
.assertEquals("Resultlist must have no entries", 0, matchResult
.size());
956 person3
.setPrefix("pre1");
957 matchResult
= cdmGenericDao
.findMatching(book3
, null);
958 Assert
.assertEquals("Resultlist must have 1 entry", 1, matchResult
.size());
959 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
961 } catch (MatchException e
) {
962 Assert
.fail("Find match must not throw Exception: " + e
.getMessage());
970 public void findMatchingCache(){
971 IBook book1
= ReferenceFactory
.newBook();
972 Team team1
= Team
.NewInstance();
973 Team team2
= Team
.NewInstance();
974 team1
.setTitleCache("Team1", true);
975 team2
.setTitleCache("Team1", true);
977 book1
.setTitle("Title1");
978 book1
.setEdition("Edition1");
979 book1
.setAuthorTeam(team1
);
982 IBook book2
= (IBook
) ((Reference
)book1
).clone();
983 IBook book3
= (IBook
) ((Reference
)book1
).clone();
985 // Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));
986 // book1.setTitleCache("cache1");
987 // Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));
989 // bookClone.setTitleCache("cache1");
990 // Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));
992 // bookClone.setTitleCache("cache2");
993 // Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));
994 // bookClone.setTitleCache("cache1"); //restore
996 // bookClone.setEdition(null);
997 // Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));
999 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
1000 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
1001 cdmGenericDao
.saveOrUpdate((Reference
)book3
);
1002 cdmGenericDao
.saveOrUpdate(team1
);
1003 cdmGenericDao
.saveOrUpdate(team2
);
1006 IMatchStrategy matchStrategy
= DefaultMatchStrategy
.NewInstance(Reference
.class);
1009 List
<IBook
> matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1010 Assert
.assertNotNull("Resultlist must not be null", matchResult
);
1011 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1012 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1013 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1015 book1
.setTitleCache("cache1", true);
1016 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1017 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1018 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1020 book2
.setTitleCache("cache2", false);
1021 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1022 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1023 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1025 book2
.setEdition(null);
1026 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1027 Assert
.assertEquals("Resultlist must have 0 entries", 0, matchResult
.size());
1029 book3
.setTitleCache("cache1", true);
1030 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1031 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1032 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1034 IMatchStrategy teamMatcher
= DefaultMatchStrategy
.NewInstance(Team
.class);
1035 boolean teamsMatch
= teamMatcher
.invoke(team1
, team2
);
1036 Assert
.assertTrue("Team1 and team2 should match" ,teamsMatch
);
1038 book3
.setAuthorTeam(team2
);
1039 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1040 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1041 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1043 book3
.setAuthorTeam(null);
1044 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1045 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1046 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1048 book2
.setTitleCache(book3
.getTitleCache(), true);
1049 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1050 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1051 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1052 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1054 team2
.setTitleCache("team2", true);
1055 teamsMatch
= teamMatcher
.invoke(team1
, team2
);
1056 Assert
.assertFalse("Team1 and team2 should not match" ,teamsMatch
);
1058 book3
.setAuthorTeam(team1
);
1059 book2
.setAuthorTeam(team2
);
1060 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1061 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1062 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1065 } catch (MatchException e
) {
1066 Assert
.fail("Find match must not throw Exception: " + e
.getMessage());
1067 e
.printStackTrace();
1073 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getHqlResult(java.lang.String)}.
1076 public void testGetHqlResult() {
1077 logger
.warn("Not yet implemented");