Project

General

Profile

Download (82.8 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2014 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.api.service;
10

    
11
import static org.junit.Assert.assertEquals;
12
import static org.junit.Assert.assertFalse;
13
import static org.junit.Assert.assertNotEquals;
14
import static org.junit.Assert.assertNotNull;
15
import static org.junit.Assert.assertNull;
16
import static org.junit.Assert.assertTrue;
17

    
18
import java.io.FileNotFoundException;
19
import java.util.Collection;
20
import java.util.Collections;
21
import java.util.List;
22
import java.util.Set;
23
import java.util.UUID;
24
import java.util.stream.Collectors;
25

    
26
import org.apache.log4j.Logger;
27
import org.junit.Test;
28
import org.unitils.dbunit.annotation.DataSet;
29
import org.unitils.spring.annotation.SpringBeanByType;
30

    
31
import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
32
import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
33
import eu.etaxonomy.cdm.api.service.dto.SpecimenOrObservationBaseDTO;
34
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
35
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
36
import eu.etaxonomy.cdm.model.agent.Institution;
37
import eu.etaxonomy.cdm.model.agent.Person;
38
import eu.etaxonomy.cdm.model.common.CdmBase;
39
import eu.etaxonomy.cdm.model.common.Identifier;
40
import eu.etaxonomy.cdm.model.common.TimePeriod;
41
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
42
import eu.etaxonomy.cdm.model.description.Feature;
43
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
44
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
45
import eu.etaxonomy.cdm.model.description.TaxonDescription;
46
import eu.etaxonomy.cdm.model.molecular.DnaSample;
47
import eu.etaxonomy.cdm.model.molecular.Sequence;
48
import eu.etaxonomy.cdm.model.name.IBotanicalName;
49
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
50
import eu.etaxonomy.cdm.model.name.TaxonName;
51
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
52
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
53
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
54
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
55
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
56
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
57
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
58
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
59
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
60
import eu.etaxonomy.cdm.model.taxon.Classification;
61
import eu.etaxonomy.cdm.model.taxon.Synonym;
62
import eu.etaxonomy.cdm.model.taxon.SynonymType;
63
import eu.etaxonomy.cdm.model.taxon.Taxon;
64
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
65
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
66
import eu.etaxonomy.cdm.model.term.DefinedTerm;
67
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
68
import eu.etaxonomy.cdm.persistence.query.AssignmentStatus;
69
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
70
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
71

    
72
/**
73
 * @author pplitzner
74
 * @since 31.03.2014
75
 */
76
public class OccurrenceServiceTest extends CdmTransactionalIntegrationTest {
77

    
78
    private static final Logger logger = Logger.getLogger(OccurrenceServiceTest.class);
79

    
80
    @SpringBeanByType
81
    private IOccurrenceService occurrenceService;
82

    
83
    @SpringBeanByType
84
    private ISequenceService sequenceService;
85

    
86
    @SpringBeanByType
87
    private ITaxonService taxonService;
88

    
89
    @SpringBeanByType
90
    private ITaxonNodeService taxonNodeService;
91

    
92
    @SpringBeanByType
93
    private IClassificationService classificationService;
94

    
95
    @SpringBeanByType
96
    private INameService nameService;
97

    
98
    @SpringBeanByType
99
    private ITermService termService;
100

    
101
    @SpringBeanByType
102
    private IDescriptionService descriptionService;
103

    
104
    @Test
105
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
106
    public void testMoveDerivate() {
107
        DerivedUnit specimenA = (DerivedUnit) occurrenceService.load(UUID
108
                .fromString("35cfb0b3-588d-4eee-9db6-ac9caa44e39a"));
109
        DerivedUnit specimenB = (DerivedUnit) occurrenceService.load(UUID
110
                .fromString("09496534-efd0-44c8-b1ce-01a34a8a0229"));
111
        DerivedUnit dnaSample = (DnaSample) occurrenceService.load(UUID
112
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
113

    
114
        occurrenceService.saveOrUpdate(specimenA);
115
        occurrenceService.saveOrUpdate(specimenB);
116
        occurrenceService.saveOrUpdate(dnaSample);
117

    
118
        Person derivationActor = Person.NewTitledInstance("Derivation Actor");
119
        String derivationDescription = "Derivation Description";
120
        Institution derivationInstitution = Institution.NewInstance();
121
        TimePeriod derivationTimePeriod = TimePeriod.NewInstance(2015);
122

    
123
        DerivationEvent originalDerivedFromEvent = DerivationEvent.NewSimpleInstance(specimenA, dnaSample,
124
                DerivationEventType.DNA_EXTRACTION());
125

    
126
        originalDerivedFromEvent.setActor(derivationActor);
127
        originalDerivedFromEvent.setDescription(derivationDescription);
128
        originalDerivedFromEvent.setInstitution(derivationInstitution);
129
        originalDerivedFromEvent.setTimeperiod(derivationTimePeriod);
130

    
131
        occurrenceService.moveDerivate(specimenA, specimenB, dnaSample);
132
        assertTrue("DerivationEvent not removed from source!", specimenA.getDerivationEvents().isEmpty());
133
        assertEquals("DerivationEvent not moved to source!", 1, specimenB.getDerivationEvents().size());
134

    
135
        DerivationEvent derivationEvent = specimenB.getDerivationEvents().iterator().next();
136
        assertEquals("Moved DerivationEvent not of same type!", DerivationEventType.DNA_EXTRACTION(),
137
                derivationEvent.getType());
138
        assertEquals(derivationActor, derivationEvent.getActor());
139
        assertEquals(derivationDescription, derivationEvent.getDescription());
140
        assertEquals(derivationInstitution, derivationEvent.getInstitution());
141
        assertEquals(derivationTimePeriod, derivationEvent.getTimeperiod());
142
        assertEquals(DerivationEventType.DNA_EXTRACTION(), derivationEvent.getType());
143

    
144
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
145
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
146
        assertEquals("Target of moved object not correct", specimenB, newOriginal);
147
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
148

    
149
        DerivedUnit movedDerivate = derivationEvent.getDerivatives().iterator().next();
150
        assertEquals("Moved derivate has wrong type", SpecimenOrObservationType.DnaSample,
151
                movedDerivate.getRecordBasis());
152
        assertNotEquals("DerivationEvent 'derivedFrom' has not been changed after moving", originalDerivedFromEvent,
153
                movedDerivate.getDerivedFrom());
154

    
155
    }
156

    
157
    @Test
158
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDBDataSet.xml")
159
    public void testMoveDerivateNoParent() {
160
        DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
161
        FieldUnit fieldUnit = FieldUnit.NewInstance();
162

    
163
        occurrenceService.saveOrUpdate(fieldUnit);
164
        occurrenceService.saveOrUpdate(derivedUnit);
165

    
166
        assertEquals("DerivationEvent not moved to source!", 0, fieldUnit.getDerivationEvents().size());
167
        occurrenceService.moveDerivate(null, fieldUnit, derivedUnit);
168
        assertEquals("DerivationEvent not moved to source!", 1, fieldUnit.getDerivationEvents().size());
169

    
170
        DerivationEvent derivationEvent = fieldUnit.getDerivationEvents().iterator().next();
171
        assertNull(derivationEvent.getType());
172

    
173
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
174
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
175
        assertEquals("Target of moved object not correct", fieldUnit, newOriginal);
176
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
177
    }
178

    
179
    @Test
180
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
181
    public void testMoveSequence() {
182
        DnaSample dnaSampleA = (DnaSample) occurrenceService.load(UUID
183
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
184
        DnaSample dnaSampleB = (DnaSample) occurrenceService.load(UUID
185
                .fromString("85fccc2f-c796-46b3-b2fc-6c9a4d68cfda"));
186
        String consensusSequence = "ATTCG";
187
        Sequence sequence = sequenceService.load(UUID.fromString("6da4f378-9861-4338-861b-7b8073763e7a"));
188

    
189
        occurrenceService.saveOrUpdate(dnaSampleA);
190
        occurrenceService.saveOrUpdate(dnaSampleB);
191
        sequenceService.saveOrUpdate(sequence);
192

    
193
        dnaSampleA.addSequence(sequence);
194

    
195
        occurrenceService.moveSequence(dnaSampleA, dnaSampleB, sequence);
196
        assertEquals("Number of sequences is wrong", 0, dnaSampleA.getSequences().size());
197
        assertEquals("Number of sequences is wrong", 1, dnaSampleB.getSequences().size());
198
        Sequence next = dnaSampleB.getSequences().iterator().next();
199
        assertEquals("Sequences are not equals", sequence, next);
200
        assertEquals("Sequences are not equals", consensusSequence, next.getSequenceString());
201
    }
202

    
203
    @Test
204
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDeleteIndividualAssociatedAndTypeSpecimen.xml")
205
    public void testDeleteIndividualAssociatedAndTypeSpecimen() {
206
        final UUID taxonDEscriptionUuid = UUID.fromString("a87a893e-2ea8-427d-a26b-dbd2515d6b8a");
207
        final UUID botanicalNameUuid = UUID.fromString("a604774e-d66a-4d47-b9d1-d0e38a8c787a");
208
        final UUID fieldUnitUuid = UUID.fromString("67e81ca8-ff91-4df6-bf48-e4600c7f15a2");
209
        final UUID derivedUnitUuid = UUID.fromString("d229713b-0123-4f15-bffc-76ae45c37564");
210

    
211
        // //how the XML was generated
212
        // FieldUnit fieldUnit = FieldUnit.NewInstance();
213
        // fieldUnit.setUuid(fieldUnitUuid);
214
        // //sub derivates (DerivedUnit, DnaSample)
215
        // DerivedUnit derivedUnit =
216
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
217
        // derivedUnit.setUuid(derivedUnitUuid);
218
        //
219
        // //derivation events
220
        // DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit,
221
        // DerivationEventType.ACCESSIONING());
222
        //
223
        // occurrenceService.save(fieldUnit);
224
        // occurrenceService.save(derivedUnit);
225
        //
226
        // //create name with type specimen
227
        // BotanicalName name =
228
        // BotanicalName.PARSED_NAME("Campanula patual sec L.");
229
        // name.setUuid(BOTANICAL_NAME_UUID);
230
        // SpecimenTypeDesignation typeDesignation =
231
        // SpecimenTypeDesignation.NewInstance();
232
        // typeDesignation.setTypeSpecimen(derivedUnit);
233
        // //add type designation to name
234
        // name.addTypeDesignation(typeDesignation, false);
235
        //
236
        // // create taxon with name and two taxon descriptions (one with
237
        // // IndividualsAssociations and a "described" voucher specimen, and an
238
        // // empty one)
239
        // Taxon taxon = Taxon.NewInstance(name, null);
240
        // taxon.setUuid(taxonUuid);
241
        // TaxonDescription taxonDescription = TaxonDescription.NewInstance();
242
        // taxonDescription.setUuid(TAXON_DESCRIPTION_UUID);
243
        // //add voucher
244
        // taxonDescription.addElement(IndividualsAssociation.NewInstance(fieldUnit));
245
        // taxon.addDescription(taxonDescription);
246
        // //add another taxon description to taxon which is not associated with
247
        // a specimen thus should not be taken into account
248
        // taxon.addDescription(TaxonDescription.NewInstance());
249
        // taxonService.saveOrUpdate(taxon);
250
        //
251
        //
252
        // commitAndStartNewTransaction(null);
253
        //
254
        // setComplete();
255
        // endTransaction();
256
        //
257
        //
258
        // try {
259
        // writeDbUnitDataSetFile(new String[] {
260
        // "SpecimenOrObservationBase",
261
        // "SpecimenOrObservationBase_DerivationEvent",
262
        // "DerivationEvent",
263
        // "Sequence",
264
        // "Sequence_SingleRead",
265
        // "SingleRead",
266
        // "AmplificationResult",
267
        // "DescriptionElementBase",
268
        // "DescriptionBase",
269
        // "TaxonBase",
270
        // "TypeDesignationBase",
271
        // "TaxonName",
272
        // "TaxonName_TypeDesignationBase",
273
        // "HomotypicalGroup"
274
        // }, "testDeleteIndividualAssociatedAndTypeSpecimen");
275
        // } catch (FileNotFoundException e) {
276
        // e.printStackTrace();
277
        // }
278

    
279
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
280
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
281
        IBotanicalName name = nameService.load(botanicalNameUuid);
282
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDEscriptionUuid);
283
        // check initial state (IndividualsAssociation)
284
        DescriptionElementBase descriptionElement = taxonDescription.getElements().iterator().next();
285
        assertTrue("wrong type of description element", descriptionElement.isInstanceOf(IndividualsAssociation.class));
286
        assertEquals("associated specimen is incorrect", associatedFieldUnit,
287
                ((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation());
288
        // check initial state (Type Designation)
289
        @SuppressWarnings("rawtypes")
290
        Set<TypeDesignationBase> typeDesignations = name.getTypeDesignations();
291
        TypeDesignationBase<?> typeDesignation = typeDesignations.iterator().next();
292
        assertTrue("wrong type of type designation", typeDesignation.isInstanceOf(SpecimenTypeDesignation.class));
293
        assertEquals("type specimen is incorrect", typeSpecimen,
294
                ((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen());
295

    
296
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
297
        // delete type specimen from type designation
298
        config.setDeleteFromTypeDesignation(true);
299
        occurrenceService.delete(typeSpecimen, config);
300
        assertTrue(((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen() == null);
301

    
302
        // delete associated field unit from IndividualsAssociation
303
        config.setDeleteFromIndividualsAssociation(true);
304
        occurrenceService.delete(associatedFieldUnit, config);
305
        assertTrue(((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation() == null);
306

    
307
    }
308

    
309
    @Test
310
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceService.loadData.xml")
311
    public void testLoadData() {
312
        String fieldUnitUuid = "5a31df5a-2e4d-40b1-8d4e-5754736ae7ef";
313
        String derivedUnitUuid = "18f70977-5d9c-400a-96c4-0cb7a2cd287e";
314

    
315
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(UUID.fromString(fieldUnitUuid));
316
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(UUID.fromString(derivedUnitUuid));
317

    
318
        assertFalse(fieldUnit.getDerivationEvents().iterator().next().getDerivatives().isEmpty());
319
        assertTrue(derivedUnit.getDerivedFrom() != null);
320
    }
321

    
322
    @Test
323
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testListAssociatedAndTypedTaxa.xml")
324
    public void testListIndividualsAssociatensAndSpecimenTypeDesignations(){
325
        UUID fieldUnitUuid = UUID.fromString("b359ff20-98de-46bf-aa43-3e10bb072cd4");
326
        UUID typeSpecimenUuid = UUID.fromString("0f8608c7-ffe7-40e6-828c-cb3382580878");
327
        UUID taxonDescriptionUuid = UUID.fromString("d77db2d4-45a1-4aa1-ab34-f33395f54965");
328
        UUID taxonUuid = UUID.fromString("b0de794c-8cb7-4369-8f83-870ca37abbe0");
329
        // //how the XML was generated
330
        // FieldUnit associatedFieldUnit = FieldUnit.NewInstance();
331
        // associatedFieldUnit.setUuid(fieldUnitUuid);
332
        // //sub derivates (DerivedUnit, DnaSample)
333
        // DerivedUnit typeSpecimen =
334
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
335
        // typeSpecimen.setUuid(typeSpecimenUuid);
336
        //
337
        // //derivation events
338
        // DerivationEvent.NewSimpleInstance(associatedFieldUnit, typeSpecimen,
339
        // DerivationEventType.ACCESSIONING());
340
        //
341
        // occurrenceService.save(associatedFieldUnit);
342
        // occurrenceService.save(typeSpecimen);
343
        //
344
        // //create name with type specimen
345
        // BotanicalName name =
346
        // BotanicalName.PARSED_NAME("Campanula patual sec L.");
347
        // SpecimenTypeDesignation typeDesignation =
348
        // SpecimenTypeDesignation.NewInstance();
349
        // typeDesignation.setTypeSpecimen(typeSpecimen);
350
        //
351
        // // create taxon with name and two taxon descriptions (one with
352
        // // IndividualsAssociations and a "described" voucher specimen, and an
353
        // // empty one)
354
        // Taxon taxon = Taxon.NewInstance(name, null);
355
        // taxon.setUuid(taxonUuid);
356
        // TaxonDescription taxonDescription = TaxonDescription.NewInstance();
357
        // taxonDescription.setUuid(taxonDescriptionUuid);
358
        // //add voucher
359
        // taxonDescription.addElement(IndividualsAssociation.NewInstance(associatedFieldUnit));
360
        // taxon.addDescription(taxonDescription);
361
        // //add type designation to name
362
        // name.addTypeDesignation(typeDesignation, false);
363
        // //add another taxon description to taxon which is not associated with
364
        // a specimen thus should not be taken into account
365
        // taxon.addDescription(TaxonDescription.NewInstance());
366
        // taxonService.saveOrUpdate(taxon);
367
        //
368
        // commitAndStartNewTransaction(null);
369
        //
370
        // setComplete();
371
        // endTransaction();
372
        //
373
        // try {
374
        // writeDbUnitDataSetFile(new String[]{
375
        // "SpecimenOrObservationBase",
376
        // "SpecimenOrObservationBase_DerivationEvent",
377
        // "DerivationEvent",
378
        // "Sequence",
379
        // "Sequence_SingleRead",
380
        // "SingleRead",
381
        // "AmplificationResult",
382
        // "DescriptionElementBase",
383
        // "DescriptionBase",
384
        // "TaxonBase",
385
        // "TypeDesignationBase",
386
        // "TaxonName",
387
        // "TaxonName_TypeDesignationBase",
388
        // "HomotypicalGroup"}, "testListAssociatedAndTypedTaxa");
389
        // } catch (FileNotFoundException e) {
390
        // e.printStackTrace();
391
        // }
392
        //
393
        // System.out.println("associatedFieldUnit.getUuid() " +
394
        // associatedFieldUnit.getUuid());
395
        // System.out.println("typeSpecimen.getUuid() "+typeSpecimen.getUuid());
396
        // System.out.println("taxonDescription.getUuid() "+taxonDescription.getUuid());
397
        // System.out.println("taxon.getUuid() "+taxon.getUuid());
398

    
399
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
400
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(typeSpecimenUuid);
401
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
402
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
403
        // check for FieldUnit (IndividualsAssociation)
404
        java.util.Collection<IndividualsAssociation> individualsAssociations = occurrenceService
405
                .listIndividualsAssociations(associatedFieldUnit, null, null, null, null);
406
        assertEquals("Number of individuals associations is incorrect", 1, individualsAssociations.size());
407
        IndividualsAssociation individualsAssociation = individualsAssociations.iterator().next();
408
        assertTrue("association has wrong type",
409
                individualsAssociation.getInDescription().isInstanceOf(TaxonDescription.class));
410
        TaxonDescription retrievedTaxonDescription = HibernateProxyHelper.deproxy(
411
                individualsAssociation.getInDescription(), TaxonDescription.class);
412
        assertEquals(taxonDescription, retrievedTaxonDescription);
413
        assertEquals("Associated taxon is incorrect", taxon, retrievedTaxonDescription.getTaxon());
414

    
415
        // check for DerivedUnit (Type Designation should exist)
416
        java.util.Collection<SpecimenTypeDesignation> typeDesignations = occurrenceService.listTypeDesignations(
417
                typeSpecimen, null, null, null, null);
418
        assertEquals("Number of type designations is incorrect", 1, typeDesignations.size());
419
        SpecimenTypeDesignation specimenTypeDesignation = typeDesignations.iterator().next();
420
        Set<TaxonName> typifiedNames = specimenTypeDesignation.getTypifiedNames();
421
        assertEquals("number of typified names is incorrect", 1, typifiedNames.size());
422
        Set<?> taxonBases = typifiedNames.iterator().next().getTaxonBases();
423
        assertEquals("number of taxa incorrect", 1, taxonBases.size());
424
        Object next = taxonBases.iterator().next();
425
        assertTrue(next instanceof CdmBase && ((CdmBase) next).isInstanceOf(Taxon.class));
426
        assertEquals("Typed taxon is incorrect", taxon, next);
427
    }
428

    
429
    @Test
430
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithSpecimenDescription.xml")
431
    public void testIsDeletableWithSpecimenDescription() {
432
        UUID derivedUnitUuid = UUID.fromString("68095c8e-025d-49f0-8bb2-ed36378b75c3");
433
        UUID specimenDescriptionUuid = UUID.fromString("4094f947-ce84-47b1-bad5-e57e33239d3c");
434
        // //how the XML was generated
435
        // DerivedUnit derivedUnit =
436
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
437
        // derivedUnit.setUuid(derivedUnitUuid);
438
        // SpecimenDescription specimenDescription =
439
        // SpecimenDescription.NewInstance();
440
        // specimenDescription.setUuid(specimenDescriptionUuid);
441
        // derivedUnit.addDescription(specimenDescription);
442
        // occurrenceService.save(derivedUnit);
443
        //
444
        // commitAndStartNewTransaction(null);
445
        //
446
        // setComplete();
447
        // endTransaction();
448
        //
449
        // try {
450
        // writeDbUnitDataSetFile(new String[] {
451
        // "SpecimenOrObservationBase",
452
        // "SpecimenOrObservationBase_DerivationEvent",
453
        // "DerivationEvent",
454
        // "Sequence",
455
        // "Sequence_SingleRead",
456
        // "SingleRead",
457
        // "AmplificationResult",
458
        // "DescriptionElementBase",
459
        // "DescriptionBase",
460
        // "TaxonBase",
461
        // "TypeDesignationBase",
462
        // "TaxonName",
463
        // "TaxonName_TypeDesignationBase",
464
        // "HomotypicalGroup"
465
        // }, "testIsDeletableWithSpecimenDescription");
466
        // } catch (FileNotFoundException e) {
467
        // e.printStackTrace();
468
        // }
469

    
470
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
471
        SpecimenDescription specimenDescription = (SpecimenDescription) descriptionService
472
                .load(specimenDescriptionUuid);
473

    
474
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
475
        DeleteResult deleteResult = null;
476
        // delete derivedUnit1
477
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
478
        //deletion of specimen description should always work because there are no
479
        //specimen description without a specimen
480
        assertTrue(deleteResult.toString(), deleteResult.isOk());
481
        occurrenceService.delete(derivedUnit, config);
482
        specimenDescription = (SpecimenDescription) descriptionService.find(specimenDescriptionUuid);
483

    
484
        assertNull(specimenDescription);
485
    }
486

    
487
    @Test
488
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithDescribedSpecimenInTaxonDescription.xml")
489
    public void testIsDeletableWithDescribedSpecimenInTaxonDescription() {
490
        UUID fieldUnitUuid = UUID.fromString("d656a004-38ee-404c-810a-87ffb0ab16c2");
491
        // //how the XML was generated
492
        // FieldUnit fieldUnit = FieldUnit.NewInstance();
493
        // fieldUnit.setUuid(fieldUnitUuid);
494
        // DerivedUnit derivedUnit =
495
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
496
        //
497
        // //derivation events
498
        // DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit,
499
        // DerivationEventType.ACCESSIONING());
500
        //
501
        // occurrenceService.save(fieldUnit);
502
        // occurrenceService.save(derivedUnit);
503
        //
504
        // // create taxon with name and two taxon descriptions
505
        // //(one with a "described" voucher specimen, and an empty one)
506
        // Taxon taxon =
507
        // Taxon.NewInstance(BotanicalName.PARSED_NAME("Campanula patual sec L."),
508
        // null);
509
        // taxonDescription.setUuid(taxonDescriptionUuid);
510
        // //add voucher
511
        // taxonDescription.setDescribedSpecimenOrObservation(derivedUnit);
512
        // taxon.addDescription(taxonDescription);
513
        // //add another taxon description to taxon which is not associated with
514
        // a specimen thus should not be taken into account
515
        // taxon.addDescription(TaxonDescription.NewInstance());
516
        // taxonService.saveOrUpdate(taxon);
517
        //
518
        //
519
        // commitAndStartNewTransaction(null);
520
        //
521
        // setComplete();
522
        // endTransaction();
523
        //
524
        //
525
        // try {
526
        // writeDbUnitDataSetFile(new String[] {
527
        // "SpecimenOrObservationBase",
528
        // "SpecimenOrObservationBase_DerivationEvent",
529
        // "DerivationEvent",
530
        // "Sequence",
531
        // "Sequence_SingleRead",
532
        // "SingleRead",
533
        // "AmplificationResult",
534
        // "DescriptionElementBase",
535
        // "DescriptionBase",
536
        // "TaxonBase",
537
        // "TypeDesignationBase",
538
        // "TaxonName",
539
        // "TaxonName_TypeDesignationBase",
540
        // "HomotypicalGroup"
541
        // }, "testIsDeletableWithDescribedSpecimenInTaxonDescription");
542
        // } catch (FileNotFoundException e) {
543
        // e.printStackTrace();
544
        // }
545

    
546
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
547

    
548
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
549
        DeleteResult deleteResult = null;
550
        // check deletion of field unit -> should fail because of voucher
551
        // specimen (describedSpecimen) in TaxonDescription
552
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
553
        assertFalse(deleteResult.toString(), deleteResult.isOk());
554

    
555
        // allow deletion from TaxonDescription and deletion of child derivates
556
        config.setDeleteFromDescription(true);
557
        config.setDeleteChildren(true);
558
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
559
        assertTrue(deleteResult.toString(), deleteResult.isOk());
560
    }
561

    
562
    @Test
563
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithIndividualsAssociationTaxonDescription.xml")
564
    public void testIsDeletableWithIndividualsAssociationTaxonDescription() {
565
        UUID fieldUnitUuid = UUID.fromString("7978b978-5100-4c7a-82ef-3a23e0f3c723");
566
        UUID taxonDescriptionUuid = UUID.fromString("d4b0d561-6e7e-4fd8-bf3c-925530f949eb");
567
        // //how the XML was generated
568
        // FieldUnit fieldUnit = FieldUnit.NewInstance();
569
        // fieldUnit.setUuid(fieldUnitUuid);
570
        //
571
        // occurrenceService.save(fieldUnit);
572
        //
573
        // // create taxon with name and two taxon descriptions (one with
574
        // // IndividualsAssociations and a "described" voucher specimen, and an
575
        // // empty one)
576
        // Taxon taxon =
577
        // Taxon.NewInstance(BotanicalName.PARSED_NAME("Campanula patual sec L."),
578
        // null);
579
        // TaxonDescription taxonDescription = TaxonDescription.NewInstance();
580
        // taxonDescription.setUuid(taxonDescriptionUuid);
581
        // //add voucher
582
        // taxonDescription.addElement(IndividualsAssociation.NewInstance(fieldUnit));
583
        // taxon.addDescription(taxonDescription);
584
        // //add another taxon description to taxon which is not associated with
585
        // a specimen thus should not be taken into account
586
        // taxon.addDescription(TaxonDescription.NewInstance());
587
        // taxonService.saveOrUpdate(taxon);
588
        //
589
        //
590
        // commitAndStartNewTransaction(null);
591
        //
592
        // setComplete();
593
        // endTransaction();
594
        //
595
        //
596
        // try {
597
        // writeDbUnitDataSetFile(new String[] {
598
        // "SpecimenOrObservationBase",
599
        // "SpecimenOrObservationBase_DerivationEvent",
600
        // "DerivationEvent",
601
        // "Sequence",
602
        // "Sequence_SingleRead",
603
        // "SingleRead",
604
        // "AmplificationResult",
605
        // "DescriptionElementBase",
606
        // "DescriptionBase",
607
        // "TaxonBase",
608
        // "TypeDesignationBase",
609
        // "TaxonName",
610
        // "TaxonName_TypeDesignationBase",
611
        // "HomotypicalGroup"
612
        // }, "testIsDeletableWithIndividualsAssociationTaxonDescription");
613
        // } catch (FileNotFoundException e) {
614
        // e.printStackTrace();
615
        // }
616

    
617
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
618
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
619
        IndividualsAssociation individualsAssociation = (IndividualsAssociation) taxonDescription.getElements()
620
                .iterator().next();
621

    
622
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
623
        DeleteResult deleteResult = null;
624
        // check deletion of field unit -> should fail because of
625
        // IndividualAssociation
626
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
627
        assertFalse(deleteResult.toString(), deleteResult.isOk());
628
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(individualsAssociation));
629

    
630
        // allow deletion of individuals association
631
        config.setDeleteFromIndividualsAssociation(true);
632
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
633
        assertTrue(deleteResult.toString(), deleteResult.isOk());
634

    
635
    }
636

    
637
    @Test
638
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithTypeDesignation.xml")
639
    public void testIsDeletableWithTypeDesignation() {
640
        UUID derivedUnitUuid = UUID.fromString("f7fd1dc1-3c93-42a7-8279-cde5bfe37ea0");
641
        UUID botanicalNameUuid = UUID.fromString("7396430c-c932-4dd3-a45a-40c2808b132e");
642
        // DerivedUnit derivedUnit =
643
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
644
        // derivedUnit.setUuid(derivedUnitUuid);
645
        //
646
        // occurrenceService.save(derivedUnit);
647
        //
648
        // //create name with type specimen
649
        // BotanicalName name =
650
        // BotanicalName.PARSED_NAME("Campanula patual sec L.");
651
        // name.setUuid(botanicalNameUuid);
652
        // SpecimenTypeDesignation typeDesignation =
653
        // SpecimenTypeDesignation.NewInstance();
654
        // typeDesignation.setTypeSpecimen(derivedUnit);
655
        // //add type designation to name
656
        // name.addTypeDesignation(typeDesignation, false);
657
        //
658
        // nameService.saveOrUpdate(name);
659
        //
660
        // commitAndStartNewTransaction(null);
661
        //
662
        // setComplete();
663
        // endTransaction();
664
        //
665
        //
666
        // try {
667
        // writeDbUnitDataSetFile(new String[] {
668
        // "SpecimenOrObservationBase",
669
        // "SpecimenOrObservationBase_DerivationEvent",
670
        // "DerivationEvent",
671
        // "Sequence",
672
        // "Sequence_SingleRead",
673
        // "SingleRead",
674
        // "AmplificationResult",
675
        // "DescriptionElementBase",
676
        // "DescriptionBase",
677
        // "TaxonBase",
678
        // "TypeDesignationBase",
679
        // "TaxonName",
680
        // "TaxonName_TypeDesignationBase",
681
        // "HomotypicalGroup"
682
        // }, "testIsDeletableWithTypeDesignation");
683
        // } catch (FileNotFoundException e) {
684
        // e.printStackTrace();
685
        // }
686

    
687
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
688

    
689
        // create name with type specimen
690
        IBotanicalName name = nameService.load(botanicalNameUuid);
691
        SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation) name.getTypeDesignations().iterator()
692
                .next();
693

    
694
        // add type designation to name
695
        name.addTypeDesignation(typeDesignation, false);
696

    
697
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
698
        DeleteResult deleteResult = null;
699

    
700
        // check deletion of specimen
701
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
702
        assertFalse(deleteResult.toString(), deleteResult.isOk());
703
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(typeDesignation));
704

    
705
        // allow deletion of type designation
706
        config.setDeleteFromTypeDesignation(true);
707

    
708
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
709
        assertTrue(deleteResult.toString(), deleteResult.isOk());
710
    }
711

    
712
    @Test
713
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithChildren.xml")
714
    public void testIsDeletableWithChildren() {
715
        UUID fieldUnitUuid = UUID.fromString("92ada058-4c14-4131-8ecd-b82dc1dd2882");
716
        UUID derivedUnitUuid = UUID.fromString("896dffdc-6809-4914-8950-5501fee1c0fd");
717
        UUID dnaSampleUuid = UUID.fromString("7efd1d66-ac7f-4202-acdf-a72cbb9c3a21");
718
        // if this test fails be sure to check if there are left-over elements
719
        // in the DB
720
        // e.g. clear by adding "<AMPLIFICATIONRESULT/>" to the data set XML
721

    
722
        // //how the XML was generated
723
        // FieldUnit fieldUnit = FieldUnit.NewInstance();
724
        // fieldUnit.setUuid(fieldUnitUuid);
725
        // //sub derivates (DerivedUnit, DnaSample)
726
        // DerivedUnit derivedUnit =
727
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
728
        // derivedUnit.setUuid(derivedUnitUuid);
729
        // DnaSample dnaSample = DnaSample.NewInstance();
730
        // dnaSample.setUuid(dnaSampleUuid);
731
        //
732
        // //derivation events
733
        // DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit,
734
        // DerivationEventType.ACCESSIONING());
735
        // DerivationEvent.NewSimpleInstance(derivedUnit, dnaSample,
736
        // DerivationEventType.DNA_EXTRACTION());
737
        //
738
        // occurrenceService.save(fieldUnit);
739
        // occurrenceService.save(derivedUnit);
740
        // occurrenceService.save(dnaSample);
741
        //
742
        // commitAndStartNewTransaction(null);
743
        //
744
        // setComplete();
745
        // endTransaction();
746
        //
747
        // try {
748
        // writeDbUnitDataSetFile(new String[] {
749
        // "SpecimenOrObservationBase",
750
        // "SpecimenOrObservationBase_DerivationEvent",
751
        // "DerivationEvent",
752
        // "Sequence",
753
        // "SingleRead",
754
        // "SingleReadAlignment",
755
        // "Amplification",
756
        // "AmplificationResult",
757
        // "DescriptionElementBase",
758
        // "DescriptionBase",
759
        // "TaxonBase",
760
        // "TypeDesignationBase",
761
        // "TaxonName",
762
        // "TaxonName_TypeDesignationBase",
763
        // "HomotypicalGroup"
764
        // }, "testIsDeletableWithChildren");
765
        // } catch (FileNotFoundException e) {
766
        // e.printStackTrace();
767
        // }
768
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
769
        // sub derivates (DerivedUnit, DnaSample)
770
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
771
        DnaSample dnaSample = (DnaSample) occurrenceService.load(dnaSampleUuid);
772

    
773
        // derivation events
774
        DerivationEvent fieldUnitToDerivedUnitEvent = fieldUnit.getDerivationEvents().iterator().next();
775
        DerivationEvent derivedUnitToDnaSampleEvent = derivedUnit.getDerivationEvents().iterator().next();
776

    
777
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
778

    
779
        DeleteResult deleteResult = null;
780
        // check deletion of DnaSample
781
        deleteResult = occurrenceService.isDeletable(dnaSample.getUuid(), config);
782
        assertTrue(deleteResult.toString(), deleteResult.isOk());
783

    
784
        // check deletion of Specimen
785
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
786
        assertFalse(deleteResult.toString(), deleteResult.isOk());
787
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(derivedUnitToDnaSampleEvent));
788

    
789
        // check deletion of fieldUnit
790
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
791
        assertFalse(deleteResult.toString(), deleteResult.isOk());
792
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(fieldUnitToDerivedUnitEvent));
793

    
794
        // check deletion of Specimen
795
        config.setDeleteChildren(true);
796
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
797
        assertTrue(deleteResult.toString(), deleteResult.isOk());
798
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(derivedUnitToDnaSampleEvent));
799

    
800
        // check deletion of fieldUnit
801
        config.setDeleteFromDescription(true);
802
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
803
        assertTrue(deleteResult.toString(), deleteResult.isOk());
804

    
805
    }
806

    
807
    @Test
808
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="OccurrenceServiceTest.testListAssociatedTaxaAndListByAssociatedTaxon.xml")
809
    public void testListAssociatedTaxaAndListByAssociatedTaxon(){
810
        UUID associatedSpecimenUuid = UUID.fromString("6478a387-bc77-4f1b-bfab-671ad786a27e");
811
        UUID unassociatedSpecimenUuid = UUID.fromString("820e1af6-9bff-4244-97d3-81fd9a49c91c");
812
        UUID typeSpecimenUuid = UUID.fromString("b6f31b9f-f9e2-4bc7-883e-35bd6a9978b4");
813
        UUID taxonUuid = UUID.fromString("5613698d-840b-4034-b9b1-1302938e183b");
814
//      DerivedUnit typeSpecimen = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
815
//      DerivedUnit associatedSpecimen = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
816
//      DerivedUnit unassociatedSpecimen = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
817
//      typeSpecimen.setUuid(typeSpecimenUuid);
818
//      associatedSpecimen.setUuid(associatedSpecimenUuid);
819
//      unassociatedSpecimen.setUuid(unassociatedSpecimenUuid);
820
//
821
//      occurrenceService.save(typeSpecimen);
822
//      occurrenceService.save(associatedSpecimen);
823
//      occurrenceService.save(unassociatedSpecimen);
824
//
825
//      BotanicalName name = BotanicalName.PARSED_NAME("Campanula patula");
826
//      SpecimenTypeDesignation typeDesignation = SpecimenTypeDesignation.NewInstance();
827
//      typeDesignation.setTypeSpecimen(typeSpecimen);
828
//      name.addTypeDesignation(typeDesignation, false);
829
//
830
//      Taxon taxon = Taxon.NewInstance(name, null);
831
//      taxon.setUuid(taxonUuid);
832
//      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
833
////      taxonDescription.setUuid(taxonDescriptionUuid);
834
//
835
//      taxonDescription.addElement(IndividualsAssociation.NewInstance(associatedSpecimen));
836
//      taxon.addDescription(taxonDescription);
837
//
838
//      taxonService.saveOrUpdate(taxon);
839
//
840
//      commitAndStartNewTransaction(null);
841
//
842
//      setComplete();
843
//      endTransaction();
844
//
845
//      try {
846
//          writeDbUnitDataSetFile(new String[]{
847
//                                 "SpecimenOrObservationBase",
848
//                  "SpecimenOrObservationBase_DerivationEvent",
849
//                  "DerivationEvent",
850
//                  "Sequence",
851
//                  "Sequence_SingleRead",
852
//                  "SingleRead",
853
//                  "AmplificationResult",
854
//                  "DescriptionElementBase",
855
//                  "DescriptionBase",
856
//                  "TaxonBase",
857
//                  "TypeDesignationBase",
858
//                  "TaxonName",
859
//                  "TaxonName_TypeDesignationBase",
860
//                  "TeamOrPersonBase",
861
//                  "HomotypicalGroup"}, "testListAssociatedTaxaAndListByAssociatedTaxon");
862
//      } catch (FileNotFoundException e) {
863
//          e.printStackTrace();
864
//      }
865
        //check initial state
866
        SpecimenOrObservationBase<?> typeSpecimen = occurrenceService.load(typeSpecimenUuid);
867
        SpecimenOrObservationBase<?> associatedSpecimen = occurrenceService.load(associatedSpecimenUuid);
868
        SpecimenOrObservationBase<?> unassociatedSpecimen = occurrenceService.load(unassociatedSpecimenUuid);
869
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
870

    
871
        assertNotNull(typeSpecimen);
872
        assertNotNull(associatedSpecimen);
873
        assertNotNull(unassociatedSpecimen);
874
        assertNotNull(taxon);
875

    
876
        //check association (IndividualsAssociations + TypeDesignations) specimen -> taxon (name)
877

    
878
        //unassociated specimen
879
        java.util.Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(unassociatedSpecimen, null, null, null, null);
880
        assertNotNull(associatedTaxa);
881
        assertTrue(associatedTaxa.isEmpty());
882

    
883
        //type specimen
884
        associatedTaxa = occurrenceService.listAssociatedTaxa(typeSpecimen, null, null, null, null);
885
        assertNotNull(associatedTaxa);
886
        assertEquals(1, associatedTaxa.size());
887
        assertEquals(taxon, associatedTaxa.iterator().next());
888

    
889
        //associated specimen
890
        associatedTaxa = occurrenceService.listAssociatedTaxa(associatedSpecimen, null, null, null, null);
891
        assertNotNull(associatedTaxa);
892
        assertEquals(1, associatedTaxa.size());
893
        assertEquals(taxon, associatedTaxa.iterator().next());
894

    
895
        //check association (IndividualsAssociations + TypeDesignations) taxon (name) -> specimen
896
        List<DerivedUnit> byAssociatedTaxon = occurrenceService.listByAssociatedTaxon(DerivedUnit.class, null, taxon, null, null, null, null, null);
897
        assertNotNull(byAssociatedTaxon);
898
        assertEquals(2, byAssociatedTaxon.size());
899
        assertTrue(byAssociatedTaxon.contains(associatedSpecimen));
900
        assertTrue(byAssociatedTaxon.contains(typeSpecimen));
901
        assertTrue(!byAssociatedTaxon.contains(unassociatedSpecimen));
902

    
903
    }
904

    
905
    /**
906
     * Structure is as follows:
907
     *
908
     *  FieldUnit(FU,4999):"filedUnit1"
909
     *    |
910
     *    +---> DerivedUnit(FS,5000):"testUnit1"
911
     *        |
912
     *        + ---> DerivedUnit(DS,5001):"dna"
913
     *            |
914
     *            + ---> DnaSample(DS,5004):"dnaSample"
915
     *
916
     */
917
    @Test
918
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testFindOcurrences.xml")
919
    public void testFindOccurrences() {
920
        UUID derivedUnit1Uuid = UUID.fromString("843bc8c9-c0fe-4735-bf40-82f1996dcefb");
921
        UUID derivedUnit2Uuid = UUID.fromString("40cd9cb1-7c74-4e7d-a1f8-8a1e0314e940");
922
        UUID dnaSampleUuid = UUID.fromString("364969a6-2457-4e2e-ae1e-29a6fcaa741a");
923
        UUID dnaSampleWithSequenceUuid = UUID.fromString("571d4e9a-0736-4da3-ad4a-a2df427a1f01");
924
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
925

    
926
        UUID taxonUuid = UUID.fromString("dfca7629-8a60-4d51-998d-371897f725e9");
927

    
928
        // DerivedUnit derivedUnit =
929
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
930
        // derivedUnit.setTitleCache("testUnit1");
931
        // derivedUnit.setAccessionNumber("ACC1");
932
        // DerivedUnit derivedUnit2 =
933
        // DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
934
        // derivedUnit2.setTitleCache("testUnit2");
935
        // derivedUnit2.setBarcode("ACC2");
936
        // DerivedUnit dnaSample =
937
        // DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
938
        // dnaSample.setTitleCache("dna");
939
        // dnaSample.setCatalogNumber("ACC1");
940
        // DerivedUnit tissue =
941
        // DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
942
        // tissue.setTitleCache("tissue");
943
        //
944
        // DerivationEvent.NewSimpleInstance(derivedUnit, dnaSample,
945
        // DerivationEventType.DNA_EXTRACTION());
946
        //
947
        // derivedUnit.setUuid(derivedUnit1Uuid);
948
        // derivedUnit2.setUuid(derivedUnit2Uuid);
949
        // dnaSample.setUuid(dnaSampleUuid);
950
        // tissue.setUuid(tissueUuid);
951
        //
952
        // occurrenceService.save(derivedUnit);
953
        // occurrenceService.save(derivedUnit2);
954
        // occurrenceService.save(dnaSample);
955
        // occurrenceService.save(tissue);
956
        //
957
        // Taxon taxon =
958
        // Taxon.NewInstance(BotanicalName.PARSED_NAME("Campanula patual"),
959
        // null);
960
        // taxon.setUuid(taxonUuid);
961
        // TaxonDescription taxonDescription = TaxonDescription.NewInstance();
962
        // taxonDescription.setUuid(UUID.fromString("272d4d28-662c-468e-94d8-16993fab91ba"));
963
        // //add voucher
964
        // taxonDescription.addElement(IndividualsAssociation.NewInstance(derivedUnit));
965
        // taxonDescription.addElement(IndividualsAssociation.NewInstance(tissue));
966
        // taxon.addDescription(taxonDescription);
967
        // taxonService.saveOrUpdate(taxon);
968
        //
969
        // commitAndStartNewTransaction(null);
970
        //
971
        // setComplete();
972
        // endTransaction();
973
        //
974
        //
975
        // try {
976
        // writeDbUnitDataSetFile(new String[] {
977
        // "SpecimenOrObservationBase",
978
        // "SpecimenOrObservationBase_DerivationEvent",
979
        // "DerivationEvent",
980
        // "DescriptionElementBase",
981
        // "DescriptionBase",
982
        // "TaxonBase",
983
        // "TypeDesignationBase",
984
        // "TaxonName",
985
        // "TaxonName_TypeDesignationBase",
986
        // "HomotypicalGroup",
987
        // "TeamOrPersonBase"
988
        // }, "testFindOcurrences");
989
        // } catch (FileNotFoundException e) {
990
        // e.printStackTrace();
991
        // }
992

    
993
        SpecimenOrObservationBase<?> derivedUnit1 = occurrenceService.load(derivedUnit1Uuid);
994
        SpecimenOrObservationBase<?> derivedUnit2 = occurrenceService.load(derivedUnit2Uuid);
995
        SpecimenOrObservationBase<?> tissue = occurrenceService.load(tissueUuid);
996
        SpecimenOrObservationBase<?> dnaSample = occurrenceService.load(dnaSampleUuid);
997
        DerivedUnit dnaSampleWithSequence = (DerivedUnit) occurrenceService.load(dnaSampleWithSequenceUuid);
998
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
999

    
1000

    
1001
        assertNotNull(derivedUnit1);
1002
        assertNotNull(derivedUnit2);
1003
        assertNotNull(tissue);
1004
        assertNotNull(dnaSample);
1005
        assertNotNull(taxon);
1006

    
1007
        // wildcard search => all derivates
1008
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1009
        config.setTitleSearchString("*");
1010
        assertEquals(6, occurrenceService.countOccurrences(config));
1011
        @SuppressWarnings("rawtypes")
1012
        List<SpecimenOrObservationBase> allDerivates = occurrenceService.findByTitle(config).getRecords();
1013
        assertEquals(6, allDerivates.size());
1014
        assertTrue(allDerivates.contains(derivedUnit1));
1015
        assertTrue(allDerivates.contains(derivedUnit2));
1016
        assertTrue(allDerivates.contains(tissue));
1017
        assertTrue(allDerivates.contains(dnaSample));
1018

    
1019
        // queryString search => 2 derivates
1020
        config = new FindOccurrencesConfigurator();
1021
        config.setTitleSearchString("test*");
1022
        // config.setClazz(SpecimenOrObservationBase.class);
1023
        assertEquals(3, occurrenceService.countOccurrences(config));
1024
        @SuppressWarnings("rawtypes")
1025
        List<SpecimenOrObservationBase> queryStringDerivates = occurrenceService.findByTitle(config).getRecords();
1026
        assertEquals(3, queryStringDerivates.size());
1027
        assertTrue(queryStringDerivates.contains(derivedUnit1));
1028
        assertTrue(queryStringDerivates.contains(derivedUnit2));
1029

    
1030
        // class search => 4 results
1031
        config = new FindOccurrencesConfigurator();
1032
        config.setClazz(SpecimenOrObservationBase.class);
1033
        assertEquals(6, occurrenceService.countOccurrences(config));
1034
        @SuppressWarnings("rawtypes")
1035
        List<SpecimenOrObservationBase> specimenOrObservationBases = occurrenceService.findByTitle(config).getRecords();
1036
        assertEquals(6, specimenOrObservationBases.size());
1037

    
1038
        // class search => 0 results
1039
        config = new FindOccurrencesConfigurator();
1040
        config.setClazz(FieldUnit.class);
1041
        assertEquals(1, occurrenceService.countOccurrences(config));
1042
        @SuppressWarnings("rawtypes")
1043
        List<SpecimenOrObservationBase> fieldUnits = occurrenceService.findByTitle(config).getRecords();
1044
        assertEquals(1, fieldUnits.size());
1045

    
1046
        // class search => 4 results
1047
        config = new FindOccurrencesConfigurator();
1048
        config.setClazz(DerivedUnit.class);
1049
        assertEquals(5, occurrenceService.countOccurrences(config));
1050
        @SuppressWarnings("rawtypes")
1051
        List<SpecimenOrObservationBase> derivedUnits = occurrenceService.findByTitle(config).getRecords();
1052
        assertEquals(5, derivedUnits.size());
1053
        assertTrue(derivedUnits.contains(derivedUnit1));
1054
        assertTrue(derivedUnits.contains(derivedUnit2));
1055
        assertTrue(derivedUnits.contains(tissue));
1056
        assertTrue(derivedUnits.contains(dnaSample));
1057

    
1058
        // significant identifier search
1059
        config = new FindOccurrencesConfigurator();
1060
        config.setClazz(DerivedUnit.class);
1061
        config.setSignificantIdentifier("ACC1");
1062
        assertEquals(2, occurrenceService.countOccurrences(config));
1063
        @SuppressWarnings("rawtypes")
1064
        List<SpecimenOrObservationBase> accessionedUnits = occurrenceService.findByTitle(config).getRecords();
1065
        assertEquals(2, accessionedUnits.size());
1066
        assertTrue(accessionedUnits.contains(derivedUnit1));
1067
        assertFalse(accessionedUnits.contains(derivedUnit2));
1068
        assertFalse(accessionedUnits.contains(tissue));
1069
        assertTrue(accessionedUnits.contains(dnaSample));
1070

    
1071
        config = new FindOccurrencesConfigurator();
1072
        config.setClazz(DerivedUnit.class);
1073
        config.setSignificantIdentifier("ACC2");
1074
        assertEquals(1, occurrenceService.countOccurrences(config));
1075
        @SuppressWarnings("rawtypes")
1076
        List<SpecimenOrObservationBase> barcodedUnits = occurrenceService.findByTitle(config).getRecords();
1077
        assertEquals(1, barcodedUnits.size());
1078
        assertFalse(barcodedUnits.contains(derivedUnit1));
1079
        assertTrue(barcodedUnits.contains(derivedUnit2));
1080
        assertFalse(barcodedUnits.contains(tissue));
1081
        assertFalse(barcodedUnits.contains(dnaSample));
1082

    
1083
        // recordBasis search => 1 Fossil
1084
        config = new FindOccurrencesConfigurator();
1085
        config.setSpecimenType(SpecimenOrObservationType.Fossil);
1086
        assertEquals(1, occurrenceService.countOccurrences(config));
1087
        @SuppressWarnings("rawtypes")
1088
        List<SpecimenOrObservationBase> fossils = occurrenceService.findByTitle(config).getRecords();
1089
        assertEquals(1, fossils.size());
1090
        assertTrue(fossils.contains(derivedUnit1));
1091

    
1092
        // taxon determination search => 2 associated specimens
1093
        config = new FindOccurrencesConfigurator();
1094
        config.setClazz(DerivedUnit.class);
1095
        config.setAssociatedTaxonUuid(taxon.getUuid());
1096
        assertEquals(2, occurrenceService.countOccurrences(config));
1097
        @SuppressWarnings("rawtypes")
1098
        List<SpecimenOrObservationBase> associatedSpecimens = occurrenceService.findByTitle(config).getRecords();
1099
        assertEquals(2, associatedSpecimens.size());
1100
        assertTrue(associatedSpecimens.contains(derivedUnit1));
1101
        assertTrue(associatedSpecimens.contains(tissue));
1102

    
1103
        // taxon determination search (indirectly associated) => 3 associated
1104
        // specimens
1105
        config = new FindOccurrencesConfigurator();
1106
        config.setClazz(DerivedUnit.class);
1107
        config.setAssociatedTaxonUuid(taxon.getUuid());
1108
        config.setRetrieveIndirectlyAssociatedSpecimens(true);
1109
        assertEquals(5, occurrenceService.countOccurrences(config));
1110
        @SuppressWarnings("rawtypes")
1111
        List<SpecimenOrObservationBase> indirectlyAssociatedSpecimens = occurrenceService.findByTitle(config)
1112
                .getRecords();
1113
        assertEquals(5, indirectlyAssociatedSpecimens.size());
1114
        assertTrue(indirectlyAssociatedSpecimens.contains(derivedUnit1));
1115
        assertTrue(indirectlyAssociatedSpecimens.contains(dnaSample));
1116
        assertTrue(indirectlyAssociatedSpecimens.contains(tissue));
1117

    
1118
        // taxon association search
1119
        config = new FindOccurrencesConfigurator();
1120
        config.setClazz(SpecimenOrObservationBase.class);
1121
        config.setAssociatedTaxonUuid(taxon.getUuid());
1122
        assertEquals(2, occurrenceService.countOccurrences(config));
1123
        @SuppressWarnings("rawtypes")
1124
        List<SpecimenOrObservationBase> specimensOrObservations = occurrenceService.findByTitle(config).getRecords();
1125
        assertEquals(2, specimensOrObservations.size());
1126
        assertTrue(specimensOrObservations.contains(tissue));
1127
        assertTrue(specimensOrObservations.contains(derivedUnit1));
1128

    
1129
        //test assignment status
1130
        //all specimen
1131
        config = new FindOccurrencesConfigurator();
1132
        config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
1133
        assertEquals(6, occurrenceService.countOccurrences(config));
1134
        @SuppressWarnings("rawtypes")
1135
        List<SpecimenOrObservationBase> allSpecimens = occurrenceService.findByTitle(config).getRecords();
1136
        assertEquals(6, allSpecimens.size());
1137
        assertTrue(allSpecimens.contains(derivedUnit1));
1138
        assertTrue(allSpecimens.contains(derivedUnit2));
1139
        assertTrue(allSpecimens.contains(tissue));
1140
        assertTrue(allSpecimens.contains(dnaSample));
1141

    
1142
        //assigned specimen
1143
        config = new FindOccurrencesConfigurator();
1144
        config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
1145
        assertEquals(2, occurrenceService.countOccurrences(config));
1146
        @SuppressWarnings("rawtypes")
1147
        List<SpecimenOrObservationBase> assignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1148
        assertEquals(2, assignedSpecimens.size());
1149
        assertTrue(assignedSpecimens.contains(derivedUnit1));
1150
        assertTrue(assignedSpecimens.contains(tissue));
1151

    
1152
        //unassigned specimen
1153
        config = new FindOccurrencesConfigurator();
1154
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1155
        assertEquals(4, occurrenceService.countOccurrences(config));
1156
        @SuppressWarnings("rawtypes")
1157
        List<SpecimenOrObservationBase> unAssignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1158
        assertEquals(4, unAssignedSpecimens.size());
1159
        assertTrue(unAssignedSpecimens.contains(derivedUnit2));
1160
        assertTrue(unAssignedSpecimens.contains(dnaSample));
1161

    
1162
        //ignore assignment status because taxon uuid is set
1163
        config = new FindOccurrencesConfigurator();
1164
        config.setAssociatedTaxonUuid(taxon.getUuid());
1165
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1166
        assertEquals(2, occurrenceService.countOccurrences(config));
1167
        @SuppressWarnings("rawtypes")
1168
        List<SpecimenOrObservationBase> ignoreAssignmentStatusSpecimens = occurrenceService.findByTitle(config).getRecords();
1169
        assertEquals(2, ignoreAssignmentStatusSpecimens.size());
1170
        assertTrue(ignoreAssignmentStatusSpecimens.contains(derivedUnit1));
1171
        assertTrue(ignoreAssignmentStatusSpecimens.contains(tissue));
1172

    
1173
        SpecimenOrObservationBaseDTO findByAccessionNumber = occurrenceService.findByGeneticAccessionNumber("ACC_DNA",  null);
1174

    
1175
        assertNotNull(findByAccessionNumber);
1176
        // logger.setLevel(Level.TRACE);
1177
        logger.trace("root unit: " + findByAccessionNumber.getLabel());
1178
        logger.trace("derivatives:\n\t" + findByAccessionNumber.getDerivatives().stream().map(du -> du.toString() + ":" + du.getLabel()).collect(Collectors.joining("\n\t")));
1179
        assertEquals(1, findByAccessionNumber.getDerivatives().size());
1180
       // assertTrue(findByAccessionNumber.contains(derivedUnit1));
1181
       // assertTrue(findByAccessionNumber.get(0).get.equals(dnaSampleWithSequence));
1182
    }
1183

    
1184

    
1185
    @Test
1186
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1187
    public void testListUuidAndTitleCacheByAssociatedTaxon() {
1188
        UUID taxonNodeUuid = UUID.fromString("6b8b6ff9-66e4-4496-8e5a-7d03bdf9a076");
1189
        /**
1190
         * Structure is as follows:
1191
         *
1192
         * Taxon ----IndividualsAssociation---> DnaSample
1193
         * Taxon ----TypeDesignation---> Fossil
1194
         * Taxon ----Determination ---> PreservedSpecimenA
1195
         *
1196
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1197
         *
1198
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1199
         *
1200
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1201
         */
1202

    
1203
        //UUIDS
1204
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1205
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1206
        UUID derivedUnitDeterminationSynonymNameUuid = UUID.fromString("d940a940-8caf-4a52-b1d8-ba4aad7ddae2");
1207
        UUID derivedUnitDeterminationOrphanNameUuid = UUID.fromString("587b7297-7d59-4f59-8ef3-c7a559cadeca");
1208
        UUID tissueUuidNoAssociationUuid = UUID.fromString("93e94260-5107-4b2c-9ce4-da9e1a4e7cb9");
1209
        UUID dnaSampleUuidIndividualsAssociationUuid = UUID.fromString("1fb53903-c9b9-4078-8297-5b86aec7fe21");
1210
        UUID fossilTypeDesignationUuid = UUID.fromString("42ec8dcf-a923-4256-bbd5-b0d10f4de5e2");
1211
        UUID taxonUuid = UUID.fromString("07cc47a5-1a63-46a1-8366-0d59d2b90d5b");
1212

    
1213
        /*
1214
         * search for taxon node
1215
         * should retrieve all specimens associated via
1216
         *  - type designations (fossil)
1217
         *  - individuals associations (dnaSample)
1218
         *  - determinations on
1219
         *   - taxon (specimenA)
1220
         *   - taxon name (specimenA, specimenB)
1221
         */
1222
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1223
        config.setAssociatedTaxonUuid(taxonUuid);
1224
        Collection<SpecimenNodeWrapper> specimens = occurrenceService
1225
                .listUuidAndTitleCacheByAssociatedTaxon(Collections.singletonList(taxonNodeUuid), null, null);
1226
        List<UUID> uuidList = specimens.stream().map(specimen ->
1227
        specimen.getUuidAndTitleCache().getUuid()).collect(Collectors.toList());
1228
        assertTrue(uuidList.contains(derivedUnitDeterminationNameUuid));
1229
        assertTrue(uuidList.contains(derivedUnitDeterminationTaxonUuid));
1230
        assertFalse(uuidList.contains(derivedUnitDeterminationSynonymNameUuid));
1231
        assertTrue(uuidList.contains(dnaSampleUuidIndividualsAssociationUuid));
1232
        assertTrue(uuidList.contains(fossilTypeDesignationUuid));
1233
        assertFalse(uuidList.contains(tissueUuidNoAssociationUuid));
1234
        assertFalse(uuidList.contains(derivedUnitDeterminationOrphanNameUuid));
1235
        assertEquals("Wrong number of associated specimens", 4, specimens.size());
1236
    }
1237

    
1238
    /**
1239
     * This will test the retrieval of specimens that are in any way associated
1240
     * with a taxon resp. taxon name via type designation, determination event
1241
     * or individuals associations. It will also consider synonym relationships.
1242
     */
1243
    @Test
1244
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1245
    public void testAllKindsOfSpecimenAssociations() {
1246

    
1247
        /**
1248
         * Structure is as follows:
1249
         *
1250
         * Taxon ----IndividualsAssociation---> DnaSample
1251
         * Taxon ----TypeDesignation---> Fossil
1252
         * Taxon ----Determination ---> PreservedSpecimenA
1253
         *
1254
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1255
         *
1256
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1257
         *
1258
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1259
         */
1260

    
1261
        //UUIDS
1262
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1263
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1264

    
1265
        UUID derivedUnitDeterminationSynonymUuid = UUID.fromString("8eb94a7d-c802-49a7-bc10-c26de20a52c2");
1266
        UUID derivedUnitDeterminationSynonymNameUuid = UUID.fromString("d940a940-8caf-4a52-b1d8-ba4aad7ddae2");
1267

    
1268
        UUID derivedUnitDeterminationOrphanNameUuid = UUID.fromString("587b7297-7d59-4f59-8ef3-c7a559cadeca");
1269

    
1270
        UUID tissueUuidNoAssociationUuid = UUID.fromString("93e94260-5107-4b2c-9ce4-da9e1a4e7cb9");
1271
        UUID dnaSampleUuidIndividualsAssociationUuid = UUID.fromString("1fb53903-c9b9-4078-8297-5b86aec7fe21");
1272
        UUID fossilTypeDesignationUuid = UUID.fromString("42ec8dcf-a923-4256-bbd5-b0d10f4de5e2");
1273

    
1274
        UUID taxonUuid = UUID.fromString("07cc47a5-1a63-46a1-8366-0d59d2b90d5b");
1275
        UUID synoymUuid = UUID.fromString("c16bcd9b-7d18-4fb5-af60-f9ef14c1d3a9");
1276

    
1277
        UUID taxonNameUuid = UUID.fromString("e59b95c0-9ad6-48be-af62-a982ba72b917");
1278
        UUID synonymNameUuid = UUID.fromString("39f04b2a-b8bd-46e8-9102-ab665c64ec8e");
1279
        UUID orphanNameUuid = UUID.fromString("d8e56365-3ad9-4b0e-88bf-acaaab223a9b");
1280

    
1281
        //load cdm entities
1282
        DerivedUnit derivedUnitDeterminationTaxon = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationTaxonUuid);
1283
        DerivedUnit derivedUnitDeterminationName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationNameUuid);
1284
        DerivedUnit derivedUnitDeterminationSynonym = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymUuid);
1285
        DerivedUnit derivedUnitDeterminationSynonymName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymNameUuid);
1286
        DerivedUnit derivedUnitDeterminationOrphanName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationOrphanNameUuid);
