Project

General

Profile

Download (78.2 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.List;
20
import java.util.Set;
21
import java.util.UUID;
22

    
23
import org.apache.log4j.Logger;
24
import org.junit.Test;
25
import org.unitils.dbunit.annotation.DataSet;
26
import org.unitils.spring.annotation.SpringBeanByType;
27

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

    
68
/**
69
 * @author pplitzner
70
 \* @since 31.03.2014
71
 *
72
 */
73
public class OccurrenceServiceTest extends CdmTransactionalIntegrationTest {
74

    
75
    @SuppressWarnings("unused")
76
    private static final Logger logger = Logger.getLogger(OccurrenceServiceTest.class);
77

    
78
    @SpringBeanByType
79
    private IOccurrenceService occurrenceService;
80

    
81
    @SpringBeanByType
82
    private ISequenceService sequenceService;
83

    
84
    @SpringBeanByType
85
    private ITaxonService taxonService;
86

    
87
    @SpringBeanByType
88
    private INameService nameService;
89

    
90
    @SpringBeanByType
91
    private ITermService termService;
92

    
93
    @SpringBeanByType
94
    private IDescriptionService descriptionService;
95

    
96
    private Reference getReference() {
97
        Reference result = ReferenceFactory.newGeneric();
98
        result.setTitle("some generic reference");
99
        return result;
100
    }
101

    
102
    private Taxon getTaxon() {
103
        Reference sec = getReference();
104
        TaxonName name = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
105
        Taxon taxon = Taxon.NewInstance(name, sec);
106
        return taxon;
107

    
108
    }
109

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

    
120
        occurrenceService.saveOrUpdate(specimenA);
121
        occurrenceService.saveOrUpdate(specimenB);
122
        occurrenceService.saveOrUpdate(dnaSample);
123

    
124
        Person derivationActor = Person.NewTitledInstance("Derivation Actor");
125
        String derivationDescription = "Derivation Description";
126
        Institution derivationInstitution = Institution.NewInstance();
127
        TimePeriod derivationTimePeriod = TimePeriod.NewInstance(2015);
128

    
129
        DerivationEvent originalDerivedFromEvent = DerivationEvent.NewSimpleInstance(specimenA, dnaSample,
130
                DerivationEventType.DNA_EXTRACTION());
131

    
132
        originalDerivedFromEvent.setActor(derivationActor);
133
        originalDerivedFromEvent.setDescription(derivationDescription);
134
        originalDerivedFromEvent.setInstitution(derivationInstitution);
135
        originalDerivedFromEvent.setTimeperiod(derivationTimePeriod);
136

    
137
        occurrenceService.moveDerivate(specimenA, specimenB, dnaSample);
138
        assertTrue("DerivationEvent not removed from source!", specimenA.getDerivationEvents().isEmpty());
139
        assertEquals("DerivationEvent not moved to source!", 1, specimenB.getDerivationEvents().size());
140

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

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

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

    
161
    }
162

    
163
    @Test
164
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "../../database/BlankDataSet.xml")
165
    public void testMoveDerivateNoParent() {
166
        DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
167
        FieldUnit fieldUnit = FieldUnit.NewInstance();
168

    
169
        occurrenceService.saveOrUpdate(fieldUnit);
170
        occurrenceService.saveOrUpdate(derivedUnit);
171

    
172
        assertEquals("DerivationEvent not moved to source!", 0, fieldUnit.getDerivationEvents().size());
173
        occurrenceService.moveDerivate(null, fieldUnit, derivedUnit);
174
        assertEquals("DerivationEvent not moved to source!", 1, fieldUnit.getDerivationEvents().size());
175

    
176
        DerivationEvent derivationEvent = fieldUnit.getDerivationEvents().iterator().next();
177
        assertNull(derivationEvent.getType());
178

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

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

    
195
        occurrenceService.saveOrUpdate(dnaSampleA);
196
        occurrenceService.saveOrUpdate(dnaSampleB);
197
        sequenceService.saveOrUpdate(sequence);
198

    
199
        dnaSampleA.addSequence(sequence);
200

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

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

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

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

    
301
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
302
        // delete type specimen from type designation
303
        config.setDeleteFromTypeDesignation(true);
304
        occurrenceService.delete(typeSpecimen, config);
305
        assertTrue(((SpecimenTypeDesignation) typeDesignation).getTypeSpecimen() == null);
306

    
307
        // delete associated field unit from IndividualsAssociation
308
        config.setDeleteFromIndividualsAssociation(true);
309
        occurrenceService.delete(associatedFieldUnit, config);
310
        assertTrue(((IndividualsAssociation) descriptionElement).getAssociatedSpecimenOrObservation() == null);
311

    
312
    }
