Project

General

Profile

Download (48.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
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.
8
*/
9

    
10
package eu.etaxonomy.cdm.persistence.dao.hibernate.common;
11

    
12
import static org.junit.Assert.assertEquals;
13

    
14
import java.io.FileNotFoundException;
15
import java.net.URI;
16
import java.util.ArrayList;
17
import java.util.Arrays;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.Set;
21
import java.util.UUID;
22

    
23
import org.apache.log4j.Logger;
24
import org.hibernate.MappingException;
25
import org.hibernate.internal.SessionFactoryImpl;
26
import org.hibernate.persister.collection.CollectionPersister;
27
import org.hibernate.stat.Statistics;
28
import org.hibernate.type.Type;
29
import org.junit.Assert;
30
import org.junit.Before;
31
import org.junit.Test;
32
import org.unitils.dbunit.annotation.DataSet;
33
import org.unitils.dbunit.annotation.DataSets;
34
import org.unitils.spring.annotation.SpringBeanByType;
35

    
36
import eu.etaxonomy.cdm.model.agent.Address;
37
import eu.etaxonomy.cdm.model.agent.AgentBase;
38
import eu.etaxonomy.cdm.model.agent.Contact;
39
import eu.etaxonomy.cdm.model.agent.Institution;
40
import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
41
import eu.etaxonomy.cdm.model.agent.Person;
42
import eu.etaxonomy.cdm.model.agent.Team;
43
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
44
import eu.etaxonomy.cdm.model.common.Annotation;
45
import eu.etaxonomy.cdm.model.common.AnnotationType;
46
import eu.etaxonomy.cdm.model.common.CdmBase;
47
import eu.etaxonomy.cdm.model.common.Credit;
48
import eu.etaxonomy.cdm.model.common.Extension;
49
import eu.etaxonomy.cdm.model.common.ExtensionType;
50
import eu.etaxonomy.cdm.model.common.ICdmBase;
51
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
52
import eu.etaxonomy.cdm.model.common.Identifier;
53
import eu.etaxonomy.cdm.model.common.IntextReference;
54
import eu.etaxonomy.cdm.model.common.LSIDAuthority;
55
import eu.etaxonomy.cdm.model.common.Language;
56
import eu.etaxonomy.cdm.model.common.LanguageString;
57
import eu.etaxonomy.cdm.model.common.Marker;
58
import eu.etaxonomy.cdm.model.common.MarkerType;
59
import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
60
import eu.etaxonomy.cdm.model.common.TimePeriod;
61
import eu.etaxonomy.cdm.model.common.VerbatimTimePeriod;
62
import eu.etaxonomy.cdm.model.description.CategoricalData;
63
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
64
import eu.etaxonomy.cdm.model.description.DescriptionBase;
65
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
66
import eu.etaxonomy.cdm.model.description.Distribution;
67
import eu.etaxonomy.cdm.model.description.Feature;
68
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
69
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
70
import eu.etaxonomy.cdm.model.description.MediaKey;
71
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
72
import eu.etaxonomy.cdm.model.description.QuantitativeData;
73
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
74
import eu.etaxonomy.cdm.model.description.State;
75
import eu.etaxonomy.cdm.model.description.StateData;
76
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
77
import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
78
import eu.etaxonomy.cdm.model.description.TaxonDescription;
79
import eu.etaxonomy.cdm.model.description.TaxonInteraction;
80
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
81
import eu.etaxonomy.cdm.model.description.TextData;
82
import eu.etaxonomy.cdm.model.description.TextFormat;
83
import eu.etaxonomy.cdm.model.location.Country;
84
import eu.etaxonomy.cdm.model.location.NamedArea;
85
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
86
import eu.etaxonomy.cdm.model.location.NamedAreaType;
87
import eu.etaxonomy.cdm.model.location.Point;
88
import eu.etaxonomy.cdm.model.location.ReferenceSystem;
89
import eu.etaxonomy.cdm.model.media.AudioFile;
90
import eu.etaxonomy.cdm.model.media.ImageFile;
91
import eu.etaxonomy.cdm.model.media.Media;
92
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
93
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
94
import eu.etaxonomy.cdm.model.media.MovieFile;
95
import eu.etaxonomy.cdm.model.media.Rights;
96
import eu.etaxonomy.cdm.model.media.RightsType;
97
import eu.etaxonomy.cdm.model.metadata.CdmPreference;
98
import eu.etaxonomy.cdm.model.molecular.Amplification;
99
import eu.etaxonomy.cdm.model.molecular.DnaSample;
100
import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;
101
import eu.etaxonomy.cdm.model.molecular.Primer;
102
import eu.etaxonomy.cdm.model.molecular.Sequence;
103
import eu.etaxonomy.cdm.model.molecular.SingleRead;
104
import eu.etaxonomy.cdm.model.molecular.SingleReadAlignment;
105
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
106
import eu.etaxonomy.cdm.model.name.HybridRelationship;
107
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
108
import eu.etaxonomy.cdm.model.name.IBotanicalName;
109
import eu.etaxonomy.cdm.model.name.NameRelationship;
110
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
111
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
112
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
113
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
114
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
115
import eu.etaxonomy.cdm.model.name.Rank;
116
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
117
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
118
import eu.etaxonomy.cdm.model.name.TaxonName;
119
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
120
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
121
import eu.etaxonomy.cdm.model.occurrence.Collection;
122
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
123
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
124
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
125
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
126
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
127
import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
128
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
129
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
130
import eu.etaxonomy.cdm.model.permission.GrantedAuthorityImpl;
131
import eu.etaxonomy.cdm.model.permission.Group;
132
import eu.etaxonomy.cdm.model.permission.User;
133
import eu.etaxonomy.cdm.model.reference.IBook;
134
import eu.etaxonomy.cdm.model.reference.IBookSection;
135
import eu.etaxonomy.cdm.model.reference.OriginalSourceBase;
136
import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
137
import eu.etaxonomy.cdm.model.reference.Reference;
138
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
139
import eu.etaxonomy.cdm.model.taxon.Classification;
140
import eu.etaxonomy.cdm.model.taxon.Synonym;
141
import eu.etaxonomy.cdm.model.taxon.SynonymType;
142
import eu.etaxonomy.cdm.model.taxon.Taxon;
143
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
144
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
145
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
146
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
147
import eu.etaxonomy.cdm.model.term.DefinedTerm;
148
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
149
import eu.etaxonomy.cdm.model.term.OrderedTermBase;
150
import eu.etaxonomy.cdm.model.term.OrderedTermVocabulary;
151
import eu.etaxonomy.cdm.model.term.Representation;
152
import eu.etaxonomy.cdm.model.term.TermNode;
153
import eu.etaxonomy.cdm.model.term.TermTree;
154
import eu.etaxonomy.cdm.model.term.TermVocabulary;
155
import eu.etaxonomy.cdm.model.view.AuditEvent;
156
import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;
157
import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
158
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
159
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
160
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
161
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
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;
170

    
171
/**
172
 * @author a.mueller
173
 * @since 27.07.2009
174
 */
175
public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest {
176
	private static final Logger logger = Logger.getLogger(CdmGenericDaoImplTest.class);
177

    
178
	@SpringBeanByType
179
	private ICdmGenericDao cdmGenericDao;
180

    
181
	@SpringBeanByType
182
	private ITaxonDao taxonDao;
183

    
184
	@SpringBeanByType
185
	private IOccurrenceDao occurrenceDao;
186

    
187
	@SpringBeanByType
188
	private ITaxonNameDao nameDao;
189

    
190
	@SpringBeanByType
191
	private IAgentDao agentDao;
192

    
193
    @SpringBeanByType
194
    private IReferenceDao referenceDao;
195

    
196
	@Before
197
	public void setUp() throws Exception {}
198

    
199
// ***************** TESTS **************************************************
200

    
201
	@Test
202
	@DataSets({
203
      @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
204
      @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")})
205
	public void testDelete(){
206
		Reference ref1 = ReferenceFactory.newBook();
207
		Reference ref2 = ReferenceFactory.newBook();
208
		Annotation annotation = Annotation.NewInstance("Anno1", null);
209
		ref1.addAnnotation(annotation);
210
		UUID ref1Uuid = cdmGenericDao.saveOrUpdate(ref1);
211
		UUID ref2Uuid = cdmGenericDao.saveOrUpdate(ref2);
212
		List<Reference> list = cdmGenericDao.list(Reference.class, 10, 0, null, null);
213
//        System.out.println("ref1: " + ref1Uuid + " ref2: " + ref2Uuid);
214
        for (Reference ref: list){
215
//            System.out.println("reference: " + ref.getUuid());
216
        }
217
		try {
218
			cdmGenericDao.merge(ref2, ref1, null);
219

    
220
		} catch (MergeException e) {
221
			Assert.fail();
222
		}
223
		commitAndStartNewTransaction(null);
224
		list = cdmGenericDao.list(Reference.class, 10, 0, null, null);
225
//		System.out.println("ref1: " + ref1Uuid + " ref2: " + ref2Uuid);
226
//        for (Reference ref: list){
227
//            System.out.println("reference: " + ref.getUuid());
228
//        }
229
		Assert.assertEquals(1, list.size());
230
	}
231

    
232
	@Test
233
	public void testGetCdmBasesByFieldAndClass() {
234
		logger.warn("Not yet implemented");
235
	}
236

    
237
	@Test
238
	public void testGetCdmBasesWithItemInCollection() {
239
		logger.warn("Not yet implemented");
240
	}
241

    
242
	@Test
243
	public void testGetAllPersistedClasses() {
244
		Class<?>[] existingClassesArray = {
245
				Address.class,
246
				AgentBase.class,
247
				Institution.class,
248
				InstitutionalMembership.class,
249
				Person.class,
250
				Team.class,
251
				TeamOrPersonBase.class,
252
				Annotation.class,
253
				AnnotationType.class,
254
				Credit.class,
255
				DefinedTermBase.class,
256
				Extension.class,
257
				ExtensionType.class,
258
				GrantedAuthorityImpl.class,
259
				Group.class,
260
				IdentifiableSource.class,
261
				Identifier.class,
262
				IntextReference.class,
263
				Language.class,
264
				LanguageString.class,
265
				LSIDAuthority.class,
266
				Marker.class,
267
				MarkerType.class,
268
				OrderedTermBase.class,
269
				OrderedTermVocabulary.class,
270
				OriginalSourceBase.class,
271
				RelationshipTermBase.class,
272
				Representation.class,
273
				TermVocabulary.class,
274
				User.class,
275
				DefinedTerm.class,
276

    
277
				CategoricalData.class,
278
				CommonTaxonName.class,
279
				DescriptionBase.class,
280
				DescriptionElementBase.class,
281
				Distribution.class,
282
				Feature.class,
283
				TermNode.class,
284
				TermTree.class,
285
				MediaKey.class,
286
				IndividualsAssociation.class,
287
				MeasurementUnit.class,
288
				PresenceAbsenceTerm.class,
289
				QuantitativeData.class,
290
				SpecimenDescription.class,
291
				State.class,
292
				StateData.class,
293
				StatisticalMeasure.class,
294
				StatisticalMeasurementValue.class,
295
				TaxonDescription.class,
296
				TaxonInteraction.class,
297
				TaxonNameDescription.class,
298
				TextData.class,
299
				TextFormat.class,
300
				NamedArea.class,
301
				NamedAreaLevel.class,
302
				NamedAreaType.class,
303
				ReferenceSystem.class,
304
				Country.class,
305
				AudioFile.class,
306
				ImageFile.class,
307
				Media.class,
308
				MediaRepresentation.class,
309
				MediaRepresentationPart.class,
310
				MovieFile.class,
311
				Rights.class,
312
				RightsType.class,
313
				Amplification.class,
314
				DnaSample.class,
315
				SingleRead.class,
316
				SingleReadAlignment.class,
317
				Primer.class,
318
				Sequence.class,
319
				PhylogeneticTree.class,
320
				Sequence.class,
321
				HomotypicalGroup.class,
322
				HybridRelationship.class,
323
				HybridRelationshipType.class,
324
				NameRelationship.class,
325
				NameRelationshipType.class,
326
				NameTypeDesignation.class,
327
				NameTypeDesignationStatus.class,
328
				NomenclaturalStatus.class,
329
				NomenclaturalStatusType.class,
330
				Rank.class,
331
				SpecimenTypeDesignation.class,
332
				SpecimenTypeDesignationStatus.class,
333
				TaxonName.class,
334
				TypeDesignationBase.class,
335
				Collection.class,
336
				DerivationEvent.class,
337
				DerivationEventType.class,
338
				DerivedUnit.class,
339
				DeterminationEvent.class,
340
				FieldUnit.class,
341
				GatheringEvent.class,
342
				PreservationMethod.class,
343
				SpecimenOrObservationBase.class,
344
				Reference.class,
345
				Synonym.class,
346
				SynonymType.class,
347
				Taxon.class,
348
				TaxonBase.class,
349
				TaxonNode.class,
350
				Classification.class,
351
				TaxonRelationship.class,
352
				TaxonRelationshipType.class ,
353
				//Contact.class,  //these are embedabble classes
354
				//LSID.class,
355
				//Point.class,
356
				//NomenclaturalCode.class,
357
		}	;
358
		List<Class<?>> existingClassesList = new ArrayList<>();
359
		existingClassesList.addAll(Arrays.asList(existingClassesArray));
360
		boolean includeAbstractClasses = true;
361
		Set<Class<? extends CdmBase>> foundClasses = cdmGenericDao.getAllPersistedClasses(includeAbstractClasses);
362

    
363
		//for debugging only
364
		//		for (Class existingClass : existingClassesList){
365
		//			if (! foundClasses.contains(existingClass)){
366
		//				logger.warn("Class not found: " + existingClass.getCanonicalName());
367
		//			}
368
		//		}
369

    
370
		//All classes must be found
371
		Assert.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses.containsAll(existingClassesList));
372

    
373
		//No extra classes must be found
374
		for (Class<?> clazz : foundClasses){
375
			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)
376
				Assert.fail("Class " + clazz.getName() + " is not assignable from CdmBase");
377
			}
378
		}
379

    
380
		includeAbstractClasses = false;
381
		Set<Class<? extends CdmBase>> noAbstractClasses = cdmGenericDao.getAllPersistedClasses(includeAbstractClasses);
382
		Class<?> abstractClassToTest = TaxonBase.class;
383
		Assert.assertFalse("Abstract class " + abstractClassToTest.getName() + " may not be in set ", noAbstractClasses.contains(abstractClassToTest));
384
	}
385

    
386
	@Test
387
	@DataSets({
388
	     @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
389
	     @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml")})
390
	public void testGetReferencingObjectsCdmBase() {
391
		IBotanicalName name = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
392
		name.setTitleCache("A name", true);
393
		Reference ref1 = ReferenceFactory.newArticle();
394
		Taxon taxon = Taxon.NewInstance(name, ref1);
395
		Person author = Person.NewInstance();
396
		author.setTitleCache("Author", true);
397
		ref1.addAnnotation(Annotation.NewInstance("A1", Language.DEFAULT()));
398
		ref1.setAuthorship(author);
399
		name.setBasionymAuthorship(author);
400

    
401
		name.setNomenclaturalReference(ref1);
402

    
403
		taxonDao.save(taxon);
404
//		UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
405
//		Reference ref1 = referenceService.findByUuid(uuid);
406
		commitAndStartNewTransaction(null);
407

    
408
		Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(ref1);
409
		String debug = "############## RESULT ###################";
410
		for (CdmBase obj: referencedObjects){
411
			debug += "Object1: " + obj.getClass().getSimpleName() + " - " + obj;
412
		}
413
		//was 3 before bidirectionality was removed for supplemental data
414
		assertEquals(2, referencedObjects.size());
415
		debug += "############## ENDE ###################";
416

    
417
//		UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
418
//		AgentBase author = agentService.findByUuid(uuidAuthor);
419

    
420
		referencedObjects = cdmGenericDao.getReferencingObjects(author);
421
		debug += "############## RESULT ###################";
422
		for (CdmBase obj: referencedObjects){
423
			debug += "Object2: " + obj.getClass().getSimpleName() + " - " + obj;
424
		}
425
		assertEquals(2, referencedObjects.size());
426
		debug += "############## ENDE ###################";
427
		logger.info(debug);
428
	}
429

    
430
	/**
431
	 * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
432
	 */
433
	@Test
434
	@DataSet
435
	public final void testGetReferencingObjects2() {
436
//		SpecimenDescription desc1 = SpecimenDescription.NewInstance();
437
//		desc1.setTitleCache("desc1");
438
//		SpecimenDescription desc2 = SpecimenDescription.NewInstance();
439
//		desc2.setTitleCache("desc2");
440
//
441
//		SpecimenOrObservationBase spec1 = Specimen.NewInstance();
442
//
443
//		desc1.addDescribedSpecimenOrObservation(spec1);
444
//		//Taxon taxon = Taxon.NewInstance(taxonName, sec)
445
//		spec1.addDescription(desc2);
446
//
447
//		occurrenceService.save(spec1);
448

    
449
		UUID uuidSpec = UUID.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");
450
		SpecimenOrObservationBase<?> spec1 = occurrenceDao.findByUuid(uuidSpec);
451

    
452
		Set<CdmBase> referencingObjects = cdmGenericDao.getReferencingObjects(spec1);
453
//		System.out.println("############## RESULT ###################");
454
//		for (CdmBase obj: referencingObjects){
455
//			System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);
456
//		}
457
//		System.out.println("############## ENDE ###################");
458
		assertEquals("Number of referencing objects must be 2.", 2, referencingObjects.size());
459
	}
460

    
461
	/**
462
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
463
	 * @throws MergeException
464
	 */
465
	@Test
466
	public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException {
467

    
468
		TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
469
		name1.setTitleCache("BotanicalName1", true);
470

    
471
		TaxonName name2 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
472
		name2.setTitleCache("BotanicalName2", true);
473

    
474
		TaxonName zooName1 = TaxonNameFactory.NewZoologicalInstance(Rank.SPECIES());
475
		name1.setTitleCache("ZoologicalName1", true);
476

    
477
		Reference article1 = ReferenceFactory.newArticle();
478
		Reference article2 = ReferenceFactory.newArticle();
479

    
480
		name1.setNomenclaturalReference(article1);
481
		name2.setNomenclaturalReference(article2);
482

    
483
		Taxon taxon1 = Taxon.NewInstance(name1, article1);
484
		Taxon taxon2 = Taxon.NewInstance(name2, article2);
485

    
486
//		Person author = Person.NewInstance();
487
//		author.setTitleCache("Author");
488
		Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());
489
		Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());
490

    
491
		article1.addAnnotation(annotation1);
492
		article2.addAnnotation(annotation2);
493

    
494
		Marker marker1 = Marker.NewInstance(MarkerType.COMPLETE(), false);
495
		Marker marker2 = Marker.NewInstance(MarkerType.IMPORTED(), false);
496

    
497
		article1.addMarker(marker1);
498
		article2.addMarker(marker2);
499

    
500
		Rights rights1 = Rights.NewInstance();
501
		Rights rights2 = Rights.NewInstance();
502

    
503
		article1.addRights(rights1);
504
		article2.addRights(rights2);
505

    
506
		Credit credit1 = Credit.NewInstance(Team.NewInstance(), "credit1");
507
		Credit credit2 = Credit.NewInstance(Team.NewInstance(), "credit2");
508

    
509
		article1.addCredit(credit1);
510
		article2.addCredit(credit2);
511

    
512
		Extension extension1 = Extension.NewInstance();
513
		Extension extension2 = Extension.NewInstance();
514

    
515
		article1.addExtension(extension1);
516
		article2.addExtension(extension2);
517

    
518
		IdentifiableSource source1 = IdentifiableSource.NewInstance(OriginalSourceType.Unknown);
519
		IdentifiableSource source2 = IdentifiableSource.NewInstance(OriginalSourceType.Unknown);
520

    
521
		article1.addSource(source1);
522
		article2.addSource(source2);
523

    
524
		Media media1 = Media.NewInstance();
525
		Media media2 = Media.NewInstance();
526

    
527
		article1.addMedia(media1);
528
		article2.addMedia(media2);
529

    
530
//		ref1.setAuthorship(author);
531
//		name1.setBasionymAuthorship(author);
532

    
533
		name1.setNomenclaturalReference(article1);
534

    
535
		nameDao.save(name1);
536
		nameDao.save(name2);
537
		nameDao.save(zooName1);
538

    
539
		TaxonDescription taxDesc = TaxonDescription.NewInstance(taxon1);
540
		taxDesc.setTitleCache("taxDesc", true);
541
		taxDesc.addSource(OriginalSourceType.Unknown, null, null, article2, null);
542

    
543
		taxonDao.save(taxon1);
544

    
545
		//unidircetional reference to the merged object should be redirected
546
		cdmGenericDao.merge(article1, article2, null);
547
		Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());
548
		//TODO microCitations!! -> warning
549

    
550
		//Annotations
551
		Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());
