3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.api
.service
;
12 import static org
.junit
.Assert
.assertEquals
;
13 import static org
.junit
.Assert
.assertFalse
;
14 import static org
.junit
.Assert
.assertNotNull
;
15 import static org
.junit
.Assert
.assertTrue
;
17 import java
.io
.FileNotFoundException
;
18 import java
.util
.UUID
;
20 import org
.apache
.log4j
.Logger
;
21 import org
.junit
.Test
;
22 import org
.unitils
.dbunit
.annotation
.DataSet
;
23 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
25 import eu
.etaxonomy
.cdm
.api
.service
.config
.SpecimenDeleteConfigurator
;
26 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
27 import eu
.etaxonomy
.cdm
.model
.molecular
.AmplificationResult
;
28 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
29 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
30 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
31 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
32 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
33 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldUnit
;
35 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
36 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
37 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
38 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
45 public class OccurrenceServiceDeepDeleteTest
extends CdmTransactionalIntegrationTest
{
47 private final UUID FIELD_UNIT_UUID
= UUID
.fromString("b5f58da5-4442-4001-9d13-33f41518b72a");
48 private final UUID DERIVED_UNIT_UUID
= UUID
.fromString("448be6e7-f19c-4a10-9a0a-97aa005f817d");
49 private final UUID DNA_SAMPLE_UUID
= UUID
.fromString("bee4212b-aff1-484e-845f-065c7d6216af");
50 private final UUID SEQUENCE_UUID
= UUID
.fromString("0b867369-de8c-4837-a708-5b7d9f6091be");
52 @SuppressWarnings("unused")
53 private static final Logger logger
= Logger
.getLogger(OccurrenceServiceDeepDeleteTest
.class);
56 private IOccurrenceService occurrenceService
;
59 private ISequenceService sequenceService
;
62 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="OccurrenceServiceTest.testDeleteDerivateHierarchyStepByStep.xml")
63 public void testDeepDelete_FieldUnit(){
66 String assertMessage
= "Incorrect number of specimens after deletion.";
67 DeleteResult deleteResult
= null;
68 SpecimenDeleteConfigurator config
= new SpecimenDeleteConfigurator();
69 config
.setDeleteMolecularData(true);
70 config
.setDeleteChildren(true);
72 FieldUnit fieldUnit
= (FieldUnit
) occurrenceService
.load(FIELD_UNIT_UUID
);
73 DnaSample dnaSample
= (DnaSample
) occurrenceService
.load(DNA_SAMPLE_UUID
);
76 assertEquals(assertMessage
, 3, occurrenceService
.count(SpecimenOrObservationBase
.class));
77 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
78 assertEquals(assertMessage
, 2, occurrenceService
.count(DerivedUnit
.class));
79 assertEquals(assertMessage
, 1, occurrenceService
.count(DnaSample
.class));
80 assertEquals("incorrect number of amplification results", 1, dnaSample
.getAmplificationResults().size());
81 assertEquals("number of sequences incorrect", 1, dnaSample
.getSequences().size());
82 assertEquals("incorrect number of single reads", 1, dnaSample
.getAmplificationResults().iterator().next().getSingleReads().size());
85 deleteResult
= occurrenceService
.deleteDerivateHierarchy(fieldUnit
, config
);
86 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
87 assertEquals(assertMessage
, 0, occurrenceService
.count(SpecimenOrObservationBase
.class));
88 assertEquals(assertMessage
, 0, occurrenceService
.count(FieldUnit
.class));
89 assertEquals(assertMessage
, 0, occurrenceService
.count(DerivedUnit
.class));
90 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
94 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
95 public void testDeepDelete_DerivedUnit(){
96 String assertMessage
= "Incorrect number of specimens after deletion.";
97 DeleteResult deleteResult
= null;
98 SpecimenDeleteConfigurator config
= new SpecimenDeleteConfigurator();
99 config
.setDeleteMolecularData(true);
100 config
.setDeleteChildren(true);
102 DerivedUnit derivedUnit
= (DerivedUnit
) occurrenceService
.load(DERIVED_UNIT_UUID
);
103 DnaSample dnaSample
= (DnaSample
) occurrenceService
.load(DNA_SAMPLE_UUID
);
105 //check initial state
106 assertEquals(assertMessage
, 3, occurrenceService
.count(SpecimenOrObservationBase
.class));
107 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
108 assertEquals(assertMessage
, 2, occurrenceService
.count(DerivedUnit
.class));
109 assertEquals(assertMessage
, 1, occurrenceService
.count(DnaSample
.class));
110 assertEquals("incorrect number of amplification results", 1, dnaSample
.getAmplificationResults().size());
111 assertEquals("number of sequences incorrect", 1, dnaSample
.getSequences().size());
112 assertEquals("incorrect number of single reads", 1, dnaSample
.getAmplificationResults().iterator().next().getSingleReads().size());
114 //delete derived unit
115 deleteResult
= occurrenceService
.deleteDerivateHierarchy(derivedUnit
, config
);
116 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
117 assertEquals(assertMessage
, 1, occurrenceService
.count(SpecimenOrObservationBase
.class));
118 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
119 assertEquals(assertMessage
, 0, occurrenceService
.count(DerivedUnit
.class));
120 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
124 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
125 public void testDeepDelete_DnaSample(){
126 String assertMessage
= "Incorrect number of specimens after deletion.";
127 DeleteResult deleteResult
= null;
128 SpecimenDeleteConfigurator config
= new SpecimenDeleteConfigurator();
129 config
.setDeleteMolecularData(true);
130 config
.setDeleteChildren(true);
132 DnaSample dnaSample
= (DnaSample
) occurrenceService
.load(DNA_SAMPLE_UUID
);
134 //check initial state
135 assertEquals(assertMessage
, 3, occurrenceService
.count(SpecimenOrObservationBase
.class));
136 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
137 assertEquals(assertMessage
, 2, occurrenceService
.count(DerivedUnit
.class));
138 assertEquals(assertMessage
, 1, occurrenceService
.count(DnaSample
.class));
139 assertEquals("incorrect number of amplification results", 1, dnaSample
.getAmplificationResults().size());
140 assertEquals("number of sequences incorrect", 1, dnaSample
.getSequences().size());
141 assertEquals("incorrect number of single reads", 1, dnaSample
.getAmplificationResults().iterator().next().getSingleReads().size());
144 deleteResult
= occurrenceService
.deleteDerivateHierarchy(dnaSample
, config
);
145 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
146 assertEquals(assertMessage
, 2, occurrenceService
.count(SpecimenOrObservationBase
.class));
147 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
148 assertEquals(assertMessage
, 1, occurrenceService
.count(DerivedUnit
.class));
149 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
154 @DataSet(value
="OccurrenceServiceDeepDeleteTest.testDeleteStepByStep.xml", loadStrategy
=CleanSweepInsertLoadStrategy
.class)
155 public void testDeleteDerivateHierarchyStepByStep(){
156 UUID fieldUnitUuid
= UUID
.fromString("4d91a9bc-2af7-40f8-b6e6-545305301807");
157 UUID derivedUnitUuid
= UUID
.fromString("f9c57904-e512-4927-90ad-f3833cdef967");
158 UUID tissueSampleUuid
= UUID
.fromString("14b92fce-1236-455b-ba46-2a7e35d9230e");
159 UUID dnaSampleUuid
= UUID
.fromString("60c31688-edec-4796-aa2f-28a7ea12256b");
160 UUID sequenceUuid
= UUID
.fromString("24804b67-d6f7-48e5-811a-e7240230d305");
162 String assertMessage
= "Incorrect number of specimens after deletion.";
163 DeleteResult deleteResult
= null;
164 SpecimenDeleteConfigurator config
= new SpecimenDeleteConfigurator();
166 FieldUnit fieldUnit
= (FieldUnit
) occurrenceService
.load(fieldUnitUuid
);
167 DerivedUnit derivedUnit
= (DerivedUnit
) occurrenceService
.load(derivedUnitUuid
);
168 DerivedUnit tissueSample
= (DerivedUnit
) occurrenceService
.load(tissueSampleUuid
);
169 DnaSample dnaSample
= (DnaSample
) occurrenceService
.load(dnaSampleUuid
);
170 Sequence consensusSequence
= sequenceService
.load(sequenceUuid
);
172 //check initial state
173 assertNotNull(fieldUnit
);
174 assertNotNull(derivedUnit
);
175 assertNotNull(tissueSample
);
176 assertNotNull(dnaSample
);
177 assertNotNull(consensusSequence
);
179 assertEquals(assertMessage
, 4, occurrenceService
.count(SpecimenOrObservationBase
.class));
180 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
181 assertEquals(assertMessage
, 3, occurrenceService
.count(DerivedUnit
.class));
182 assertEquals(assertMessage
, 1, occurrenceService
.count(DnaSample
.class));
183 assertEquals("incorrect number of amplification results", 1, dnaSample
.getAmplificationResults().size());
184 assertEquals("number of sequences incorrect", 1, dnaSample
.getSequences().size());
185 assertEquals("incorrect number of single reads", 1, dnaSample
.getAmplificationResults().iterator().next().getSingleReads().size());
186 assertEquals("incorrect number of single reads", 1, consensusSequence
.getSingleReads().size());
187 assertEquals(consensusSequence
.getSingleReads().iterator().next(), dnaSample
.getAmplificationResults().iterator().next().getSingleReads().iterator().next());
189 //delete sequence -> should fail
190 deleteResult
= occurrenceService
.deleteDerivateHierarchy(consensusSequence
, config
);
191 assertFalse(deleteResult
.toString(), deleteResult
.isOk());
193 //allow deletion of molecular data
194 config
.setDeleteMolecularData(true);
196 SingleRead singleRead
= dnaSample
.getAmplificationResults().iterator().next().getSingleReads().iterator().next();
197 deleteResult
= occurrenceService
.deleteSingleRead(singleRead
, consensusSequence
);
198 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
199 assertEquals("incorrect number of single reads", 0, dnaSample
.getAmplificationResults().iterator().next().getSingleReads().size());
200 assertEquals("incorrect number of single reads", 0, consensusSequence
.getSingleReads().size());
202 //delete sequence -> should fail
203 deleteResult
= occurrenceService
.deleteDerivateHierarchy(consensusSequence
, config
);
204 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
205 assertEquals("number of sequences incorrect", 0, dnaSample
.getSequences().size());
209 deleteResult
= occurrenceService
.deleteDerivateHierarchy(dnaSample
, config
);
210 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
211 assertEquals(assertMessage
, 3, occurrenceService
.count(SpecimenOrObservationBase
.class));
212 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
213 assertEquals(assertMessage
, 2, occurrenceService
.count(DerivedUnit
.class));
214 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
216 //delete tissue sample
217 deleteResult
= occurrenceService
.deleteDerivateHierarchy(tissueSample
, config
);
218 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
219 assertEquals(assertMessage
, 2, occurrenceService
.count(SpecimenOrObservationBase
.class));
220 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
221 assertEquals(assertMessage
, 1, occurrenceService
.count(DerivedUnit
.class));
222 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
224 //delete derived unit
225 deleteResult
= occurrenceService
.deleteDerivateHierarchy(derivedUnit
, config
);
226 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
227 assertEquals(assertMessage
, 1, occurrenceService
.count(SpecimenOrObservationBase
.class));
228 assertEquals(assertMessage
, 1, occurrenceService
.count(FieldUnit
.class));
229 assertEquals(assertMessage
, 0, occurrenceService
.count(DerivedUnit
.class));
230 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
233 deleteResult
= occurrenceService
.deleteDerivateHierarchy(fieldUnit
, config
);
235 assertTrue(deleteResult
.toString(), deleteResult
.isOk());
236 assertEquals(assertMessage
, 0, occurrenceService
.count(SpecimenOrObservationBase
.class));
237 assertEquals(assertMessage
, 0, occurrenceService
.count(FieldUnit
.class));
238 assertEquals(assertMessage
, 0, occurrenceService
.count(DerivedUnit
.class));
239 assertEquals(assertMessage
, 0, occurrenceService
.count(DnaSample
.class));
245 public void createTestDataSet() throws FileNotFoundException
{
246 UUID fieldUnitUuid
= UUID
.fromString("4d91a9bc-2af7-40f8-b6e6-545305301807");
247 UUID derivedUnitUuid
= UUID
.fromString("f9c57904-e512-4927-90ad-f3833cdef967");
248 UUID tissueSampleUuid
= UUID
.fromString("14b92fce-1236-455b-ba46-2a7e35d9230e");
249 UUID dnaSampleUuid
= UUID
.fromString("60c31688-edec-4796-aa2f-28a7ea12256b");
250 UUID sequenceUuid
= UUID
.fromString("24804b67-d6f7-48e5-811a-e7240230d305");
252 //how the XML was generated
253 FieldUnit fieldUnit
= FieldUnit
.NewInstance();
254 fieldUnit
.setUuid(fieldUnitUuid
);
255 //sub derivates (DerivedUnit, DnaSample)
256 DerivedUnit derivedUnit
= DerivedUnit
.NewInstance(SpecimenOrObservationType
.PreservedSpecimen
);
257 derivedUnit
.setUuid(derivedUnitUuid
);
258 DerivedUnit tissueSample
= DerivedUnit
.NewInstance(SpecimenOrObservationType
.TissueSample
);
259 tissueSample
.setUuid(tissueSampleUuid
);
260 DnaSample dnaSample
= (DnaSample
) DerivedUnit
.NewInstance(SpecimenOrObservationType
.DnaSample
);
261 dnaSample
.setUuid(dnaSampleUuid
);
262 Sequence sequence
= Sequence
.NewInstance("");
263 sequence
.setUuid(sequenceUuid
);
264 SingleRead singleRead1
= SingleRead
.NewInstance();
266 dnaSample
.addSequence(sequence
);
267 sequence
.addSingleRead(singleRead1
);
268 AmplificationResult amplificationResult
= AmplificationResult
.NewInstance(dnaSample
);
269 amplificationResult
.addSingleRead(singleRead1
);
272 DerivationEvent
.NewSimpleInstance(fieldUnit
, derivedUnit
, DerivationEventType
.ACCESSIONING());
273 DerivationEvent
.NewSimpleInstance(derivedUnit
, tissueSample
, DerivationEventType
.TISSUE_SAMPLING());
274 DerivationEvent
.NewSimpleInstance(tissueSample
, dnaSample
, DerivationEventType
.DNA_EXTRACTION());
276 occurrenceService
.save(fieldUnit
);
277 occurrenceService
.save(derivedUnit
);
278 occurrenceService
.save(tissueSample
);
279 occurrenceService
.save(dnaSample
);
281 commitAndStartNewTransaction(null);
287 writeDbUnitDataSetFile(new String
[] {
288 "SpecimenOrObservationBase",
289 "SpecimenOrObservationBase_DerivationEvent",
293 "SingleReadAlignment",
295 "AmplificationResult",
296 "DescriptionElementBase",
299 "TypeDesignationBase",
301 "TaxonNameBase_TypeDesignationBase",
303 }, "testDeleteStepByStep");
304 } catch (FileNotFoundException e
) {