1287
        DerivedUnit tissueUuidNoAssociation = (DerivedUnit) occurrenceService.load(tissueUuidNoAssociationUuid);
1288
        DnaSample dnaSampleUuidIndividualsAssociation = (DnaSample) occurrenceService.load(dnaSampleUuidIndividualsAssociationUuid);
1289
        DerivedUnit fossilTypeDesignation = (DerivedUnit) occurrenceService.load(fossilTypeDesignationUuid);
1290
        Taxon taxon = HibernateProxyHelper.deproxy(taxonService.load(taxonUuid), Taxon.class);
1291
        Synonym synonym = (Synonym) taxonService.load(synoymUuid);
1292
        TaxonName taxonName = nameService.load(taxonNameUuid);
1293
        TaxonName synonymName = nameService.load(synonymNameUuid);
1294
        TaxonName orphanName = nameService.load(orphanNameUuid);
1295

    
1296
        //check initial state
1297
        assertNotNull(derivedUnitDeterminationTaxon);
1298
        assertNotNull(derivedUnitDeterminationName);
1299
        assertNotNull(derivedUnitDeterminationSynonym);
1300
        assertNotNull(derivedUnitDeterminationSynonymName);
1301
        assertNotNull(derivedUnitDeterminationOrphanName);
1302
        assertNotNull(tissueUuidNoAssociation);