552

    
553
		//Marker
554
		Assert.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1.getMarkers().size());
555

    
556
		//Rights
557
		Assert.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1.getRights().size());
558

    
559
		//Credits
560
		Assert.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1.getCredits().size());
561

    
562
		//Extensions
563
		Assert.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1.getExtensions().size());
564

    
565
		//Sources
566
		Assert.assertEquals("Sources number should be 2 (1 from each of the merged objects)", 2, article1.getSources().size());
567

    
568
		//Media
569
		Assert.assertEquals("Media number should be 2 (1 from each of the merged objects)", 2, article1.getMedia().size());
570

    
571
		//Description sources
572
		Assert.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc.getSources().size());
573
		Assert.assertEquals("Taxon description must have article1 as source", taxDesc.getSources().iterator().next().getCitation(),article1);
574

    
575
		//test exceptions
576

    
577
		testMergeExceptions(name1, name2, taxon1, zooName1);
578

    
579
		//FIXME TO BE IMPLEMENTED
580
		//current defalt implementation for rights, credits and media is ADD_CLONE and therefore the below tests don't work
581
		//TODO is this the wanted default behaviour?
582
//		Assert.assertTrue("Rights2 must be contained in the rights", article1.getRights().contains(rights2));
583
//		Assert.assertTrue("Credits2 must be contained in the credits", article1.getCredits().contains(credit2));
584
//		Assert.assertTrue("Media2 must be contained in the media", article1.getMedia().contains(media2));
585

    
586
	}
