Project

General

Profile

Download (81.5 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.molecular.ISequenceService;
34
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
35
import eu.etaxonomy.cdm.model.agent.Institution;
36
import eu.etaxonomy.cdm.model.agent.Person;
37
import eu.etaxonomy.cdm.model.common.CdmBase;
38
import eu.etaxonomy.cdm.model.common.DefinedTerm;
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.Rank;
50
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
51
import eu.etaxonomy.cdm.model.name.TaxonName;
52
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
53
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
54
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
55
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
56
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
57
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
58
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
59
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
60
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
61
import eu.etaxonomy.cdm.model.reference.Reference;
62
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
63
import eu.etaxonomy.cdm.model.taxon.Classification;
64
import eu.etaxonomy.cdm.model.taxon.Synonym;
65
import eu.etaxonomy.cdm.model.taxon.SynonymType;
66
import eu.etaxonomy.cdm.model.taxon.Taxon;
67
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
68
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
69
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
70
import eu.etaxonomy.cdm.persistence.query.AssignmentStatus;
71
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
72
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
73

    
74
/**
75
 * @author pplitzner
76
 * @since 31.03.2014
77
 *
78
 */
79
public class OccurrenceServiceTest extends CdmTransactionalIntegrationTest {
80

    
81
    @SuppressWarnings("unused")
82
    private static final Logger logger = Logger.getLogger(OccurrenceServiceTest.class);
83

    
84
    @SpringBeanByType
85
    private IOccurrenceService occurrenceService;
86

    
87
    @SpringBeanByType
88
    private ISequenceService sequenceService;
89

    
90
    @SpringBeanByType
91
    private ITaxonService taxonService;
92

    
93
    @SpringBeanByType
94
    private ITaxonNodeService taxonNodeService;
95

    
96
    @SpringBeanByType
97
    private IClassificationService classificationService;
98

    
99
    @SpringBeanByType
100
    private INameService nameService;
101

    
102
    @SpringBeanByType
103
    private ITermService termService;
104

    
105
    @SpringBeanByType
106
    private IDescriptionService descriptionService;
107

    
108
    private Reference getReference() {
109
        Reference result = ReferenceFactory.newGeneric();
110
        result.setTitle("some generic reference");
111
        return result;
112
    }
113

    
114
    private Taxon getTaxon() {
115
        Reference sec = getReference();
116
        TaxonName name = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
117
        Taxon taxon = Taxon.NewInstance(name, sec);
118
        return taxon;
119

    
120
    }
121

    
122
    @Test
123
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
124
    public void testMoveDerivate() {
125
        DerivedUnit specimenA = (DerivedUnit) occurrenceService.load(UUID
126
                .fromString("35cfb0b3-588d-4eee-9db6-ac9caa44e39a"));
127
        DerivedUnit specimenB = (DerivedUnit) occurrenceService.load(UUID
128
                .fromString("09496534-efd0-44c8-b1ce-01a34a8a0229"));
129
        DerivedUnit dnaSample = (DnaSample) occurrenceService.load(UUID
130
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
131

    
132
        occurrenceService.saveOrUpdate(specimenA);
133
        occurrenceService.saveOrUpdate(specimenB);
134
        occurrenceService.saveOrUpdate(dnaSample);
135

    
136
        Person derivationActor = Person.NewTitledInstance("Derivation Actor");
137
        String derivationDescription = "Derivation Description";
138
        Institution derivationInstitution = Institution.NewInstance();
139
        TimePeriod derivationTimePeriod = TimePeriod.NewInstance(2015);
140

    
141
        DerivationEvent originalDerivedFromEvent = DerivationEvent.NewSimpleInstance(specimenA, dnaSample,
142
                DerivationEventType.DNA_EXTRACTION());
143

    
144
        originalDerivedFromEvent.setActor(derivationActor);
145
        originalDerivedFromEvent.setDescription(derivationDescription);
146
        originalDerivedFromEvent.setInstitution(derivationInstitution);
147
        originalDerivedFromEvent.setTimeperiod(derivationTimePeriod);
148

    
149
        occurrenceService.moveDerivate(specimenA, specimenB, dnaSample);
150
        assertTrue("DerivationEvent not removed from source!", specimenA.getDerivationEvents().isEmpty());
151
        assertEquals("DerivationEvent not moved to source!", 1, specimenB.getDerivationEvents().size());
152

    
153
        DerivationEvent derivationEvent = specimenB.getDerivationEvents().iterator().next();
154
        assertEquals("Moved DerivationEvent not of same type!", DerivationEventType.DNA_EXTRACTION(),
155
                derivationEvent.getType());
156
        assertEquals(derivationActor, derivationEvent.getActor());
157
        assertEquals(derivationDescription, derivationEvent.getDescription());
158
        assertEquals(derivationInstitution, derivationEvent.getInstitution());
159
        assertEquals(derivationTimePeriod, derivationEvent.getTimeperiod());
160
        assertEquals(DerivationEventType.DNA_EXTRACTION(), derivationEvent.getType());
161

    
162
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
163
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
164
        assertEquals("Target of moved object not correct", specimenB, newOriginal);
165
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
166

    
167
        DerivedUnit movedDerivate = derivationEvent.getDerivatives().iterator().next();
168
        assertEquals("Moved derivate has wrong type", SpecimenOrObservationType.DnaSample,
169
                movedDerivate.getRecordBasis());
170
        assertNotEquals("DerivationEvent 'derivedFrom' has not been changed after moving", originalDerivedFromEvent,
171
                movedDerivate.getDerivedFrom());
172

    
173
    }
174

    
175
    @Test
176
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "../../database/BlankDataSet.xml")
177
    public void testMoveDerivateNoParent() {
178
        DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
179
        FieldUnit fieldUnit = FieldUnit.NewInstance();
180

    
181
        occurrenceService.saveOrUpdate(fieldUnit);
182
        occurrenceService.saveOrUpdate(derivedUnit);
183

    
184
        assertEquals("DerivationEvent not moved to source!", 0, fieldUnit.getDerivationEvents().size());
185
        occurrenceService.moveDerivate(null, fieldUnit, derivedUnit);
186
        assertEquals("DerivationEvent not moved to source!", 1, fieldUnit.getDerivationEvents().size());
187

    
188
        DerivationEvent derivationEvent = fieldUnit.getDerivationEvents().iterator().next();
189
        assertNull(derivationEvent.getType());
190

    
191
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
192
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
193
        assertEquals("Target of moved object not correct", fieldUnit, newOriginal);
194
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
195
    }
196

    
197
    @Test
198
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
199
    public void testMoveSequence() {
200
        DnaSample dnaSampleA = (DnaSample) occurrenceService.load(UUID
201
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
202
        DnaSample dnaSampleB = (DnaSample) occurrenceService.load(UUID
203
                .fromString("85fccc2f-c796-46b3-b2fc-6c9a4d68cfda"));
204
        String consensusSequence = "ATTCG";
205
        Sequence sequence = sequenceService.load(UUID.fromString("6da4f378-9861-4338-861b-7b8073763e7a"));
206

    
207
        occurrenceService.saveOrUpdate(dnaSampleA);
208
        occurrenceService.saveOrUpdate(dnaSampleB);
209
        sequenceService.saveOrUpdate(sequence);
210

    
211
        dnaSampleA.addSequence(sequence);
212

    
213
        occurrenceService.moveSequence(dnaSampleA, dnaSampleB, sequence);
214
        assertEquals("Number of sequences is wrong", 0, dnaSampleA.getSequences().size());
215
        assertEquals("Number of sequences is wrong", 1, dnaSampleB.getSequences().size());
216
        Sequence next = dnaSampleB.getSequences().iterator().next();
217
        assertEquals("Sequences are not equals", sequence, next);
218
        assertEquals("Sequences are not equals", consensusSequence, next.getSequenceString());
219
    }
220

    
221
    @Test
222
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDeleteIndividualAssociatedAndTypeSpecimen.xml")
223
    public void testDeleteIndividualAssociatedAndTypeSpecimen() {
224
        final UUID taxonDEscriptionUuid = UUID.fromString("a87a893e-2ea8-427d-a26b-dbd2515d6b8a");
225
        final UUID botanicalNameUuid = UUID.fromString("a604774e-d66a-4d47-b9d1-d0e38a8c787a");
226
        final UUID fieldUnitUuid = UUID.fromString("67e81ca8-ff91-4df6-bf48-e4600c7f15a2");
227
        final UUID derivedUnitUuid = UUID.fromString("d229713b-0123-4f15-bffc-76ae45c37564");
228

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

    
297
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
298
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
299
        IBotanicalName name = nameService.load(botanicalNameUuid);
300
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDEscriptionUuid);
301
        // check initial state (IndividualsAssociation)
302
        DescriptionElementBase descriptionElement = taxonDescription.getElements().iterator().next();
303
        assertTrue("wrong type of description element", descriptionElement.isInstanceOf(IndividualsAssociation.class));
304
        assertEquals("associated specimen is incorrect", associatedFieldUnit,
305
                ((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation());
306
        // check initial state (Type Designation)
307
        Set<TypeDesignationBase> typeDesignations = name.getTypeDesignations();
308
        TypeDesignationBase<?> typeDesignation = typeDesignations.iterator().next();
309
        assertTrue("wrong type of type designation", typeDesignation.isInstanceOf(SpecimenTypeDesignation.class));
310
        assertEquals("type specimen is incorrect", typeSpecimen,
311
                ((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen());
312

    
313
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
314
        // delete type specimen from type designation
315
        config.setDeleteFromTypeDesignation(true);
316
        occurrenceService.delete(typeSpecimen, config);
317
        assertTrue(((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen() == null);
318

    
319
        // delete associated field unit from IndividualsAssociation
320
        config.setDeleteFromIndividualsAssociation(true);
321
        occurrenceService.delete(associatedFieldUnit, config);
322
        assertTrue(((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation() == null);
323

    
324
    }
325

    
326
    @Test
327
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceService.loadData.xml")
328
    public void testLoadData() {
329
        String fieldUnitUuid = "5a31df5a-2e4d-40b1-8d4e-5754736ae7ef";
330
        String derivedUnitUuid = "18f70977-5d9c-400a-96c4-0cb7a2cd287e";
331

    
332
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(UUID.fromString(fieldUnitUuid));
333
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(UUID.fromString(derivedUnitUuid));
334

    
335
        assertFalse(fieldUnit.getDerivationEvents().iterator().next().getDerivatives().isEmpty());
336
        assertTrue(derivedUnit.getDerivedFrom() != null);
337
    }
338

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

    
416
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
417
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(typeSpecimenUuid);
418
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
419
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
420
        // check for FieldUnit (IndividualsAssociation)
421
        java.util.Collection<IndividualsAssociation> individualsAssociations = occurrenceService
422
                .listIndividualsAssociations(associatedFieldUnit, null, null, null, null);
423
        assertEquals("Number of individuals associations is incorrect", 1, individualsAssociations.size());
424
        IndividualsAssociation individualsAssociation = individualsAssociations.iterator().next();
425
        assertTrue("association has wrong type",
426
                individualsAssociation.getInDescription().isInstanceOf(TaxonDescription.class));
427
        TaxonDescription retrievedTaxonDescription = HibernateProxyHelper.deproxy(
428
                individualsAssociation.getInDescription(), TaxonDescription.class);
429
        assertEquals(taxonDescription, retrievedTaxonDescription);
430
        assertEquals("Associated taxon is incorrect", taxon, retrievedTaxonDescription.getTaxon());
431

    
432
        // check for DerivedUnit (Type Designation should exist)
433
        java.util.Collection<SpecimenTypeDesignation> typeDesignations = occurrenceService.listTypeDesignations(
434
                typeSpecimen, null, null, null, null);
435
        assertEquals("Number of type designations is incorrect", 1, typeDesignations.size());
436
        SpecimenTypeDesignation specimenTypeDesignation = typeDesignations.iterator().next();
437
        Set<TaxonName> typifiedNames = specimenTypeDesignation.getTypifiedNames();
438
        assertEquals("number of typified names is incorrect", 1, typifiedNames.size());
439
        Set<?> taxonBases = typifiedNames.iterator().next().getTaxonBases();
440
        assertEquals("number of taxa incorrect", 1, taxonBases.size());
441
        Object next = taxonBases.iterator().next();
442
        assertTrue(next instanceof CdmBase && ((CdmBase) next).isInstanceOf(Taxon.class));
443
        assertEquals("Typed taxon is incorrect", taxon, next);
444
    }
445

    
446
    @Test
447
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithSpecimenDescription.xml")
448
    public void testIsDeletableWithSpecimenDescription() {
449
        UUID derivedUnitUuid = UUID.fromString("68095c8e-025d-49f0-8bb2-ed36378b75c3");
450
        UUID specimenDescriptionUuid = UUID.fromString("4094f947-ce84-47b1-bad5-e57e33239d3c");
451
        // //how the XML was generated
452
        // DerivedUnit derivedUnit =
453
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
454
        // derivedUnit.setUuid(derivedUnitUuid);
455
        // SpecimenDescription specimenDescription =
456
        // SpecimenDescription.NewInstance();
457
        // specimenDescription.setUuid(specimenDescriptionUuid);
458
        // derivedUnit.addDescription(specimenDescription);
459
        // occurrenceService.save(derivedUnit);
460
        //
461
        // commitAndStartNewTransaction(null);
462
        //
463
        // setComplete();
464
        // endTransaction();
465
        //
466
        // try {
467
        // writeDbUnitDataSetFile(new String[] {
468
        // "SpecimenOrObservationBase",
469
        // "SpecimenOrObservationBase_DerivationEvent",
470
        // "DerivationEvent",
471
        // "Sequence",
472
        // "Sequence_SingleRead",
473
        // "SingleRead",
474
        // "AmplificationResult",
475
        // "DescriptionElementBase",
476
        // "DescriptionBase",
477
        // "TaxonBase",
478
        // "TypeDesignationBase",
479
        // "TaxonName",
480
        // "TaxonName_TypeDesignationBase",
481
        // "HomotypicalGroup"
482
        // }, "testIsDeletableWithSpecimenDescription");
483
        // } catch (FileNotFoundException e) {
484
        // e.printStackTrace();
485
        // }
486

    
487
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
488
        SpecimenDescription specimenDescription = (SpecimenDescription) descriptionService
489
                .load(specimenDescriptionUuid);
490

    
491
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
492
        DeleteResult deleteResult = null;
493
        // delete derivedUnit1
494
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
495
        //deletion of specimen description should always work because there are no
496
        //specimen description without a specimen
497
        assertTrue(deleteResult.toString(), deleteResult.isOk());
498
        occurrenceService.delete(derivedUnit, config);
499
        specimenDescription = (SpecimenDescription) descriptionService.find(specimenDescriptionUuid);
500

    
501
        assertNull(specimenDescription);
502
    }
503

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

    
563
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
564

    
565
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
566
        DeleteResult deleteResult = null;
567
        // check deletion of field unit -> should fail because of voucher
568
        // specimen (describedSpecimen) in TaxonDescription
569
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
570
        assertFalse(deleteResult.toString(), deleteResult.isOk());
571

    
572
        // allow deletion from TaxonDescription and deletion of child derivates
573
        config.setDeleteFromDescription(true);
574
        config.setDeleteChildren(true);
575
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
576
        assertTrue(deleteResult.toString(), deleteResult.isOk());
577
    }
578

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

    
634
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
635
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
636
        IndividualsAssociation individualsAssociation = (IndividualsAssociation) taxonDescription.getElements()
637
                .iterator().next();
638

    
639
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
640
        DeleteResult deleteResult = null;
641
        // check deletion of field unit -> should fail because of
642
        // IndividualAssociation
643
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
644
        assertFalse(deleteResult.toString(), deleteResult.isOk());
645
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(individualsAssociation));
646

    
647
        // allow deletion of individuals association
648
        config.setDeleteFromIndividualsAssociation(true);
649
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
650
        assertTrue(deleteResult.toString(), deleteResult.isOk());
651

    
652
    }
653

    
654
    @Test
655
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithTypeDesignation.xml")
656
    public void testIsDeletableWithTypeDesignation() {
657
        UUID derivedUnitUuid = UUID.fromString("f7fd1dc1-3c93-42a7-8279-cde5bfe37ea0");
658
        UUID botanicalNameUuid = UUID.fromString("7396430c-c932-4dd3-a45a-40c2808b132e");
659
        // DerivedUnit derivedUnit =
660
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
661
        // derivedUnit.setUuid(derivedUnitUuid);
662
        //
663
        // occurrenceService.save(derivedUnit);
664
        //
665
        // //create name with type specimen
666
        // BotanicalName name =
667
        // BotanicalName.PARSED_NAME("Campanula patual sec L.");
668
        // name.setUuid(botanicalNameUuid);
669
        // SpecimenTypeDesignation typeDesignation =
670
        // SpecimenTypeDesignation.NewInstance();
671
        // typeDesignation.setTypeSpecimen(derivedUnit);
672
        // //add type designation to name
673
        // name.addTypeDesignation(typeDesignation, false);
674
        //
675
        // nameService.saveOrUpdate(name);
676
        //
677
        // commitAndStartNewTransaction(null);
678
        //
679
        // setComplete();
680
        // endTransaction();
681
        //
682
        //
683
        // try {
684
        // writeDbUnitDataSetFile(new String[] {
685
        // "SpecimenOrObservationBase",
686
        // "SpecimenOrObservationBase_DerivationEvent",
687
        // "DerivationEvent",
688
        // "Sequence",
689
        // "Sequence_SingleRead",
690
        // "SingleRead",
691
        // "AmplificationResult",
692
        // "DescriptionElementBase",
693
        // "DescriptionBase",
694
        // "TaxonBase",
695
        // "TypeDesignationBase",
696
        // "TaxonName",
697
        // "TaxonName_TypeDesignationBase",
698
        // "HomotypicalGroup"
699
        // }, "testIsDeletableWithTypeDesignation");
700
        // } catch (FileNotFoundException e) {
701
        // e.printStackTrace();
702
        // }
703

    
704
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
705

    
706
        // create name with type specimen
707
        IBotanicalName name = nameService.load(botanicalNameUuid);
708
        SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation) name.getTypeDesignations().iterator()
709
                .next();
710

    
711
        // add type designation to name
712
        name.addTypeDesignation(typeDesignation, false);
713

    
714
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
715
        DeleteResult deleteResult = null;
716

    
717
        // check deletion of specimen
718
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
719
        assertFalse(deleteResult.toString(), deleteResult.isOk());
720
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(typeDesignation));
721

    
722
        // allow deletion of type designation
723
        config.setDeleteFromTypeDesignation(true);
724

    
725
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
726
        assertTrue(deleteResult.toString(), deleteResult.isOk());
727
    }
728

    
729
    @Test
730
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testIsDeletableWithChildren.xml")
731
    public void testIsDeletableWithChildren() {
732
        UUID fieldUnitUuid = UUID.fromString("92ada058-4c14-4131-8ecd-b82dc1dd2882");
733
        UUID derivedUnitUuid = UUID.fromString("896dffdc-6809-4914-8950-5501fee1c0fd");
734
        UUID dnaSampleUuid = UUID.fromString("7efd1d66-ac7f-4202-acdf-a72cbb9c3a21");
735
        // if this test fails be sure to check if there are left-over elements
736
        // in the DB
737
        // e.g. clear by adding "<AMPLIFICATIONRESULT/>" to the data set XML
738

    
739
        // //how the XML was generated
740
        // FieldUnit fieldUnit = FieldUnit.NewInstance();
741
        // fieldUnit.setUuid(fieldUnitUuid);
742
        // //sub derivates (DerivedUnit, DnaSample)
743
        // DerivedUnit derivedUnit =
744
        // DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
745
        // derivedUnit.setUuid(derivedUnitUuid);
746
        // DnaSample dnaSample = DnaSample.NewInstance();
747
        // dnaSample.setUuid(dnaSampleUuid);
748
        //
749
        // //derivation events
750
        // DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit,
751
        // DerivationEventType.ACCESSIONING());
752
        // DerivationEvent.NewSimpleInstance(derivedUnit, dnaSample,
753
        // DerivationEventType.DNA_EXTRACTION());
754
        //
755
        // occurrenceService.save(fieldUnit);
756
        // occurrenceService.save(derivedUnit);
757
        // occurrenceService.save(dnaSample);
758
        //
759
        // commitAndStartNewTransaction(null);
760
        //
761
        // setComplete();
762
        // endTransaction();
763
        //
764
        // try {
765
        // writeDbUnitDataSetFile(new String[] {
766
        // "SpecimenOrObservationBase",
767
        // "SpecimenOrObservationBase_DerivationEvent",
768
        // "DerivationEvent",
769
        // "Sequence",
770
        // "SingleRead",
771
        // "SingleReadAlignment",
772
        // "Amplification",
773
        // "AmplificationResult",
774
        // "DescriptionElementBase",
775
        // "DescriptionBase",
776
        // "TaxonBase",
777
        // "TypeDesignationBase",
778
        // "TaxonName",
779
        // "TaxonName_TypeDesignationBase",
780
        // "HomotypicalGroup"
781
        // }, "testIsDeletableWithChildren");
782
        // } catch (FileNotFoundException e) {
783
        // e.printStackTrace();
784
        // }
785
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
786
        // sub derivates (DerivedUnit, DnaSample)
787
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
788
        DnaSample dnaSample = (DnaSample) occurrenceService.load(dnaSampleUuid);
789

    
790
        // derivation events
791
        DerivationEvent fieldUnitToDerivedUnitEvent = fieldUnit.getDerivationEvents().iterator().next();
792
        DerivationEvent derivedUnitToDnaSampleEvent = derivedUnit.getDerivationEvents().iterator().next();
793

    
794
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
795

    
796
        DeleteResult deleteResult = null;
797
        // check deletion of DnaSample
798
        deleteResult = occurrenceService.isDeletable(dnaSample.getUuid(), config);
799
        assertTrue(deleteResult.toString(), deleteResult.isOk());
800

    
801
        // check deletion of Specimen
802
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
803
        assertFalse(deleteResult.toString(), deleteResult.isOk());
804
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(derivedUnitToDnaSampleEvent));
805

    
806
        // check deletion of fieldUnit
807
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
808
        assertFalse(deleteResult.toString(), deleteResult.isOk());
809
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(fieldUnitToDerivedUnitEvent));
810

    
811
        // check deletion of Specimen
812
        config.setDeleteChildren(true);
813
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
814
        assertTrue(deleteResult.toString(), deleteResult.isOk());
815
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(derivedUnitToDnaSampleEvent));
816

    
817
        // check deletion of fieldUnit
818
        config.setDeleteFromDescription(true);
819
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
820
        assertTrue(deleteResult.toString(), deleteResult.isOk());
821

    
822
    }
823

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

    
888
        assertNotNull(typeSpecimen);
889
        assertNotNull(associatedSpecimen);
890
        assertNotNull(unassociatedSpecimen);
891
        assertNotNull(taxon);
892

    
893
        //check association (IndividualsAssociations + TypeDesignations) specimen -> taxon (name)
894

    
895
        //unassociated specimen
896
        java.util.Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(unassociatedSpecimen, null, null, null, null);
897
        assertNotNull(associatedTaxa);
898
        assertTrue(associatedTaxa.isEmpty());
899

    
900
        //type specimen
901
        associatedTaxa = occurrenceService.listAssociatedTaxa(typeSpecimen, null, null, null, null);
902
        assertNotNull(associatedTaxa);
903
        assertEquals(1, associatedTaxa.size());
904
        assertEquals(taxon, associatedTaxa.iterator().next());
905

    
906
        //associated specimen
907
        associatedTaxa = occurrenceService.listAssociatedTaxa(associatedSpecimen, null, null, null, null);
908
        assertNotNull(associatedTaxa);
909
        assertEquals(1, associatedTaxa.size());
910
        assertEquals(taxon, associatedTaxa.iterator().next());
911

    
912

    
913
        //check association (IndividualsAssociations + TypeDesignations) taxon (name) -> specimen
914
        List<DerivedUnit> byAssociatedTaxon = occurrenceService.listByAssociatedTaxon(DerivedUnit.class, null, taxon, null, null, null, null, null);
915
        assertNotNull(byAssociatedTaxon);
916
        assertEquals(2, byAssociatedTaxon.size());
917
        assertTrue(byAssociatedTaxon.contains(associatedSpecimen));
918
        assertTrue(byAssociatedTaxon.contains(typeSpecimen));
919
        assertTrue(!byAssociatedTaxon.contains(unassociatedSpecimen));
920

    
921
    }
