3ed43e3997d4eb23cad95f9a7c9cf8a8f129a977
[cdmlib.git] / cdmlib-services / src / test / java / eu / etaxonomy / cdm / test / integration / SaveCdmEntitiesTest.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10 package eu.etaxonomy.cdm.test.integration;
11
12 import static org.junit.Assert.assertEquals;
13
14 import org.junit.Test;
15
16 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
17 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
18 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
19 import eu.etaxonomy.cdm.api.service.INameService;
20 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
21 import eu.etaxonomy.cdm.api.service.IReferenceService;
22 import eu.etaxonomy.cdm.api.service.ITermService;
23 import eu.etaxonomy.cdm.database.CdmDataSource;
24 import eu.etaxonomy.cdm.database.DbSchemaValidation;
25 import eu.etaxonomy.cdm.database.ICdmDataSource;
26 import eu.etaxonomy.cdm.model.agent.Institution;
27 import eu.etaxonomy.cdm.model.agent.Person;
28 import eu.etaxonomy.cdm.model.common.DefinedTerm;
29 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
30 import eu.etaxonomy.cdm.model.common.Language;
31 import eu.etaxonomy.cdm.model.common.OriginalSourceType;
32 import eu.etaxonomy.cdm.model.common.TimePeriod;
33 import eu.etaxonomy.cdm.model.location.Country;
34 import eu.etaxonomy.cdm.model.location.NamedArea;
35 import eu.etaxonomy.cdm.model.location.Point;
36 import eu.etaxonomy.cdm.model.location.ReferenceSystem;
37 import eu.etaxonomy.cdm.model.name.BotanicalName;
38 import eu.etaxonomy.cdm.model.name.Rank;
39 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
40 import eu.etaxonomy.cdm.model.occurrence.Collection;
41 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
42 import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
43 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
44 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
45 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
46 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
47 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
48 import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
49 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
50 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
51 import eu.etaxonomy.cdm.model.reference.Reference;
52 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
53 import eu.etaxonomy.cdm.model.taxon.Taxon;
54
55
56 /**
57 * @author pplitzner
58 * @date Sep 8, 2014
59 *
60 */
61 public class SaveCdmEntitiesTest {
62
63 private void persistNonCascadedElements(SpecimenOrObservationBase<?> specimen, ConversationHolder conversation, CdmApplicationController applicationController){
64 //services
65 ITermService termService = applicationController.getTermService();
66 IReferenceService referenceService = applicationController.getReferenceService();
67 INameService nameService = applicationController.getNameService();
68
69 //scan SpecimenOrObservationBase
70 for(DeterminationEvent determinationEvent:specimen.getDeterminations()){
71 //modifier
72 DefinedTerm modifier = determinationEvent.getModifier();
73 if(termService.find(modifier.getUuid())==null){
74 termService.save(modifier);
75 }
76 //references DONE with cascading
77 // for (Reference reference : determinationEvent.getReferences()) {
78 // if(referenceService.find(reference.getUuid())==null){
79 // referenceService.save(reference);
80 // }
81 // else{
82 // //TODO user interaction??
83 // }
84 // }
85 }
86 //kindOfUnit
87 persistTerm(termService, specimen.getKindOfUnit());
88 //lifeStage
89 persistTerm(termService, specimen.getLifeStage());
90
91 //FieldUnit
92 if(specimen instanceof FieldUnit){
93 FieldUnit fieldUnit = (FieldUnit)specimen;
94 GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
95 if(gatheringEvent!=null){
96 //country
97 persistTerm(termService, gatheringEvent.getCountry());
98 //collecting areas
99 for (NamedArea namedArea : gatheringEvent.getCollectingAreas()) {
100 persistTerm(termService, namedArea);
101 }
102 }
103 for (DerivationEvent derivationEvent : fieldUnit.getDerivationEvents()) {
104 for (DerivedUnit derivedUnit : derivationEvent.getDerivatives()) {
105 persistNonCascadedElements(derivedUnit, conversation, applicationController);
106 }
107 }
108 }
109
110 //DerivedUnit
111 else if(specimen instanceof DerivedUnit){
112 DerivedUnit derivedUnit = (DerivedUnit)specimen;
113 if(derivedUnit.getCollection()!=null && derivedUnit.getCollection().getInstitute()!=null){
114 for (DefinedTerm type : derivedUnit.getCollection().getInstitute().getTypes()) {
115 persistTerm(termService, type);
116 }
117 }
118 if(derivedUnit.getPreservation()!=null){
119 persistTerm(termService, derivedUnit.getPreservation().getMedium());
120 }
121 if(derivedUnit.getStoredUnder()!=null){
122 if(nameService.find(derivedUnit.getStoredUnder().getUuid())==null){
123 //TODO persist name??
124 }
125 else{
126 //TODO user interaction??
127 }
128 }
129 }
130 }
131
132 private void persistTerm(ITermService termService, DefinedTermBase<?> term){
133 if(term!=null){
134 termService.saveOrUpdate(term);
135 }
136 }
137 //potential fields that are not persisted cascadingly
138 /*
139 * SOOB
140 -DescriptionBase?? how to instantiate?
141 -determinations
142 --modifier TERM
143 --setOfReferences CDM
144 -kindOfUnit TERM
145 -lifeStage TERM
146 - sex TERM
147
148 FieldUnit
149 -GatheringEvent
150 --Country TERM
151 --CollectingAreas TERM
152
153 DerivedUnit
154 -collection
155 --institute
156 ---types TERM
157 -preservationMethod
158 --medium TERM
159 -storedUnder CDM TaxonNameBase
160 */
161
162 @Test
163 public void testSaveSpecimen(){
164 DbSchemaValidation dbSchemaValidation = DbSchemaValidation.CREATE_DROP;
165 // ICdmDataSource datasource = CdmDataSource.NewMySqlInstance("localhost", "test_db", "root", "root");
166 ICdmDataSource datasource = CdmDataSource.NewH2EmbeddedInstance("test_db", "root", "root");
167 CdmApplicationController applicationController = CdmApplicationController.NewInstance(datasource, dbSchemaValidation);
168
169 ConversationHolder conversation = applicationController.NewConversation();
170 conversation.startTransaction();
171 conversation.bind();
172
173 IOccurrenceService occurrenceService = applicationController.getOccurrenceService();
174 for(int i=0;i<10;i++){
175 DerivedUnitFacade derivedUnitFacade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
176 derivedUnitFacade.setAccessionNumber(Double.toString(Math.random()));
177 derivedUnitFacade.setCountry(NamedArea.AFRICA());
178 derivedUnitFacade.addSource(OriginalSourceType.Unknown, ReferenceFactory.newArticle(), "microReference", "originalNameString");
179
180 //save specimen
181 occurrenceService.saveOrUpdate(derivedUnitFacade.innerDerivedUnit());
182 conversation.commit();
183
184 //Collection
185 Collection collection = Collection.NewInstance();
186 Collection subCollection = Collection.NewInstance();
187 subCollection.setSuperCollection(collection);
188
189 collection.setCode("coll code");
190 collection.setCodeStandard("codeStandard");
191 collection.setName("coll name");
192 collection.setTownOrLocation("townOrLocation");
193 Institution institution = Institution.NewInstance();
194 collection.setInstitute(institution);
195
196 //FieldUnit
197 FieldUnit fieldUnit = FieldUnit.NewInstance();
198 fieldUnit.setFieldNumber("fieldNumber");
199 fieldUnit.setFieldNotes("fieldNotes");
200 Person primaryCollector = Person.NewInstance();
201 primaryCollector.setLifespan(TimePeriod.NewInstance(2014));
202 fieldUnit.setPrimaryCollector(primaryCollector);
203
204 GatheringEvent gatheringEvent = GatheringEvent.NewInstance();
205 fieldUnit.setGatheringEvent(gatheringEvent);
206 gatheringEvent.putLocality(Language.ENGLISH(), "locality");
207 gatheringEvent.setExactLocation(Point.NewInstance(22.4, -34.2,
208 ReferenceSystem.WGS84(), 33));
209 gatheringEvent.setCountry(Country.GERMANY());
210 gatheringEvent.addCollectingArea(NamedArea.EUROPE());
211 gatheringEvent.setCollectingMethod("collectingMethod");
212 gatheringEvent.setAbsoluteElevation(10);
213 gatheringEvent.setAbsoluteElevationMax(100);
214 gatheringEvent.setAbsoluteElevationText("elevation text");
215
216 gatheringEvent.setDistanceToGround(10.4);
217 gatheringEvent.setDistanceToGroundMax(100.3);
218 gatheringEvent.setDistanceToGroundText("distance to ground text");
219
220 gatheringEvent.setDistanceToWaterSurface(10.4);
221 gatheringEvent.setDistanceToWaterSurfaceMax(100.3);
222 gatheringEvent.setDistanceToWaterSurfaceText("distance to water text");
223
224
225 //Derived Unit
226 MediaSpecimen mediaSpecimen = MediaSpecimen.NewInstance(SpecimenOrObservationType.StillImage);
227 mediaSpecimen.setCollection(collection);
228 mediaSpecimen.setCatalogNumber("catalogNumber");
229 mediaSpecimen.setAccessionNumber("accessionNumber");
230 // mediaSpecimen.setCollectorsNumber("collectorsNumber");
231 mediaSpecimen.setBarcode("barcode");
232 BotanicalName storedUnder = BotanicalName.NewInstance(Rank.SPECIES());
233 storedUnder.setTitleCache("Stored under", true);
234 mediaSpecimen.setStoredUnder(storedUnder);
235 mediaSpecimen.setExsiccatum("exsiccatum");
236 PreservationMethod preservation = PreservationMethod.NewInstance(null, "My preservation");
237 preservation.setTemperature(22.4);
238 mediaSpecimen.setPreservation(preservation);
239
240 //DerivationEvent
241 DerivationEvent event = DerivationEvent.NewInstance(DerivationEventType.ACCESSIONING());
242 event.addOriginal(fieldUnit);
243 event.addDerivative(mediaSpecimen);
244
245
246 //SpecOrObservationBase
247 fieldUnit.setSex(DefinedTerm.SEX_FEMALE());
248 fieldUnit.setLifeStage(DefinedTerm.NewStageInstance("Live stage", "stage", null));
249 fieldUnit.setKindOfUnit(DefinedTerm.NewKindOfUnitInstance("Kind of unit", "Kind of unit", null));
250 fieldUnit.setIndividualCount(3);
251 fieldUnit.putDefinition(Language.ENGLISH(), "definition");
252 fieldUnit.setPublish(true);
253
254 //Determination
255 DeterminationEvent determinationEvent = DeterminationEvent.NewInstance(getTaxon(), mediaSpecimen);
256 determinationEvent.setModifier(DefinedTerm.DETERMINATION_MODIFIER_AFFINIS());
257 determinationEvent.setPreferredFlag(true);
258 Reference<?> reference = getReference();
259 determinationEvent.addReference(reference);
260
261
262 //save specimen
263 persistNonCascadedElements(fieldUnit, conversation, applicationController);
264 occurrenceService.saveOrUpdate(fieldUnit);
265 try{
266 conversation.commit();
267 }
268 catch (Exception e){
269 e.printStackTrace();
270 }
271 }
272 assertEquals("Incorrect number of DerivedUnits in DB", 20, occurrenceService.getDerivedUnitUuidAndTitleCache().size());
273
274 }
275 private Reference<?> getReference() {
276 Reference<?> result = ReferenceFactory.newGeneric();
277 result.setTitle("some generic reference");
278 return result;
279 }
280
281 private Taxon getTaxon() {
282 Reference<?> sec = getReference();
283 TaxonNameBase<?,?> name = BotanicalName.NewInstance(Rank.GENUS());
284 Taxon taxon = Taxon.NewInstance(name, sec);
285 return taxon;
286
287 }
288
289 }