587

    
588
	@Test
589
	public void testMergeTaxonNameAndTaxon() throws MergeException {
590
	    TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
591
		name1.setTitleCache("BotanicalName1", true);
592

    
593
		TaxonName name2 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
594
		name2.setTitleCache("BotanicalName2", true);
595

    
596
		IBotanicalName name3 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
597
		name3.setTitleCache("BotanicalName3", true);
598

    
599
		Reference database = ReferenceFactory.newDatabase();
600

    
601
		Taxon taxon1 = Taxon.NewInstance(name1, database);
602
		Taxon taxon2 = Taxon.NewInstance(name2, database);
603
		Taxon taxon3 = Taxon.NewInstance(name3, database);
604

    
605
		taxonDao.save(taxon1);
606
		taxonDao.save(taxon2);
607
		taxonDao.save(taxon3);
608

    
609
		cdmGenericDao.merge(name1, name2, null);
610
		Assert.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1.getTaxonBases().size());
611
		Assert.assertEquals("Taxon2 must have name1 as new name.", name1 ,taxon2.getName());
612

    
613
//TODO
614
//		cdmGenericDao.merge(taxon1, taxon3, null);
615
//		Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());
616
	}
617

    
618
	@Test
619
	public void testMergeAuthors() throws MergeException {
620

    
621
		IBotanicalName name1 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
622
		name1.setTitleCache("BotanicalName1", true);
623

    
624
		IBotanicalName name2 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
625
		name2.setTitleCache("BotanicalName2", true);
626

    
627
		IBook book1 = ReferenceFactory.newBook();
628
		IBook book2 = ReferenceFactory.newBook();
629

    
630
		Team team1 = Team.NewInstance();
631
		Team team2 = Team.NewInstance();
632
		Team team3 = Team.NewInstance();
633
		team1.setTitleCache("team1", true);
634
		team2.setTitleCache("team2", true);
635
		team3.setTitleCache("team3", true);
636

    
637
		Person person1 = Person.NewTitledInstance("person1");
638
		Person person2 = Person.NewTitledInstance("person2");
639
		Person person3 = Person.NewTitledInstance("person3");
640

    
641
		team1.setNomenclaturalTitle("T.1");
642
		String street1 = "Strasse1";
643
		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)));