1303
        assertNotNull(dnaSampleUuidIndividualsAssociation);
1304
        assertNotNull(fossilTypeDesignation);
1305
        assertNotNull(taxon);
1306
        assertNotNull(synonym);
1307
        assertNotNull(taxonName);
1308
        assertNotNull(synonymName);
1309
        assertNotNull(orphanName);
1310

    
1311
        /*
1312
         * search for taxon
1313
         * should retrieve all specimens associated via
1314
         *  - type designations (fossil)
1315
         *  - individuals associations (dnaSample)
1316
         *  - determinations on
1317
         *   - taxon (specimenA)
1318
         *   - taxon name (specimenA, specimenB)
1319
         *   - synonym names (specimenC)
1320
         */
1321
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1322
        config.setAssociatedTaxonUuid(taxonUuid);
1323
        @SuppressWarnings("rawtypes")
1324
        List<SpecimenOrObservationBase> specimens = occurrenceService.findByTitle(config).getRecords();
1325
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1326
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1327
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1328
        assertTrue(specimens.contains(dnaSampleUuidIndividualsAssociation));
1329
        assertTrue(specimens.contains(fossilTypeDesignation));
1330
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1331
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1332
        assertEquals("Wrong number of associated specimens", 5, specimens.size());
1333

    
1334
        /*
1335
         * search for taxon name
1336
         * should retrieve all specimens associated via
1337
         *  - determinations on
1338
         *   - taxon name (specimenA, specimenB)
1339
         */