313

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

    
320
        FieldUnit fieldUnit = (FieldUnit) occurrenceService.load(UUID.fromString(fieldUnitUuid));
321
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(UUID.fromString(derivedUnitUuid));
322

    
323
        assertFalse(fieldUnit.getDerivationEvents().iterator().next().getDerivatives().isEmpty());
324
        assertTrue(derivedUnit.getDerivedFrom() != null);
325
    }
326

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

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

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

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

    
475
        DerivedUnit derivedUnit = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
476
        SpecimenDescription specimenDescription = (SpecimenDescription) descriptionService
477
                .load(specimenDescriptionUuid);
478

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

    
489
        assertNull(specimenDescription);
490
    }
491

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

    
551
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
552

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

    
560
        // allow deletion from TaxonDescription and deletion of child derivates
561
        config.setDeleteFromDescription(true);
562
        config.setDeleteChildren(true);
563
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
564
        assertTrue(deleteResult.toString(), deleteResult.isOk());
565
    }
566

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

    
622
        FieldUnit associatedFieldUnit = (FieldUnit) occurrenceService.load(fieldUnitUuid);
623
        TaxonDescription taxonDescription = (TaxonDescription) descriptionService.load(taxonDescriptionUuid);
624
        IndividualsAssociation individualsAssociation = (IndividualsAssociation) taxonDescription.getElements()
625
                .iterator().next();
626

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

    
635
        // allow deletion of individuals association
636
        config.setDeleteFromIndividualsAssociation(true);
637
        deleteResult = occurrenceService.isDeletable(associatedFieldUnit.getUuid(), config);
638
        assertTrue(deleteResult.toString(), deleteResult.isOk());
639

    
640
    }
641

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

    
692
        DerivedUnit typeSpecimen = (DerivedUnit) occurrenceService.load(derivedUnitUuid);
693

    
694
        // create name with type specimen
695
        IBotanicalName name = nameService.load(botanicalNameUuid);
696
        SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation) name.getTypeDesignations().iterator()
697
                .next();
698

    
699
        // add type designation to name
700
        name.addTypeDesignation(typeDesignation, false);
701

    
702
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
703
        DeleteResult deleteResult = null;
704

    
705
        // check deletion of specimen
706
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
707
        assertFalse(deleteResult.toString(), deleteResult.isOk());
708
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(typeDesignation));
709

    
710
        // allow deletion of type designation
711
        config.setDeleteFromTypeDesignation(true);
712

    
713
        deleteResult = occurrenceService.isDeletable(typeSpecimen.getUuid(), config);
714
        assertTrue(deleteResult.toString(), deleteResult.isOk());
715
    }
716

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

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

    
778
        // derivation events
779
        DerivationEvent fieldUnitToDerivedUnitEvent = fieldUnit.getDerivationEvents().iterator().next();
780
        DerivationEvent derivedUnitToDnaSampleEvent = derivedUnit.getDerivationEvents().iterator().next();
781

    
782
        SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
783

    
784
        DeleteResult deleteResult = null;
785
        // check deletion of DnaSample
786
        deleteResult = occurrenceService.isDeletable(dnaSample.getUuid(), config);
787
        assertTrue(deleteResult.toString(), deleteResult.isOk());
788

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

    
794
        // check deletion of fieldUnit
795
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
796
        assertFalse(deleteResult.toString(), deleteResult.isOk());
797
        assertTrue(deleteResult.toString(), deleteResult.getRelatedObjects().contains(fieldUnitToDerivedUnitEvent));
798

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

    
805
        // check deletion of fieldUnit
806
        config.setDeleteFromDescription(true);
807
        deleteResult = occurrenceService.isDeletable(fieldUnit.getUuid(), config);
808
        assertTrue(deleteResult.toString(), deleteResult.isOk());
809

    
810
    }
811

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

    
876
        assertNotNull(typeSpecimen);
877
        assertNotNull(associatedSpecimen);
878
        assertNotNull(unassociatedSpecimen);
879
        assertNotNull(taxon);
880

    
881
        //check association (IndividualsAssociations + TypeDesignations) specimen -> taxon (name)
882

    
883
        //unassociated specimen
884
        java.util.Collection<TaxonBase<?>> associatedTaxa = occurrenceService.listAssociatedTaxa(unassociatedSpecimen, null, null, null, null);
885
        assertNotNull(associatedTaxa);
886
        assertTrue(associatedTaxa.isEmpty());
887

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

    
894
        //associated specimen
895
        associatedTaxa = occurrenceService.listAssociatedTaxa(associatedSpecimen, null, null, null, null);