644
		team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
645
		String street3 = "Street3";
646
		team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));
647
		String emailAddress1 = "Email1";
648
		team1.addEmailAddress(emailAddress1);
649

    
650
		team2.addTeamMember(person1);
651
		team2.addTeamMember(person2);
652
		String emailAddress2 = "Email2";
653
		team2.addEmailAddress(emailAddress2);
654

    
655
		team3.addTeamMember(person3);
656
		team3.addEmailAddress("emailAddress3");
657

    
658
		book1.setAuthorship(team2);
659
		book2.setAuthorship(team3);
660

    
661
		Credit credit1 = Credit.NewInstance(team3, "credit1");
662
		book2.addCredit(credit1);
663

    
664
		agentDao.save(team1);
665
		agentDao.save(team2);
666
		agentDao.save(team3);
667
		cdmGenericDao.save((Reference)book1);
668
		cdmGenericDao.save((Reference)book2);
669

    
670
		cdmGenericDao.merge(team2, team3, null);
671

    
672
		Assert.assertSame("Author of book1 must be team2.", team2, book1.getAuthorship());
673
		Assert.assertSame("Author of book2 must be team2.", team2, book2.getAuthorship());
674
		Assert.assertSame("Agent of credit1 must be team2.", team2, credit1.getAgent());
