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
.test
.integration
;
12 import static org
.junit
.Assert
.assertEquals
;
14 import org
.junit
.Test
;
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
;
61 public class SaveCdmEntitiesTest
{
63 private void persistNonCascadedElements(SpecimenOrObservationBase
<?
> specimen
, ConversationHolder conversation
, CdmApplicationController applicationController
){
65 ITermService termService
= applicationController
.getTermService();
66 IReferenceService referenceService
= applicationController
.getReferenceService();
67 INameService nameService
= applicationController
.getNameService();
69 //scan SpecimenOrObservationBase
70 for(DeterminationEvent determinationEvent
:specimen
.getDeterminations()){
72 DefinedTerm modifier
= determinationEvent
.getModifier();
73 if(termService
.find(modifier
.getUuid())==null){
74 termService
.save(modifier
);
76 //references DONE with cascading
77 // for (Reference reference : determinationEvent.getReferences()) {
78 // if(referenceService.find(reference.getUuid())==null){
79 // referenceService.save(reference);
82 // //TODO user interaction??
87 persistTerm(termService
, specimen
.getKindOfUnit());
89 persistTerm(termService
, specimen
.getLifeStage());
92 if(specimen
instanceof FieldUnit
){
93 FieldUnit fieldUnit
= (FieldUnit
)specimen
;
94 GatheringEvent gatheringEvent
= fieldUnit
.getGatheringEvent();
95 if(gatheringEvent
!=null){
97 persistTerm(termService
, gatheringEvent
.getCountry());
99 for (NamedArea namedArea
: gatheringEvent
.getCollectingAreas()) {
100 persistTerm(termService
, namedArea
);
103 for (DerivationEvent derivationEvent
: fieldUnit
.getDerivationEvents()) {
104 for (DerivedUnit derivedUnit
: derivationEvent
.getDerivatives()) {
105 persistNonCascadedElements(derivedUnit
, conversation
, applicationController
);
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
);
118 if(derivedUnit
.getPreservation()!=null){
119 persistTerm(termService
, derivedUnit
.getPreservation().getMedium());
121 if(derivedUnit
.getStoredUnder()!=null){
122 if(nameService
.find(derivedUnit
.getStoredUnder().getUuid())==null){
123 //TODO persist name??
126 //TODO user interaction??
132 private void persistTerm(ITermService termService
, DefinedTermBase
<?
> term
){
134 termService
.saveOrUpdate(term
);
137 //potential fields that are not persisted cascadingly
140 -DescriptionBase?? how to instantiate?
143 --setOfReferences CDM
151 --CollectingAreas TERM
159 -storedUnder CDM TaxonNameBase
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
);
169 ConversationHolder conversation
= applicationController
.NewConversation();
170 conversation
.startTransaction();
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");
181 occurrenceService
.saveOrUpdate(derivedUnitFacade
.innerDerivedUnit());
182 conversation
.commit();
185 Collection collection
= Collection
.NewInstance();
186 Collection subCollection
= Collection
.NewInstance();
187 subCollection
.setSuperCollection(collection
);
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
);
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
);
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");
216 gatheringEvent
.setDistanceToGround(10.4);
217 gatheringEvent
.setDistanceToGroundMax(100.3);
218 gatheringEvent
.setDistanceToGroundText("distance to ground text");
220 gatheringEvent
.setDistanceToWaterSurface(10.4);
221 gatheringEvent
.setDistanceToWaterSurfaceMax(100.3);
222 gatheringEvent
.setDistanceToWaterSurfaceText("distance to water text");
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
);
241 DerivationEvent event
= DerivationEvent
.NewInstance(DerivationEventType
.ACCESSIONING());
242 event
.addOriginal(fieldUnit
);
243 event
.addDerivative(mediaSpecimen
);
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);
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
);
263 persistNonCascadedElements(fieldUnit
, conversation
, applicationController
);
264 occurrenceService
.saveOrUpdate(fieldUnit
);
266 conversation
.commit();
272 assertEquals("Incorrect number of DerivedUnits in DB", 20, occurrenceService
.getDerivedUnitUuidAndTitleCache().size());
275 private Reference
<?
> getReference() {
276 Reference
<?
> result
= ReferenceFactory
.newGeneric();
277 result
.setTitle("some generic reference");
281 private Taxon
getTaxon() {
282 Reference
<?
> sec
= getReference();
283 TaxonNameBase
<?
,?
> name
= BotanicalName
.NewInstance(Rank
.GENUS());
284 Taxon taxon
= Taxon
.NewInstance(name
, sec
);