896
        assertNotNull(associatedTaxa);
897
        assertEquals(1, associatedTaxa.size());
898
        assertEquals(taxon, associatedTaxa.iterator().next());
899

    
900

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

    
909
    }
910

    
911
    @Test
912
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testFindOcurrences.xml")
913
    public void testFindOccurrences() {
914
        UUID derivedUnit1Uuid = UUID.fromString("843bc8c9-c0fe-4735-bf40-82f1996dcefb");
915
        UUID derivedUnit2Uuid = UUID.fromString("40cd9cb1-7c74-4e7d-a1f8-8a1e0314e940");
916
        UUID dnaSampleUuid = UUID.fromString("364969a6-2457-4e2e-ae1e-29a6fcaa741a");
917
        UUID tissueUuid = UUID.fromString("b608613c-1b5a-4882-8b14-d643b6fc5998");
918

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

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

    
986
        SpecimenOrObservationBase derivedUnit1 = occurrenceService.load(derivedUnit1Uuid);
987
        SpecimenOrObservationBase derivedUnit2 = occurrenceService.load(derivedUnit2Uuid);
988
        SpecimenOrObservationBase tissue = occurrenceService.load(tissueUuid);
989
        SpecimenOrObservationBase dnaSample = occurrenceService.load(dnaSampleUuid);
990
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
991

    
992
        assertNotNull(derivedUnit1);
993
        assertNotNull(derivedUnit2);
994
        assertNotNull(tissue);
995
        assertNotNull(dnaSample);
996
        assertNotNull(taxon);
997

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

    
1009
        // queryString search => 2 derivates
1010
        config = new FindOccurrencesConfigurator();
1011
        config.setTitleSearchString("test*");
1012
        // config.setClazz(SpecimenOrObservationBase.class);
1013
        assertEquals(2, occurrenceService.countOccurrences(config));
1014
        List<SpecimenOrObservationBase> queryStringDerivates = occurrenceService.findByTitle(config).getRecords();
1015
        assertEquals(2, 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(4, occurrenceService.countOccurrences(config));
1023
        List<SpecimenOrObservationBase> specimenOrObservationBases = occurrenceService.findByTitle(config).getRecords();
1024
        assertEquals(4, specimenOrObservationBases.size());
1025

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

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

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

    
1056
        config = new FindOccurrencesConfigurator();
1057
        config.setClazz(DerivedUnit.class);
1058
        config.setSignificantIdentifier("ACC2");
1059
        assertEquals(1, occurrenceService.countOccurrences(config));
1060
        List<SpecimenOrObservationBase> barcodedUnits = occurrenceService.findByTitle(config).getRecords();
1061
        assertEquals(1, barcodedUnits.size());
1062
        assertFalse(barcodedUnits.contains(derivedUnit1));
1063
        assertTrue(barcodedUnits.contains(derivedUnit2));
1064
        assertFalse(barcodedUnits.contains(tissue));
1065
        assertFalse(barcodedUnits.contains(dnaSample));
1066

    
1067
        // recordBasis search => 1 Fossil
1068
        config = new FindOccurrencesConfigurator();
1069
        config.setSpecimenType(SpecimenOrObservationType.Fossil);
1070
        assertEquals(1, occurrenceService.countOccurrences(config));
1071
        List<SpecimenOrObservationBase> fossils = occurrenceService.findByTitle(config).getRecords();
1072
        assertEquals(1, fossils.size());
1073
        assertTrue(fossils.contains(derivedUnit1));
1074

    
1075
        // taxon determination search => 2 associated specimens
1076
        config = new FindOccurrencesConfigurator();
1077
        config.setClazz(DerivedUnit.class);
1078
        config.setAssociatedTaxonUuid(taxon.getUuid());
1079
        assertEquals(2, occurrenceService.countOccurrences(config));
1080
        List<SpecimenOrObservationBase> associatedSpecimens = occurrenceService.findByTitle(config).getRecords();
1081
        assertEquals(2, associatedSpecimens.size());
1082
        assertTrue(associatedSpecimens.contains(derivedUnit1));
1083
        assertTrue(associatedSpecimens.contains(tissue));
1084

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

    
1099
        // taxon association search
1100
        config = new FindOccurrencesConfigurator();
1101
        config.setClazz(SpecimenOrObservationBase.class);
1102
        config.setAssociatedTaxonUuid(taxon.getUuid());
1103
        assertEquals(2, occurrenceService.countOccurrences(config));
1104
        List<SpecimenOrObservationBase> specimensOrObservations = occurrenceService.findByTitle(config).getRecords();
1105
        assertEquals(2, specimensOrObservations.size());
1106
        assertTrue(specimensOrObservations.contains(tissue));
1107
        assertTrue(specimensOrObservations.contains(derivedUnit1));
1108

    
1109
        //test assignment status
1110
        //all specimen
1111
        config = new FindOccurrencesConfigurator();
1112
        config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
1113
        assertEquals(4, occurrenceService.countOccurrences(config));
1114
        List<SpecimenOrObservationBase> allSpecimens = occurrenceService.findByTitle(config).getRecords();
1115
        assertEquals(4, allSpecimens.size());
1116
        assertTrue(allSpecimens.contains(derivedUnit1));
1117
        assertTrue(allSpecimens.contains(derivedUnit2));
1118
        assertTrue(allSpecimens.contains(tissue));
1119
        assertTrue(allSpecimens.contains(dnaSample));
1120

    
1121
        //assigned specimen
1122
        config = new FindOccurrencesConfigurator();
1123
        config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
1124
        assertEquals(2, occurrenceService.countOccurrences(config));
1125
        List<SpecimenOrObservationBase> assignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1126
        assertEquals(2, assignedSpecimens.size());
1127
        assertTrue(assignedSpecimens.contains(derivedUnit1));
1128
        assertTrue(assignedSpecimens.contains(tissue));
1129

    
1130
        //unassigned specimen
1131
        config = new FindOccurrencesConfigurator();
1132
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1133
        assertEquals(2, occurrenceService.countOccurrences(config));
1134
        List<SpecimenOrObservationBase> unAssignedSpecimens = occurrenceService.findByTitle(config).getRecords();
1135
        assertEquals(2, unAssignedSpecimens.size());
1136
        assertTrue(unAssignedSpecimens.contains(derivedUnit2));
1137
        assertTrue(unAssignedSpecimens.contains(dnaSample));
1138

    
1139
        //ignore assignment status because taxon uuid is set
1140
        config = new FindOccurrencesConfigurator();
1141
        config.setAssociatedTaxonUuid(taxon.getUuid());
1142
        config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
1143
        assertEquals(2, occurrenceService.countOccurrences(config));
1144
        List<SpecimenOrObservationBase> ignoreAssignmentStatusSpecimens = occurrenceService.findByTitle(config).getRecords();
1145
        assertEquals(2, ignoreAssignmentStatusSpecimens.size());
1146
        assertTrue(ignoreAssignmentStatusSpecimens.contains(derivedUnit1));
1147
        assertTrue(ignoreAssignmentStatusSpecimens.contains(tissue));
1148

    
1149

    
1150
    }
1151

    
1152
    /**
1153
     * This will test the retrieval of specimens that are in any way associated
1154
     * with a taxon resp. taxon name via type designation, determination event
1155
     * or individuals associations. It will also consider synonym relationships.
1156
     */
1157
    @Test
1158
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testAllKindsOfSpecimenAssociations.xml")
1159
    public void testAllKindsOfSpecimenAssociations() {
1160

    
1161
        /**
1162
         * Structure is as follows:
1163
         *
1164
         * Taxon ----IndividualsAssociation---> DnaSample
1165
         * Taxon ----TypeDesignation---> Fossil
1166
         * Taxon ----Determination ---> PreservedSpecimenA
1167
         *
1168
         * Taxon ---> Taxon Name ----Determination ---> PreservedSpecimenB
1169
         *
1170
         * Taxon ---> Synonym ---> SynonymName ----Determination---> PreservedSpecimenC
1171
         *
1172
         * Orphan Name (not associated with any taxon) ----Determination ---> PreservedSpecimenD
1173
         */
1174

    
1175
        //UUIDS
1176
        UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1177
        UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1178

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

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

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

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

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

    
1195
        //load cdm entities
1196
        DerivedUnit derivedUnitDeterminationTaxon = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationTaxonUuid);
1197
        DerivedUnit derivedUnitDeterminationName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationNameUuid);
