Project

General

Profile

Download (42.3 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2007 EDIT
4
* European Distributed Institute of Taxonomy 
5
* http://www.e-taxonomy.eu
6
* 
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10

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

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

    
15
import java.util.ArrayList;
16
import java.util.Arrays;
17
import java.util.List;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.apache.log4j.Logger;
22
import org.junit.After;
23
import org.junit.AfterClass;
24
import org.junit.Assert;
25
import org.junit.Before;
26
import org.junit.BeforeClass;
27
import org.junit.Ignore;
28
import org.junit.Test;
29
import org.unitils.dbunit.annotation.DataSet;
30
import org.unitils.spring.annotation.SpringBeanByType;
31

    
32
import eu.etaxonomy.cdm.model.agent.Address;
33
import eu.etaxonomy.cdm.model.agent.AgentBase;
34
import eu.etaxonomy.cdm.model.agent.Contact;
35
import eu.etaxonomy.cdm.model.agent.Institution;
36
import eu.etaxonomy.cdm.model.agent.InstitutionType;
37
import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
38
import eu.etaxonomy.cdm.model.agent.Person;
39
import eu.etaxonomy.cdm.model.agent.Team;
40
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
41
import eu.etaxonomy.cdm.model.common.Annotation;
42
import eu.etaxonomy.cdm.model.common.AnnotationType;
43
import eu.etaxonomy.cdm.model.common.CdmBase;
44
import eu.etaxonomy.cdm.model.common.Credit;
45
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
46
import eu.etaxonomy.cdm.model.common.Extension;
47
import eu.etaxonomy.cdm.model.common.ExtensionType;
48
import eu.etaxonomy.cdm.model.common.Figure;
49
import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;
50
import eu.etaxonomy.cdm.model.common.Group;
51
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
52
import eu.etaxonomy.cdm.model.common.LSIDAuthority;
53
import eu.etaxonomy.cdm.model.common.Language;
54
import eu.etaxonomy.cdm.model.common.LanguageString;
55
import eu.etaxonomy.cdm.model.common.Marker;
56
import eu.etaxonomy.cdm.model.common.MarkerType;
57
import eu.etaxonomy.cdm.model.common.OrderedTermBase;
58
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
59
import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
60
import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
61
import eu.etaxonomy.cdm.model.common.Representation;
62
import eu.etaxonomy.cdm.model.common.TermVocabulary;
63
import eu.etaxonomy.cdm.model.common.TimePeriod;
64
import eu.etaxonomy.cdm.model.common.User;
65
import eu.etaxonomy.cdm.model.description.AbsenceTerm;
66
import eu.etaxonomy.cdm.model.description.CategoricalData;
67
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
68
import eu.etaxonomy.cdm.model.description.DescriptionBase;
69
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
70
import eu.etaxonomy.cdm.model.description.Distribution;
71
import eu.etaxonomy.cdm.model.description.Feature;
72
import eu.etaxonomy.cdm.model.description.FeatureNode;
73
import eu.etaxonomy.cdm.model.description.FeatureTree;
74
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
75
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
76
import eu.etaxonomy.cdm.model.description.MediaKey;
77
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
78
import eu.etaxonomy.cdm.model.description.PresenceTerm;
79
import eu.etaxonomy.cdm.model.description.QuantitativeData;
80
import eu.etaxonomy.cdm.model.description.Scope;
81
import eu.etaxonomy.cdm.model.description.Sex;
82
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
83
import eu.etaxonomy.cdm.model.description.Stage;
84
import eu.etaxonomy.cdm.model.description.State;
85
import eu.etaxonomy.cdm.model.description.StateData;
86
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
87
import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
88
import eu.etaxonomy.cdm.model.description.TaxonDescription;
89
import eu.etaxonomy.cdm.model.description.TaxonInteraction;
90
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
91
import eu.etaxonomy.cdm.model.description.TextData;
92
import eu.etaxonomy.cdm.model.description.TextFormat;
93
import eu.etaxonomy.cdm.model.location.Continent;
94
import eu.etaxonomy.cdm.model.location.NamedArea;
95
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
96
import eu.etaxonomy.cdm.model.location.NamedAreaType;
97
import eu.etaxonomy.cdm.model.location.Point;
98
import eu.etaxonomy.cdm.model.location.ReferenceSystem;
99
import eu.etaxonomy.cdm.model.location.TdwgArea;
100
import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;
101
import eu.etaxonomy.cdm.model.media.AudioFile;
102
import eu.etaxonomy.cdm.model.media.ImageFile;
103
import eu.etaxonomy.cdm.model.media.Media;
104
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
105
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
106
import eu.etaxonomy.cdm.model.media.MovieFile;
107
import eu.etaxonomy.cdm.model.media.ReferencedMedia;
108
import eu.etaxonomy.cdm.model.media.Rights;
109
import eu.etaxonomy.cdm.model.media.RightsTerm;
110
import eu.etaxonomy.cdm.model.molecular.DnaSample;
111
import eu.etaxonomy.cdm.model.molecular.GenBankAccession;
112
import eu.etaxonomy.cdm.model.molecular.Locus;
113
import eu.etaxonomy.cdm.model.molecular.PhylogeneticTree;
114
import eu.etaxonomy.cdm.model.molecular.Sequence;
115
import eu.etaxonomy.cdm.model.name.BacterialName;
116
import eu.etaxonomy.cdm.model.name.BotanicalName;
117
import eu.etaxonomy.cdm.model.name.CultivarPlantName;
118
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
119
import eu.etaxonomy.cdm.model.name.HybridRelationship;
120
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
121
import eu.etaxonomy.cdm.model.name.NameRelationship;
122
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
123
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
124
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
125
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
126
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
127
import eu.etaxonomy.cdm.model.name.NonViralName;
128
import eu.etaxonomy.cdm.model.name.Rank;
129
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
130
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
131
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
132
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
133
import eu.etaxonomy.cdm.model.name.ViralName;
134
import eu.etaxonomy.cdm.model.name.ZoologicalName;
135
import eu.etaxonomy.cdm.model.occurrence.Collection;
136
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
137
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
138
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
139
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
140
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
141
import eu.etaxonomy.cdm.model.occurrence.DeterminationModifier;
142
import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
143
import eu.etaxonomy.cdm.model.occurrence.Fossil;
144
import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
145
import eu.etaxonomy.cdm.model.occurrence.LivingBeing;
146
import eu.etaxonomy.cdm.model.occurrence.Observation;
147
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
148
import eu.etaxonomy.cdm.model.occurrence.Specimen;
149
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
150
import eu.etaxonomy.cdm.model.reference.IBook;
151
import eu.etaxonomy.cdm.model.reference.IBookSection;
152
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
153
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
154
import eu.etaxonomy.cdm.model.taxon.Synonym;
155
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
156
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
157
import eu.etaxonomy.cdm.model.taxon.Taxon;
158
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
159
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
160
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
161
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
162
import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
163
import eu.etaxonomy.cdm.model.view.AuditEvent;
164
import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;
165
import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
166
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
167
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
168
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
169
import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
170
import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
171
import eu.etaxonomy.cdm.strategy.match.MatchException;
172
import eu.etaxonomy.cdm.strategy.merge.DefaultMergeStrategy;
173
import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
174
import eu.etaxonomy.cdm.strategy.merge.MergeException;
175
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
176

    
177
/**
178
 * @author a.mueller
179
 * @created 27.07.2009
180
 * @version 1.0
181
 */
182
public class CdmGenericDaoImplTest extends CdmTransactionalIntegrationTest{
183
	private static final Logger logger = Logger.getLogger(CdmGenericDaoImplTest.class);
184
	
185
	@SpringBeanByType
186
	private ICdmGenericDao cdmGenericDao;
187
	
188
	@SpringBeanByType
189
	private ITaxonDao taxonDao;
190
	
191
	@SpringBeanByType
192
	private IOccurrenceDao occurrenceDao;
193

    
194
	
195
	@SpringBeanByType
196
	private ITaxonNameDao nameDao;
197

    
198
	@SpringBeanByType
199
	private IAgentDao agentDao;
200
	
201
	
202
	/**
203
	 * @throws java.lang.Exception
204
	 */
205
	@BeforeClass
206
	public static void setUpBeforeClass() throws Exception {
207
	}
208

    
209
	/**
210
	 * @throws java.lang.Exception
211
	 */
212
	@AfterClass
213
	public static void tearDownAfterClass() throws Exception {
214
	}
215

    
216
	/**
217
	 * @throws java.lang.Exception
218
	 */
219
	@Before
220
	public void setUp() throws Exception {
221
	}
222

    
223
	/**
224
	 * @throws java.lang.Exception
225
	 */
226
	@After
227
	public void tearDown() throws Exception {
228
	}
229

    
230
// ***************** TESTS **************************************************	
231
	
232
	@Test
233
	@Ignore
234
	public void testDelete(){
235
		ReferenceBase ref1 = ReferenceFactory.newBook();
236
		ReferenceBase ref2 = ReferenceFactory.newBook();
237
		Annotation annotation = Annotation.NewInstance("Anno1", null);
238
		ref1.addAnnotation(annotation);
239
		cdmGenericDao.saveOrUpdate(ref1);
240
		cdmGenericDao.saveOrUpdate(ref2);
241
		taxonDao.flush();
242
		try {
243
			cdmGenericDao.merge(ref2, ref1, null);
244
			taxonDao.flush();
245
		} catch (MergeException e) {
246
			// TODO Auto-generated catch block
247
			e.printStackTrace();
248
		}
249
		//cdmGenericDao.delete(ref1);
250
		taxonDao.flush();
251
		System.out.println("OK");
252
		//Assert.fail("Failed for testing");
253
	}
254
	
255
	/**
256
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
257
	 * @throws MergeException 
258
	 */
259
	@Test
260
	@Ignore
261
	public void testDelete2() throws MergeException {
262
		BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
263
		name1.setTitleCache("BotanicalName1", true);
264
		
265
		BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
266
		name2.setTitleCache("BotanicalName2", true);
267
		
268
		ReferenceBase article1 = ReferenceFactory.newArticle();
269
		ReferenceBase article2 = ReferenceFactory.newArticle();
270
		
271
		
272
		name1.setNomenclaturalReference(article1);
273
		name2.setNomenclaturalReference(article2);
274
		
275
		
276
		Taxon taxon1 = Taxon.NewInstance(name1, article1);
277
		
278
//		Person author = Person.NewInstance();
279
//		author.setTitleCache("Author");
280
		Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());
281
		Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());
282
		
283
		article1.addAnnotation(annotation1);
284
		article2.addAnnotation(annotation2);
285
		
286
		nameDao.save(name1);
287
		nameDao.save(name2);
288
		cdmGenericDao.saveOrUpdate(article2);
289
		
290
		taxonDao.save(taxon1);
291

    
292
		//unidircetional reference to the merged object should be redirected
293
		cdmGenericDao.merge(article1, article2, null);
294
		Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());