675

    
676
		Assert.assertEquals("Team2 must have 3 persons as members.",3, team2.getTeamMembers().size());
677
		Assert.assertTrue("Team2 must have person3 as new member.", team2.getTeamMembers().contains(person3));
678
		Assert.assertSame("Team2 must have person3 as third member.",person3, team2.getTeamMembers().get(2));
679

    
680
		//Contact
681
		cdmGenericDao.merge(team2, team1, null);
682
		Contact team2Contact = team2.getContact();
683
		Assert.assertNotNull("team2Contact must not be null", team2Contact);
684
		Assert.assertNotNull("Addresses must not be null", team2Contact.getAddresses());
685
		Assert.assertEquals("Number of addresses must be 3", 3, team2Contact.getAddresses().size());
686
		Assert.assertEquals("Number of email addresses must be 4", 4, team2Contact.getEmailAddresses().size());
687

    
688
		boolean street1Exists = false;
689
		boolean street3Exists = false;
690
		boolean country1Exists = false;
691
		for  (Address address : team2Contact.getAddresses()){
692
			if (street1.equals(address.getStreet())){
693
				street1Exists = true;
694
			}
695
			if (street3.equals(address.getStreet())){
696
				street3Exists = true;
697
			}
698
			if (Country.ARGENTINAARGENTINEREPUBLIC() == address.getCountry()){
699
				country1Exists = true;
700
			}
701
		}
702
		Assert.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists);
703
		Assert.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists);
704
		Assert.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists);
705

    
706
		//Person
707
		Institution institution1 = Institution.NewInstance();
708
		institution1.setTitleCache("inst1", true);
709
		Institution institution2 = Institution.NewInstance();
710
		institution2.setTitleCache("inst2", true);
711

    
712
		TimePeriod period1 = TimePeriod.NewInstance(2002, 2004);
713
		TimePeriod period2 = TimePeriod.NewInstance(2004, 2006);
714

    
715
		person1.addInstitutionalMembership(institution1, period1, "departement1", "role1");
716
		person2.addInstitutionalMembership(institution2, period2, "departement2", "role2");
717

    
718
		IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);
719
		personMergeStrategy.invoke(person1, person2);
720

    
721
		Assert.assertEquals("Number of institutional memberships must be 2", 2, person1.getInstitutionalMemberships().size());
722
		for (InstitutionalMembership institutionalMembership : person1.getInstitutionalMemberships()){
723
			Assert.assertSame("Person of institutional memebership must be person1", person1, institutionalMembership.getPerson());
724
		}
725
	}
726

    
727
	/**
728
     * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
729
     *
730
     * Test for https://dev.e-taxonomy.eu/redmine/issues/5652
731
     *
732
     * @throws MergeException
733
     */
734
    @Test
735
    public void testMergePersons() throws MergeException {
736
        Team team1 = Team.NewInstance();
737
        Team team2 = Team.NewInstance();
738
        Team team3 = Team.NewInstance();
739
        team1.setTitleCache("team1", true);
740
        team2.setTitleCache("team2", true);
741
        team3.setTitleCache("team3", true);
742

    
743
        Person person1a = Person.NewTitledInstance("person1a");
744
        Person person1b = Person.NewTitledInstance("person1b");
745
        Person person2 = Person.NewTitledInstance("person2");
746
        Person person3 = Person.NewTitledInstance("person3");
747

    
748
        team1.addTeamMember(person1a);
749
        team1.addTeamMember(person2);
750

    
751
        team2.addTeamMember(person2);
752
        team2.addTeamMember(person1a);
753
        team2.addTeamMember(person3);
754

    
755
        team3.addTeamMember(person3);
756

    
757
        agentDao.save(team1);
758
        agentDao.save(team2);
759
        agentDao.save(team3);
760
        agentDao.save(person1b);
761
        commitAndStartNewTransaction(null);
762

    
763
        IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);
764
        cdmGenericDao.merge(person1b, person1a, personMergeStrategy);
765

    
766
        team1 = (Team)agentDao.load(team1.getUuid());
767
        team2 = (Team)agentDao.load(team2.getUuid());
768

    
769
        //order should not change and 1a should be replaced by 1b
770
        Assert.assertEquals("person1b", team1.getTeamMembers().get(0).getTitleCache());
771
        Assert.assertEquals("person2", team1.getTeamMembers().get(1).getTitleCache());
772

    
773
        Assert.assertEquals("person2", team2.getTeamMembers().get(0).getTitleCache());
774
        Assert.assertEquals("person1b", team2.getTeamMembers().get(1).getTitleCache());
775
        Assert.assertEquals("person3", team2.getTeamMembers().get(2).getTitleCache());