922

    
923
    @Test
924
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testFindOcurrences.xml")
925
    public void testFindOccurrences() {
926
        UUID derivedUnit1Uuid = UUID.fromString("843bc8c9-c0fe-4735-bf40-82f1996dcefb");
927
        UUID derivedUnit2Uuid = UUID.fromString("40cd9cb1-7c74-4e7d-a1f8-8a1e0314e940");
928
        UUID dnaSampleUuid = UUID.fromString("364969a6-2457-4e2e-ae1e-29a6fcaa741a");
929
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
930

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

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

    
998
        SpecimenOrObservationBase derivedUnit1 = occurrenceService.load(derivedUnit1Uuid);
999
        SpecimenOrObservationBase derivedUnit2 = occurrenceService.load(derivedUnit2Uuid);
1000
        SpecimenOrObservationBase tissue = occurrenceService.load(tissueUuid);
1001
        SpecimenOrObservationBase dnaSample = occurrenceService.load(dnaSampleUuid);
1002
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
1003

    
1004
        assertNotNull(derivedUnit1);
1005
        assertNotNull(derivedUnit2);
1006
        assertNotNull(tissue);
1007
        assertNotNull(dnaSample);
1008
        assertNotNull(taxon);
1009

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

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

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

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

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

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

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

    
1079
        // recordBasis search => 1 Fossil
1080
        config = new FindOccurrencesConfigurator();
1081
        config.setSpecimenType(SpecimenOrObservationType.Fossil);
1082
        assertEquals(1, occurrenceService.countOccurrences(config));
1083
        List<SpecimenOrObservationBase> fossils = occurrenceService.findByTitle(config).getRecords();
1084
        assertEquals(1, fossils.size());
1085
        assertTrue(fossils.contains(derivedUnit1));
1086

    
1087
        // taxon determination search => 2 associated specimens
1088
        config = new FindOccurrencesConfigurator();
1089
        config.setClazz(DerivedUnit.class);
1090
        config.setAssociatedTaxonUuid(taxon.getUuid());
1091
        assertEquals(2, occurrenceService.countOccurrences(config));
1092
        List<SpecimenOrObservationBase> associatedSpecimens = occurrenceService.findByTitle(config).getRecords();
1093
        assertEquals(2, associatedSpecimens.size());
1094
        assertTrue(associatedSpecimens.contains(derivedUnit1));
1095
        assertTrue(associatedSpecimens.contains(tissue));
1096

    
1097
        // taxon determination search (indirectly associated) => 3 associated
1098
        // specimens
1099
        config = new FindOccurrencesConfigurator();
1100
        config.setClazz(DerivedUnit.class);
1101
        config.setAssociatedTaxonUuid(taxon.getUuid());
1102
        config.setRetrieveIndirectlyAssociatedSpecimens(true);
1103
        assertEquals(3, occurrenceService.countOccurrences(config));
1104
        List<SpecimenOrObservationBase> indirectlyAssociatedSpecimens = occurrenceService.findByTitle(config)
1105
                .getRecords();
1106
        assertEquals(3, indirectlyAssociatedSpecimens.size());
1107
        assertTrue(indirectlyAssociatedSpecimens.contains(derivedUnit1));
1108
        assertTrue(indirectlyAssociatedSpecimens.contains(dnaSample));
1109
        assertTrue(indirectlyAssociatedSpecimens.contains(tissue));
1110

    
1111
        // taxon association search
1112
        config = new FindOccurrencesConfigurator();
1113
        config.setClazz(SpecimenOrObservationBase.class);
1114
        config.setAssociatedTaxonUuid(taxon.getUuid());
1115
        assertEquals(2, occurrenceService.countOccurrences(config));
1116
        List<SpecimenOrObservationBase> specimensOrObservations = occurrenceService.findByTitle(config).getRecords();
1117
        assertEquals(2, specimensOrObservations.size());
1118
        assertTrue(specimensOrObservations.contains(tissue));
1119
        assertTrue(specimensOrObservations.contains(derivedUnit1));
1120

    
1121
        //test assignment status
1122
        //all specimen
1123
        config = new FindOccurrencesConfigurator();
1124
        config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
1125
        assertEquals(4, occurrenceService.countOccurrences(config));
1126
        List<SpecimenOrObservationBase> allSpecimens = occurrenceService.findByTitle(config).getRecords();
1127
        assertEquals(4, allSpecimens.size());
1128
        assertTrue(allSpecimens.contains(derivedUnit1));
1129
        assertTrue(allSpecimens.contains(derivedUnit2));
1130
        assertTrue(allSpecimens.contains(tissue));
1131
        assertTrue(allSpecimens.contains(dnaSample));
1132

    
1133
        //assigned specimen
1134
        config = new FindOccurrencesConfigurator();
1135
        config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
1136
        assertEquals(2, occurrenceService.countOccurrences(config));
1137
        List<SpecimenOrObservationBase> assignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1138
        assertEquals(2, assignedSpecimens.size());
1139
        assertTrue(assignedSpecimens.contains(derivedUnit1));
1140
        assertTrue(assignedSpecimens.contains(tissue));
1141

    
1142
        //unassigned specimen
1143
        config = new FindOccurrencesConfigurator();
1144
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1145
        assertEquals(2, occurrenceService.countOccurrences(config));
1146
        List<SpecimenOrObservationBase> unAssignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1147
        assertEquals(2, unAssignedSpecimens.size());
1148
        assertTrue(unAssignedSpecimens.contains(derivedUnit2));
1149
        assertTrue(unAssignedSpecimens.contains(dnaSample));
1150

    
1151
        //ignore assignment status because taxon uuid is set
1152
        config = new FindOccurrencesConfigurator();
1153
        config.setAssociatedTaxonUuid(taxon.getUuid());
1154
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1155
        assertEquals(2, occurrenceService.countOccurrences(config));
1156
        List<SpecimenOrObservationBase> ignoreAssignmentStatusSpecimens = occurrenceService.findByTitle(config).getRecords();
1157
        assertEquals(2, ignoreAssignmentStatusSpecimens.size());
1158
        assertTrue(ignoreAssignmentStatusSpecimens.contains(derivedUnit1));
1159
        assertTrue(ignoreAssignmentStatusSpecimens.contains(tissue));
1160

    
1161

    
1162
    }