1198
        DerivedUnit derivedUnitDeterminationSynonym = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymUuid);
1199
        DerivedUnit derivedUnitDeterminationSynonymName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationSynonymNameUuid);
1200
        DerivedUnit derivedUnitDeterminationOrphanName = (DerivedUnit) occurrenceService.load(derivedUnitDeterminationOrphanNameUuid);
1201
        DerivedUnit tissueUuidNoAssociation = (DerivedUnit) occurrenceService.load(tissueUuidNoAssociationUuid);
1202
        DnaSample dnaSampleUuidIndividualsAssociation = (DnaSample) occurrenceService.load(dnaSampleUuidIndividualsAssociationUuid);
1203
        DerivedUnit fossilTypeDesignation = (DerivedUnit) occurrenceService.load(fossilTypeDesignationUuid);
1204
        Taxon taxon = (Taxon) taxonService.load(taxonUuid);
1205
        Synonym synonym = (Synonym) taxonService.load(synoymUuid);
1206
        TaxonName taxonName = nameService.load(taxonNameUuid);
1207
        TaxonName synonymName = nameService.load(synonymNameUuid);
1208
        TaxonName orphanName = nameService.load(orphanNameUuid);
1209

    
1210
        //check initial state
1211
        assertNotNull(derivedUnitDeterminationTaxon);