776
    }
777

    
778
    @Test
779
    public void testReallocateIntextReferenceForReferenceAndLanguageString() throws MergeException {
780
        UUID uuidRef1 = UUID.fromString("41743cec-b893-4e8b-b06c-91f9b9ba8fee");
781
        UUID uuidRef2 = UUID.fromString("8fd56b43-7cca-4c3b-bb90-7576da81c072");
782

    
783
        // CREATE DATA
784

    
785
        Reference ref1 = ReferenceFactory.newGeneric();
786
        ref1.setTitle("Reference1");
787
        ref1.setUuid(uuidRef1);
788
        Reference ref2 = ReferenceFactory.newGeneric();
789
        ref2.setTitle("Reference2");
790
        ref2.setUuid(uuidRef2);
791
        referenceDao.save(ref2);
792
        Taxon taxon = Taxon.NewInstance(null, null);
793

    
794
        TaxonDescription desc = TaxonDescription.NewInstance(taxon);
795
        Language language = Language.DEFAULT();
796
        TextData textData = TextData.NewInstance(Feature.DESCRIPTION(), "And here is a citation" , language, null);
797
        LanguageString languageString = textData.getLanguageText(language);
798
        IntextReference intextRefRef = languageString.addIntextReference(ref1, 4, 8);
799
        String uuidIntextRefRef = intextRefRef.getUuid().toString();
800
        desc.addElement(textData);
801
        Assert.assertEquals("And <cdm:reference cdmId='"+uuidRef1+"' intextId='"+uuidIntextRefRef+"'>here</cdm:reference> is a citation",
802
                    languageString.getText());
803

    
804
        //SAVE AND COMMIT
805
        taxonDao.save(taxon);
806
        commitAndStartNewTransaction(null);
807

    
808
        //MERGE
809
        DefaultMergeStrategy strategy = DefaultMergeStrategy.NewInstance(Reference.class);
810
        ref1 = referenceDao.findByUuid(uuidRef1);
811
        ref2 = referenceDao.findByUuid(uuidRef2);
812
        cdmGenericDao.merge(ref2, ref1, strategy);
813

    
814
        taxon = (Taxon)taxonDao.findByUuid(taxon.getUuid());
815
        textData = (TextData)taxon.getDescriptions().iterator().next().getElements().iterator().next();
816
        languageString = textData.getLanguageText(language);
817
        Assert.assertEquals("And <cdm:reference cdmId='"+uuidRef2+"' intextId='"+uuidIntextRefRef+"'>here</cdm:reference> is a citation",
818
                languageString.getText());
819
    }
820

    
821
    @Test
822
    public void testReallocateIntextReferenceForNameAndAnnotation() throws MergeException {
823
        UUID uuidPinusAlba = UUID.fromString("52743cec-b893-4e8b-b06c-91f9b9ba8fee");
824
        UUID uuidAbiesAlba = UUID.fromString("6ed56b43-7cca-4c3b-bb90-7576da81c072");
825

    
826
        // CREATE DATA
827
        TaxonName pinusAlba = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
828
        pinusAlba.setTitleCache("BotanicalName1", true);
829
        pinusAlba.setUuid(uuidPinusAlba);
830

    
831
        TaxonName abiesAlba = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
832
        abiesAlba.setTitleCache("Abies alba", true);
833
        abiesAlba.setUuid(uuidAbiesAlba);
834

    
835
        Taxon taxon = Taxon.NewInstance(null, null);
836

    
837
        Annotation annotation = Annotation.NewDefaultLanguageInstance("My annotation on Abies alba and its habit.");
838
        taxon.addAnnotation(annotation);
839
        IntextReference intextRefName = annotation.addIntextReference(abiesAlba, "My annotation on ", "Abies alba", " and its habit.");
840
        String uuidIntextRefName = intextRefName.getUuid().toString();
841
        Assert.assertEquals("My annotation on <cdm:name cdmId='"+uuidAbiesAlba+"' intextId='"+uuidIntextRefName+"'>Abies alba</cdm:name> and its habit.",
842
                annotation.getText());
843

    
844
        //SAVE AND COMMIT
845
        taxonDao.save(taxon);
846
        nameDao.save(abiesAlba);
847
        nameDao.save(pinusAlba);
848
        commitAndStartNewTransaction(null);
849

    
850
        //MERGE
851
        DefaultMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TaxonName.class);
852
        abiesAlba = nameDao.findByUuid(uuidAbiesAlba);
853
        pinusAlba = nameDao.findByUuid(uuidPinusAlba);
854
        cdmGenericDao.merge(pinusAlba, abiesAlba, strategy);
855

    
856
        taxon = (Taxon)taxonDao.findByUuid(taxon.getUuid());
857
        annotation = taxon.getAnnotations().iterator().next();
858

    
859
        Assert.assertEquals("My annotation on <cdm:name cdmId='"+uuidPinusAlba+"' intextId='"+uuidIntextRefName+"'>Abies alba</cdm:name> and its habit.",
860
                annotation.getText());
861
    }
862

    
863
	@Test
864
	public void testReallocatePersonTeam() throws MergeException {
865

    
866
	    TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
867
		name1.setTitleCache("BotanicalName1", true);
868

    
869
		IBook book1 = ReferenceFactory.newBook();
870

    
871
		Team team1 = Team.NewInstance();
872
		Team team2 = Team.NewInstance();
873
		team1.setTitleCache("team1", true);
874
		team2.setTitleCache("team2", true);
875

    
876
		Person person1 = Person.NewTitledInstance("person1");
877
		Person person2 = Person.NewTitledInstance("person2");
878

    
879
		team1.setNomenclaturalTitle("T.1");
880
		String street1 = "Strasse1";
881
		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)));
882
		team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
883
		String street3 = "Street3";
884
		team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));
885
		String emailAddress1 = "Email1";
886
		team1.addEmailAddress(emailAddress1);
887

    
888
		//FIXME
889
//		team2.addTeamMember(person1);
890
		team2.addTeamMember(person2);
891
		String emailAddress2 = "Email2";
892
		team2.addEmailAddress(emailAddress2);
893

    
894
		Credit credit1 = Credit.NewInstance(team2, "credit1");
895
		book1.addCredit(credit1);