1163

    
1164
    @Test
1165
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1166
    public void testListUuidAndTitleCacheByAssociatedTaxon() {
1167
        UUID taxonNodeUuid = UUID.fromString("6b8b6ff9-66e4-4496-8e5a-7d03bdf9a076");
1168
        /**
1169
         * Structure is as follows:
1170
         *
1171
         * Taxon ----IndividualsAssociation---> DnaSample
1172
         * Taxon ----TypeDesignation---> Fossil
1173
         * Taxon ----Determination ---> PreservedSpecimenA
1174
         *
1175
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1176
         *
1177
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1178
         *
1179
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1180
         */
1181

    
1182
        //UUIDS
1183
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1184
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1185
        UUID derivedUnitDeterminationSynonymNameUuid = UUID.fromString("d940a940-8caf-4a52-b1d8-ba4aad7ddae2");
1186
        UUID derivedUnitDeterminationOrphanNameUuid = UUID.fromString("587b7297-7d59-4f59-8ef3-c7a559cadeca");
1187
        UUID tissueUuidNoAssociationUuid = UUID.fromString("93e94260-5107-4b2c-9ce4-da9e1a4e7cb9");
1188
        UUID dnaSampleUuidIndividualsAssociationUuid = UUID.fromString("1fb53903-c9b9-4078-8297-5b86aec7fe21");
1189
        UUID fossilTypeDesignationUuid = UUID.fromString("42ec8dcf-a923-4256-bbd5-b0d10f4de5e2");
1190
        UUID taxonUuid = UUID.fromString("07cc47a5-1a63-46a1-8366-0d59d2b90d5b");
1191

    
1192
        /*
1193
         * search for taxon node
1194
         * should retrieve all specimens associated via
1195
         *  - type designations (fossil)
1196
         *  - individuals associations (dnaSample)
1197
         *  - determinations on
1198
         *   - taxon (specimenA)
1199
         *   - taxon name (specimenA, specimenB)
1200
         */
1201
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1202
        config.setAssociatedTaxonUuid(taxonUuid);
1203
        Collection<SpecimenNodeWrapper> specimens = occurrenceService
1204
                .listUuidAndTitleCacheByAssociatedTaxon(Collections.singletonList(taxonNodeUuid), null, null);
1205
        List<UUID> uuidList = specimens.stream().map(specimen ->
1206
        specimen.getUuidAndTitleCache().getUuid()).collect(Collectors.toList());
1207
        assertTrue(uuidList.contains(derivedUnitDeterminationNameUuid));
1208
        assertTrue(uuidList.contains(derivedUnitDeterminationTaxonUuid));
1209
        assertFalse(uuidList.contains(derivedUnitDeterminationSynonymNameUuid));
1210
        assertTrue(uuidList.contains(dnaSampleUuidIndividualsAssociationUuid));
1211
        assertTrue(uuidList.contains(fossilTypeDesignationUuid));
1212
        assertFalse(uuidList.contains(tissueUuidNoAssociationUuid));
1213
        assertFalse(uuidList.contains(derivedUnitDeterminationOrphanNameUuid));
1214
        assertEquals("Wrong number of associated specimens", 4, specimens.size());
1215
    }