1212
        assertNotNull(derivedUnitDeterminationName);
1213
        assertNotNull(derivedUnitDeterminationSynonym);
1214
        assertNotNull(derivedUnitDeterminationSynonymName);
1215
        assertNotNull(derivedUnitDeterminationOrphanName);
1216
        assertNotNull(tissueUuidNoAssociation);
1217
        assertNotNull(dnaSampleUuidIndividualsAssociation);
1218
        assertNotNull(fossilTypeDesignation);
1219
        assertNotNull(taxon);
1220
        assertNotNull(synonym);
1221
        assertNotNull(taxonName);
1222
        assertNotNull(synonymName);
1223
        assertNotNull(orphanName);
1224

    
1225
        /*
1226
         * search for taxon
1227
         * should retrieve all specimens associated via
1228
         *  - type designations (fossil)
1229
         *  - individuals associations (dnaSample)
1230
         *  - determinations on
1231
         *   - taxon (specimenA)
1232
         *   - taxon name (specimenA, specimenB)
1233
         *   - synonym names (specimenC)
1234
         */
1235
        FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
1236
        config.setAssociatedTaxonUuid(taxonUuid);
1237
        List<SpecimenOrObservationBase> specimens = occurrenceService.findByTitle(config).getRecords();
1238
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1239
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1240
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1241
        assertTrue(specimens.contains(dnaSampleUuidIndividualsAssociation));
1242
        assertTrue(specimens.contains(fossilTypeDesignation));
1243
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1244
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1245
        assertEquals("Wrong number of associated specimens", 5, specimens.size());
1246

    
1247
        /*
1248
         * search for taxon name
1249
         * should retrieve all specimens associated via
1250
         *  - determinations on
1251
         *   - taxon name (specimenA, specimenB)
1252
         */
1253
        config = new FindOccurrencesConfigurator();
1254
        config.setAssociatedTaxonNameUuid(taxonNameUuid);
1255
        specimens = occurrenceService.findByTitle(config).getRecords();
1256
        assertTrue(specimens.contains(derivedUnitDeterminationName));
1257
        assertTrue(specimens.contains(derivedUnitDeterminationTaxon));
1258
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1259
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1260
        assertTrue(!specimens.contains(fossilTypeDesignation));
1261
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1262
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1263
        assertEquals("Wrong number of associated specimens", 2, specimens.size());
1264

    
1265
        /*
1266
         * search for synonym name
1267
         * should retrieve all specimens associated via
1268
         *  - determinations on
1269
         *   - synonym names (specimenC)
1270
         */
1271
        config = new FindOccurrencesConfigurator();
1272
        config.setAssociatedTaxonNameUuid(synonymNameUuid);
1273
        specimens = occurrenceService.findByTitle(config).getRecords();
1274
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1275
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1276
        assertTrue(specimens.contains(derivedUnitDeterminationSynonymName));
1277
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1278
        assertTrue(!specimens.contains(fossilTypeDesignation));
1279
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1280
        assertTrue(!specimens.contains(derivedUnitDeterminationOrphanName));
1281
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1282

    
1283
        /*
1284
         * search for orphan name
1285
         * should retrieve all specimens associated via
1286
         *  - determinations on
1287
         *   - taxon name (specimenD)
1288
         */
1289
        config = new FindOccurrencesConfigurator();
1290
        config.setAssociatedTaxonNameUuid(orphanNameUuid);
1291
        specimens = occurrenceService.findByTitle(config).getRecords();
1292
        assertTrue(!specimens.contains(derivedUnitDeterminationName));
1293
        assertTrue(!specimens.contains(derivedUnitDeterminationTaxon));
1294
        assertTrue(!specimens.contains(derivedUnitDeterminationSynonymName));
1295
        assertTrue(!specimens.contains(dnaSampleUuidIndividualsAssociation));
1296
        assertTrue(!specimens.contains(fossilTypeDesignation));
1297
        assertTrue(!specimens.contains(tissueUuidNoAssociation));
1298
        assertTrue(specimens.contains(derivedUnitDeterminationOrphanName));
1299
        assertEquals("Wrong number of associated specimens", 1, specimens.size());
