Project

General

Profile

Download (82 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 dnaSampleWithSequenceUuid = UUID.fromString("571d4e9a-0736-4da3-ad4a-a2df427a1f01");
930
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
931

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

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

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

    
1006
        assertNotNull(derivedUnit1);
1007
        assertNotNull(derivedUnit2);
1008
        assertNotNull(tissue);
1009
        assertNotNull(dnaSample);
1010
        assertNotNull(taxon);
1011

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

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

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

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

    
1047
        // class search => 4 results
1048
        config = new FindOccurrencesConfigurator();
1049
        config.setClazz(DerivedUnit.class);
1050
        assertEquals(5, occurrenceService.countOccurrences(config));
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
        List<SpecimenOrObservationBase> accessionedUnits = occurrenceService.findByTitle(config).getRecords();
1064
        assertEquals(2, accessionedUnits.size());
1065
        assertTrue(accessionedUnits.contains(derivedUnit1));
1066
        assertFalse(accessionedUnits.contains(derivedUnit2));
1067
        assertFalse(accessionedUnits.contains(tissue));
1068
        assertTrue(accessionedUnits.contains(dnaSample));
1069

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

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

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

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

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

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

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

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

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

    
1163

    
1164

    
1165
        List<DerivedUnit> findByAccessionNumber = occurrenceService.findByAccessionNumber("ACC_DNA", 10, 1, null, null);
1166

    
1167
        assertEquals(1, findByAccessionNumber.size());
1168
       // assertTrue(findByAccessionNumber.contains(derivedUnit1));
1169
        assertTrue(findByAccessionNumber.contains(dnaSampleWithSequence));
1170

    
1171

    
1172
    }
1173

    
1174
    @Test
1175
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1176
    public void testListUuidAndTitleCacheByAssociatedTaxon() {
1177
        UUID taxonNodeUuid = UUID.fromString("6b8b6ff9-66e4-4496-8e5a-7d03bdf9a076");
1178
        /**
1179
         * Structure is as follows:
1180
         *
1181
         * Taxon ----IndividualsAssociation---> DnaSample
1182
         * Taxon ----TypeDesignation---> Fossil
1183
         * Taxon ----Determination ---> PreservedSpecimenA
1184
         *
1185
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1186
         *
1187
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1188
         *
1189
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1190
         */
1191

    
1192
        //UUIDS
1193
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1194
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1195
        UUID derivedUnitDeterminationSynonymNameUuid = UUID.fromString("d940a940-8caf-4a52-b1d8-ba4aad7ddae2");
1196
        UUID derivedUnitDeterminationOrphanNameUuid = UUID.fromString("587b7297-7d59-4f59-8ef3-c7a559cadeca");
1197
        UUID tissueUuidNoAssociationUuid = UUID.fromString("93e94260-5107-4b2c-9ce4-da9e1a4e7cb9");
1198
        UUID dnaSampleUuidIndividualsAssociationUuid = UUID.fromString("1fb53903-c9b9-4078-8297-5b86aec7fe21");
1199
        UUID fossilTypeDesignationUuid = UUID.fromString("42ec8dcf-a923-4256-bbd5-b0d10f4de5e2");
1200
        UUID taxonUuid = UUID.fromString("07cc47a5-1a63-46a1-8366-0d59d2b90d5b");
1201

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

    
1227
    /**
1228
     * This will test the retrieval of specimens that are in any way associated
1229
     * with a taxon resp. taxon name via type designation, determination event
1230
     * or individuals associations. It will also consider synonym relationships.
1231
     */
1232
    @Test
1233
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest-testAllKindsOfSpecimenAssociations.xml")
1234
    public void testAllKindsOfSpecimenAssociations() {
1235

    
1236
        /**
1237
         * Structure is as follows:
1238
         *
1239
         * Taxon ----IndividualsAssociation---> DnaSample
1240
         * Taxon ----TypeDesignation---> Fossil
1241
         * Taxon ----Determination ---> PreservedSpecimenA
1242
         *
1243
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1244
         *
1245
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1246
         *
1247
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1248
         */
1249

    
1250
        //UUIDS
1251
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1252
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1253

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

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

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

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

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

    
1270
        //load cdm entities
1271
        DerivedUnit derivedUnitDeterminationTaxon = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationTaxonUuid);
1272
        DerivedUnit derivedUnitDeterminationName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationNameUuid);
1273
        DerivedUnit derivedUnitDeterminationSynonym = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymUuid);
1274
        DerivedUnit derivedUnitDeterminationSynonymName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymNameUuid);
1275
        DerivedUnit derivedUnitDeterminationOrphanName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationOrphanNameUuid);