1216

    
1217
    /**
1218
     * This will test the retrieval of specimens that are in any way associated
1219
     * with a taxon resp. taxon name via type designation, determination event
1220
     * or individuals associations. It will also consider synonym relationships.
1221
     */
1222
    @Test
1223
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1224
    public void testAllKindsOfSpecimenAssociations() {
1225

    
1226
        /**
1227
         * Structure is as follows:
1228
         *
1229
         * Taxon ----IndividualsAssociation---> DnaSample
1230
         * Taxon ----TypeDesignation---> Fossil
1231
         * Taxon ----Determination ---> PreservedSpecimenA
1232
         *
1233
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1234
         *
1235
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1236
         *
1237
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1238
         */
1239

    
1240
        //UUIDS
1241
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1242
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1243

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

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

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

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

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

    
1260
        //load cdm entities
1261
        DerivedUnit derivedUnitDeterminationTaxon = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationTaxonUuid);
1262
        DerivedUnit derivedUnitDeterminationName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationNameUuid);
1263
        DerivedUnit derivedUnitDeterminationSynonym = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymUuid);
1264
        DerivedUnit derivedUnitDeterminationSynonymName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymNameUuid);
1265
        DerivedUnit derivedUnitDeterminationOrphanName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationOrphanNameUuid);