1300

    
1301
        //        //DERIVATIVES
1302
        //        //determination: taxon
1303
        //        DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1304
        //        derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1305
        //        //determination: taxon name
1306
        //        DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1307
        //        derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1308
        //        //determination: synonym
1309
        //        DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1310
        //        derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1311
        //        //determination: synonym name
1312
        //        DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1313
        //        derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1314
        //        //determination: orphan name
1315
        //        DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1316
        //        derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1317
        //        //no association
1318
        //        DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1319
        //        tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1320
        //        //individuals association with taxon
1321
        //        DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1322
        //        dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1323
        //        //type specimen of taxon
1324
        //        DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1325
        //        fossilTypeDesignation.setTitleCache("Fossil with type designation");
1326
        //
1327
        //        derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1328
        //        derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1329
        //        derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1330
        //        derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1331
        //        derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1332
        //        tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1333
        //        dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1334
        //        fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1335
        //
1336
        //        occurrenceService.save(derivedUnitDeterminationTaxon);
1337
        //        occurrenceService.save(derivedUnitDeterminationName);
1338
        //        occurrenceService.save(derivedUnitDeterminationSynonym);
1339
        //        occurrenceService.save(derivedUnitDeterminationSynonymName);
1340
        //        occurrenceService.save(derivedUnitDeterminationOrphanName);
1341
        //        occurrenceService.save(tissueUuidNoAssociation);
1342
        //        occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1343
        //        occurrenceService.save(fossilTypeDesignation);
1344
        //
1345
        //        //NAMES
1346
        //        BotanicalName taxonName = BotanicalName.PARSED_NAME("Campanula patual");
1347
        //        BotanicalName synonymName = BotanicalName.PARSED_NAME("Syno nyma");
1348
        //        BotanicalName orphanName = BotanicalName.PARSED_NAME("Orphanus lonelia");
1349
        //        taxonName.setUuid(taxonNameUuid);
1350
        //        synonymName.setUuid(synonymNameUuid);
1351
        //        orphanName.setUuid(orphanNameUuid);
1352
        //
1353
        //        //TAXON
1354
        //        Taxon taxon = Taxon.NewInstance(taxonName, null);
1355
        //        taxon.setUuid(taxonUuid);
1356
        //
1357
        //        //SYNONYM
1358
        //        Synonym synonym = Synonym.NewInstance(synonymName, null);
1359
        //        synonym.setUuid(synoymUuid);
1360
        //        taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1361
        //
1362
        //        //IndividualsAssociation
1363
        //        TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1364
        //        IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1365
        //        association.setFeature(Feature.SPECIMEN());
1366
        //        taxonDescription.addElement(association);
1367
        //        taxon.addDescription(taxonDescription);
1368
        //
1369
        //        //DETERMINATION EVENTS
1370
        //        DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1371
        //        DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1372
        ////        DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1373
        //        DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1374
        //        DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1375
        //
1376
        //        //type designation
1377
        //        SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1378
        //        specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1379
        //        taxonName.addTypeDesignation(specimenTypeDesignation, false);
1380
        //
1381
        //        taxonService.saveOrUpdate(taxon);
1382
        //
1383
        //        commitAndStartNewTransaction(null);
1384
        //
1385
        //        setComplete();
1386
        //        endTransaction();
1387
        //
1388
        //
1389
        //        try {
1390
        //            writeDbUnitDataSetFile(new String[] {
1391
        //                    "SpecimenOrObservationBase",
1392
        //                    "SpecimenOrObservationBase_DerivationEvent",
1393
        //                    "DerivationEvent",
1394
        //                    "DescriptionElementBase",
1395
        //                    "DescriptionBase",
1396
        //                    "TaxonBase",
1397
        //                    "TypeDesignationBase",
1398
        //                    "TaxonName",
1399
        //                    "TaxonName_TypeDesignationBase",
1400
        //                    "HomotypicalGroup",
1401
        //                    "TeamOrPersonBase",
1402
        //                    "DeterminationEvent"
1403
        //            }, "testAllKindsOfSpecimenAssociations");
1404
        //        } catch (FileNotFoundException e) {
1405
        //            e.printStackTrace();
1406
        //        }
1407

    
1408

    
1409
    }
1410

    
1411
    @Test