295
		//TODO microCitations!! -> warning	
296
		
297
		//Annotations
298
		Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());
299
	}
300

    
301
	
302
	
303
	
304
	/**
305
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#CdmGenericDaoImpl()}.
306
	 */
307
	@Test
308
	public void testCdmGenericDaoImpl() {
309
		logger.warn("Not yet implemented");
310
	}
311

    
312
	/**
313
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesByFieldAndClass(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.
314
	 */
315
	@Test
316
	public void testGetCdmBasesByFieldAndClass() {
317
		logger.warn("Not yet implemented");
318
	}
319

    
320
	/**
321
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getCdmBasesWithItemInCollection(java.lang.Class, java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)}.
322
	 */
323
	@Test
324
	public void testGetCdmBasesWithItemInCollection() {
325
		logger.warn("Not yet implemented");
326
	}
327

    
328
	/**
329
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getAllCdmClasses(boolean)}.
330
	 */
331
	@Test
332
	public void testGetAllCdmClasses() {
333
		Class[] existingClassesArray = {
334
				Address.class,
335
				AgentBase.class,
336
				Institution.class, 
337
				InstitutionalMembership.class, 
338
				InstitutionType.class, 
339
				Person.class, 
340
				Team.class, 
341
				TeamOrPersonBase.class, 
342
				Annotation.class, 
343
				AnnotationType.class, 
344
				Credit.class,
345
				DefinedTermBase.class, 
346
				Extension.class, 
347
				ExtensionType.class, 
348
				Figure.class, 
349
				GrantedAuthorityImpl.class, 
350
				Group.class, 
351
				IdentifiableSource.class,
352
				Language.class, 
353
				LanguageString.class, 
354
				LSIDAuthority.class, 
355
				Marker.class, 
356
				MarkerType.class, 
357
				OrderedTermBase.class, 
358
				OrderedTermVocabulary.class, 
359
				OriginalSourceBase.class,
360
				RelationshipTermBase.class, 
361
				Representation.class, 
362
				TermVocabulary.class, 
363
				User.class, 
364
				
365
				AbsenceTerm.class, 
366
				CategoricalData.class, 
367
				CommonTaxonName.class, 
368
				DescriptionBase.class, 
369
				DescriptionElementBase.class, 
370
				Distribution.class, 
371
				Feature.class, 
372
				FeatureNode.class, 
373
				FeatureTree.class, 
374
				MediaKey.class, 
375
				IndividualsAssociation.class, 
376
				MeasurementUnit.class, 
377
				PresenceAbsenceTermBase.class, 
378
				PresenceTerm.class, 
379
				QuantitativeData.class, 
380
				Scope.class, 
381
				Sex.class, 
382
				SpecimenDescription.class, 
383
				Stage.class, 
384
				State.class, 
385
				StateData.class, 
386
				StatisticalMeasure.class, 
387
				StatisticalMeasurementValue.class, 
388
				TaxonDescription.class, 
389
				TaxonInteraction.class, 
390
				TaxonNameDescription.class, 
391
				TextData.class, 
392
				TextFormat.class, 
393
				Continent.class, 
394
				NamedArea.class, 
395
				NamedAreaLevel.class, 
396
				NamedAreaType.class, 
397
				ReferenceSystem.class, 
398
				TdwgArea.class, 
399
				WaterbodyOrCountry.class, 
400
				AudioFile.class, 
401
				ImageFile.class, 
402
				Media.class, 
403
				MediaRepresentation.class, 
404
				MediaRepresentationPart.class, 
405
				MovieFile.class, 
406
				ReferencedMedia.class, 
407
				Rights.class, 
408
				RightsTerm.class, 
409
				DnaSample.class, 
410
				GenBankAccession.class, 
411
				Locus.class, 
412
				PhylogeneticTree.class, 
413
				Sequence.class, 
414
				BacterialName.class, 
415
				BotanicalName.class, 
416
				CultivarPlantName.class, 
417
				HomotypicalGroup.class, 
418
				HybridRelationship.class, 
419
				HybridRelationshipType.class, 
420
				NameRelationship.class, 
421
				NameRelationshipType.class, 
422
				NameTypeDesignation.class, 
423
				NameTypeDesignationStatus.class, 
424
				NomenclaturalStatus.class, 
425
				NomenclaturalStatusType.class, 
426
				NonViralName.class, 
427
				Rank.class, 
428
				SpecimenTypeDesignation.class, 
429
				SpecimenTypeDesignationStatus.class, 
430
				TaxonNameBase.class, 
431
				TypeDesignationBase.class, 
432
				ViralName.class, 
433
				ZoologicalName.class, 
434
				Collection.class, 
435
				DerivationEvent.class, 
436
				DerivationEventType.class, 
437
				DerivedUnit.class, 
438
				DerivedUnitBase.class, 
439
				DeterminationEvent.class, 
440
				DeterminationModifier.class, 
441
				FieldObservation.class, 
442
				Fossil.class, 
443
				GatheringEvent.class, 
444
				LivingBeing.class, 
445
				Observation.class, 
446
				PreservationMethod.class, 
447
				Specimen.class, 
448
				SpecimenOrObservationBase.class, 
449
				ReferenceBase.class, 
450
				Synonym.class, 
451
				SynonymRelationship.class, 
452
				SynonymRelationshipType.class, 
453
				Taxon.class, 
454
				TaxonBase.class, 
455
				TaxonNode.class, 
456
				TaxonomicTree.class, 
457
				TaxonRelationship.class, 
458
				TaxonRelationshipType.class 
459
				//Contact.class, 
460
				//LSID.class, 
461
				//Modifier.class, 
462
				//Point.class, 
463
				//NomenclaturalCode.class, 
464
		}	;
465
		List<Class> existingClassesList = new ArrayList<Class>();
466
		existingClassesList.addAll(Arrays.asList(existingClassesArray));
467
		boolean includeAbstractClasses = true;
468
		Set<Class<? extends CdmBase>> foundClasses = cdmGenericDao.getAllCdmClasses(includeAbstractClasses);
469
		
470
		//for debugging only		
471
		//		for (Class existingClass : existingClassesList){
472
		//			if (! foundClasses.contains(existingClass)){
473
		//				logger.warn("Class not found: " + existingClass.getCanonicalName());
474
		//			}
475
		//		}
476
		
477
		//All classes must be found
478
		Assert.assertTrue("all classes must be found by getAllCdmClasses() method", foundClasses.containsAll(existingClassesList));
479
		
480
		
481
		//No extra classes must be found
482
		for (Class clazz : foundClasses){
483
			if (! CdmBase.class.isAssignableFrom(clazz)&& !( AuditEvent.class == clazz)  ){ //OLD: && !( LSID.class == clazz)&& !( NomenclaturalCode.class == clazz) && !( Point.class == clazz) && !( Modifier.class == clazz) && !( Contact.class == clazz) 
484
				Assert.fail("Class " + clazz.getName() + " is not assignable from CdmBase");
485
			}
486
		}
487
		
488
		includeAbstractClasses = false;
489
		Set<Class<? extends CdmBase>> noAbstractClasses = cdmGenericDao.getAllCdmClasses(includeAbstractClasses);
490
		Class abstractClassToTest = TaxonNameBase.class;
491
		Assert.assertFalse("Abstract class " + abstractClassToTest.getName() + " may not be in set ", noAbstractClasses.contains(abstractClassToTest));
492
	}
