2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
;
11 import static org
.junit
.Assert
.assertEquals
;
13 import java
.io
.FileNotFoundException
;
14 import java
.util
.ArrayList
;
15 import java
.util
.Arrays
;
16 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import org
.apache
.log4j
.Logger
;
22 import org
.hibernate
.MappingException
;
23 import org
.hibernate
.internal
.SessionFactoryImpl
;
24 import org
.hibernate
.persister
.collection
.CollectionPersister
;
25 import org
.hibernate
.stat
.Statistics
;
26 import org
.hibernate
.type
.Type
;
27 import org
.junit
.Assert
;
28 import org
.junit
.Before
;
29 import org
.junit
.Test
;
30 import org
.unitils
.dbunit
.annotation
.DataSet
;
31 import org
.unitils
.dbunit
.annotation
.DataSets
;
32 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
34 import eu
.etaxonomy
.cdm
.common
.URI
;
35 import eu
.etaxonomy
.cdm
.model
.agent
.Address
;
36 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
37 import eu
.etaxonomy
.cdm
.model
.agent
.Contact
;
38 import eu
.etaxonomy
.cdm
.model
.agent
.Institution
;
39 import eu
.etaxonomy
.cdm
.model
.agent
.InstitutionalMembership
;
40 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
41 import eu
.etaxonomy
.cdm
.model
.agent
.Team
;
42 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
43 import eu
.etaxonomy
.cdm
.model
.common
.Annotation
;
44 import eu
.etaxonomy
.cdm
.model
.common
.AnnotationType
;
45 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
46 import eu
.etaxonomy
.cdm
.model
.common
.Credit
;
47 import eu
.etaxonomy
.cdm
.model
.common
.Extension
;
48 import eu
.etaxonomy
.cdm
.model
.common
.ExtensionType
;
49 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
50 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableSource
;
51 import eu
.etaxonomy
.cdm
.model
.common
.Identifier
;
52 import eu
.etaxonomy
.cdm
.model
.common
.IntextReference
;
53 import eu
.etaxonomy
.cdm
.model
.common
.LSIDAuthority
;
54 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
55 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
56 import eu
.etaxonomy
.cdm
.model
.common
.Marker
;
57 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
58 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipTermBase
;
59 import eu
.etaxonomy
.cdm
.model
.common
.TimePeriod
;
60 import eu
.etaxonomy
.cdm
.model
.common
.VerbatimTimePeriod
;
61 import eu
.etaxonomy
.cdm
.model
.description
.CategoricalData
;
62 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
63 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
64 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
65 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
66 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
67 import eu
.etaxonomy
.cdm
.model
.description
.IndividualsAssociation
;
68 import eu
.etaxonomy
.cdm
.model
.description
.MeasurementUnit
;
69 import eu
.etaxonomy
.cdm
.model
.description
.MediaKey
;
70 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTerm
;
71 import eu
.etaxonomy
.cdm
.model
.description
.QuantitativeData
;
72 import eu
.etaxonomy
.cdm
.model
.description
.SpecimenDescription
;
73 import eu
.etaxonomy
.cdm
.model
.description
.State
;
74 import eu
.etaxonomy
.cdm
.model
.description
.StateData
;
75 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasure
;
76 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasurementValue
;
77 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
78 import eu
.etaxonomy
.cdm
.model
.description
.TaxonInteraction
;
79 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
80 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
81 import eu
.etaxonomy
.cdm
.model
.description
.TextFormat
;
82 import eu
.etaxonomy
.cdm
.model
.location
.Country
;
83 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
84 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaLevel
;
85 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaType
;
86 import eu
.etaxonomy
.cdm
.model
.location
.Point
;
87 import eu
.etaxonomy
.cdm
.model
.location
.ReferenceSystem
;
88 import eu
.etaxonomy
.cdm
.model
.media
.AudioFile
;
89 import eu
.etaxonomy
.cdm
.model
.media
.ImageFile
;
90 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
91 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
92 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
93 import eu
.etaxonomy
.cdm
.model
.media
.MovieFile
;
94 import eu
.etaxonomy
.cdm
.model
.media
.Rights
;
95 import eu
.etaxonomy
.cdm
.model
.media
.RightsType
;
96 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmPreference
;
97 import eu
.etaxonomy
.cdm
.model
.molecular
.Amplification
;
98 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
99 import eu
.etaxonomy
.cdm
.model
.molecular
.PhylogeneticTree
;
100 import eu
.etaxonomy
.cdm
.model
.molecular
.Primer
;
101 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
102 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
103 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleReadAlignment
;
104 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
105 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationship
;
106 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
107 import eu
.etaxonomy
.cdm
.model
.name
.IBotanicalName
;
108 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationship
;
109 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
110 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignation
;
111 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
112 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
113 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
114 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
115 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
116 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
117 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
118 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameFactory
;
119 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
120 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
121 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
122 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
123 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
124 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
125 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldUnit
;
126 import eu
.etaxonomy
.cdm
.model
.occurrence
.GatheringEvent
;
127 import eu
.etaxonomy
.cdm
.model
.occurrence
.PreservationMethod
;
128 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
129 import eu
.etaxonomy
.cdm
.model
.permission
.GrantedAuthorityImpl
;
130 import eu
.etaxonomy
.cdm
.model
.permission
.Group
;
131 import eu
.etaxonomy
.cdm
.model
.permission
.User
;
132 import eu
.etaxonomy
.cdm
.model
.reference
.IBook
;
133 import eu
.etaxonomy
.cdm
.model
.reference
.IBookSection
;
134 import eu
.etaxonomy
.cdm
.model
.reference
.OriginalSourceBase
;
135 import eu
.etaxonomy
.cdm
.model
.reference
.OriginalSourceType
;
136 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
137 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
138 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
139 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
140 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymType
;
141 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
142 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
143 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
144 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
145 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
146 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTerm
;
147 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
148 import eu
.etaxonomy
.cdm
.model
.term
.OrderedTermBase
;
149 import eu
.etaxonomy
.cdm
.model
.term
.OrderedTermVocabulary
;
150 import eu
.etaxonomy
.cdm
.model
.term
.Representation
;
151 import eu
.etaxonomy
.cdm
.model
.term
.TermNode
;
152 import eu
.etaxonomy
.cdm
.model
.term
.TermTree
;
153 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
154 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
155 import eu
.etaxonomy
.cdm
.persistence
.dao
.agent
.IAgentDao
;
156 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.ICdmGenericDao
;
157 import eu
.etaxonomy
.cdm
.persistence
.dao
.name
.ITaxonNameDao
;
158 import eu
.etaxonomy
.cdm
.persistence
.dao
.occurrence
.IOccurrenceDao
;
159 import eu
.etaxonomy
.cdm
.persistence
.dao
.reference
.IReferenceDao
;
160 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
161 import eu
.etaxonomy
.cdm
.persistence
.dto
.ReferencingObjectDto
;
162 import eu
.etaxonomy
.cdm
.strategy
.match
.DefaultMatchStrategy
;
163 import eu
.etaxonomy
.cdm
.strategy
.match
.IMatchStrategyEqual
;
164 import eu
.etaxonomy
.cdm
.strategy
.match
.MatchException
;
165 import eu
.etaxonomy
.cdm
.strategy
.merge
.DefaultMergeStrategy
;
166 import eu
.etaxonomy
.cdm
.strategy
.merge
.IMergeStrategy
;
167 import eu
.etaxonomy
.cdm
.strategy
.merge
.MergeException
;
168 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
169 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
175 public class CdmGenericDaoImplTest
extends CdmTransactionalIntegrationTest
{
177 private static final Logger logger
= Logger
.getLogger(CdmGenericDaoImplTest
.class);
180 private ICdmGenericDao cdmGenericDao
;
183 private ITaxonDao taxonDao
;
186 private IOccurrenceDao occurrenceDao
;
189 private ITaxonNameDao nameDao
;
192 private IAgentDao agentDao
;
195 private IReferenceDao referenceDao
;
198 public void setUp() throws Exception
{}
200 // ***************** TESTS **************************************************
204 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
205 @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")}
207 public void testDelete(){
208 Reference ref1
= ReferenceFactory
.newBook();
209 Reference ref2
= ReferenceFactory
.newBook();
210 Annotation annotation
= Annotation
.NewInstance("Anno1", null);
211 ref1
.addAnnotation(annotation
);
212 cdmGenericDao
.saveOrUpdate(ref1
);
213 cdmGenericDao
.saveOrUpdate(ref2
);
214 List
<Reference
> list
= cdmGenericDao
.list(Reference
.class, 10, 0, null, null);
217 cdmGenericDao
.merge(ref2
, ref1
, null);
219 } catch (MergeException e
) {
222 commitAndStartNewTransaction(null);
223 list
= cdmGenericDao
.list(Reference
.class, 10, 0, null, null);
224 Assert
.assertEquals(1, list
.size());
228 public void testGetCdmBasesByFieldAndClass() {
229 logger
.warn("Not yet implemented");
233 public void testGetCdmBasesWithItemInCollection() {
234 logger
.warn("Not yet implemented");
238 public void testGetAllPersistedClasses() {
239 Class
<?
>[] existingClassesArray
= {
243 InstitutionalMembership
.class,
246 TeamOrPersonBase
.class,
248 AnnotationType
.class,
250 DefinedTermBase
.class,
253 GrantedAuthorityImpl
.class,
255 IdentifiableSource
.class,
257 IntextReference
.class,
259 LanguageString
.class,
263 OrderedTermBase
.class,
264 OrderedTermVocabulary
.class,
265 OriginalSourceBase
.class,
266 RelationshipTermBase
.class,
267 Representation
.class,
268 TermVocabulary
.class,
272 CategoricalData
.class,
273 CommonTaxonName
.class,
274 DescriptionBase
.class,
275 DescriptionElementBase
.class,
281 IndividualsAssociation
.class,
282 MeasurementUnit
.class,
283 PresenceAbsenceTerm
.class,
284 QuantitativeData
.class,
285 SpecimenDescription
.class,
288 StatisticalMeasure
.class,
289 StatisticalMeasurementValue
.class,
290 TaxonDescription
.class,
291 TaxonInteraction
.class,
292 TaxonNameDescription
.class,
296 NamedAreaLevel
.class,
298 ReferenceSystem
.class,
303 MediaRepresentation
.class,
304 MediaRepresentationPart
.class,
311 SingleReadAlignment
.class,
314 PhylogeneticTree
.class,
316 HomotypicalGroup
.class,
317 HybridRelationship
.class,
318 HybridRelationshipType
.class,
319 NameRelationship
.class,
320 NameRelationshipType
.class,
321 NameTypeDesignation
.class,
322 NameTypeDesignationStatus
.class,
323 NomenclaturalStatus
.class,
324 NomenclaturalStatusType
.class,
326 SpecimenTypeDesignation
.class,
327 SpecimenTypeDesignationStatus
.class,
329 TypeDesignationBase
.class,
331 DerivationEvent
.class,
332 DerivationEventType
.class,
334 DeterminationEvent
.class,
336 GatheringEvent
.class,
337 PreservationMethod
.class,
338 SpecimenOrObservationBase
.class,
345 Classification
.class,
346 TaxonRelationship
.class,
347 TaxonRelationshipType
.class ,
348 //Contact.class, //these are embedabble classes
351 //NomenclaturalCode.class,
353 List
<Class
<?
>> existingClassesList
= new ArrayList
<>();
354 existingClassesList
.addAll(Arrays
.asList(existingClassesArray
));
355 boolean includeAbstractClasses
= true;
356 Set
<Class
<?
extends CdmBase
>> foundClasses
= cdmGenericDao
.getAllPersistedClasses(includeAbstractClasses
);
359 // for (Class existingClass : existingClassesList){
360 // if (! foundClasses.contains(existingClass)){
361 // logger.warn("Class not found: " + existingClass.getCanonicalName());
365 //All classes must be found
366 Assert
.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses
.containsAll(existingClassesList
));
368 //No extra classes must be found
369 for (Class
<?
> clazz
: foundClasses
){
370 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)
371 Assert
.fail("Class " + clazz
.getName() + " is not assignable from CdmBase");
375 includeAbstractClasses
= false;
376 Set
<Class
<?
extends CdmBase
>> noAbstractClasses
= cdmGenericDao
.getAllPersistedClasses(includeAbstractClasses
);
377 Class
<?
> abstractClassToTest
= TaxonBase
.class;
378 Assert
.assertFalse("Abstract class " + abstractClassToTest
.getName() + " may not be in set ", noAbstractClasses
.contains(abstractClassToTest
));
383 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
384 @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")})
385 public void testGetReferencingObjectsCdmBase() {
386 IBotanicalName name
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
387 name
.setTitleCache("A name", true);
388 Reference ref1
= ReferenceFactory
.newArticle();
389 Taxon taxon
= Taxon
.NewInstance(name
, ref1
);
390 Person author
= Person
.NewInstance();
391 author
.setTitleCache("Author", true);
392 ref1
.addAnnotation(Annotation
.NewInstance("A1", Language
.DEFAULT()));
393 ref1
.setAuthorship(author
);
394 name
.setBasionymAuthorship(author
);
396 name
.setNomenclaturalReference(ref1
);
398 taxonDao
.save(taxon
);
399 // UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
400 // Reference ref1 = referenceService.findByUuid(uuid);
401 commitAndStartNewTransaction(null);
403 Set
<CdmBase
> referencedObjects
= cdmGenericDao
.getReferencingObjects(ref1
);
404 String debug
= "############## RESULT ###################";
405 for (CdmBase obj
: referencedObjects
){
406 debug
+= "Object1: " + obj
.getClass().getSimpleName() + " - " + obj
;
408 //was 3 before bidirectionality was removed for supplemental data
409 assertEquals(2, referencedObjects
.size());
410 debug
+= "############## END ###################";
412 // UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
413 // AgentBase author = agentService.findByUuid(uuidAuthor);
415 referencedObjects
= cdmGenericDao
.getReferencingObjects(author
);
416 debug
+= "############## RESULT ###################";
417 for (CdmBase obj
: referencedObjects
){
418 debug
+= "Object2: " + obj
.getClass().getSimpleName() + " - " + obj
;
420 assertEquals(2, referencedObjects
.size());
421 debug
+= "############## END ###################";
426 //similar to testGetReferencingObjectsCdmBase but with DTO
429 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
430 @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")})
431 public void testGetReferencingObjectsDto() {
433 IBotanicalName name
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
434 name
.setTitleCache("A name", true);
435 Reference ref1
= ReferenceFactory
.newArticle();
436 Taxon taxon
= Taxon
.NewInstance(name
, ref1
);
437 Person author
= Person
.NewInstance();
438 author
.setTitleCache("Author", true);
439 ref1
.addAnnotation(Annotation
.NewInstance("A1", Language
.DEFAULT()));
440 ref1
.setAuthorship(author
);
441 name
.setCombinationAuthorship(author
);
442 name
.setBasionymAuthorship(author
); //to test deduplication
444 name
.setNomenclaturalReference(ref1
);
446 taxonDao
.save(taxon
);
447 // UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
448 // Reference ref1 = referenceService.findByUuid(uuid);
449 commitAndStartNewTransaction(null);
452 Set
<ReferencingObjectDto
> referencedObjects
= cdmGenericDao
.getReferencingObjectsDto(ref1
);
453 String debug
= "############## RESULT for ref1 ###################\n";
454 for (ReferencingObjectDto dto
: referencedObjects
){
455 debug
+= "Object"+ i
++ +": " + dto
.getType().getSimpleName() + " - " + dto
+ "\n";
457 //was 3 before bidirectionality was removed for supplemental data
458 assertEquals(2, referencedObjects
.size());
459 debug
+= "############## END ###################\n";
461 // UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
462 // AgentBase author = agentService.findByUuid(uuidAuthor);
464 referencedObjects
= cdmGenericDao
.getReferencingObjectsDto(author
);
466 debug
+= "############## RESULT for author ###################\n";
467 for (ReferencingObjectDto dto
: referencedObjects
){
468 debug
+= "Object"+ i
++ +": " + dto
.getType().getSimpleName() + " - " + dto
+ "\n";
470 assertEquals("The both taxon names should be dedulicated", 2, referencedObjects
.size());
471 debug
+= "############## END ###################\n";
476 * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
480 public final void testGetReferencingObjects2() {
481 // SpecimenDescription desc1 = SpecimenDescription.NewInstance();
482 // desc1.setTitleCache("desc1");
483 // SpecimenDescription desc2 = SpecimenDescription.NewInstance();
484 // desc2.setTitleCache("desc2");
486 // SpecimenOrObservationBase spec1 = Specimen.NewInstance();
488 // desc1.addDescribedSpecimenOrObservation(spec1);
489 // //Taxon taxon = Taxon.NewInstance(taxonName, sec)
490 // spec1.addDescription(desc2);
492 // occurrenceService.save(spec1);
494 UUID uuidSpec
= UUID
.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");
495 SpecimenOrObservationBase
<?
> spec1
= occurrenceDao
.findByUuid(uuidSpec
);
497 Set
<CdmBase
> referencingObjects
= cdmGenericDao
.getReferencingObjects(spec1
);
498 // System.out.println("############## RESULT ###################");
499 // for (CdmBase obj: referencingObjects){
500 // System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);
502 // System.out.println("############## END ###################");
503 assertEquals("Number of referencing objects must be 2.", 2, referencingObjects
.size());
507 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
508 * @throws MergeException
511 public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException
{
513 TaxonName name1
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
514 name1
.setTitleCache("BotanicalName1", true);
516 TaxonName name2
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
517 name2
.setTitleCache("BotanicalName2", true);
519 TaxonName zooName1
= TaxonNameFactory
.NewZoologicalInstance(Rank
.SPECIES());
520 name1
.setTitleCache("ZoologicalName1", true);
522 Reference article1
= ReferenceFactory
.newArticle();
523 Reference article2
= ReferenceFactory
.newArticle();
525 name1
.setNomenclaturalReference(article1
);
526 name2
.setNomenclaturalReference(article2
);
528 Taxon taxon1
= Taxon
.NewInstance(name1
, article1
);
529 Taxon taxon2
= Taxon
.NewInstance(name2
, article2
);
531 // Person author = Person.NewInstance();
532 // author.setTitleCache("Author");
533 Annotation annotation1
= Annotation
.NewInstance("A1", Language
.DEFAULT());
534 Annotation annotation2
= Annotation
.NewInstance("A2", Language
.DEFAULT());
536 article1
.addAnnotation(annotation1
);
537 article2
.addAnnotation(annotation2
);
539 Marker marker1
= Marker
.NewInstance(MarkerType
.COMPLETE(), false);
540 Marker marker2
= Marker
.NewInstance(MarkerType
.IMPORTED(), false);
542 article1
.addMarker(marker1
);
543 article2
.addMarker(marker2
);
545 Rights rights1
= Rights
.NewInstance();
546 Rights rights2
= Rights
.NewInstance();
548 article1
.addRights(rights1
);
549 article2
.addRights(rights2
);
551 Credit credit1
= Credit
.NewInstance(Team
.NewInstance(), "credit1");
552 Credit credit2
= Credit
.NewInstance(Team
.NewInstance(), "credit2");
554 article1
.addCredit(credit1
);
555 article2
.addCredit(credit2
);
557 Extension extension1
= Extension
.NewInstance();
558 Extension extension2
= Extension
.NewInstance();
560 article1
.addExtension(extension1
);
561 article2
.addExtension(extension2
);
563 IdentifiableSource source1
= IdentifiableSource
.NewInstance(OriginalSourceType
.Unknown
);
564 IdentifiableSource source2
= IdentifiableSource
.NewInstance(OriginalSourceType
.Unknown
);
566 article1
.addSource(source1
);
567 article2
.addSource(source2
);
569 Media media1
= Media
.NewInstance();
570 Media media2
= Media
.NewInstance();
572 article1
.addMedia(media1
);
573 article2
.addMedia(media2
);
575 // ref1.setAuthorship(author);
576 // name1.setBasionymAuthorship(author);
578 name1
.setNomenclaturalReference(article1
);
582 nameDao
.save(zooName1
);
584 TaxonDescription taxDesc
= TaxonDescription
.NewInstance(taxon1
);
585 taxDesc
.setTitleCache("taxDesc", true);
586 taxDesc
.addSource(OriginalSourceType
.Unknown
, null, null, article2
, null);
588 taxonDao
.save(taxon1
);
590 //unidircetional reference to the merged object should be redirected
591 cdmGenericDao
.merge(article1
, article2
, null);
592 Assert
.assertEquals("Name2 must have article 1 as new nomRef", article1
,name2
.getNomenclaturalReference());
593 //TODO microCitations!! -> warning
596 Assert
.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1
.getAnnotations().size());
599 Assert
.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1
.getMarkers().size());
602 Assert
.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1
.getRights().size());
605 Assert
.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1
.getCredits().size());
608 Assert
.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1
.getExtensions().size());
611 Assert
.assertEquals("Sources number should be 2 (1 from each of the merged objects)", 2, article1
.getSources().size());
614 Assert
.assertEquals("Media number should be 2 (1 from each of the merged objects)", 2, article1
.getMedia().size());
616 //Description sources
617 Assert
.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc
.getSources().size());
618 Assert
.assertEquals("Taxon description must have article1 as source", taxDesc
.getSources().iterator().next().getCitation(),article1
);
622 testMergeExceptions(name1
, name2
, taxon1
, zooName1
);
624 //FIXME TO BE IMPLEMENTED
625 //current defalt implementation for rights, credits and media is ADD_CLONE and therefore the below tests don't work
626 //TODO is this the wanted default behaviour?
627 // Assert.assertTrue("Rights2 must be contained in the rights", article1.getRights().contains(rights2));
628 // Assert.assertTrue("Credits2 must be contained in the credits", article1.getCredits().contains(credit2));
629 // Assert.assertTrue("Media2 must be contained in the media", article1.getMedia().contains(media2));
634 public void testMergeTaxonNameAndTaxon() throws MergeException
{
635 TaxonName name1
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
636 name1
.setTitleCache("BotanicalName1", true);
638 TaxonName name2
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
639 name2
.setTitleCache("BotanicalName2", true);
641 IBotanicalName name3
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
642 name3
.setTitleCache("BotanicalName3", true);
644 Reference database
= ReferenceFactory
.newDatabase();
646 Taxon taxon1
= Taxon
.NewInstance(name1
, database
);
647 Taxon taxon2
= Taxon
.NewInstance(name2
, database
);
648 Taxon taxon3
= Taxon
.NewInstance(name3
, database
);
650 taxonDao
.save(taxon1
);
651 taxonDao
.save(taxon2
);
652 taxonDao
.save(taxon3
);
654 cdmGenericDao
.merge(name1
, name2
, null);
655 Assert
.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1
.getTaxonBases().size());
656 Assert
.assertEquals("Taxon2 must have name1 as new name.", name1
,taxon2
.getName());
659 // cdmGenericDao.merge(taxon1, taxon3, null);
660 // Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());
664 public void testMergeAuthors() throws MergeException
{
666 IBotanicalName name1
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
667 name1
.setTitleCache("BotanicalName1", true);
669 IBotanicalName name2
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
670 name2
.setTitleCache("BotanicalName2", true);
672 IBook book1
= ReferenceFactory
.newBook();
673 IBook book2
= ReferenceFactory
.newBook();
675 Team team1
= Team
.NewInstance();
676 Team team2
= Team
.NewInstance();
677 Team team3
= Team
.NewInstance();
678 team1
.setTitleCache("team1", true);
679 team2
.setTitleCache("team2", true);
680 team3
.setTitleCache("team3", true);
682 Person person1
= Person
.NewTitledInstance("person1");
683 Person person2
= Person
.NewTitledInstance("person2");
684 Person person3
= Person
.NewTitledInstance("person3");
686 team1
.setNomenclaturalTitle("T.1");
687 String street1
= "Strasse1";
688 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)));
689 team2
.setContact(Contact
.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
690 String street3
= "Street3";
691 team2
.addAddress(street3
, null, null, null, null, null, Point
.NewInstance(1.1, 2.2, null, 4));
692 String emailAddress1
= "Email1";
693 team1
.addEmailAddress(emailAddress1
);
695 team2
.addTeamMember(person1
);
696 team2
.addTeamMember(person2
);
697 String emailAddress2
= "Email2";
698 team2
.addEmailAddress(emailAddress2
);
700 team3
.addTeamMember(person3
);
701 team3
.addEmailAddress("emailAddress3");
703 book1
.setAuthorship(team2
);
704 book2
.setAuthorship(team3
);
706 Credit credit1
= Credit
.NewInstance(team3
, "credit1");
707 book2
.addCredit(credit1
);
709 agentDao
.save(team1
);
710 agentDao
.save(team2
);
711 agentDao
.save(team3
);
712 cdmGenericDao
.save((Reference
)book1
);
713 cdmGenericDao
.save((Reference
)book2
);
715 cdmGenericDao
.merge(team2
, team3
, null);
717 Assert
.assertSame("Author of book1 must be team2.", team2
, book1
.getAuthorship());
718 Assert
.assertSame("Author of book2 must be team2.", team2
, book2
.getAuthorship());
719 Assert
.assertSame("Agent of credit1 must be team2.", team2
, credit1
.getAgent());
721 Assert
.assertEquals("Team2 must have 3 persons as members.",3, team2
.getTeamMembers().size());
722 Assert
.assertTrue("Team2 must have person3 as new member.", team2
.getTeamMembers().contains(person3
));
723 Assert
.assertSame("Team2 must have person3 as third member.",person3
, team2
.getTeamMembers().get(2));
726 cdmGenericDao
.merge(team2
, team1
, null);
727 Contact team2Contact
= team2
.getContact();
728 Assert
.assertNotNull("team2Contact must not be null", team2Contact
);
729 Assert
.assertNotNull("Addresses must not be null", team2Contact
.getAddresses());
730 Assert
.assertEquals("Number of addresses must be 3", 3, team2Contact
.getAddresses().size());
731 Assert
.assertEquals("Number of email addresses must be 4", 4, team2Contact
.getEmailAddresses().size());
733 boolean street1Exists
= false;
734 boolean street3Exists
= false;
735 boolean country1Exists
= false;
736 for (Address address
: team2Contact
.getAddresses()){
737 if (street1
.equals(address
.getStreet())){
738 street1Exists
= true;
740 if (street3
.equals(address
.getStreet())){
741 street3Exists
= true;
743 if (Country
.ARGENTINAARGENTINEREPUBLIC() == address
.getCountry()){
744 country1Exists
= true;
747 Assert
.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists
);
748 Assert
.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists
);
749 Assert
.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists
);
752 Institution institution1
= Institution
.NewInstance();
753 institution1
.setTitleCache("inst1", true);
754 Institution institution2
= Institution
.NewInstance();
755 institution2
.setTitleCache("inst2", true);
757 TimePeriod period1
= TimePeriod
.NewInstance(2002, 2004);
758 TimePeriod period2
= TimePeriod
.NewInstance(2004, 2006);
760 person1
.addInstitutionalMembership(institution1
, period1
, "departement1", "role1");
761 person2
.addInstitutionalMembership(institution2
, period2
, "departement2", "role2");
763 IMergeStrategy personMergeStrategy
= DefaultMergeStrategy
.NewInstance(Person
.class);
764 personMergeStrategy
.invoke(person1
, person2
);
766 Assert
.assertEquals("Number of institutional memberships must be 2", 2, person1
.getInstitutionalMemberships().size());
767 for (InstitutionalMembership institutionalMembership
: person1
.getInstitutionalMemberships()){
768 Assert
.assertSame("Person of institutional memebership must be person1", person1
, institutionalMembership
.getPerson());
773 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
775 * Test for https://dev.e-taxonomy.eu/redmine/issues/5652
777 * @throws MergeException
780 public void testMergePersons() throws MergeException
{
781 Team team1
= Team
.NewInstance();
782 Team team2
= Team
.NewInstance();
783 Team team3
= Team
.NewInstance();
784 team1
.setTitleCache("team1", true);
785 team2
.setTitleCache("team2", true);
786 team3
.setTitleCache("team3", true);
788 Person person1a
= Person
.NewTitledInstance("person1a");
789 Person person1b
= Person
.NewTitledInstance("person1b");
790 Person person2
= Person
.NewTitledInstance("person2");
791 Person person3
= Person
.NewTitledInstance("person3");
793 team1
.addTeamMember(person1a
);
794 team1
.addTeamMember(person2
);
796 team2
.addTeamMember(person2
);
797 team2
.addTeamMember(person1a
);
798 team2
.addTeamMember(person3
);
800 team3
.addTeamMember(person3
);
802 agentDao
.save(team1
);
803 agentDao
.save(team2
);
804 agentDao
.save(team3
);
805 agentDao
.save(person1b
);
806 commitAndStartNewTransaction(null);
808 IMergeStrategy personMergeStrategy
= DefaultMergeStrategy
.NewInstance(Person
.class);
809 cdmGenericDao
.merge(person1b
, person1a
, personMergeStrategy
);
811 team1
= (Team
)agentDao
.load(team1
.getUuid());
812 team2
= (Team
)agentDao
.load(team2
.getUuid());
814 //order should not change and 1a should be replaced by 1b
815 Assert
.assertEquals("person1b", team1
.getTeamMembers().get(0).getTitleCache());
816 Assert
.assertEquals("person2", team1
.getTeamMembers().get(1).getTitleCache());
818 Assert
.assertEquals("person2", team2
.getTeamMembers().get(0).getTitleCache());
819 Assert
.assertEquals("person1b", team2
.getTeamMembers().get(1).getTitleCache());
820 Assert
.assertEquals("person3", team2
.getTeamMembers().get(2).getTitleCache());
824 public void testReallocateIntextReferenceForReferenceAndLanguageString() throws MergeException
{
825 UUID uuidRef1
= UUID
.fromString("41743cec-b893-4e8b-b06c-91f9b9ba8fee");
826 UUID uuidRef2
= UUID
.fromString("8fd56b43-7cca-4c3b-bb90-7576da81c072");
830 Reference ref1
= ReferenceFactory
.newGeneric();
831 ref1
.setTitle("Reference1");
832 ref1
.setUuid(uuidRef1
);
833 Reference ref2
= ReferenceFactory
.newGeneric();
834 ref2
.setTitle("Reference2");
835 ref2
.setUuid(uuidRef2
);
836 referenceDao
.save(ref2
);
837 Taxon taxon
= Taxon
.NewInstance(null, null);
839 TaxonDescription desc
= TaxonDescription
.NewInstance(taxon
);
840 Language language
= Language
.DEFAULT();
841 TextData textData
= TextData
.NewInstance(Feature
.DESCRIPTION(), "And here is a citation" , language
, null);
842 LanguageString languageString
= textData
.getLanguageText(language
);
843 IntextReference intextRefRef
= languageString
.addIntextReference(ref1
, 4, 8);
844 String uuidIntextRefRef
= intextRefRef
.getUuid().toString();
845 desc
.addElement(textData
);
846 Assert
.assertEquals("And <cdm:reference cdmId='"+uuidRef1
+"' intextId='"+uuidIntextRefRef
+"'>here</cdm:reference> is a citation",
847 languageString
.getText());
850 taxonDao
.save(taxon
);
851 commitAndStartNewTransaction(null);
854 DefaultMergeStrategy strategy
= DefaultMergeStrategy
.NewInstance(Reference
.class);
855 ref1
= referenceDao
.findByUuid(uuidRef1
);
856 ref2
= referenceDao
.findByUuid(uuidRef2
);
857 cdmGenericDao
.merge(ref2
, ref1
, strategy
);
859 taxon
= (Taxon
)taxonDao
.findByUuid(taxon
.getUuid());
860 textData
= (TextData
)taxon
.getDescriptions().iterator().next().getElements().iterator().next();
861 languageString
= textData
.getLanguageText(language
);
862 Assert
.assertEquals("And <cdm:reference cdmId='"+uuidRef2
+"' intextId='"+uuidIntextRefRef
+"'>here</cdm:reference> is a citation",
863 languageString
.getText());
867 public void testReallocateIntextReferenceForNameAndAnnotation() throws MergeException
{
868 UUID uuidPinusAlba
= UUID
.fromString("52743cec-b893-4e8b-b06c-91f9b9ba8fee");
869 UUID uuidAbiesAlba
= UUID
.fromString("6ed56b43-7cca-4c3b-bb90-7576da81c072");
872 TaxonName pinusAlba
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
873 pinusAlba
.setTitleCache("BotanicalName1", true);
874 pinusAlba
.setUuid(uuidPinusAlba
);
876 TaxonName abiesAlba
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
877 abiesAlba
.setTitleCache("Abies alba", true);
878 abiesAlba
.setUuid(uuidAbiesAlba
);
880 Taxon taxon
= Taxon
.NewInstance(null, null);
882 Annotation annotation
= Annotation
.NewDefaultLanguageInstance("My annotation on Abies alba and its habit.");
883 taxon
.addAnnotation(annotation
);
884 IntextReference intextRefName
= annotation
.addIntextReference(abiesAlba
, "My annotation on ", "Abies alba", " and its habit.");
885 String uuidIntextRefName
= intextRefName
.getUuid().toString();
886 Assert
.assertEquals("My annotation on <cdm:name cdmId='"+uuidAbiesAlba
+"' intextId='"+uuidIntextRefName
+"'>Abies alba</cdm:name> and its habit.",
887 annotation
.getText());
890 taxonDao
.save(taxon
);
891 nameDao
.save(abiesAlba
);
892 nameDao
.save(pinusAlba
);
893 commitAndStartNewTransaction(null);
896 DefaultMergeStrategy strategy
= DefaultMergeStrategy
.NewInstance(TaxonName
.class);
897 abiesAlba
= nameDao
.findByUuid(uuidAbiesAlba
);
898 pinusAlba
= nameDao
.findByUuid(uuidPinusAlba
);
899 cdmGenericDao
.merge(pinusAlba
, abiesAlba
, strategy
);
901 taxon
= (Taxon
)taxonDao
.findByUuid(taxon
.getUuid());
902 annotation
= taxon
.getAnnotations().iterator().next();
904 Assert
.assertEquals("My annotation on <cdm:name cdmId='"+uuidPinusAlba
+"' intextId='"+uuidIntextRefName
+"'>Abies alba</cdm:name> and its habit.",
905 annotation
.getText());
909 public void testReallocatePersonTeam() throws MergeException
{
911 TaxonName name1
= TaxonNameFactory
.NewBotanicalInstance(Rank
.SPECIES());
912 name1
.setTitleCache("BotanicalName1", true);
914 IBook book1
= ReferenceFactory
.newBook();
916 Team team1
= Team
.NewInstance();
917 Team team2
= Team
.NewInstance();
918 team1
.setTitleCache("team1", true);
919 team2
.setTitleCache("team2", true);
921 Person person1
= Person
.NewTitledInstance("person1");
922 Person person2
= Person
.NewTitledInstance("person2");
924 team1
.setNomenclaturalTitle("T.1");
925 String street1
= "Strasse1";
926 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)));
927 team2
.setContact(Contact
.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
928 String street3
= "Street3";
929 team2
.addAddress(street3
, null, null, null, null, null, Point
.NewInstance(1.1, 2.2, null, 4));
930 String emailAddress1
= "Email1";
931 team1
.addEmailAddress(emailAddress1
);
934 // team2.addTeamMember(person1);
935 team2
.addTeamMember(person2
);
936 String emailAddress2
= "Email2";
937 team2
.addEmailAddress(emailAddress2
);
939 Credit credit1
= Credit
.NewInstance(team2
, "credit1");
940 book1
.addCredit(credit1
);
942 agentDao
.save(team1
);
943 agentDao
.save(team2
);
944 agentDao
.save(person1
);
945 agentDao
.save(person2
);
947 cdmGenericDao
.save((Reference
)book1
);
950 name1
.setCombinationAuthorship(person1
);
951 Assert
.assertEquals("Name1 should have person1 as combination author", person1
, name1
.getCombinationAuthorship());
953 DefaultMergeStrategy strategy
= DefaultMergeStrategy
.NewInstance(TeamOrPersonBase
.class);
954 // strategy.setOnlyReallocateLinks(true);
956 FieldUnit fieldUnit1
= FieldUnit
.NewInstance();
957 fieldUnit1
.setPrimaryCollector(person1
);
958 cdmGenericDao
.save(fieldUnit1
);
960 cdmGenericDao
.merge(team2
, person1
, strategy
);
961 Assert
.fail("We expect exception because fieldunit.primaryCollector is of type person");
962 } catch (MergeException e
) {
963 if (! e
.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
964 Assert
.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
966 fieldUnit1
.setPrimaryCollector(null); //clean up for next test
967 } catch (Exception e
) {
968 Assert
.fail("Unhandled exception during merge");
970 Assert
.assertEquals("Name1 should still have person1 as combination author", person1
, name1
.getCombinationAuthorship());
973 team1
.addTeamMember(person1
);
975 cdmGenericDao
.merge(team2
, person1
, strategy
);
976 Assert
.fail("We expect exception because fieldunit.primaryCollector is of type person");
977 } catch (MergeException e
) {
978 if (! e
.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
979 Assert
.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
981 team1
.removeTeamMember(person1
); //clean up for next test
982 } catch (Exception e
) {
983 Assert
.fail("Unhandled exception during merge");
985 Assert
.assertEquals("Name1 should still have person1 as combination author", person1
, name1
.getCombinationAuthorship());
987 //test successful merge
988 cdmGenericDao
.save(name1
);
989 cdmGenericDao
.merge(team2
, person1
, strategy
);
990 Assert
.assertEquals("Name1 should have team2 as combination author now", team2
, name1
.getCombinationAuthorship());
993 private void testMergeExceptions(CdmBase name1
, CdmBase name2
, CdmBase taxon
, ICdmBase zooName1
) throws MergeException
{
996 cdmGenericDao
.merge(name1
, null, null);
997 Assert
.fail("Merging of 2 objects one or both of them null must throw an exception");
998 } catch (NullPointerException e
) {
999 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
1003 cdmGenericDao
.merge(null, name1
, null);
1004 Assert
.fail("Merging of 2 objects one or both of them null must throw an exception");
1005 } catch (NullPointerException e
) {
1006 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
1008 //exceptions to be thrown
1010 cdmGenericDao
.merge(name1
, taxon
, null);
1011 //this is not fully true anymore !! In certain cases merging of objects of different classes is allowed
1012 Assert
.fail("Merging of 2 objects of different types must throw an exception");
1013 } catch (MergeException e
) {
1014 Assert
.assertTrue("Merging of 2 objects of different types must throw an exception", true);
1017 //for names this is not the case anymore
1019 // cdmGenericDao.merge(name1, zooName1, null);
1020 // Assert.fail("Merging of 2 objects of different types must throw an exception");
1021 // } catch (MergeException e) {
1022 // Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
1027 public void findMatching(){
1028 IBook book1
= ReferenceFactory
.newBook();
1029 IBook book2
= ReferenceFactory
.newBook();
1030 IBook book3
= ReferenceFactory
.newBook();
1032 String title1
= "title1";
1033 String title2
= "title2";
1034 book1
.setTitle(title1
);
1035 book2
.setTitle(title2
);
1036 book3
.setTitle(title1
);
1038 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
1039 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
1040 cdmGenericDao
.saveOrUpdate((Reference
)book3
);
1042 IMatchStrategyEqual matchStrategy
= DefaultMatchStrategy
.NewInstance(Reference
.class);
1045 List
<IBook
> matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1046 Assert
.assertNotNull("Resultlist must not be null", matchResult
);
1047 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1048 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
1050 book1
.setDatePublished(VerbatimTimePeriod
.NewVerbatimInstance(1999, 2002));
1051 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1052 Assert
.assertTrue("Resultlist must have no entries", matchResult
.isEmpty());
1054 book3
.setDatePublished(VerbatimTimePeriod
.NewVerbatimInstance(1999));
1055 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1056 Assert
.assertTrue("Resultlist must have no entries", matchResult
.isEmpty());
1058 book3
.setDatePublished(VerbatimTimePeriod
.NewVerbatimInstance(1999,2002));
1059 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1060 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1061 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
1064 IBookSection section1
= ReferenceFactory
.newBookSection();
1065 section1
.setInBook(book1
);
1066 section1
.setTitle("SecTitle");
1067 section1
.setPages("22-33");
1068 IBookSection section2
= ReferenceFactory
.newBookSection();
1069 section2
.setInBook(book2
);
1070 section2
.setTitle("SecTitle");
1071 section2
.setPages("22-33");
1072 IBookSection section3
= ReferenceFactory
.newBookSection();
1073 section3
.setInBook(book1
);
1074 section3
.setTitle("SecTitle");
1075 section3
.setPages("22-33");
1076 cdmGenericDao
.saveOrUpdate((Reference
)section1
);
1077 cdmGenericDao
.saveOrUpdate((Reference
)section2
);
1078 cdmGenericDao
.saveOrUpdate((Reference
)section3
);
1080 List
<IBookSection
> sectionResult
= cdmGenericDao
.findMatching(section3
, null);
1081 Assert
.assertEquals("Resultlist must have 1 entries", 1, sectionResult
.size());
1082 Assert
.assertSame("Resultlist entry must be section1", section1
, sectionResult
.get(0));
1084 section2
.setInBook(book2
= (IBook
)book1
.clone());
1085 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
1086 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
1087 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1088 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1089 sectionResult
= cdmGenericDao
.findMatching(section3
, null);
1090 Assert
.assertEquals("Resultlist must have 1 entries", 2, sectionResult
.size());
1092 Person person1
= Person
.NewTitledInstance("person");
1093 Person person2
= Person
.NewTitledInstance("person");
1094 Person person3
= Person
.NewTitledInstance("person");
1096 person1
.setPrefix("pre1");
1097 person2
.setPrefix("pre2");
1098 person3
.setPrefix("pre3");
1100 // matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1101 // Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1103 book1
.setAuthorship(person1
);
1104 book2
.setAuthorship(person1
);
1105 book3
.setAuthorship(person1
);
1107 boolean m
= matchStrategy
.invoke(book1
, book3
).isSuccessful();
1108 boolean m2
= matchStrategy
.invoke(book2
, book3
).isSuccessful();
1110 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1111 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1113 book2
.setAuthorship(person2
);
1114 book3
.setAuthorship(person3
);
1115 matchResult
= cdmGenericDao
.findMatching(book3
, null);
1116 Assert
.assertEquals("Resultlist must have no entries", 0, matchResult
.size());
1118 person3
.setPrefix("pre1");
1119 matchResult
= cdmGenericDao
.findMatching(book3
, null);
1120 Assert
.assertEquals("Resultlist must have 1 entry", 1, matchResult
.size());
1121 Assert
.assertSame("Resultlist entry must be book 1", book1
, matchResult
.get(0));
1123 } catch (MatchException e
) {
1124 Assert
.fail("Find match must not throw Exception: " + e
.getMessage());
1125 e
.printStackTrace();
1130 public void findMatchingCache(){
1131 IBook book1
= ReferenceFactory
.newBook();
1132 Team team1
= Team
.NewInstance();
1133 Team team2
= Team
.NewInstance();
1134 team1
.setTitleCache("Team1", true);
1135 team2
.setTitleCache("Team1", true);
1137 book1
.setTitle("Title1");
1138 book1
.setEdition("Edition1");
1139 book1
.setAuthorship(team1
);
1142 IBook book2
= ((Reference
)book1
).clone();
1143 IBook book3
= ((Reference
)book1
).clone();
1145 // Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));
1146 // book1.setTitleCache("cache1");
1147 // Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));
1149 // bookClone.setTitleCache("cache1");
1150 // Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));
1152 // bookClone.setTitleCache("cache2");
1153 // Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));
1154 // bookClone.setTitleCache("cache1"); //restore
1156 // bookClone.setEdition(null);
1157 // Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));
1159 cdmGenericDao
.saveOrUpdate((Reference
)book1
);
1160 cdmGenericDao
.saveOrUpdate((Reference
)book2
);
1161 cdmGenericDao
.saveOrUpdate((Reference
)book3
);
1162 cdmGenericDao
.saveOrUpdate(team1
);
1163 cdmGenericDao
.saveOrUpdate(team2
);
1165 IMatchStrategyEqual matchStrategy
= DefaultMatchStrategy
.NewInstance(Reference
.class);
1168 List
<IBook
> matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1169 Assert
.assertNotNull("Resultlist must not be null", matchResult
);
1170 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1171 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1172 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1174 book1
.setTitleCache("cache1", true);
1175 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1176 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1177 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1179 book2
.setTitleCache("cache2", false);
1180 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1181 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1182 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1184 book2
.setEdition(null);
1185 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1186 Assert
.assertEquals("Resultlist must have 0 entries", 0, matchResult
.size());
1188 book3
.setTitleCache("cache1", true);
1189 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1190 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1191 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1193 IMatchStrategyEqual teamMatcher
= DefaultMatchStrategy
.NewInstance(Team
.class);
1194 boolean teamsMatch
= teamMatcher
.invoke(team1
, team2
).isSuccessful();
1195 Assert
.assertTrue("Team1 and team2 should match" ,teamsMatch
);
1197 book3
.setAuthorship(team2
);
1198 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1199 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1200 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1202 book3
.setAuthorship(null);
1203 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1204 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1205 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1207 book2
.setTitleCache(book3
.getTitleCache(), true);
1208 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1209 Assert
.assertEquals("Resultlist must have 2 entries", 2, matchResult
.size());
1210 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1211 Assert
.assertTrue("Resultlist must contain book 2", matchResult
.contains(book2
));
1213 team2
.setTitleCache("team2", true);
1214 teamsMatch
= teamMatcher
.invoke(team1
, team2
).isSuccessful();
1215 Assert
.assertFalse("Team1 and team2 should not match" ,teamsMatch
);
1217 book3
.setAuthorship(team1
);
1218 book2
.setAuthorship(team2
);
1219 matchResult
= cdmGenericDao
.findMatching(book3
, matchStrategy
);
1220 Assert
.assertEquals("Resultlist must have 1 entries", 1, matchResult
.size());
1221 Assert
.assertTrue("Resultlist must contain book 1", matchResult
.contains(book1
));
1223 } catch (MatchException e
) {
1224 Assert
.fail("Find match must not throw Exception: " + e
.getMessage());
1225 e
.printStackTrace();
1229 //from original testing within class, can be removed if not needed anymore
1230 private void test() {
1231 SessionFactoryImpl factory
= (SessionFactoryImpl
)((CdmGenericDaoImpl
)cdmGenericDao
).getSession().getSessionFactory();
1232 Type propType
= factory
.getReferencedPropertyType(TaxonName
.class.getCanonicalName(), "titleCache");
1233 Map
<?
,?
> collMetadata
= factory
.getAllCollectionMetadata();
1234 Object roles
= factory
.getCollectionRolesByEntityParticipant("eu.etaxonomy.cdm.model.name.BotanicalName");
1235 CollectionPersister collPersister
;
1237 collPersister
= factory
.getCollectionPersister(TaxonName
.class.getCanonicalName()+".annotations");
1238 } catch (MappingException e
) {
1239 // TODO Auto-generated catch block
1240 e
.printStackTrace();
1242 Statistics statistics
= factory
.getStatistics();
1243 Map
<?
,?
> allClassMetadata
= factory
.getAllClassMetadata();
1248 public void testGetHqlResult() {
1249 logger
.warn("Not yet implemented");
1253 public void createTestDataSet() throws FileNotFoundException
{}