1412
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "OccurrenceServiceTest.testDnaSampleDesignation.xml")
1413
    public void testDnaSampleDesignation(){
1414
        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1415

    
1416
        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1417
        DnaSample dnaSample = HibernateProxyHelper.deproxy(occurrenceService.load(dnaSampleUuid), DnaSample.class);
1418
        assertEquals(1, dnaSample.getIdentifiers().size());
1419
        Identifier<?> identifier = dnaSample.getIdentifiers().iterator().next();
1420
        assertEquals("NK 2088", identifier.getIdentifier());
1421
        assertEquals(sampleDesignationTermType, identifier.getType());
1422

    
1423
        //change identifier, save and reload
1424
        identifier.setIdentifier("WB10");
1425
        occurrenceService.saveOrUpdate(dnaSample);
1426
        SpecimenOrObservationBase<?> dnaSampleReloaded = occurrenceService.load(dnaSampleUuid);
1427
        assertEquals(1, dnaSample.getIdentifiers().size());
1428
        Identifier<?> identifierReloaded = dnaSample.getIdentifiers().iterator().next();
1429
        assertEquals("WB10", identifierReloaded.getIdentifier());
1430
        assertEquals(sampleDesignationTermType, identifierReloaded.getType());
1431

    
1432

    
1433
//        DefinedTerm sampleDesignationTermType = (DefinedTerm) termService.load(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"));
1434
//        //UUIDS
1435
//        UUID dnaSampleUuid = UUID.fromString("4bee91b9-23d8-438b-8569-6d6aaa5b6587");
1436
//        DerivedUnit dnaSample = DnaSample.NewInstance();
1437
//        dnaSample.setUuid(dnaSampleUuid);
1438
//        Identifier.NewInstance(dnaSample, "NK 2088", sampleDesignationTermType);
1439
//
1440
//        occurrenceService.save(dnaSample);
1441
//
1442
//        commitAndStartNewTransaction(null);
1443
//
1444
//        setComplete();
1445
//        endTransaction();
1446
//
1447
//
1448
//        try {
1449
//            writeDbUnitDataSetFile(new String[] {
1450
//                    "SpecimenOrObservationBase",
1451
//                    "IDENTIFIER",
1452
//                    "SpecimenOrObservationBase_Identifier"
1453
//            }, "testDnaSampleDesignation");
1454
//        } catch (FileNotFoundException e) {
1455
//            e.printStackTrace();
1456
//        }
1457
    }
1458
    @Override
1459
//  @Test
1460
  public void createTestDataSet() throws FileNotFoundException {
1461
      //UUIDS
1462
      UUID derivedUnitDeterminationTaxonUuid = UUID.fromString("941b8b22-1925-4b91-8ff8-97114499bb22");
1463
      UUID derivedUnitDeterminationNameUuid = UUID.fromString("0cdc7a57-6f55-45c8-b3e5-523748c381e7");
1464

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

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

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

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

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

    
1481
      //DERIVATIVES
1482
      //determination: taxon
1483
      DerivedUnit derivedUnitDeterminationTaxon = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1484
      derivedUnitDeterminationTaxon.setTitleCache("Derived Unit determined as taxon");
1485
      //determination: taxon name
1486
      DerivedUnit derivedUnitDeterminationName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1487
      derivedUnitDeterminationName.setTitleCache("Derived Unit determined as name");
1488
      //determination: synonym
1489
      DerivedUnit derivedUnitDeterminationSynonym = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1490
      derivedUnitDeterminationSynonym.setTitleCache("Derived Unit determined as synonym");
1491
      //determination: synonym name
1492
      DerivedUnit derivedUnitDeterminationSynonymName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1493
      derivedUnitDeterminationSynonymName.setTitleCache("Derived Unit determined as synonym name");
1494
      //determination: orphan name
1495
      DerivedUnit derivedUnitDeterminationOrphanName = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
1496
      derivedUnitDeterminationOrphanName.setTitleCache("Derived Unit determined as orphan name");
1497
      //no association
1498
      DerivedUnit tissueUuidNoAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.TissueSample);
1499
      tissueUuidNoAssociation.setTitleCache("tissue sample no association");
1500
      //individuals association with taxon
1501
      DerivedUnit dnaSampleUuidIndividualsAssociation = DerivedUnit.NewInstance(SpecimenOrObservationType.DnaSample);
1502
      dnaSampleUuidIndividualsAssociation.setTitleCache("dna associated via IndividualsAssociation");
1503
      //type specimen of taxon
1504
      DerivedUnit fossilTypeDesignation = DerivedUnit.NewInstance(SpecimenOrObservationType.Fossil);
1505
      fossilTypeDesignation.setTitleCache("Fossil with type designation");
1506

    
1507
      derivedUnitDeterminationTaxon.setUuid(derivedUnitDeterminationTaxonUuid);
1508
      derivedUnitDeterminationName.setUuid(derivedUnitDeterminationNameUuid);
1509
      derivedUnitDeterminationSynonym.setUuid(derivedUnitDeterminationSynonymUuid);