493

    
494
	/**
495
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
496
	 */
497
	@Test
498
	public void testGetReferencingObjectsCdmBase() {
499
		BotanicalName name = BotanicalName.NewInstance(Rank.SPECIES());
500
		name.setTitleCache("A name", true);
501
		ReferenceBase ref1 = ReferenceFactory.newArticle();
502
		Taxon taxon = Taxon.NewInstance(name, ref1);
503
		Person author = Person.NewInstance();
504
		author.setTitleCache("Author", true);
505
		ref1.addAnnotation(Annotation.NewInstance("A1", Language.DEFAULT()));
506
		ref1.setAuthorTeam(author);
507
		name.setBasionymAuthorTeam(author);
508
		
509
		name.setNomenclaturalReference(ref1);
510
		
511
		taxonDao.save(taxon);
512
//		UUID uuid = UUID.fromString("613980ac-9bd5-43b9-a374-d71e1794688f");
513
//		ReferenceBase ref1 = referenceService.findByUuid(uuid);
514
		
515
	
516
		Set<CdmBase> referencedObjects = cdmGenericDao.getReferencingObjects(ref1);
517
		System.out.println("############## RESULT ###################");
518
		for (CdmBase obj: referencedObjects){
519
			System.out.println("Object1: " + obj.getClass().getSimpleName() + " - " + obj);
520
		}
521
		assertEquals(3, referencedObjects.size());
522
		System.out.println("############## ENDE ###################");
523
		
524
//		UUID uuidAuthor = UUID.fromString("4ce66544-a5a3-4601-ab0b-1f0a1338327b");
525
//		AgentBase author = agentService.findByUuid(uuidAuthor);
526
		
527
		referencedObjects = cdmGenericDao.getReferencingObjects(author);
528
		System.out.println("############## RESULT ###################");
529
		for (CdmBase obj: referencedObjects){
530
			System.out.println("Object2: " + obj.getClass().getSimpleName() + " - " + obj);
531
		}
532
		assertEquals(2, referencedObjects.size());
533
		System.out.println("############## ENDE ###################");
534
	}
