Project

General

Profile

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

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

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

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

    
31
import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
32
import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
33
import eu.etaxonomy.cdm.api.service.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.SpecimenTypeDesignation;
50
import eu.etaxonomy.cdm.model.name.TaxonName;
51
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
52
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
53
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
54
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
55
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
56
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
57
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
58
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
59
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
60
import eu.etaxonomy.cdm.model.reference.Reference;
61
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
62
import eu.etaxonomy.cdm.model.taxon.Classification;
63
import eu.etaxonomy.cdm.model.taxon.Synonym;
64
import eu.etaxonomy.cdm.model.taxon.SynonymType;
65
import eu.etaxonomy.cdm.model.taxon.Taxon;
66
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
67
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
68
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper;
69
import eu.etaxonomy.cdm.persistence.query.AssignmentStatus;
70
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
71
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
72

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

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

    
83
    @SpringBeanByType
84
    private IOccurrenceService occurrenceService;
85

    
86
    @SpringBeanByType
87
    private ISequenceService sequenceService;
88

    
89
    @SpringBeanByType
90
    private ITaxonService taxonService;
91

    
92
    @SpringBeanByType
93
    private ITaxonNodeService taxonNodeService;
94

    
95
    @SpringBeanByType
96
    private IClassificationService classificationService;
97

    
98
    @SpringBeanByType
99
    private INameService nameService;
100

    
101
    @SpringBeanByType
102
    private ITermService termService;
103

    
104
    @SpringBeanByType
105
    private IDescriptionService descriptionService;
106

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

    
113

    
114
    @Test
115
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
116
    public void testMoveDerivate() {
117
        DerivedUnit specimenA = (DerivedUnit) occurrenceService.load(UUID
118
                .fromString("35cfb0b3-588d-4eee-9db6-ac9caa44e39a"));
119
        DerivedUnit specimenB = (DerivedUnit) occurrenceService.load(UUID
120
                .fromString("09496534-efd0-44c8-b1ce-01a34a8a0229"));
121
        DerivedUnit dnaSample = (DnaSample) occurrenceService.load(UUID
122
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
123

    
124
        occurrenceService.saveOrUpdate(specimenA);
125
        occurrenceService.saveOrUpdate(specimenB);
126
        occurrenceService.saveOrUpdate(dnaSample);
127

    
128
        Person derivationActor = Person.NewTitledInstance("Derivation Actor");
129
        String derivationDescription = "Derivation Description";
130
        Institution derivationInstitution = Institution.NewInstance();
131
        TimePeriod derivationTimePeriod = TimePeriod.NewInstance(2015);
132

    
133
        DerivationEvent originalDerivedFromEvent = DerivationEvent.NewSimpleInstance(specimenA, dnaSample,
134
                DerivationEventType.DNA_EXTRACTION());
135

    
136
        originalDerivedFromEvent.setActor(derivationActor);
137
        originalDerivedFromEvent.setDescription(derivationDescription);
138
        originalDerivedFromEvent.setInstitution(derivationInstitution);
139
        originalDerivedFromEvent.setTimeperiod(derivationTimePeriod);
140

    
141
        occurrenceService.moveDerivate(specimenA, specimenB, dnaSample);
142
        assertTrue("DerivationEvent not removed from source!", specimenA.getDerivationEvents().isEmpty());
143
        assertEquals("DerivationEvent not moved to source!", 1, specimenB.getDerivationEvents().size());
144

    
145
        DerivationEvent derivationEvent = specimenB.getDerivationEvents().iterator().next();
146
        assertEquals("Moved DerivationEvent not of same type!", DerivationEventType.DNA_EXTRACTION(),
147
                derivationEvent.getType());
148
        assertEquals(derivationActor, derivationEvent.getActor());
149
        assertEquals(derivationDescription, derivationEvent.getDescription());
150
        assertEquals(derivationInstitution, derivationEvent.getInstitution());
151
        assertEquals(derivationTimePeriod, derivationEvent.getTimeperiod());
152
        assertEquals(DerivationEventType.DNA_EXTRACTION(), derivationEvent.getType());
153

    
154
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
155
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
156
        assertEquals("Target of moved object not correct", specimenB, newOriginal);
157
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
158

    
159
        DerivedUnit movedDerivate = derivationEvent.getDerivatives().iterator().next();
160
        assertEquals("Moved derivate has wrong type", SpecimenOrObservationType.DnaSample,
161
                movedDerivate.getRecordBasis());
162
        assertNotEquals("DerivationEvent 'derivedFrom' has not been changed after moving", originalDerivedFromEvent,
163
                movedDerivate.getDerivedFrom());
164

    
165
    }
166

    
167
    @Test
168
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "../../database/BlankDataSet.xml")
169
    public void testMoveDerivateNoParent() {
170
        DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
171
        FieldUnit fieldUnit = FieldUnit.NewInstance();
172

    
173
        occurrenceService.saveOrUpdate(fieldUnit);
174
        occurrenceService.saveOrUpdate(derivedUnit);
175

    
176
        assertEquals("DerivationEvent not moved to source!", 0, fieldUnit.getDerivationEvents().size());
177
        occurrenceService.moveDerivate(null, fieldUnit, derivedUnit);
178
        assertEquals("DerivationEvent not moved to source!", 1, fieldUnit.getDerivationEvents().size());
179

    
180
        DerivationEvent derivationEvent = fieldUnit.getDerivationEvents().iterator().next();
181
        assertNull(derivationEvent.getType());
182

    
183
        assertEquals("Wrong number of derivation originals!", 1, derivationEvent.getOriginals().size());
184
        SpecimenOrObservationBase<?> newOriginal = derivationEvent.getOriginals().iterator().next();
185
        assertEquals("Target of moved object not correct", fieldUnit, newOriginal);
186
        assertEquals("Wrong number of derivatives!", 1, derivationEvent.getDerivatives().size());
187
    }
