Project

General

Profile

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

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

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

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

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

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

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

    
81
    @SpringBeanByType
82
    private IOccurrenceService occurrenceService;
83

    
84
    @SpringBeanByType
85
    private ISequenceService sequenceService;
86

    
87
    @SpringBeanByType
88
    private ITaxonService taxonService;
89

    
90
    @SpringBeanByType
91
    private ITaxonNodeService taxonNodeService;
92

    
93
    @SpringBeanByType
94
    private IClassificationService classificationService;
95

    
96
    @SpringBeanByType
97
    private INameService nameService;
98

    
99
    @SpringBeanByType
100
    private ITermService termService;
101

    
102
    @SpringBeanByType
103
    private IDescriptionService descriptionService;
104

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

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

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

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

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

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

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

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

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

    
156
    }
157

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

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

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

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

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

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

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

    
194
        dnaSampleA.addSequence(sequence);
195

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

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

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

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

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

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

    
308
    }
309

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

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

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

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

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

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

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

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

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

    
485
        assertNull(specimenDescription);
486
    }
487

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

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

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

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

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

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

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

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

    
636
    }
637

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

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

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

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

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

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

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

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

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

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

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

    
778
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
779

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

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

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

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

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

    
806
    }
807

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

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

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

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

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

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

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

    
904
    }
905

    
906
    @Test
907
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testFindOcurrences.xml")
908
    public void testFindOccurrences() {
909
        UUID derivedUnit1Uuid = UUID.fromString("843bc8c9-c0fe-4735-bf40-82f1996dcefb");
910
        UUID derivedUnit2Uuid = UUID.fromString("40cd9cb1-7c74-4e7d-a1f8-8a1e0314e940");
911
        UUID dnaSampleUuid = UUID.fromString("364969a6-2457-4e2e-ae1e-29a6fcaa741a");
912
        UUID dnaSampleWithSequenceUuid = UUID.fromString("571d4e9a-0736-4da3-ad4a-a2df427a1f01");
913
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
914

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

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

    
982
        SpecimenOrObservationBase<?> derivedUnit1 = occurrenceService.load(derivedUnit1Uuid);
983
        SpecimenOrObservationBase<?> derivedUnit2 = occurrenceService.load(derivedUnit2Uuid);
984
        SpecimenOrObservationBase<?> tissue = occurrenceService.load(tissueUuid);
985
        SpecimenOrObservationBase<?> dnaSample = occurrenceService.load(dnaSampleUuid);
986
        DerivedUnit dnaSampleWithSequence = (DerivedUnit) occurrenceService.load(dnaSampleWithSequenceUuid);
987
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
988

    
989

    
990
        assertNotNull(derivedUnit1);
991
        assertNotNull(derivedUnit2);
992
        assertNotNull(tissue);
993
        assertNotNull(dnaSample);
994
        assertNotNull(taxon);
995

    
996
        // wildcard search => all derivates
997
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
998
        config.setTitleSearchString("*");
999
        assertEquals(6, occurrenceService.countOccurrences(config));
1000
        @SuppressWarnings("rawtypes")
1001
        List<SpecimenOrObservationBase> allDerivates = occurrenceService.findByTitle(config).getRecords();
1002
        assertEquals(6, allDerivates.size());
1003
        assertTrue(allDerivates.contains(derivedUnit1));
1004
        assertTrue(allDerivates.contains(derivedUnit2));
1005
        assertTrue(allDerivates.contains(tissue));
1006
        assertTrue(allDerivates.contains(dnaSample));
1007

    
1008
        // queryString search => 2 derivates
1009
        config = new FindOccurrencesConfigurator();
1010
        config.setTitleSearchString("test*");
1011
        // config.setClazz(SpecimenOrObservationBase.class);
1012
        assertEquals(3, occurrenceService.countOccurrences(config));
1013
        @SuppressWarnings("rawtypes")
1014
        List<SpecimenOrObservationBase> queryStringDerivates = occurrenceService.findByTitle(config).getRecords();
1015
        assertEquals(3, queryStringDerivates.size());
1016
        assertTrue(queryStringDerivates.contains(derivedUnit1));
1017
        assertTrue(queryStringDerivates.contains(derivedUnit2));
1018

    
1019
        // class search => 4 results
1020
        config = new FindOccurrencesConfigurator();
1021
        config.setClazz(SpecimenOrObservationBase.class);
1022
        assertEquals(6, occurrenceService.countOccurrences(config));
1023
        @SuppressWarnings("rawtypes")
1024
        List<SpecimenOrObservationBase> specimenOrObservationBases = occurrenceService.findByTitle(config).getRecords();
1025
        assertEquals(6, specimenOrObservationBases.size());
1026

    
1027
        // class search => 0 results
1028
        config = new FindOccurrencesConfigurator();
1029
        config.setClazz(FieldUnit.class);
1030
        assertEquals(1, occurrenceService.countOccurrences(config));
1031
        @SuppressWarnings("rawtypes")
1032
        List<SpecimenOrObservationBase> fieldUnits = occurrenceService.findByTitle(config).getRecords();
1033
        assertEquals(1, fieldUnits.size());
1034

    
1035
        // class search => 4 results
1036
        config = new FindOccurrencesConfigurator();
1037
        config.setClazz(DerivedUnit.class);
1038
        assertEquals(5, occurrenceService.countOccurrences(config));
1039
        @SuppressWarnings("rawtypes")
1040
        List<SpecimenOrObservationBase> derivedUnits = occurrenceService.findByTitle(config).getRecords();
1041
        assertEquals(5, derivedUnits.size());
1042
        assertTrue(derivedUnits.contains(derivedUnit1));
1043
        assertTrue(derivedUnits.contains(derivedUnit2));
1044
        assertTrue(derivedUnits.contains(tissue));
1045
        assertTrue(derivedUnits.contains(dnaSample));
1046

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

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

    
1072
        // recordBasis search => 1 Fossil
1073
        config = new FindOccurrencesConfigurator();
1074
        config.setSpecimenType(SpecimenOrObservationType.Fossil);
1075
        assertEquals(1, occurrenceService.countOccurrences(config));
1076
        @SuppressWarnings("rawtypes")
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
        @SuppressWarnings("rawtypes")
1087
        List<SpecimenOrObservationBase> associatedSpecimens = occurrenceService.findByTitle(config).getRecords();
1088
        assertEquals(2, associatedSpecimens.size());
1089
        assertTrue(associatedSpecimens.contains(derivedUnit1));
1090
        assertTrue(associatedSpecimens.contains(tissue));
1091

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

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

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

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

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

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

    
1162
        FieldUnitDTO findByAccessionNumber = occurrenceService.findByAccessionNumber("ACC_DNA",  null);
1163

    
1164
        assertNotNull(findByAccessionNumber);
1165
        assertTrue(findByAccessionNumber.getDerivatives().size() == 1);
1166
       // assertTrue(findByAccessionNumber.contains(derivedUnit1));
1167
       // assertTrue(findByAccessionNumber.get(0).get.equals(dnaSampleWithSequence));
1168
    }