1340
        config = new FindOccurrencesConfigurator();
1341
        config.setAssociatedTaxonNameUuid(taxonNameUuid);
1342
        specimens = occurrenceService.findByTitle(config).getRecords();
1343
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1344
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1345
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1346
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1347
        assertTrue(!specimens.contains(fossilTypeDesignation));
1348
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1349
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1350
        assertEquals("Wrong number of associated specimens", 2, specimens.size());
1351

    
1352
        /*
1353
         * search for synonym name
1354
         * should retrieve all specimens associated via
1355
         *  - determinations on
1356
         *   - synonym names (specimenC)
1357
         */
1358
        config = new FindOccurrencesConfigurator();
1359
        config.setAssociatedTaxonNameUuid(synonymNameUuid);
1360
        specimens = occurrenceService.findByTitle(config).getRecords();
1361
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1362
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1363
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1364
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1365
        assertTrue(!specimens.contains(fossilTypeDesignation));
1366
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1367
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1368
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1369

    
1370
        /*
1371
         * search for orphan name
1372
         * should retrieve all specimens associated via
1373
         *  - determinations on
1374
         *   - taxon name (specimenD)
1375
         */
1376
        config = new FindOccurrencesConfigurator();
1377
        config.setAssociatedTaxonNameUuid(orphanNameUuid);