188

    
189
    @Test
190
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurenceServiceTest.move.xml")
191
    public void testMoveSequence() {
192
        DnaSample dnaSampleA = (DnaSample) occurrenceService.load(UUID
193
                .fromString("5995f852-0e78-405c-b849-d923bd6781d9"));
194
        DnaSample dnaSampleB = (DnaSample) occurrenceService.load(UUID
195
                .fromString("85fccc2f-c796-46b3-b2fc-6c9a4d68cfda"));
196
        String consensusSequence = "ATTCG";
197
        Sequence sequence = sequenceService.load(UUID.fromString("6da4f378-9861-4338-861b-7b8073763e7a"));
198

    
199
        occurrenceService.saveOrUpdate(dnaSampleA);
200
        occurrenceService.saveOrUpdate(dnaSampleB);
201
        sequenceService.saveOrUpdate(sequence);
202

    
203
        dnaSampleA.addSequence(sequence);
204

    
205
        occurrenceService.moveSequence(dnaSampleA, dnaSampleB, sequence);
206
        assertEquals("Number of sequences is wrong", 0, dnaSampleA.getSequences().size());
207
        assertEquals("Number of sequences is wrong", 1, dnaSampleB.getSequences().size());
208
        Sequence next = dnaSampleB.getSequences().iterator().next();
209
        assertEquals("Sequences are not equals", sequence, next);
210
        assertEquals("Sequences are not equals", consensusSequence, next.getSequenceString());
211
    }
212

    
213
    @Test