1276
        DerivedUnit tissueUuidNoAssociation = (DerivedUnit) occurrenceService.load(tissueUuidNoAssociationUuid);
1277
        DnaSample dnaSampleUuidIndividualsAssociation = (DnaSample) occurrenceService.load(dnaSampleUuidIndividualsAssociationUuid);
1278
        DerivedUnit fossilTypeDesignation = (DerivedUnit) occurrenceService.load(fossilTypeDesignationUuid);
1279
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
1280
        Synonym synonym = (Synonym) taxonService.load(synoymUuid);
1281
        TaxonName taxonName = nameService.load(taxonNameUuid);
1282
        TaxonName synonymName = nameService.load(synonymNameUuid);
1283
        TaxonName orphanName = nameService.load(orphanNameUuid);
1284

    
1285
        //check initial state
1286
        assertNotNull(derivedUnitDeterminationTaxon);
1287
        assertNotNull(derivedUnitDeterminationName);
1288
        assertNotNull(derivedUnitDeterminationSynonym);
1289
        assertNotNull(derivedUnitDeterminationSynonymName);
1290
        assertNotNull(derivedUnitDeterminationOrphanName);
1291
        assertNotNull(tissueUuidNoAssociation);
1292
        assertNotNull(dnaSampleUuidIndividualsAssociation);
1293
        assertNotNull(fossilTypeDesignation);
1294
        assertNotNull(taxon);
1295
        assertNotNull(synonym);
1296
        assertNotNull(taxonName);
1297
        assertNotNull(synonymName);
1298
        assertNotNull(orphanName);
1299

    
1300
        /*
1301
         * search for taxon
1302
         * should retrieve all specimens associated via
1303
         *  - type designations (fossil)
1304
         *  - individuals associations (dnaSample)
1305
         *  - determinations on
1306
         *   - taxon (specimenA)
1307
         *   - taxon name (specimenA, specimenB)
1308
         *   - synonym names (specimenC)
1309
         */
1310
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1311
        config.setAssociatedTaxonUuid(taxonUuid);
1312
        List<SpecimenOrObservationBase> specimens = occurrenceService.findByTitle(config).getRecords();
1313
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1314
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1315
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1316
        assertTrue(specimens.contains(dnaSampleUuidIndividualsAssociation));
1317
        assertTrue(specimens.contains(fossilTypeDesignation));
1318
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1319
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1320
        assertEquals("Wrong number of associated specimens", 5, specimens.size());
1321

    
1322
        /*
1323
         * search for taxon name
1324
         * should retrieve all specimens associated via
1325
         *  - determinations on
1326
         *   - taxon name (specimenA, specimenB)
1327
         */
1328
        config = new FindOccurrencesConfigurator();
1329
        config.setAssociatedTaxonNameUuid(taxonNameUuid);
1330
        specimens = occurrenceService.findByTitle(config).getRecords();
1331
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1332
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1333
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1334
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1335
        assertTrue(!specimens.contains(fossilTypeDesignation));
1336
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1337
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1338
        assertEquals("Wrong number of associated specimens", 2, specimens.size());
1339

    
1340
        /*
1341
         * search for synonym name
1342
         * should retrieve all specimens associated via
1343
         *  - determinations on
1344
         *   - synonym names (specimenC)
1345
         */
1346
        config = new FindOccurrencesConfigurator();
1347
        config.setAssociatedTaxonNameUuid(synonymNameUuid);
1348
        specimens = occurrenceService.findByTitle(config).getRecords();
1349
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1350
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1351
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1352
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1353
        assertTrue(!specimens.contains(fossilTypeDesignation));
1354
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1355
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1356
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1357

    
1358
        /*
1359
         * search for orphan name
1360
         * should retrieve all specimens associated via
1361
         *  - determinations on
1362
         *   - taxon name (specimenD)
1363
         */
1364
        config = new FindOccurrencesConfigurator();
1365
        config.setAssociatedTaxonNameUuid(orphanNameUuid);
1366
        specimens = occurrenceService.findByTitle(config).getRecords();
1367
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1368
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1369
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1370
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1371
        assertTrue(!specimens.contains(fossilTypeDesignation));
1372
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1373
        assertTrue(specimens.contains(derivedUnitDeterminationOrphanName));
1374
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1375

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

    
1492

    
1493
    }
1494

    
1495
    @Test