896

    
897
		agentDao.save(team1);
898
		agentDao.save(team2);
899
		agentDao.save(person1);
900
		agentDao.save(person2);
901

    
902
		cdmGenericDao.save((Reference)book1);
903

    
904
		//starting condition
905
		name1.setCombinationAuthorship(person1);
906
		Assert.assertEquals("Name1 should have person1 as combination author", person1, name1.getCombinationAuthorship());
907

    
908
		DefaultMergeStrategy strategy = DefaultMergeStrategy.NewInstance(TeamOrPersonBase.class);
909
//		strategy.setOnlyReallocateLinks(true);
910

    
911
		FieldUnit fieldUnit1 = FieldUnit.NewInstance();
912
		fieldUnit1.setPrimaryCollector(person1);
913
		cdmGenericDao.save(fieldUnit1);
914
		try {
915
			cdmGenericDao.merge(team2, person1, strategy);
916
			Assert.fail("We expect exception because fieldunit.primaryCollector is of type person");
917
		} catch (MergeException e) {
918
			if (! e.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
919
				Assert.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
920
			}
921
			fieldUnit1.setPrimaryCollector(null);  //clean up for next test
922
		} catch (Exception e) {
923
			Assert.fail("Unhandled exception during merge");
924
		}
925
		Assert.assertEquals("Name1 should still have person1 as combination author", person1, name1.getCombinationAuthorship());
926

    
927
		//test collections
928
		team1.addTeamMember(person1);
929
		try {
930
			cdmGenericDao.merge(team2, person1, strategy);
931
			Assert.fail("We expect exception because fieldunit.primaryCollector is of type person");
932
		} catch (MergeException e) {
933
			if (! e.getMessage().contains("Object can not be merged into new object as it is referenced in a way that does not allow merging")){
934
				Assert.fail("The exception should be the one thrown by DeduplicationHelper.reallocateByHolder(...)");
935
			}
936
			team1.removeTeamMember(person1); //clean up for next test
937
		} catch (Exception e) {
938
			Assert.fail("Unhandled exception during merge");
939
		}
940
		Assert.assertEquals("Name1 should still have person1 as combination author", person1, name1.getCombinationAuthorship());
941

    
942
		//test successful merge
943
		cdmGenericDao.save(name1);
944
		cdmGenericDao.merge(team2, person1, strategy);
945
		Assert.assertEquals("Name1 should have team2 as combination author now", team2, name1.getCombinationAuthorship());
946
	}
947

    
948
	private void testMergeExceptions(CdmBase name1, CdmBase name2, CdmBase taxon, ICdmBase zooName1) throws MergeException{
949
		//
950
		try {
951
			cdmGenericDao.merge(name1, null, null);
952
			Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
953
		} catch (NullPointerException e) {
954
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
955
		}
956
		//
957
		try {
958
			cdmGenericDao.merge(null, name1, null);
959
			Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
960
		} catch (NullPointerException e) {
961
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
962
		}
963
		//exceptions to be thrown
964
		try {
965
			cdmGenericDao.merge(name1, taxon, null);
966
			//this is not fully true anymore !! In certain cases merging of objects of different classes is allowed
967
			Assert.fail("Merging of 2 objects of different types must throw an exception");
968
		} catch (MergeException e) {
969
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
970
		}
971
		//next exception
972
		//for names this is not the case anymore
973
//		try {
974
//			cdmGenericDao.merge(name1, zooName1, null);
975
//			Assert.fail("Merging of 2 objects of different types must throw an exception");
976
//		} catch (MergeException e) {
977
//			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
978
//		}
979
	}
980

    
981
	@Test
982
	public void findMatching(){
983
		IBook book1 = ReferenceFactory.newBook();
984
		IBook book2 = ReferenceFactory.newBook();
985
		IBook book3 = ReferenceFactory.newBook();
986

    
987
		String title1 = "title1";
988
		String title2 = "title2";
989
		book1.setTitle(title1);
990
		book2.setTitle(title2);
991
		book3.setTitle(title1);
992

    
993
		cdmGenericDao.saveOrUpdate((Reference)book1);
994
		cdmGenericDao.saveOrUpdate((Reference)book2);
995
		cdmGenericDao.saveOrUpdate((Reference)book3);
996

    
997
		IMatchStrategyEqual matchStrategy = DefaultMatchStrategy.NewInstance(Reference.class);
998

    
999
		try {
1000
			List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1001
			Assert.assertNotNull("Resultlist must not be null", matchResult);
1002
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1003
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
1004

    
1005
			book1.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(1999, 2002));
1006
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1007
			Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
1008

    
1009
			book3.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(1999));
1010
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1011
			Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
1012

    
1013
			book3.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(1999,2002));
1014
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1015
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1016
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
1017

    
1018
			//BookSection
1019
			IBookSection section1 = ReferenceFactory.newBookSection();
1020
			section1.setInBook(book1);
1021
			section1.setTitle("SecTitle");
1022
			section1.setPages("22-33");
1023
			IBookSection section2 = ReferenceFactory.newBookSection();
1024
			section2.setInBook(book2);
1025
			section2.setTitle("SecTitle");
1026
			section2.setPages("22-33");
1027
			IBookSection section3 = ReferenceFactory.newBookSection();
1028
			section3.setInBook(book1);
1029
			section3.setTitle("SecTitle");
1030
			section3.setPages("22-33");
1031
			cdmGenericDao.saveOrUpdate((Reference)section1);
1032
			cdmGenericDao.saveOrUpdate((Reference)section2);
1033
			cdmGenericDao.saveOrUpdate((Reference)section3);
1034

    
1035
			List<IBookSection> sectionResult = cdmGenericDao.findMatching(section3, null);
1036
			Assert.assertEquals("Resultlist must have 1 entries", 1, sectionResult.size());
1037
			Assert.assertSame("Resultlist entry must be section1", section1, sectionResult.get(0));
1038

    
1039
			section2.setInBook(book2 = (IBook)book1.clone());
1040
			cdmGenericDao.saveOrUpdate((Reference)book2);
1041
			cdmGenericDao.saveOrUpdate((Reference)book1);
1042
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1043
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1044
			sectionResult = cdmGenericDao.findMatching(section3, null);