214
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDeleteIndividualAssociatedAndTypeSpecimen.xml")
215
    public void testDeleteIndividualAssociatedAndTypeSpecimen() {
216
        final UUID taxonDEscriptionUuid = UUID.fromString("a87a893e-2ea8-427d-a26b-dbd2515d6b8a");
217
        final UUID botanicalNameUuid = UUID.fromString("a604774e-d66a-4d47-b9d1-d0e38a8c787a");
218
        final UUID fieldUnitUuid = UUID.fromString("67e81ca8-ff91-4df6-bf48-e4600c7f15a2");
219
        final UUID derivedUnitUuid = UUID.fromString("d229713b-0123-4f15-bffc-76ae45c37564");
220

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

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

    
305
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
306
        // delete type specimen from type designation
307
        config.setDeleteFromTypeDesignation(true);
308
        occurrenceService.delete(typeSpecimen, config);
309
        assertTrue(((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen() == null);
310

    
311
        // delete associated field unit from IndividualsAssociation
312
        config.setDeleteFromIndividualsAssociation(true);
313
        occurrenceService.delete(associatedFieldUnit, config);
314
        assertTrue(((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation() == null);
315

    
316
    }
317

    
318
    @Test
319
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceService.loadData.xml")
320
    public void testLoadData() {
321
        String fieldUnitUuid = "5a31df5a-2e4d-40b1-8d4e-5754736ae7ef";
322
        String derivedUnitUuid = "18f70977-5d9c-400a-96c4-0cb7a2cd287e";
323

    
324
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(UUID.fromString(fieldUnitUuid));
325
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(UUID.fromString(derivedUnitUuid));
326

    
327
        assertFalse(fieldUnit.getDerivationEvents().iterator().next().getDerivatives().isEmpty());
328
        assertTrue(derivedUnit.getDerivedFrom() != null);
329
    }
330

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

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

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

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

    
479
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
480
        SpecimenDescription specimenDescription = (SpecimenDescription) descriptionService
481
                .load(specimenDescriptionUuid);
482

    
483
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
484
        DeleteResult deleteResult = null;
485
        // delete derivedUnit1
486
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
487
        //deletion of specimen description should always work because there are no
488
        //specimen description without a specimen
489
        assertTrue(deleteResult.toString(), deleteResult.isOk());
490
        occurrenceService.delete(derivedUnit, config);
491
        specimenDescription = (SpecimenDescription) descriptionService.find(specimenDescriptionUuid);
492

    
493
        assertNull(specimenDescription);
494
    }
495

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

    
555
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
556

    
557
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
558
        DeleteResult deleteResult = null;
559
        // check deletion of field unit -> should fail because of voucher
560
        // specimen (describedSpecimen) in TaxonDescription
561
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
562
        assertFalse(deleteResult.toString(), deleteResult.isOk());
563

    
564
        // allow deletion from TaxonDescription and deletion of child derivates
565
        config.setDeleteFromDescription(true);
566
        config.setDeleteChildren(true);
567
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
568
        assertTrue(deleteResult.toString(), deleteResult.isOk());
569
    }
570

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

    
626
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
627
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
628
        IndividualsAssociation individualsAssociation = (IndividualsAssociation) taxonDescription.getElements()
629
                .iterator().next();
630

    
631
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
632
        DeleteResult deleteResult = null;
633
        // check deletion of field unit -> should fail because of
634
        // IndividualAssociation
635
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
636
        assertFalse(deleteResult.toString(), deleteResult.isOk());
637
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(individualsAssociation));
638

    
639
        // allow deletion of individuals association
640
        config.setDeleteFromIndividualsAssociation(true);
641
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
642
        assertTrue(deleteResult.toString(), deleteResult.isOk());
643

    
644
    }
645

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

    
696
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
697

    
698
        // create name with type specimen
699
        IBotanicalName name = nameService.load(botanicalNameUuid);
700
        SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation) name.getTypeDesignations().iterator()
701
                .next();
702

    
703
        // add type designation to name
704
        name.addTypeDesignation(typeDesignation, false);
705

    
706
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
707
        DeleteResult deleteResult = null;
708

    
709
        // check deletion of specimen
710
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
711
        assertFalse(deleteResult.toString(), deleteResult.isOk());
712
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(typeDesignation));
713

    
714
        // allow deletion of type designation
715
        config.setDeleteFromTypeDesignation(true);
716

    
717
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
718
        assertTrue(deleteResult.toString(), deleteResult.isOk());
719
    }
720

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

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

    
782
        // derivation events
783
        DerivationEvent fieldUnitToDerivedUnitEvent = fieldUnit.getDerivationEvents().iterator().next();
784
        DerivationEvent derivedUnitToDnaSampleEvent = derivedUnit.getDerivationEvents().iterator().next();
785

    
786
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
787

    
788
        DeleteResult deleteResult = null;
789
        // check deletion of DnaSample
790
        deleteResult = occurrenceService.isDeletable(dnaSample.getUuid(), config);
791
        assertTrue(deleteResult.toString(), deleteResult.isOk());
792

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

    
798
        // check deletion of fieldUnit
799
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
800
        assertFalse(deleteResult.toString(), deleteResult.isOk());
801
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(fieldUnitToDerivedUnitEvent));
802

    
803
        // check deletion of Specimen
804
        config.setDeleteChildren(true);
805
        deleteResult = occurrenceService.isDeletable(derivedUnit.getUuid(), config);
806
        assertTrue(deleteResult.toString(), deleteResult.isOk());
807
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(derivedUnitToDnaSampleEvent));
808

    
809
        // check deletion of fieldUnit
810
        config.setDeleteFromDescription(true);
811
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
812
        assertTrue(deleteResult.toString(), deleteResult.isOk());
813

    
814
    }