1378
        specimens = occurrenceService.findByTitle(config).getRecords();
1379
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1380
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1381
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1382
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1383
        assertTrue(!specimens.contains(fossilTypeDesignation));
1384
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1385
        assertTrue(specimens.contains(derivedUnitDeterminationOrphanName));
1386
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1387

    
1388
//        //DERIVATIVES
1389
//        //determination: taxon
1390
//        DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1391
//        derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1392
//        //determination: taxon name
1393
//        DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1394
//        derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1395
//        //determination: synonym
1396
//        DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1397
//        derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1398
//        //determination: synonym name
1399
//        DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1400
//        derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1401
//        //determination: orphan name
1402
//        DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1403
//        derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1404
//        //no association
1405
//        DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1406
//        tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1407
//        //individuals association with taxon
1408
//        DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1409
//        dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1410
//        //type specimen of taxon
1411
//        DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1412
//        fossilTypeDesignation.setTitleCache("Fossil with type designation");
1413
//
1414
//        derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1415
//        derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1416
//        derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1417
//        derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1418
//        derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1419
//        tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1420
//        dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1421
//        fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1422
//
1423
//        occurrenceService.save(derivedUnitDeterminationTaxon);
1424
//        occurrenceService.save(derivedUnitDeterminationName);
1425
//        occurrenceService.save(derivedUnitDeterminationSynonym);
1426
//        occurrenceService.save(derivedUnitDeterminationSynonymName);
1427
//        occurrenceService.save(derivedUnitDeterminationOrphanName);
1428
//        occurrenceService.save(tissueUuidNoAssociation);
1429
//        occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1430
//        occurrenceService.save(fossilTypeDesignation);
1431
//
1432
//        //NAMES
1433
//        TaxonName taxonName = TaxonNameFactory.PARSED_BOTANICAL("Campanula patual");
1434
//        TaxonName synonymName = TaxonNameFactory.PARSED_BOTANICAL("Syno nyma");
1435
//        TaxonName orphanName = TaxonNameFactory.PARSED_BOTANICAL("Orphanus lonelia");
1436
//        taxonName.setUuid(taxonNameUuid);
1437
//        synonymName.setUuid(synonymNameUuid);
1438
//        orphanName.setUuid(orphanNameUuid);
1439
//
1440
//        //TAXON
1441
//        Taxon taxon = Taxon.NewInstance(taxonName, null);
1442
//        taxon.setUuid(taxonUuid);
1443
//
1444
//        Classification classification = Classification.NewInstance("Test Classification");
1445
//        TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1446
//        taxonNode.setUuid(taxonNodeUuid);
1447
//
1448
//        //SYNONYM
1449
//        Synonym synonym = Synonym.NewInstance(synonymName, null);
1450
//        synonym.setUuid(synoymUuid);
1451
//        taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1452
//
1453
//        //IndividualsAssociation
1454
//        TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1455
//        IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1456
//        association.setFeature(Feature.SPECIMEN());
1457
//        taxonDescription.addElement(association);
1458
//        taxon.addDescription(taxonDescription);
1459
//
1460
//        //DETERMINATION EVENTS
1461
//        DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1462
//        DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1463
//        //        DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1464
//        DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1465
//        DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1466
//
1467
//        //type designation
1468
//        SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1469
//        specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1470
//        taxonName.addTypeDesignation(specimenTypeDesignation, false);
1471
//
1472
//        classificationService.save(classification);
1473
//        taxonService.saveOrUpdate(taxon);
1474
//        taxonNodeService.save(taxonNode);
1475
//
1476
//        commitAndStartNewTransaction(null);
1477
//
1478
//        setComplete();
1479
//        endTransaction();
1480
//
1481
//
1482
//        try {
1483
//            writeDbUnitDataSetFile(new String[] {
1484
//        "SpecimenOrObservationBase",
1485
//        "SpecimenOrObservationBase_DerivationEvent",
1486
//        "DerivationEvent",
1487
//        "DescriptionElementBase",
1488
//        "DescriptionBase",
1489
//        "TaxonBase",
1490
//        "TaxonNode",
1491
//        "Classification",
1492
//        "TypeDesignationBase",
1493
//        "TaxonName",
1494
//        "TaxonName_TypeDesignationBase",
1495
//        "HomotypicalGroup",
1496
//        "TeamOrPersonBase",
1497
//        "LanguageString",
1498
//        "DeterminationEvent"
1499
//            }, "testAllKindsOfSpecimenAssociations");
1500
//        } catch (FileNotFoundException e) {
1501
//            e.printStackTrace();
1502
//        }
1503
    }