1496
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDnaSampleDesignation.xml")
1497
    public void testDnaSampleDesignation(){
1498
        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1499

    
1500
        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1501
        DnaSample dnaSample = HibernateProxyHelper.deproxy(occurrenceService.load(dnaSampleUuid), DnaSample.class);
1502
        assertEquals(1, dnaSample.getIdentifiers().size());
1503
        Identifier<?> identifier = dnaSample.getIdentifiers().iterator().next();
1504
        assertEquals("NK 2088", identifier.getIdentifier());
1505
        assertEquals(sampleDesignationTermType, identifier.getType());
1506

    
1507
        //change identifier, save and reload
1508
        identifier.setIdentifier("WB10");
1509
        occurrenceService.saveOrUpdate(dnaSample);
1510
        SpecimenOrObservationBase<?> dnaSampleReloaded = occurrenceService.load(dnaSampleUuid);
1511
        assertEquals(1, dnaSample.getIdentifiers().size());
1512
        Identifier<?> identifierReloaded = dnaSample.getIdentifiers().iterator().next();
1513
        assertEquals("WB10", identifierReloaded.getIdentifier());
1514
        assertEquals(sampleDesignationTermType, identifierReloaded.getType());
1515

    
1516

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

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

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

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

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

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

    
1566
      //DERIVATIVES
1567
      //determination: taxon
1568
      DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1569
      derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1570
      //determination: taxon name
1571
      DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1572
      derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1573
      //determination: synonym
1574
      DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1575
      derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1576
      //determination: synonym name
1577
      DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1578
      derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1579
      //determination: orphan name
1580
      DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1581
      derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1582
      //no association
1583
      DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1584
      tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1585
      //individuals association with taxon
1586
      DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1587
      dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1588
      //type specimen of taxon
1589
      DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1590
      fossilTypeDesignation.setTitleCache("Fossil with type designation");
1591

    
1592
      derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1593
      derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1594
      derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1595
      derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1596
      derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1597
      tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1598
      dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1599
      fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1600

    
1601
      occurrenceService.save(derivedUnitDeterminationTaxon);
1602
      occurrenceService.save(derivedUnitDeterminationName);
1603
      occurrenceService.save(derivedUnitDeterminationSynonym);
1604
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1605
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1606
      occurrenceService.save(tissueUuidNoAssociation);
1607
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1608
      occurrenceService.save(fossilTypeDesignation);
1609

    
1610
      //NAMES
1611
      TaxonName taxonName = TaxonNameFactory.PARSED_BOTANICAL("Campanula patual");
1612
      TaxonName synonymName = TaxonNameFactory.PARSED_BOTANICAL("Syno nyma");
1613
      TaxonName orphanName = TaxonNameFactory.PARSED_BOTANICAL("Orphanus lonelia");
1614
      taxonName.setUuid(taxonNameUuid);
1615
      synonymName.setUuid(synonymNameUuid);
1616
      orphanName.setUuid(orphanNameUuid);
1617

    
1618
      //TAXON
1619
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1620
      taxon.setUuid(taxonUuid);
1621

    
1622
      Classification classification = Classification.NewInstance("Test Classification");
1623
      TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1624
      taxonNode.setUuid(taxonNodeUuid);
1625

    
1626
      //SYNONYM
1627
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1628
      synonym.setUuid(synoymUuid);
1629
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1630

    
1631
      //IndividualsAssociation
1632
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1633
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1634
      association.setFeature(Feature.SPECIMEN());
1635
      taxonDescription.addElement(association);
1636
      taxon.addDescription(taxonDescription);
1637

    
1638
      //DETERMINATION EVENTS
1639
      DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1640
      DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1641
      //        DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1642
      DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1643
      DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1644

    
1645
      //type designation
1646
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1647
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1648
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1649

    
1650
      classificationService.saveOrUpdate(classification);
1651
      taxonService.saveOrUpdate(taxon);
1652
      taxonNodeService.saveOrUpdate(taxonNode);
1653

    
1654
      commitAndStartNewTransaction(null);
1655

    
1656
      setComplete();
1657
      endTransaction();
1658

    
1659

    
1660
      try {
1661
          writeDbUnitDataSetFile(new String[] {
1662
                  "SpecimenOrObservationBase",
1663
                  "SpecimenOrObservationBase_DerivationEvent",
1664
                  "DerivationEvent",
1665
                  "DescriptionElementBase",
1666
                  "DescriptionBase",
1667
                  "TaxonBase",
1668
                  "TaxonNode",
1669
                  "Classification",
1670
                  "TypeDesignationBase",
1671
                  "TaxonName",
1672
                  "TaxonName_TypeDesignationBase",
1673
                  "HomotypicalGroup",
1674
                  "TeamOrPersonBase",
1675
                  "LanguageString",
1676
                  "DeterminationEvent"
1677
          }, "testAllKindsOfSpecimenAssociations");
1678
      } catch (FileNotFoundException e) {
1679
          e.printStackTrace();
1680
      }
1681

    
1682
  }
1683
}
(16-16/35)