815

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

    
880
        assertNotNull(typeSpecimen);
881
        assertNotNull(associatedSpecimen);
882
        assertNotNull(unassociatedSpecimen);
883
        assertNotNull(taxon);
884

    
885
        //check association (IndividualsAssociations + TypeDesignations) specimen -> taxon (name)
886

    
887
        //unassociated specimen
888
        java.util.Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(unassociatedSpecimen, null, null, null, null);
889
        assertNotNull(associatedTaxa);
890
        assertTrue(associatedTaxa.isEmpty());
891

    
892
        //type specimen
893
        associatedTaxa = occurrenceService.listAssociatedTaxa(typeSpecimen, null, null, null, null);
894
        assertNotNull(associatedTaxa);
895
        assertEquals(1, associatedTaxa.size());
896
        assertEquals(taxon, associatedTaxa.iterator().next());
897

    
898
        //associated specimen
899
        associatedTaxa = occurrenceService.listAssociatedTaxa(associatedSpecimen, null, null, null, null);
900
        assertNotNull(associatedTaxa);
901
        assertEquals(1, associatedTaxa.size());
902
        assertEquals(taxon, associatedTaxa.iterator().next());
903

    
904

    
905
        //check association (IndividualsAssociations + TypeDesignations) taxon (name) -> specimen
906
        List<DerivedUnit> byAssociatedTaxon = occurrenceService.listByAssociatedTaxon(DerivedUnit.class, null, taxon, null, null, null, null, null);
907
        assertNotNull(byAssociatedTaxon);
908
        assertEquals(2, byAssociatedTaxon.size());
909
        assertTrue(byAssociatedTaxon.contains(associatedSpecimen));
910
        assertTrue(byAssociatedTaxon.contains(typeSpecimen));
911
        assertTrue(!byAssociatedTaxon.contains(unassociatedSpecimen));
912

    
913
    }
914

    
915
    @Test