1266
        DerivedUnit tissueUuidNoAssociation = (DerivedUnit) occurrenceService.load(tissueUuidNoAssociationUuid);
1267
        DnaSample dnaSampleUuidIndividualsAssociation = (DnaSample) occurrenceService.load(dnaSampleUuidIndividualsAssociationUuid);
1268
        DerivedUnit fossilTypeDesignation = (DerivedUnit) occurrenceService.load(fossilTypeDesignationUuid);
1269
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
1270
        Synonym synonym = (Synonym) taxonService.load(synoymUuid);
1271
        TaxonName taxonName = nameService.load(taxonNameUuid);
1272
        TaxonName synonymName = nameService.load(synonymNameUuid);
1273
        TaxonName orphanName = nameService.load(orphanNameUuid);
1274

    
1275
        //check initial state
1276
        assertNotNull(derivedUnitDeterminationTaxon);
1277
        assertNotNull(derivedUnitDeterminationName);
1278
        assertNotNull(derivedUnitDeterminationSynonym);
1279
        assertNotNull(derivedUnitDeterminationSynonymName);
1280
        assertNotNull(derivedUnitDeterminationOrphanName);
1281
        assertNotNull(tissueUuidNoAssociation);
1282
        assertNotNull(dnaSampleUuidIndividualsAssociation);