535
	
536
	/**
537
	 * 2nd test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getReferencingObjects(CdmBase)}.
538
	 * 
539
	 */
540
	@Test
541
	@DataSet
542
	public final void testGetReferencingObjects2() {
543
//		SpecimenDescription desc1 = SpecimenDescription.NewInstance();
544
//		desc1.setTitleCache("desc1");
545
//		SpecimenDescription desc2 = SpecimenDescription.NewInstance();
546
//		desc2.setTitleCache("desc2");
547
//		
548
//		SpecimenOrObservationBase spec1 = Specimen.NewInstance();
549
//		
550
//		desc1.addDescribedSpecimenOrObservation(spec1);
551
//		//Taxon taxon = Taxon.NewInstance(taxonNameBase, sec)
552
//		spec1.addDescription(desc2);
553
//		
554
//		occurrenceService.save(spec1);
555
		
556
		UUID uuidSpec = UUID.fromString("41539e9c-3764-4f14-9712-2d07d00c8e4c");
557
		SpecimenOrObservationBase spec1 = occurrenceDao.findByUuid(uuidSpec);
558
		
559
	
560
		Set<CdmBase> referencingObjects = cdmGenericDao.getReferencingObjects(spec1);
561
		System.out.println("############## RESULT ###################");
562
		for (CdmBase obj: referencingObjects){
563
			System.out.println("Object: " + obj.getClass().getSimpleName() + " - " + obj);
564
		}
565
		System.out.println("############## ENDE ###################");
566
		assertEquals("Number of referencing objects must be 2.", 2, referencingObjects.size());
567

    
568
	}
569
	
570
	/**
571
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
572
	 * @throws MergeException 
573
	 */
574
	@Test
575
	@Ignore