916
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testFindOcurrences.xml")
917
    public void testFindOccurrences() {
918
        UUID derivedUnit1Uuid = UUID.fromString("843bc8c9-c0fe-4735-bf40-82f1996dcefb");
919
        UUID derivedUnit2Uuid = UUID.fromString("40cd9cb1-7c74-4e7d-a1f8-8a1e0314e940");
920
        UUID dnaSampleUuid = UUID.fromString("364969a6-2457-4e2e-ae1e-29a6fcaa741a");
921
        UUID dnaSampleWithSequenceUuid = UUID.fromString("571d4e9a-0736-4da3-ad4a-a2df427a1f01");
922
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
923

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

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

    
991
        SpecimenOrObservationBase derivedUnit1 = occurrenceService.load(derivedUnit1Uuid);
992
        SpecimenOrObservationBase derivedUnit2 = occurrenceService.load(derivedUnit2Uuid);
993
        SpecimenOrObservationBase tissue = occurrenceService.load(tissueUuid);
994
        SpecimenOrObservationBase dnaSample = occurrenceService.load(dnaSampleUuid);
995
        SpecimenOrObservationBase dnaSampleWithSequence = occurrenceService.load(dnaSampleWithSequenceUuid);
996
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
997

    
998
        assertNotNull(derivedUnit1);
999
        assertNotNull(derivedUnit2);
1000
        assertNotNull(tissue);
1001
        assertNotNull(dnaSample);
1002
        assertNotNull(taxon);
1003

    
1004
        // wildcard search => all derivates
1005
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1006
        config.setTitleSearchString("*");
1007
        assertEquals(5, occurrenceService.countOccurrences(config));
1008
        List<SpecimenOrObservationBase> allDerivates = occurrenceService.findByTitle(config).getRecords();
1009
        assertEquals(5, allDerivates.size());
1010
        assertTrue(allDerivates.contains(derivedUnit1));
1011
        assertTrue(allDerivates.contains(derivedUnit2));
1012
        assertTrue(allDerivates.contains(tissue));
1013
        assertTrue(allDerivates.contains(dnaSample));
1014

    
1015
        // queryString search => 2 derivates
1016
        config = new FindOccurrencesConfigurator();
1017
        config.setTitleSearchString("test*");
1018
        // config.setClazz(SpecimenOrObservationBase.class);
1019
        assertEquals(2, occurrenceService.countOccurrences(config));
1020
        List<SpecimenOrObservationBase> queryStringDerivates = occurrenceService.findByTitle(config).getRecords();
1021
        assertEquals(2, queryStringDerivates.size());
1022
        assertTrue(queryStringDerivates.contains(derivedUnit1));
1023
        assertTrue(queryStringDerivates.contains(derivedUnit2));
1024

    
1025
        // class search => 4 results
1026
        config = new FindOccurrencesConfigurator();
1027
        config.setClazz(SpecimenOrObservationBase.class);
1028
        assertEquals(5, occurrenceService.countOccurrences(config));
1029
        List<SpecimenOrObservationBase> specimenOrObservationBases = occurrenceService.findByTitle(config).getRecords();
1030
        assertEquals(5, specimenOrObservationBases.size());
1031

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

    
1039
        // class search => 4 results
1040
        config = new FindOccurrencesConfigurator();
1041
        config.setClazz(DerivedUnit.class);
1042
        assertEquals(5, occurrenceService.countOccurrences(config));
1043
        List<SpecimenOrObservationBase> derivedUnits = occurrenceService.findByTitle(config).getRecords();
1044
        assertEquals(5, derivedUnits.size());
1045
        assertTrue(derivedUnits.contains(derivedUnit1));
1046
        assertTrue(derivedUnits.contains(derivedUnit2));
1047
        assertTrue(derivedUnits.contains(tissue));
1048
        assertTrue(derivedUnits.contains(dnaSample));
1049

    
1050
        // significant identifier search
1051
        config = new FindOccurrencesConfigurator();
1052
        config.setClazz(DerivedUnit.class);
1053
        config.setSignificantIdentifier("ACC1");
1054
        assertEquals(2, occurrenceService.countOccurrences(config));
1055
        List<SpecimenOrObservationBase> accessionedUnits = occurrenceService.findByTitle(config).getRecords();
1056
        assertEquals(2, accessionedUnits.size());
1057
        assertTrue(accessionedUnits.contains(derivedUnit1));
1058
        assertFalse(accessionedUnits.contains(derivedUnit2));
1059
        assertFalse(accessionedUnits.contains(tissue));
1060
        assertTrue(accessionedUnits.contains(dnaSample));
1061

    
1062
        config = new FindOccurrencesConfigurator();
1063
        config.setClazz(DerivedUnit.class);
1064
        config.setSignificantIdentifier("ACC2");
1065
        assertEquals(1, occurrenceService.countOccurrences(config));
1066
        List<SpecimenOrObservationBase> barcodedUnits = occurrenceService.findByTitle(config).getRecords();
1067
        assertEquals(1, barcodedUnits.size());
1068
        assertFalse(barcodedUnits.contains(derivedUnit1));
1069
        assertTrue(barcodedUnits.contains(derivedUnit2));
1070
        assertFalse(barcodedUnits.contains(tissue));
1071
        assertFalse(barcodedUnits.contains(dnaSample));
1072

    
1073
        // recordBasis search => 1 Fossil
1074
        config = new FindOccurrencesConfigurator();
1075
        config.setSpecimenType(SpecimenOrObservationType.Fossil);
1076
        assertEquals(1, occurrenceService.countOccurrences(config));
1077
        List<SpecimenOrObservationBase> fossils = occurrenceService.findByTitle(config).getRecords();
1078
        assertEquals(1, fossils.size());
1079
        assertTrue(fossils.contains(derivedUnit1));
1080

    
1081
        // taxon determination search => 2 associated specimens
1082
        config = new FindOccurrencesConfigurator();
1083
        config.setClazz(DerivedUnit.class);
1084
        config.setAssociatedTaxonUuid(taxon.getUuid());
1085
        assertEquals(2, occurrenceService.countOccurrences(config));
1086
        List<SpecimenOrObservationBase> associatedSpecimens = occurrenceService.findByTitle(config).getRecords();
1087
        assertEquals(2, associatedSpecimens.size());
1088
        assertTrue(associatedSpecimens.contains(derivedUnit1));
1089
        assertTrue(associatedSpecimens.contains(tissue));
1090

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

    
1105
        // taxon association search
1106
        config = new FindOccurrencesConfigurator();
1107
        config.setClazz(SpecimenOrObservationBase.class);
1108
        config.setAssociatedTaxonUuid(taxon.getUuid());
1109
        assertEquals(2, occurrenceService.countOccurrences(config));
1110
        List<SpecimenOrObservationBase> specimensOrObservations = occurrenceService.findByTitle(config).getRecords();
1111
        assertEquals(2, specimensOrObservations.size());
1112
        assertTrue(specimensOrObservations.contains(tissue));
1113
        assertTrue(specimensOrObservations.contains(derivedUnit1));
1114

    
1115
        //test assignment status
1116
        //all specimen
1117
        config = new FindOccurrencesConfigurator();
1118
        config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
1119
        assertEquals(5, occurrenceService.countOccurrences(config));
1120
        List<SpecimenOrObservationBase> allSpecimens = occurrenceService.findByTitle(config).getRecords();
1121
        assertEquals(5, allSpecimens.size());
1122
        assertTrue(allSpecimens.contains(derivedUnit1));
1123
        assertTrue(allSpecimens.contains(derivedUnit2));
1124
        assertTrue(allSpecimens.contains(tissue));
1125
        assertTrue(allSpecimens.contains(dnaSample));
1126

    
1127
        //assigned specimen
1128
        config = new FindOccurrencesConfigurator();
1129
        config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
1130
        assertEquals(2, occurrenceService.countOccurrences(config));
1131
        List<SpecimenOrObservationBase> assignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1132
        assertEquals(2, assignedSpecimens.size());
1133
        assertTrue(assignedSpecimens.contains(derivedUnit1));
1134
        assertTrue(assignedSpecimens.contains(tissue));
1135

    
1136
        //unassigned specimen
1137
        config = new FindOccurrencesConfigurator();
1138
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1139
        assertEquals(3, occurrenceService.countOccurrences(config));
1140
        List<SpecimenOrObservationBase> unAssignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1141
        assertEquals(3, unAssignedSpecimens.size());
1142
        assertTrue(unAssignedSpecimens.contains(derivedUnit2));
1143
        assertTrue(unAssignedSpecimens.contains(dnaSample));
1144

    
1145
        //ignore assignment status because taxon uuid is set
1146
        config = new FindOccurrencesConfigurator();
1147
        config.setAssociatedTaxonUuid(taxon.getUuid());
1148
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1149
        assertEquals(2, occurrenceService.countOccurrences(config));
1150
        List<SpecimenOrObservationBase> ignoreAssignmentStatusSpecimens = occurrenceService.findByTitle(config).getRecords();
1151
        assertEquals(2, ignoreAssignmentStatusSpecimens.size());
1152
        assertTrue(ignoreAssignmentStatusSpecimens.contains(derivedUnit1));
1153
        assertTrue(ignoreAssignmentStatusSpecimens.contains(tissue));
1154

    
1155

    
1156

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

    
1159
        assertEquals(1, findByAccessionNumber.size());
1160
       // assertTrue(findByAccessionNumber.contains(derivedUnit1));
1161
        assertTrue(findByAccessionNumber.contains(dnaSampleWithSequence));
1162

    
1163

    
1164
    }