1283
        assertNotNull(fossilTypeDesignation);
1284
        assertNotNull(taxon);
1285
        assertNotNull(synonym);
1286
        assertNotNull(taxonName);
1287
        assertNotNull(synonymName);
1288
        assertNotNull(orphanName);
1289

    
1290
        /*
1291
         * search for taxon
1292
         * should retrieve all specimens associated via
1293
         *  - type designations (fossil)
1294
         *  - individuals associations (dnaSample)
1295
         *  - determinations on
1296
         *   - taxon (specimenA)
1297
         *   - taxon name (specimenA, specimenB)
1298
         *   - synonym names (specimenC)
1299
         */
1300
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1301
        config.setAssociatedTaxonUuid(taxonUuid);
1302
        List<SpecimenOrObservationBase> specimens = occurrenceService.findByTitle(config).getRecords();
1303
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1304
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1305
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1306
        assertTrue(specimens.contains(dnaSampleUuidIndividualsAssociation));
1307
        assertTrue(specimens.contains(fossilTypeDesignation));
1308
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1309
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1310
        assertEquals("Wrong number of associated specimens", 5, specimens.size());
1311

    
1312
        /*
1313
         * search for taxon name
1314
         * should retrieve all specimens associated via
1315
         *  - determinations on
1316
         *   - taxon name (specimenA, specimenB)
1317
         */