1504

    
1505
    @Test
1506
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDnaSampleDesignation.xml")
1507
    public void testDnaSampleDesignation(){
1508
        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(DefinedTerm.uuidSampleDesignation);
1509

    
1510
        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1511
        DnaSample dnaSample = HibernateProxyHelper.deproxy(occurrenceService.load(dnaSampleUuid), DnaSample.class);
1512
        assertEquals(1, dnaSample.getIdentifiers().size());
1513
        Identifier identifier = dnaSample.getIdentifiers().iterator().next();
1514
        assertEquals("NK 2088", identifier.getIdentifier());
1515
        assertEquals(sampleDesignationTermType, identifier.getType());
1516

    
1517
        //change identifier, save and reload
1518
        identifier.setIdentifier("WB10");
1519
        occurrenceService.saveOrUpdate(dnaSample);
1520
        SpecimenOrObservationBase<?> dnaSampleReloaded = occurrenceService.load(dnaSampleUuid);
1521
        assertEquals(1, dnaSample.getIdentifiers().size());
1522
        Identifier identifierReloaded = dnaSample.getIdentifiers().iterator().next();
1523
        assertEquals("WB10", identifierReloaded.getIdentifier());
1524
        assertEquals(sampleDesignationTermType, identifierReloaded.getType());
1525

    
1526
//        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(DefinedTerm.uuidSampleDesignation);
1527
//        //UUIDS
1528
//        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1529
//        DerivedUnit dnaSample = DnaSample.NewInstance();
1530
//        dnaSample.setUuid(dnaSampleUuid);
1531
//        Identifier.NewInstance(dnaSample, "NK 2088", sampleDesignationTermType);
1532
//
1533
//        occurrenceService.save(dnaSample);
1534
//
1535
//        commitAndStartNewTransaction(null);
1536
//
1537
//        setComplete();
1538
//        endTransaction();
1539
//
1540
//
1541
//        try {
1542
//            writeDbUnitDataSetFile(new String[] {
1543
//                    "SpecimenOrObservationBase",
1544
//                    "IDENTIFIER",
1545
//                    "SpecimenOrObservationBase_Identifier"
1546
//            }, "testDnaSampleDesignation");
1547
//        } catch (FileNotFoundException e) {
1548
//            e.printStackTrace();
1549
//        }
1550
    }