576
	public void testMergeCdmBaseReferenceAndIdentifiable() throws MergeException {
577
		cdmGenericDao.test();
578
		
579
		
580
		BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
581
		name1.setTitleCache("BotanicalName1", true);
582
		
583
		BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
584
		name2.setTitleCache("BotanicalName2", true);
585
		
586
		ZoologicalName zooName1 = ZoologicalName.NewInstance(Rank.SPECIES());
587
		name1.setTitleCache("ZoologicalName1", true);
588

    
589
		ReferenceBase article1 = ReferenceFactory.newArticle();
590
		ReferenceBase article2 = ReferenceFactory.newArticle();
591
		
592
		
593
		name1.setNomenclaturalReference(article1);
594
		name2.setNomenclaturalReference(article2);
595
		
596
		
597
		Taxon taxon1 = Taxon.NewInstance(name1, article1);
598
		Taxon taxon2 = Taxon.NewInstance(name2, article2);
599
		
600
		
601
//		Person author = Person.NewInstance();
602
//		author.setTitleCache("Author");
603
		Annotation annotation1 = Annotation.NewInstance("A1", Language.DEFAULT());
604
		Annotation annotation2 = Annotation.NewInstance("A2", Language.DEFAULT());
605
		
606
		article1.addAnnotation(annotation1);
607
		article2.addAnnotation(annotation2);
608
		
609
		Marker marker1 = Marker.NewInstance(MarkerType.COMPLETE(), false);
610
		Marker marker2 = Marker.NewInstance(MarkerType.IMPORTED(), false);
611
		
612
		article1.addMarker(marker1);
613
		article2.addMarker(marker2);
614

    
615
		Rights rights1 = Rights.NewInstance();
616
		Rights rights2 = Rights.NewInstance();
617
		
618
		article1.addRights(rights1);
619
		article2.addRights(rights2);
620

    
621
		
622
		Credit credit1 = Credit.NewInstance(Team.NewInstance(), "credit1");
623
		Credit credit2 = Credit.NewInstance(Team.NewInstance(), "credit2");
624
		
625
		article1.addCredit(credit1);
626
		article2.addCredit(credit2);
627

    
628
		Extension extension1 = Extension.NewInstance();
629
		Extension extension2 = Extension.NewInstance();
630
		
631
		article1.addExtension(extension1);
632
		article2.addExtension(extension2);
633
		
634
		IdentifiableSource source1 = IdentifiableSource.NewInstance();
635
		IdentifiableSource source2 = IdentifiableSource.NewInstance();
636
		
637
		article1.addSource(source1);
638
		article2.addSource(source2);
639

    
640
		Media media1 = Media.NewInstance();
641
		Media media2 = Media.NewInstance();
642
		
643
		article1.addMedia(media1);
644
		article2.addMedia(media2);
645
		
646
//		ref1.setAuthorTeam(author);
647
//		name1.setBasionymAuthorTeam(author);
648
		
649
		name1.setNomenclaturalReference(article1);
650

    
651
		nameDao.save(name1);
652
		nameDao.save(name2);
653
		nameDao.save(zooName1);
654
		
655
		TaxonDescription taxDesc = TaxonDescription.NewInstance(taxon1);
656
		taxDesc.setTitleCache("taxDesc", true);
657
		taxDesc.addDescriptionSource(article2);
658

    
659
		taxonDao.save(taxon1);
660

    
661
		//unidircetional reference to the merged object should be redirected
662
		cdmGenericDao.merge(article1, article2, null);
663
		Assert.assertEquals("Name2 must have article 1 as new nomRef", article1 ,name2.getNomenclaturalReference());
664
		//TODO microCitations!! -> warning	
665
		
666
		//Annotations
667
		Assert.assertEquals("Annotation number should be 2 (1 from each of the merged objects)", 2, article1.getAnnotations().size());
668
		
669
		//Marker
670
		Assert.assertEquals("Marker number should be 2 (1 from each of the merged objects)", 2, article1.getMarkers().size());
671

    
672
		//Rights
673
		Assert.assertEquals("Rights number should be 2 (1 from each of the merged objects)", 2, article1.getRights().size());
674
		
675
		//Credits
676
		Assert.assertEquals("Credits number should be 2 (1 from each of the merged objects)", 2, article1.getCredits().size());
677
		
678
		//Extensions
679
		Assert.assertEquals("Extensions number should be 2 (1 from each of the merged objects)", 2, article1.getExtensions().size());
680

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

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

    
687
		//Description sources
688
		Assert.assertEquals("Number of sources for taxon description must be 1", 1, taxDesc.getDescriptionSources().size());
689
		Assert.assertTrue("Taxon description must have article1 as source", taxDesc.getDescriptionSources().contains(article1));
690
	
691
		//test exceptions
692
		testMergeExceptions(name1, name2, taxon1, zooName1);
693

    
694
		
695
		//TO BE IMPLEMENTED 
696
		Assert.assertTrue("Rights2 must be contained in the rights", article1.getRights().contains(rights2));
697
		Assert.assertTrue("Credits2 must be contained in the credits", article1.getCredits().contains(credit2));
698
		Assert.assertTrue("Media2 must be contained in the media", article1.getMedia().contains(media2));
699
	
700
	}
701
	
702
	/**
703
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
704
	 * @throws MergeException 
705
	 */
706
	@Test
707
	@Ignore