1165

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1484

    
1485
    }
1486

    
1487

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

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

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

    
1509

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

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

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

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

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

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

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

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

    
1594
      occurrenceService.save(derivedUnitDeterminationTaxon);
1595
      occurrenceService.save(derivedUnitDeterminationName);
1596
      occurrenceService.save(derivedUnitDeterminationSynonym);
1597
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1598
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1599
      occurrenceService.save(tissueUuidNoAssociation);
1600
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1601
      occurrenceService.save(fossilTypeDesignation);
1602

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

    
1611
      //TAXON
1612
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1613
      taxon.setUuid(taxonUuid);
1614

    
1615
      Classification classification = Classification.NewInstance("Test Classification");
1616
      TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1617
      taxonNode.setUuid(taxonNodeUuid);
1618

    
1619
      //SYNONYM
1620
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1621
      synonym.setUuid(synoymUuid);
1622
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1623

    
1624
      //IndividualsAssociation
1625
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1626
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1627
      association.setFeature(Feature.SPECIMEN());
1628
      taxonDescription.addElement(association);
1629
      taxon.addDescription(taxonDescription);
1630

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

    
1638
      //type designation
1639
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1640
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1641
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1642

    
1643
      classificationService.saveOrUpdate(classification);
1644
      taxonService.saveOrUpdate(taxon);
1645
      taxonNodeService.saveOrUpdate(taxonNode);
1646

    
1647
      commitAndStartNewTransaction(null);
1648

    
1649
      setComplete();
1650
      endTransaction();
1651

    
1652

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

    
1675
  }
1676
}
(16-16/37)