1318
        config = new FindOccurrencesConfigurator();
1319
        config.setAssociatedTaxonNameUuid(taxonNameUuid);
1320
        specimens = occurrenceService.findByTitle(config).getRecords();
1321
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1322
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1323
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1324
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1325
        assertTrue(!specimens.contains(fossilTypeDesignation));
1326
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1327
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1328
        assertEquals("Wrong number of associated specimens", 2, specimens.size());
1329

    
1330
        /*
1331
         * search for synonym name
1332
         * should retrieve all specimens associated via
1333
         *  - determinations on
1334
         *   - synonym names (specimenC)
1335
         */
1336
        config = new FindOccurrencesConfigurator();
1337
        config.setAssociatedTaxonNameUuid(synonymNameUuid);
1338
        specimens = occurrenceService.findByTitle(config).getRecords();
1339
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1340
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1341
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1342
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1343
        assertTrue(!specimens.contains(fossilTypeDesignation));
1344
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1345
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1346
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1347

    
1348
        /*
1349
         * search for orphan name
1350
         * should retrieve all specimens associated via
1351
         *  - determinations on
1352
         *   - taxon name (specimenD)
1353
         */
1354
        config = new FindOccurrencesConfigurator();
1355
        config.setAssociatedTaxonNameUuid(orphanNameUuid);
1356
        specimens = occurrenceService.findByTitle(config).getRecords();
1357
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1358
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1359
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1360
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1361
        assertTrue(!specimens.contains(fossilTypeDesignation));
1362
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1363
        assertTrue(specimens.contains(derivedUnitDeterminationOrphanName));
1364
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1365

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

    
1482

    
1483
    }
1484

    
1485
    @Test