708
	public void testMergeTaxonNameAndTaxon() throws MergeException {
709
		BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
710
		name1.setTitleCache("BotanicalName1", true);
711
		
712
		BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
713
		name2.setTitleCache("BotanicalName2", true);
714

    
715
		BotanicalName name3 = BotanicalName.NewInstance(Rank.SPECIES());
716
		name3.setTitleCache("BotanicalName3", true);
717
		
718
		ReferenceBase database = ReferenceFactory.newDatabase();
719
		
720
		Taxon taxon1 = Taxon.NewInstance(name1, database);
721
		Taxon taxon2 = Taxon.NewInstance(name2, database);
722
		Taxon taxon3 = Taxon.NewInstance(name3, database);
723

    
724
		taxonDao.save(taxon1);
725
		taxonDao.save(taxon2);
726
		taxonDao.save(taxon3);
727

    
728
		cdmGenericDao.merge(name1, name2, null);
729
		Assert.assertEquals("Name1 must have 2 taxa attached now.", 2 ,name1.getTaxonBases().size());
730
		Assert.assertEquals("Taxon2 must have name1 as new name.", name1 ,taxon2.getName());
731
	
732
//TODO		
733
//		cdmGenericDao.merge(taxon1, taxon3, null);
734
//		Assert.assertEquals("Name1 must have 3 taxa attached now.", 3 ,name1.getTaxonBases().size());
735
		
736
		
737
	}
738
	
739
	/**
740
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.
741
	 * @throws MergeException 
742
	 */
743
	@Test
744
	public void testMergeAuthors() throws MergeException {
745
		
746
		BotanicalName name1 = BotanicalName.NewInstance(Rank.SPECIES());
747
		name1.setTitleCache("BotanicalName1", true);
748
		
749
		BotanicalName name2 = BotanicalName.NewInstance(Rank.SPECIES());
750
		name2.setTitleCache("BotanicalName2", true);
751

    
752
		IBook book1 = ReferenceFactory.newBook();
753
		IBook book2 = ReferenceFactory.newBook();
754
		
755
		Team team1 = Team.NewInstance();
756
		Team team2 = Team.NewInstance();
757
		Team team3 = Team.NewInstance();
758
		team1.setTitleCache("team1", true);
759
		team2.setTitleCache("team2", true);
760
		team3.setTitleCache("team3", true);
761
		
762
		Person person1 = Person.NewTitledInstance("person1");
763
		Person person2 = Person.NewTitledInstance("person2");
764
		Person person3 = Person.NewTitledInstance("person3");
765
		
766
		team1.setNomenclaturalTitle("T.1");
767
		String street1 = "Strasse1";
768
		team1.setContact(Contact.NewInstance(street1, "12345", "Berlin", WaterbodyOrCountry.ARGENTINA_ARGENTINE_REPUBLIC(),"pobox" , "Region", "a@b.de", "f12345", "+49-30-123456", "www.abc.de", Point.NewInstance(2.4, 3.2, ReferenceSystem.WGS84(), 3)));
769
		team2.setContact(Contact.NewInstance("Street2", null, "London", null, null, null, null, "874599873", null, null, null));
770
		String street3 = "Street3";
771
		team2.addAddress(street3, null, null, null, null, null, Point.NewInstance(1.1, 2.2, null, 4));
772
		String emailAddress1 = "Email1";
773
		team1.addEmailAddress(emailAddress1);
774
		
775
		team2.addTeamMember(person1);
776
		team2.addTeamMember(person2);
777
		String emailAddress2 = "Email2";
778
		team2.addEmailAddress(emailAddress2);
779
		
780
		team3.addTeamMember(person3);
781
		team3.addEmailAddress("emailAddress3");
782
		
783
		book1.setAuthorTeam(team2);
784
		book2.setAuthorTeam(team3);
785
		
786
		Credit credit1 = Credit.NewInstance(team3, "credit1");
787
		book2.addCredit(credit1);
788
		
789
		agentDao.save(team1);
790
		agentDao.save(team2);
791
		agentDao.save(team3);
792
		cdmGenericDao.save((ReferenceBase)book1);
793
		cdmGenericDao.save((ReferenceBase)book2);
794
				
795
		cdmGenericDao.merge(team2, team3, null);
796
		
797
		Assert.assertSame("Author of book1 must be team2.", team2, book1.getAuthorTeam());
798
		Assert.assertSame("Author of book2 must be team2.", team2, book2.getAuthorTeam());
799
		Assert.assertSame("Agent of credit1 must be team2.", team2, credit1.getAgent());
800

    
801
		Assert.assertEquals("Team2 must have 3 persons as members.",3, team2.getTeamMembers().size());
802
		Assert.assertTrue("Team2 must have person3 as new member.", team2.getTeamMembers().contains(person3));
803
		Assert.assertSame("Team2 must have person3 as third member.",person3, team2.getTeamMembers().get(2));
804
		
805
		
806
		//Contact 
807
		cdmGenericDao.merge(team2, team1, null);
808
		Contact team2Contact = team2.getContact();
809
		Assert.assertNotNull("team2Contact must not be null", team2Contact);
810
		Assert.assertNotNull("Addresses must not be null", team2Contact.getAddresses());
811
		Assert.assertEquals("Number of addresses must be 3", 3, team2Contact.getAddresses().size());
812
		Assert.assertEquals("Number of email addresses must be 4", 4, team2Contact.getEmailAddresses().size());
813
		
814
		boolean street1Exists = false;
815
		boolean street3Exists = false;
816
		boolean country1Exists = false;
817
		for  (Address address : team2Contact.getAddresses()){
818
			if (street1.equals(address.getStreet())){
819
				street1Exists = true;
820
			}
821
			if (street3.equals(address.getStreet())){
822
				street3Exists = true;
823
			}
824
			if (WaterbodyOrCountry.ARGENTINA_ARGENTINE_REPUBLIC() == address.getCountry()){
825
				country1Exists = true;
826
			}
827
		}
828
		Assert.assertTrue("Street1 must be one of the streets in team2's addresses", street1Exists);
829
		Assert.assertTrue("Street3 must be one of the streets in team2's addressesss", street3Exists);
830
		Assert.assertTrue("Argentina must be one of the countries in team2's addresses", country1Exists);
831
		
832
		//Person
833
		Institution institution1 = Institution.NewInstance();
834
		institution1.setTitleCache("inst1", true);
835
		Institution institution2 = Institution.NewInstance();
836
		institution2.setTitleCache("inst2", true);
837
		
838
		TimePeriod period1 = TimePeriod.NewInstance(2002, 2004);
839
		TimePeriod period2 = TimePeriod.NewInstance(2004, 2006);
840
		
841
		person1.addInstitutionalMembership(institution1, period1, "departement1", "role1");
842
		person2.addInstitutionalMembership(institution2, period2, "departement2", "role2");
843

    
844
		IMergeStrategy personMergeStrategy = DefaultMergeStrategy.NewInstance(Person.class);
845
		personMergeStrategy.invoke(person1, person2);
846
		
847
		Assert.assertEquals("Number of institutional memberships must be 2", 2, person1.getInstitutionalMemberships().size());
848
		for (InstitutionalMembership institutionalMembership : person1.getInstitutionalMemberships()){
849
			Assert.assertSame("Person of institutional memebership must be person1", person1, institutionalMembership.getPerson());
850
		}
851
		
852
	}