1045
			Assert.assertEquals("Resultlist must have 1 entries", 2, sectionResult.size());
1046

    
1047
			Person person1 = Person.NewTitledInstance("person");
1048
			Person person2 = Person.NewTitledInstance("person");
1049
			Person person3 = Person.NewTitledInstance("person");
1050

    
1051
			person1.setPrefix("pre1");
1052
			person2.setPrefix("pre2");
1053
			person3.setPrefix("pre3");
1054

    
1055
//			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1056
//			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1057

    
1058
			book1.setAuthorship(person1);
1059
			book2.setAuthorship(person1);
1060
			book3.setAuthorship(person1);
1061

    
1062
			boolean m = matchStrategy.invoke(book1, book3).isSuccessful();
1063
			boolean m2 = matchStrategy.invoke(book2, book3).isSuccessful();
1064

    
1065
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1066
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1067

    
1068
			book2.setAuthorship(person2);
1069
			book3.setAuthorship(person3);
1070
			matchResult = cdmGenericDao.findMatching(book3, null);
1071
			Assert.assertEquals("Resultlist must have no entries", 0, matchResult.size());
1072

    
1073
			person3.setPrefix("pre1");
1074
			matchResult = cdmGenericDao.findMatching(book3, null);
1075
			Assert.assertEquals("Resultlist must have 1 entry", 1, matchResult.size());
1076
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
1077

    
1078
		} catch (MatchException e) {
1079
			Assert.fail("Find match must not throw Exception: " + e.getMessage());
1080
			e.printStackTrace();
1081
		}
1082
	}
1083

    
1084
	@Test
1085
	public void findMatchingCache(){
1086
		IBook book1 = ReferenceFactory.newBook();
1087
		Team team1 = Team.NewInstance();
1088
		Team team2 = Team.NewInstance();
1089
		team1.setTitleCache("Team1", true);
1090
		team2.setTitleCache("Team1", true);
1091

    
1092
		book1.setTitle("Title1");
1093
		book1.setEdition("Edition1");
1094
		book1.setAuthorship(team1);
1095

    
1096

    
1097
		IBook book2 = (IBook) ((Reference)book1).clone();
1098
		IBook book3 = (IBook) ((Reference)book1).clone();
1099

    
1100
//		Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));
1101
//		book1.setTitleCache("cache1");
1102
//		Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));
1103
//
1104
//		bookClone.setTitleCache("cache1");
1105
//		Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));
1106
//
1107
//		bookClone.setTitleCache("cache2");
1108
//		Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));
1109
//		bookClone.setTitleCache("cache1"); //restore
1110
//
1111
//		bookClone.setEdition(null);
1112
//		Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));
1113

    
1114
		cdmGenericDao.saveOrUpdate((Reference)book1);
1115
		cdmGenericDao.saveOrUpdate((Reference)book2);
1116
		cdmGenericDao.saveOrUpdate((Reference)book3);
1117
		cdmGenericDao.saveOrUpdate(team1);
1118
		cdmGenericDao.saveOrUpdate(team2);
1119

    
1120
		IMatchStrategyEqual matchStrategy = DefaultMatchStrategy.NewInstance(Reference.class);
1121

    
1122
		try {
1123
			List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1124
			Assert.assertNotNull("Resultlist must not be null", matchResult);
1125
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1126
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1127
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1128

    
1129
			book1.setTitleCache("cache1", true);
1130
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1131
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1132
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1133

    
1134
			book2.setTitleCache("cache2", false);
1135
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1136
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1137
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1138

    
1139
			book2.setEdition(null);
1140
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1141
			Assert.assertEquals("Resultlist must have 0 entries", 0, matchResult.size());
1142

    
1143
			book3.setTitleCache("cache1", true);
1144
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1145
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1146
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1147

    
1148
			IMatchStrategyEqual teamMatcher = DefaultMatchStrategy.NewInstance(Team.class);
1149
			boolean teamsMatch = teamMatcher.invoke(team1, team2).isSuccessful();
1150
			Assert.assertTrue("Team1 and team2 should match" ,teamsMatch);
1151

    
1152
			book3.setAuthorship(team2);
1153
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1154
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1155
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1156

    
1157
			book3.setAuthorship(null);
1158
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1159
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1160
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1161

    
1162
			book2.setTitleCache(book3.getTitleCache(), true);
1163
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1164
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1165
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1166
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1167

    
1168
			team2.setTitleCache("team2", true);
1169
			teamsMatch = teamMatcher.invoke(team1, team2).isSuccessful();
1170
			Assert.assertFalse("Team1 and team2 should not match" ,teamsMatch);
1171

    
1172
			book3.setAuthorship(team1);
1173
			book2.setAuthorship(team2);
1174
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1175
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1176
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1177

    
1178
		} catch (MatchException e) {
1179
			Assert.fail("Find match must not throw Exception: " + e.getMessage());
1180
			e.printStackTrace();
1181
		}
1182
	}
1183

    
1184
	//from original testing within class, can be removed if not needed anymore
1185
	private void test() {
1186
		SessionFactoryImpl factory = (SessionFactoryImpl)((CdmGenericDaoImpl)cdmGenericDao).getSession().getSessionFactory();
1187
		Type propType = factory.getReferencedPropertyType(TaxonName.class.getCanonicalName(), "titleCache");
1188
		Map<?,?> collMetadata = factory.getAllCollectionMetadata();
1189
		Object roles = factory.getCollectionRolesByEntityParticipant("eu.etaxonomy.cdm.model.name.BotanicalName");
1190
		CollectionPersister collPersister;
1191
		try {
1192
			collPersister = factory.getCollectionPersister(TaxonName.class.getCanonicalName()+".annotations");
1193
		} catch (MappingException e) {
1194
			// TODO Auto-generated catch block
1195
			e.printStackTrace();
1196
		}
1197
		Statistics statistics = factory.getStatistics();
1198
		Map<?,?> allClassMetadata = factory.getAllClassMetadata();
1199
		logger.debug("");
1200
	}
1201

    
1202
	@Test
1203
	public void testGetHqlResult() {
1204
		logger.warn("Not yet implemented");
1205
	}
1206

    
1207
    @Override
1208
    public void createTestDataSet() throws FileNotFoundException {}
1209
}
(4-4/7)