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
package eu.etaxonomy.cdm.persistence.dao.hibernate.common;
10

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

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

    
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;
33

    
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.strategy.match.DefaultMatchStrategy;
162
import eu.etaxonomy.cdm.strategy.match.IMatchStrategyEqual;
163
import eu.etaxonomy.cdm.strategy.match.MatchException;
164
import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;
165
import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
166
import eu.etaxonomy.cdm.strategy.merge.MergeException;
167
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
168
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
169

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

    
177
	@SpringBeanByType
178
	private ICdmGenericDao cdmGenericDao;
179

    
180
	@SpringBeanByType
181
	private ITaxonDao taxonDao;
182

    
183
	@SpringBeanByType
184
	private IOccurrenceDao occurrenceDao;
185

    
186
	@SpringBeanByType
187
	private ITaxonNameDao nameDao;
188

    
189
	@SpringBeanByType
190
	private IAgentDao agentDao;
191

    
192
    @SpringBeanByType
193
    private IReferenceDao referenceDao;
194

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

    
198
// ***************** TESTS **************************************************
199

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

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

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

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

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

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

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

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

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

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

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

    
400
		name.setNomenclaturalReference(ref1);
401

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
532
		name1.setNomenclaturalReference(article1);
533

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

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

    
542
		taxonDao.save(taxon1);
543

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

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

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

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

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

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

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

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

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

    
574
		//test exceptions
575

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

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

    
585
	}
586

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

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

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

    
598
		Reference database = ReferenceFactory.newDatabase();
599

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
754
        team3.addTeamMember(person3);
755

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

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

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

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

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

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

    
782
        // CREATE DATA
783

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
868
		IBook book1 = ReferenceFactory.newBook();
869

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1095

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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