853
	
854
	private void testMergeExceptions(CdmBase name1, CdmBase name2, CdmBase taxon,CdmBase zooName1) throws MergeException{
855
		//
856
		try {
857
			cdmGenericDao.merge(name1, null, null);
858
			Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
859
		} catch (MergeException e) {
860
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
861
		}
862
		//
863
		try {
864
			cdmGenericDao.merge(null, name1, null);
865
			Assert.fail("Merging of 2 objects one or both of them null must throw an exception");
866
		} catch (NullPointerException e) {
867
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
868
		}
869
		//exceptions to be thrown
870
		try {
871
			cdmGenericDao.merge(name1, taxon, null);
872
			Assert.fail("Merging of 2 objects of different types must throw an exception");
873
		} catch (MergeException e) {
874
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
875
		}
876
		//next exception
877
		try {
878
			cdmGenericDao.merge(name1, zooName1, null);
879
			Assert.fail("Merging of 2 objects of different types must throw an exception");
880
		} catch (MergeException e) {
881
			Assert.assertTrue("Merging of 2 objects of different types must throw an exception", true);
882
		}
883
	}
884
	
885
	@Test
886
	public void findMatching(){
887
		IBook book1 = ReferenceFactory.newBook();
888
		IBook book2 = ReferenceFactory.newBook();
889
		IBook book3 = ReferenceFactory.newBook();
890
		IBook book4 = ReferenceFactory.newBook();
891
		
892
		String title1 = "title1";
893
		String title2 = "title2";
894
		book1.setTitle(title1);
895
		book2.setTitle(title2);
896
		book3.setTitle(title1);
897
		
898
		cdmGenericDao.saveOrUpdate((ReferenceBase)book1);
899
		cdmGenericDao.saveOrUpdate((ReferenceBase)book2);
900
		cdmGenericDao.saveOrUpdate((ReferenceBase)book3);
901
		
902
		IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(ReferenceBase.class);
903
		
904
		try {
905
			List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
906
			Assert.assertNotNull("Resultlist must not be null", matchResult);
907
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
908
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
909
			
910
			book1.setDatePublished(TimePeriod.NewInstance(1999, 2002));
911
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
912
			Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
913
			
914
			book3.setDatePublished(TimePeriod.NewInstance(1999));
915
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
916
			Assert.assertTrue("Resultlist must have no entries", matchResult.isEmpty());
917

    
918
			book3.setDatePublished(TimePeriod.NewInstance(1999,2002));
919
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
920
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
921
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
922
			
923
			//BookSection
924
			IBookSection section1 = ReferenceFactory.newBookSection();
925
			section1.setInBook(book1);
926
			section1.setTitle("SecTitle");
927
			section1.setPages("22-33");
928
			IBookSection section2 = ReferenceFactory.newBookSection();
929
			section2.setInBook(book2);
930
			section2.setTitle("SecTitle");
931
			section2.setPages("22-33");
932
			IBookSection section3 = ReferenceFactory.newBookSection();
933
			section3.setInBook(book1);
934
			section3.setTitle("SecTitle");
935
			section3.setPages("22-33");
936
			cdmGenericDao.saveOrUpdate((ReferenceBase)section1);
937
			cdmGenericDao.saveOrUpdate((ReferenceBase)section2);
938
			cdmGenericDao.saveOrUpdate((ReferenceBase)section3);
939
			
940
			List<IBookSection> sectionResult = cdmGenericDao.findMatching(section3, null);
941
			Assert.assertEquals("Resultlist must have 1 entries", 1, sectionResult.size());
942
			Assert.assertSame("Resultlist entry must be section1", section1, sectionResult.get(0));
943
			section2.setInBook(book2 = (IBook)((ReferenceBase) book1).clone());
944
			cdmGenericDao.saveOrUpdate((ReferenceBase)book2);
945
			cdmGenericDao.saveOrUpdate((ReferenceBase)book1);
946
			
947
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
948
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
949
			sectionResult = cdmGenericDao.findMatching(section3, null);
950
			Assert.assertEquals("Resultlist must have 1 entries", 2, sectionResult.size());
951
			
952
			
953
			Person person1 = Person.NewTitledInstance("person");
954
			Person person2 = Person.NewTitledInstance("person");
955
			Person person3 = Person.NewTitledInstance("person");
956
			
957
			person1.setPrefix("pre1");
958
			person2.setPrefix("pre2");
959
			person3.setPrefix("pre3");
960
			
961
//			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
962
//			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
963
			
964
			book1.setAuthorTeam(person1);
965
			book2.setAuthorTeam(person1);
966
			book3.setAuthorTeam(person1);
967
			
968
			boolean m = matchStrategy.invoke(book1, book3);
969
			boolean m2 = matchStrategy.invoke(book2, book3);
970
			
971
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
972
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
973
			
974
			book2.setAuthorTeam(person2);
975
			book3.setAuthorTeam(person3);
976
			matchResult = cdmGenericDao.findMatching(book3, null);
977
			Assert.assertEquals("Resultlist must have no entries", 0, matchResult.size());
978
			
979
			person3.setPrefix("pre1");
980
			matchResult = cdmGenericDao.findMatching(book3, null);
981
			Assert.assertEquals("Resultlist must have 1 entry", 1, matchResult.size());
982
			Assert.assertSame("Resultlist entry must be book 1", book1, matchResult.get(0));
983

    
984
		} catch (MatchException e) {
985
			Assert.fail("Find match must not throw Exception: " + e.getMessage());
986
			e.printStackTrace();
987
		}
988

    
989
	}