1510
      derivedUnitDeterminationSynonymName.setUuid(derivedUnitDeterminationSynonymNameUuid);
1511
      derivedUnitDeterminationOrphanName.setUuid(derivedUnitDeterminationOrphanNameUuid);
1512
      tissueUuidNoAssociation.setUuid(tissueUuidNoAssociationUuid);
1513
      dnaSampleUuidIndividualsAssociation.setUuid(dnaSampleUuidIndividualsAssociationUuid);
1514
      fossilTypeDesignation.setUuid(fossilTypeDesignationUuid);
1515

    
1516
      occurrenceService.save(derivedUnitDeterminationTaxon);
1517
      occurrenceService.save(derivedUnitDeterminationName);
1518
      occurrenceService.save(derivedUnitDeterminationSynonym);
1519
      occurrenceService.save(derivedUnitDeterminationSynonymName);
1520
      occurrenceService.save(derivedUnitDeterminationOrphanName);
1521
      occurrenceService.save(tissueUuidNoAssociation);
1522
      occurrenceService.save(dnaSampleUuidIndividualsAssociation);
1523
      occurrenceService.save(fossilTypeDesignation);
1524

    
1525
      //NAMES
1526
      TaxonName taxonName = TaxonNameFactory.PARSED_BOTANICAL("Campanula patual");
1527
      TaxonName synonymName = TaxonNameFactory.PARSED_BOTANICAL("Syno nyma");
1528
      TaxonName orphanName = TaxonNameFactory.PARSED_BOTANICAL("Orphanus lonelia");
1529
      taxonName.setUuid(taxonNameUuid);
1530
      synonymName.setUuid(synonymNameUuid);
1531
      orphanName.setUuid(orphanNameUuid);
1532

    
1533
      //TAXON
1534
      Taxon taxon = Taxon.NewInstance(taxonName, null);
1535
      taxon.setUuid(taxonUuid);
1536

    
1537
      //SYNONYM
1538
      Synonym synonym = Synonym.NewInstance(synonymName, null);
1539
      synonym.setUuid(synoymUuid);
1540
      taxon.addSynonym(synonym, SynonymType.HOMOTYPIC_SYNONYM_OF());
1541

    
1542
      //IndividualsAssociation
1543
      TaxonDescription taxonDescription = TaxonDescription.NewInstance();
1544
      IndividualsAssociation association = IndividualsAssociation.NewInstance(dnaSampleUuidIndividualsAssociation);
1545
      association.setFeature(Feature.SPECIMEN());
1546
      taxonDescription.addElement(association);
1547
      taxon.addDescription(taxonDescription);
1548

    
1549
      //DETERMINATION EVENTS
1550
      DeterminationEvent.NewInstance(taxon, derivedUnitDeterminationTaxon);
1551
      DeterminationEvent.NewInstance(taxonName, derivedUnitDeterminationName);
1552
//      DeterminationEvent.NewInstance(synonym, derivedUnitDeterminationSynonym);//TODO determinationa on synonym not possible?
1553
      DeterminationEvent.NewInstance(synonymName, derivedUnitDeterminationSynonymName);
1554
      DeterminationEvent.NewInstance(orphanName, derivedUnitDeterminationOrphanName);
1555

    
1556
      //type designation
1557
      SpecimenTypeDesignation specimenTypeDesignation = SpecimenTypeDesignation.NewInstance();
1558
      specimenTypeDesignation.setTypeSpecimen(fossilTypeDesignation);
1559
      taxonName.addTypeDesignation(specimenTypeDesignation, false);
1560

    
1561
      taxonService.saveOrUpdate(taxon);
1562

    
1563
      commitAndStartNewTransaction(null);
1564

    
1565
      setComplete();
1566
      endTransaction();
1567

    
1568

    
1569
      try {
1570
          writeDbUnitDataSetFile(new String[] {
1571
                  "SpecimenOrObservationBase",
1572
                  "SpecimenOrObservationBase_DerivationEvent",
1573
                  "DerivationEvent",
1574
                  "DescriptionElementBase",
1575
                  "DescriptionBase",
1576
                  "TaxonBase",
1577
                  "TypeDesignationBase",
1578
                  "TaxonName",
1579
                  "TaxonName_TypeDesignationBase",
1580
                  "HomotypicalGroup",
1581
                  "TeamOrPersonBase",
1582
                  "DeterminationEvent"
1583
          }, "testAllKindsOfSpecimenAssociations");
1584
      } catch (FileNotFoundException e) {
1585
          e.printStackTrace();
1586
      }
1587

    
1588
  }
1589
}
(16-16/35)