1551

    
1552
    @Override
1553
//  @Test
1554
  public void createTestDataSet() throws FileNotFoundException {
1555
      //UUIDS
1556
      UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1557
      UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1558

    
1559
      UUID derivedUnitDeterminationSynonymUuid = UUID.fromString("8eb94a7d-c802-49a7-bc10-c26de20a52c2");
1560
      UUID derivedUnitDeterminationSynonymNameUuid = UUID.fromString("d940a940-8caf-4a52-b1d8-ba4aad7ddae2");
1561

    
1562
      UUID derivedUnitDeterminationOrphanNameUuid = UUID.fromString("587b7297-7d59-4f59-8ef3-c7a559cadeca");
1563

    
1564
      UUID tissueUuidNoAssociationUuid = UUID.fromString("93e94260-5107-4b2c-9ce4-da9e1a4e7cb9");
1565
      UUID dnaSampleUuidIndividualsAssociationUuid = UUID.fromString("1fb53903-c9b9-4078-8297-5b86aec7fe21");
1566
      UUID fossilTypeDesignationUuid = UUID.fromString("42ec8dcf-a923-4256-bbd5-b0d10f4de5e2");
1567

    
1568
      UUID taxonNodeUuid = UUID.fromString("6b8b6ff9-66e4-4496-8e5a-7d03bdf9a076");
1569
      UUID taxonUuid = UUID.fromString("07cc47a5-1a63-46a1-8366-0d59d2b90d5b");
1570
      UUID synoymUuid = UUID.fromString("c16bcd9b-7d18-4fb5-af60-f9ef14c1d3a9");
1571

    
1572
      UUID taxonNameUuid = UUID.fromString("e59b95c0-9ad6-48be-af62-a982ba72b917");
1573
      UUID synonymNameUuid = UUID.fromString("39f04b2a-b8bd-46e8-9102-ab665c64ec8e");
1574
      UUID orphanNameUuid = UUID.fromString("d8e56365-3ad9-4b0e-88bf-acaaab223a9b");
1575

    
1576
      //DERIVATIVES
1577
      //determination: taxon
1578
      DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1579
      derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1580
      //determination: taxon name
1581
      DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1582
      derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1583
      //determination: synonym
1584
      DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1585
      derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1586
      //determination: synonym name
1587
      DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1588
      derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1589
      //determination: orphan name
1590
      DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1591
      derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1592
      //no association
1593
      DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1594
      tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1595
      //individuals association with taxon
1596
      DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1597
      dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1598
      //type specimen of taxon
1599
      DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1600
      fossilTypeDesignation.setTitleCache("Fossil with type designation");
1601

    
1602
      derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1603
      derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1604
      derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1605
      derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1606
      derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1607
      tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1608
      dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1609
      fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1610

    
1611
      occurrenceService.save(derivedUnitDeterminationTaxon);
1612
      occurrenceService.save(derivedUnitDeterminationName);
1613
      occurrenceService.save(derivedUnitDeterminationSynonym);
1614
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1615
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1616
      occurrenceService.save(tissueUuidNoAssociation);
1617
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1618
      occurrenceService.save(fossilTypeDesignation);
1619

    
1620
      //NAMES
1621
      TaxonName taxonName = TaxonNameFactory.PARSED_BOTANICAL("Campanula patual");
1622
      TaxonName synonymName = TaxonNameFactory.PARSED_BOTANICAL("Syno nyma");
1623
      TaxonName orphanName = TaxonNameFactory.PARSED_BOTANICAL("Orphanus lonelia");
1624
      taxonName.setUuid(taxonNameUuid);
1625
      synonymName.setUuid(synonymNameUuid);
1626
      orphanName.setUuid(orphanNameUuid);
1627

    
1628
      //TAXON
1629
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1630
      taxon.setUuid(taxonUuid);
1631

    
1632
      Classification classification = Classification.NewInstance("Test Classification");
1633
      TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1634
      taxonNode.setUuid(taxonNodeUuid);
1635

    
1636
      //SYNONYM
1637
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1638
      synonym.setUuid(synoymUuid);
1639
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1640

    
1641
      //IndividualsAssociation
1642
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1643
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1644
      association.setFeature(Feature.SPECIMEN());
1645
      taxonDescription.addElement(association);
1646
      taxon.addDescription(taxonDescription);
1647

    
1648
      //DETERMINATION EVENTS
1649
      DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1650
      DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1651
      //        DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1652
      DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1653
      DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1654

    
1655
      //type designation
1656
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1657
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1658
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1659

    
1660
      classificationService.saveOrUpdate(classification);
1661
      taxonService.saveOrUpdate(taxon);
1662
      taxonNodeService.saveOrUpdate(taxonNode);
1663

    
1664
      commitAndStartNewTransaction(null);
1665

    
1666
      setComplete();
1667
      endTransaction();
1668

    
1669
      try {
1670
          writeDbUnitDataSetFile(new String[] {
1671
                  "SpecimenOrObservationBase",
1672
                  "SpecimenOrObservationBase_DerivationEvent",
1673
                  "DerivationEvent",
1674
                  "DescriptionElementBase",
1675
                  "DescriptionBase",
1676
                  "TaxonBase",
1677
                  "TaxonNode",
1678
                  "Classification",
1679
                  "TypeDesignationBase",
1680
                  "TaxonName",
1681
                  "TaxonName_TypeDesignationBase",
1682
                  "HomotypicalGroup",
1683
                  "TeamOrPersonBase",
1684
                  "LanguageString",
1685
                  "DeterminationEvent"
1686
          }, "testAllKindsOfSpecimenAssociations", true);
1687
      } catch (FileNotFoundException e) {
1688
          e.printStackTrace();
1689
      }
1690
  }
1691
}
(17-17/38)