990
	
991
	
992
	@Test
993
	public void findMatchingCache(){
994
		IBook book1 = ReferenceFactory.newBook();
995
		Team team1 = Team.NewInstance();
996
		Team team2 = Team.NewInstance();
997
		team1.setTitleCache("Team1", true);
998
		team2.setTitleCache("Team1", true);
999
		
1000
		book1.setTitle("Title1");
1001
		book1.setEdition("Edition1");
1002
		book1.setAuthorTeam(team1);
1003
		
1004
		
1005
		IBook book2 = (IBook) ((ReferenceBase)book1).clone();
1006
		IBook book3 = (IBook) ((ReferenceBase)book1).clone();
1007
		
1008
//		Assert.assertTrue("Cloned book should match", matchStrategy.invoke(book1, bookClone));
1009
//		book1.setTitleCache("cache1");
1010
//		Assert.assertFalse("Cached book should not match", matchStrategy.invoke(book1, bookClone));
1011
//		
1012
//		bookClone.setTitleCache("cache1");
1013
//		Assert.assertTrue("Cached book with same cache should match", matchStrategy.invoke(book1, bookClone));
1014
//			
1015
//		bookClone.setTitleCache("cache2");
1016
//		Assert.assertFalse("Cached book with differings caches should not match", matchStrategy.invoke(book1, bookClone));
1017
//		bookClone.setTitleCache("cache1"); //restore
1018
//		
1019
//		bookClone.setEdition(null);
1020
//		Assert.assertTrue("Cached book with a defined and a null edition should match", matchStrategy.invoke(book1, bookClone));
1021

    
1022
		cdmGenericDao.saveOrUpdate((ReferenceBase)book1);
1023
		cdmGenericDao.saveOrUpdate((ReferenceBase)book2);
1024
		cdmGenericDao.saveOrUpdate((ReferenceBase)book3);
1025
		cdmGenericDao.saveOrUpdate(team1);
1026
		cdmGenericDao.saveOrUpdate(team2);
1027
		
1028
		
1029
		IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(ReferenceBase.class);
1030
		
1031
		try {
1032
			List<IBook> matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1033
			Assert.assertNotNull("Resultlist must not be null", matchResult);
1034
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1035
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1036
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1037
			
1038
			book1.setTitleCache("cache1", true);
1039
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1040
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1041
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1042
			
1043
			book2.setTitleCache("cache2", false);
1044
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1045
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1046
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1047
			
1048
			book2.setEdition(null);
1049
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1050
			Assert.assertEquals("Resultlist must have 0 entries", 0, matchResult.size());
1051
			
1052
			book3.setTitleCache("cache1", true);
1053
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1054
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1055
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1056
			
1057
			IMatchStrategy teamMatcher = DefaultMatchStrategy.NewInstance(Team.class);
1058
			boolean teamsMatch = teamMatcher.invoke(team1, team2);
1059
			Assert.assertTrue("Team1 and team2 should match" ,teamsMatch);
1060
			
1061
			book3.setAuthorTeam(team2);
1062
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1063
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1064
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1065

    
1066
			book3.setAuthorTeam(null);
1067
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1068
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1069
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1070
			
1071
			book2.setTitleCache(book3.getTitleCache(), true);
1072
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1073
			Assert.assertEquals("Resultlist must have 2 entries", 2, matchResult.size());
1074
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1075
			Assert.assertTrue("Resultlist must contain book 2", matchResult.contains(book2));
1076
			
1077
			team2.setTitleCache("team2", true);
1078
			teamsMatch = teamMatcher.invoke(team1, team2);
1079
			Assert.assertFalse("Team1 and team2 should not match" ,teamsMatch);
1080
			
1081
			book3.setAuthorTeam(team1);
1082
			book2.setAuthorTeam(team2);
1083
			matchResult = cdmGenericDao.findMatching(book3, matchStrategy);
1084
			Assert.assertEquals("Resultlist must have 1 entries", 1, matchResult.size());
1085
			Assert.assertTrue("Resultlist must contain book 1", matchResult.contains(book1));
1086
			
1087
			
1088
		} catch (MatchException e) {
1089
			Assert.fail("Find match must not throw Exception: " + e.getMessage());
1090
			e.printStackTrace();
1091
		}
1092

    
1093
	}
1094
	
1095
	/**
1096
	 * Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#getHqlResult(java.lang.String)}.
1097
	 */
1098
	@Test
1099
	public void testGetHqlResult() {
1100
		logger.warn("Not yet implemented");
1101
	}
1102
}
(4-4/9)