1169

    
1170

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1512
//        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1513
//        //UUIDS
1514
//        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1515
//        DerivedUnit dnaSample = DnaSample.NewInstance();
1516
//        dnaSample.setUuid(dnaSampleUuid);
1517
//        Identifier.NewInstance(dnaSample, "NK 2088", sampleDesignationTermType);
1518
//
1519
//        occurrenceService.save(dnaSample);
1520
//
1521
//        commitAndStartNewTransaction(null);
1522
//
1523
//        setComplete();
1524
//        endTransaction();
1525
//
1526
//
1527
//        try {
1528
//            writeDbUnitDataSetFile(new String[] {
1529
//                    "SpecimenOrObservationBase",
1530
//                    "IDENTIFIER",
1531
//                    "SpecimenOrObservationBase_Identifier"
1532
//            }, "testDnaSampleDesignation");
1533
//        } catch (FileNotFoundException e) {
1534
//            e.printStackTrace();
1535
//        }
1536
    }
1537

    
1538
    @Override
1539
//  @Test
1540
  public void createTestDataSet() throws FileNotFoundException {
1541
      //UUIDS
1542
      UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1543
      UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1544

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

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

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

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

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

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

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

    
1597
      occurrenceService.save(derivedUnitDeterminationTaxon);
1598
      occurrenceService.save(derivedUnitDeterminationName);
1599
      occurrenceService.save(derivedUnitDeterminationSynonym);
1600
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1601
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1602
      occurrenceService.save(tissueUuidNoAssociation);
1603
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1604
      occurrenceService.save(fossilTypeDesignation);
1605

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

    
1614
      //TAXON
1615
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1616
      taxon.setUuid(taxonUuid);
1617

    
1618
      Classification classification = Classification.NewInstance("Test Classification");
1619
      TaxonNode taxonNode = classification.addChildTaxon(taxon, null, null);
1620
      taxonNode.setUuid(taxonNodeUuid);
1621

    
1622
      //SYNONYM
1623
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1624
      synonym.setUuid(synoymUuid);
1625
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1626

    
1627
      //IndividualsAssociation
1628
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1629
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1630
      association.setFeature(Feature.SPECIMEN());
1631
      taxonDescription.addElement(association);
1632
      taxon.addDescription(taxonDescription);
1633

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

    
1641
      //type designation
1642
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1643
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1644
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1645

    
1646
      classificationService.saveOrUpdate(classification);
1647
      taxonService.saveOrUpdate(taxon);
1648
      taxonNodeService.saveOrUpdate(taxonNode);
1649

    
1650
      commitAndStartNewTransaction(null);
1651

    
1652
      setComplete();
1653
      endTransaction();
1654

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