1486
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDnaSampleDesignation.xml")
1487
    public void testDnaSampleDesignation(){
1488
        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1489

    
1490
        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1491
        DnaSample dnaSample = HibernateProxyHelper.deproxy(occurrenceService.load(dnaSampleUuid), DnaSample.class);
1492
        assertEquals(1, dnaSample.getIdentifiers().size());
1493
        Identifier<?> identifier = dnaSample.getIdentifiers().iterator().next();
1494
        assertEquals("NK 2088", identifier.getIdentifier());
1495
        assertEquals(sampleDesignationTermType, identifier.getType());
1496

    
1497
        //change identifier, save and reload
1498
        identifier.setIdentifier("WB10");
1499
        occurrenceService.saveOrUpdate(dnaSample);
1500
        SpecimenOrObservationBase<?> dnaSampleReloaded = occurrenceService.load(dnaSampleUuid);
1501
        assertEquals(1, dnaSample.getIdentifiers().size());
1502
        Identifier<?> identifierReloaded = dnaSample.getIdentifiers().iterator().next();
1503
        assertEquals("WB10", identifierReloaded.getIdentifier());
1504
        assertEquals(sampleDesignationTermType, identifierReloaded.getType());
1505

    
1506

    
1507
//        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1508
//        //UUIDS
1509
//        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1510
//        DerivedUnit dnaSample = DnaSample.NewInstance();
1511
//        dnaSample.setUuid(dnaSampleUuid);
1512
//        Identifier.NewInstance(dnaSample, "NK 2088", sampleDesignationTermType);
1513
//
1514
//        occurrenceService.save(dnaSample);
1515
//
1516
//        commitAndStartNewTransaction(null);
1517
//
1518
//        setComplete();
1519
//        endTransaction();
1520
//
1521
//
1522
//        try {
1523
//            writeDbUnitDataSetFile(new String[] {
1524
//                    "SpecimenOrObservationBase",
1525
//                    "IDENTIFIER",
1526
//                    "SpecimenOrObservationBase_Identifier"
1527
//            }, "testDnaSampleDesignation");
1528
//        } catch (FileNotFoundException e) {
1529
//            e.printStackTrace();
1530
//        }
1531
    }
1532
    @Override
1533
//  @Test
1534
  public void createTestDataSet() throws FileNotFoundException {
1535
      //UUIDS
1536
      UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1537
      UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1538

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

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

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

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

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

    
1556
      //DERIVATIVES
1557
      //determination: taxon
1558
      DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1559
      derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1560
      //determination: taxon name
1561
      DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1562
      derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1563
      //determination: synonym
1564
      DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1565
      derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1566
      //determination: synonym name
1567
      DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1568
      derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1569
      //determination: orphan name
1570
      DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1571
      derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1572
      //no association
1573
      DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1574
      tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1575
      //individuals association with taxon
1576
      DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1577
      dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1578
      //type specimen of taxon
1579
      DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1580
      fossilTypeDesignation.setTitleCache("Fossil with type designation");
1581

    
1582
      derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1583
      derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1584
      derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1585
      derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1586
      derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1587
      tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1588
      dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1589
      fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1590

    
1591
      occurrenceService.save(derivedUnitDeterminationTaxon);
1592
      occurrenceService.save(derivedUnitDeterminationName);
1593
      occurrenceService.save(derivedUnitDeterminationSynonym);
1594
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1595
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1596
      occurrenceService.save(tissueUuidNoAssociation);
1597
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1598
      occurrenceService.save(fossilTypeDesignation);
1599

    
1600
      //NAMES
1601
      TaxonName taxonName = TaxonNameFactory.PARSED_BOTANICAL("Campanula patual");
1602
      TaxonName synonymName = TaxonNameFactory.PARSED_BOTANICAL("Syno nyma");
1603
      TaxonName orphanName = TaxonNameFactory.PARSED_BOTANICAL("Orphanus lonelia");
1604
      taxonName.setUuid(taxonNameUuid);
1605
      synonymName.setUuid(synonymNameUuid);
1606
      orphanName.setUuid(orphanNameUuid);
1607

    
1608
      //TAXON
1609
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1610
      taxon.setUuid(taxonUuid);
1611

    
1612
      Classification classification = Classification.NewInstance("Test Classification");
1613
      TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1614
      taxonNode.setUuid(taxonNodeUuid);
1615

    
1616
      //SYNONYM
1617
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1618
      synonym.setUuid(synoymUuid);
1619
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1620

    
1621
      //IndividualsAssociation
1622
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1623
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1624
      association.setFeature(Feature.SPECIMEN());
1625
      taxonDescription.addElement(association);
1626
      taxon.addDescription(taxonDescription);
1627

    
1628
      //DETERMINATION EVENTS
1629
      DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1630
      DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1631
      //        DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1632
      DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1633
      DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1634

    
1635
      //type designation
1636
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1637
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1638
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1639

    
1640
      classificationService.saveOrUpdate(classification);
1641
      taxonService.saveOrUpdate(taxon);
1642
      taxonNodeService.saveOrUpdate(taxonNode);
1643

    
1644
      commitAndStartNewTransaction(null);
1645

    
1646
      setComplete();
1647
      endTransaction();
1648

    
1649

    
1650
      try {
1651
          writeDbUnitDataSetFile(new String[] {
1652
                  "SpecimenOrObservationBase",
1653
                  "SpecimenOrObservationBase_DerivationEvent",
1654
                  "DerivationEvent",
1655
                  "DescriptionElementBase",
1656
                  "DescriptionBase",
1657
                  "TaxonBase",
1658
                  "TaxonNode",
1659
                  "Classification",
1660
                  "TypeDesignationBase",
1661
                  "TaxonName",
1662
                  "TaxonName_TypeDesignationBase",
1663
                  "HomotypicalGroup",
1664
                  "TeamOrPersonBase",
1665
                  "LanguageString",
1666
                  "DeterminationEvent"
1667
          }, "testAllKindsOfSpecimenAssociations");
1668
      } catch (FileNotFoundException e) {
1669
          e.printStackTrace();
1670
      }
1671

    
1672
  }
1673
}
(16-16/35)