first implementation of Types in AlgaTerra
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraSpecimenImport.java
1 /**
2 * Copyright (C) 2007 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
10 package eu.etaxonomy.cdm.io.algaterra;
11
12 import java.sql.ResultSet;
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.apache.commons.lang.StringUtils;
21 import org.apache.log4j.Logger;
22 import org.springframework.stereotype.Component;
23
24 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
25 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;
26 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
27 import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraSpecimenImportValidator;
28 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
29 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
30 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonImport;
31 import eu.etaxonomy.cdm.io.common.IOValidator;
32 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
33 import eu.etaxonomy.cdm.model.common.CdmBase;
34 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
35 import eu.etaxonomy.cdm.model.common.Language;
36 import eu.etaxonomy.cdm.model.common.Marker;
37 import eu.etaxonomy.cdm.model.common.MarkerType;
38 import eu.etaxonomy.cdm.model.common.TermVocabulary;
39 import eu.etaxonomy.cdm.model.description.CategoricalData;
40 import eu.etaxonomy.cdm.model.description.DescriptionBase;
41 import eu.etaxonomy.cdm.model.description.Feature;
42 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
43 import eu.etaxonomy.cdm.model.description.MeasurementUnit;
44 import eu.etaxonomy.cdm.model.description.Modifier;
45 import eu.etaxonomy.cdm.model.description.QuantitativeData;
46 import eu.etaxonomy.cdm.model.description.State;
47 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
48 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
49 import eu.etaxonomy.cdm.model.description.TaxonDescription;
50 import eu.etaxonomy.cdm.model.description.TextData;
51 import eu.etaxonomy.cdm.model.name.BotanicalName;
52 import eu.etaxonomy.cdm.model.name.Rank;
53 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
54 import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
55 import eu.etaxonomy.cdm.model.reference.Reference;
56 import eu.etaxonomy.cdm.model.taxon.Taxon;
57 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
58
59
60 /**
61 * @author a.mueller
62 * @created 01.09.2012
63 */
64 @Component
65 public class AlgaTerraSpecimenImport extends AlgaTerraSpecimenImportBase {
66 private static final Logger logger = Logger.getLogger(AlgaTerraSpecimenImport.class);
67
68
69 private static int modCount = 5000;
70 private static final String pluralString = "specimen and observation";
71 private static final String dbTableName = "Fact"; //??
72
73
74 public AlgaTerraSpecimenImport(){
75 super();
76 }
77
78
79
80 /* (non-Javadoc)
81 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
82 */
83 @Override
84 protected String getIdQuery(BerlinModelImportState state) {
85 String result = " SELECT factId " +
86 " FROM Fact " +
87 " INNER JOIN EcoFact ON Fact.ExtensionFk = EcoFact.EcoFactId " +
88 "INNER JOIN PTaxon ON Fact.PTNameFk = PTaxon.PTNameFk AND Fact.PTRefFk = PTaxon.PTRefFk "
89 + " WHERE FactCategoryFk = 202 "
90 + " ORDER BY EcoFact.EcoFactId, PTaxon.RIdentifier, Fact.FactId ";
91 return result;
92 }
93
94 /* (non-Javadoc)
95 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
96 */
97 @Override
98 protected String getRecordQuery(BerlinModelImportConfigurator config) {
99 String strQuery =
100 " SELECT PTaxon.RIdentifier as taxonId, Fact.FactId, Fact.RecordBasis, EcoFact.*, " +
101 " tg.ID AS GazetteerId, tg.L2Code, tg.L3Code, tg.L4Code, tg.Country, tg.ISOCountry, " +
102 " ec.UUID as climateUuid, eh.UUID as habitatUuid, elf.UUID as lifeFormUuid" +
103 " FROM Fact " +
104 " INNER JOIN EcoFact ON Fact.ExtensionFk = EcoFact.EcoFactId " +
105 " INNER JOIN PTaxon ON dbo.Fact.PTNameFk = dbo.PTaxon.PTNameFk AND dbo.Fact.PTRefFk = dbo.PTaxon.PTRefFk " +
106 " LEFT OUTER JOIN TDWGGazetteer tg ON EcoFact.TDWGGazetteerFk = tg.ID " +
107 " LEFT OUTER JOIN EcoClimate ec ON EcoFact.ClimateFk = ec.ClimateId " +
108 " LEFT OUTER JOIN EcoHabitat eh ON EcoFact.HabitatFk = eh.HabitatId " +
109 " LEFT OUTER JOIN EcoLifeForm elf ON EcoFact.LifeFormFk = elf.LifeFormId " +
110 " WHERE Fact.FactCategoryFk = 202 AND (Fact.FactId IN (" + ID_LIST_TOKEN + ") )"
111 + " ORDER BY EcoFact.EcoFactId, PTaxon.RIdentifier, Fact.FactId "
112 ;
113 return strQuery;
114 }
115
116 /* (non-Javadoc)
117 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
118 */
119 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
120 boolean success = true;
121
122 AlgaTerraImportState state = (AlgaTerraImportState)bmState;
123 try {
124 makeVocabulariesAndFeatures(state);
125 } catch (SQLException e1) {
126 logger.warn("Exception occurred when trying to create Ecofact vocabularies: " + e1.getMessage());
127 e1.printStackTrace();
128 }
129 Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
130
131 Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
132 Map<String, DerivedUnit> ecoFactMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(ECO_FACT_NAMESPACE);
133
134 ResultSet rs = partitioner.getResultSet();
135
136 try {
137
138 int i = 0;
139
140 //for each reference
141 while (rs.next()){
142
143 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Specimen facts handled: " + (i-1));}
144
145 int newTaxonId = rs.getInt("taxonId");
146 int factId = rs.getInt("FactId");
147 int ecoFactId = rs.getInt("EcoFactId");
148 String recordBasis = rs.getString("RecordBasis");
149
150 try {
151
152 //source ref
153 Reference<?> sourceRef = state.getTransactionalSourceReference();
154
155 //facade
156 DerivedUnitType type = makeDerivedUnitType(recordBasis);
157 DerivedUnitFacade facade = getDerivedUnit(state, ecoFactId, ecoFactMap, type);
158
159 //field observation
160 handleSingleSpecimen(rs, facade, state);
161
162 handleEcoFactSpecificSpecimen(rs,facade, state);
163
164 state.setCurrentFieldObservationNotNew(false);
165
166 //description element
167 TaxonDescription taxonDescription = getTaxonDescription(state, newTaxonId, taxonMap, factId, sourceRef);
168 IndividualsAssociation indAssociation = IndividualsAssociation.NewInstance();
169 Feature feature = makeFeature(type);
170 indAssociation.setAssociatedSpecimenOrObservation(facade.innerDerivedUnit());
171 indAssociation.setFeature(feature);
172 taxonDescription.addElement(indAssociation);
173
174 taxaToSave.add(taxonDescription.getTaxon());
175
176
177 } catch (Exception e) {
178 logger.warn("Exception in ecoFact: FactId " + factId + ". " + e.getMessage());
179 // e.printStackTrace();
180 }
181
182 }
183
184 // logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
185
186 logger.warn("Taxa to save: " + taxaToSave.size());
187 getTaxonService().save(taxaToSave);
188
189 return success;
190 } catch (SQLException e) {
191 logger.error("SQLException:" + e);
192 return false;
193 }
194 }
195
196
197
198 private void handleEcoFactSpecificSpecimen(ResultSet rs, DerivedUnitFacade facade, AlgaTerraImportState state) throws SQLException {
199
200 Object alkalinityFlag = rs.getBoolean("AlkalinityFlag");
201
202 //alkalinity marker
203 if (alkalinityFlag != null){
204 MarkerType alkalinityMarkerType = getMarkerType(state, uuidMarkerAlkalinity, "Alkalinity", "Alkalinity", null);
205 boolean alkFlag = Boolean.valueOf(alkalinityFlag.toString());
206 Marker alkalinityMarker = Marker.NewInstance(alkalinityMarkerType, alkFlag);
207 facade.getFieldObservation(true).addMarker(alkalinityMarker);
208 }
209
210
211 DescriptionBase<?> fieldDescription = getFieldObservationDescription(facade);
212
213 //habitat, ecology, community, etc.
214 String habitat = rs.getString("HabitatExplanation");
215
216 if (isNotBlank(habitat)){
217 Feature habitatExplanation = getFeature(state, uuidFeatureHabitatExplanation, "Habitat Explanation", "HabitatExplanation", null, null);
218 TextData textData = TextData.NewInstance(habitatExplanation);
219 textData.putText(Language.DEFAULT(), habitat);
220 fieldDescription.addElement(textData);
221 }
222
223 String community = rs.getString("Comunity");
224 if (isNotBlank(community)){
225 Feature communityFeature = getFeature(state, uuidFeatureSpecimenCommunity, "Community", "The community of a specimen (e.g. other algae in the same sample)", null, null);
226 TextData textData = TextData.NewInstance(communityFeature);
227 textData.putText(Language.DEFAULT(), community);
228 fieldDescription.addElement(textData);
229 }
230
231 String additionalData = rs.getString("AdditionalData");
232 if (isNotBlank(additionalData)){ //or handle it as Annotation ??
233 Feature additionalDataFeature = getFeature(state, uuidFeatureAdditionalData, "Additional Data", "Additional Data", null, null);
234 TextData textData = TextData.NewInstance(additionalDataFeature);
235 textData.putText(Language.DEFAULT(), additionalData);
236 fieldDescription.addElement(textData);
237 }
238
239 String climateUuid = rs.getString("climateUuid");
240 String habitatUuid = rs.getString("habitatUuid");
241 String lifeFormUuid = rs.getString("lifeFormUuid");
242
243 addCategoricalValue(state, fieldDescription, climateUuid, uuidFeatureAlgaTerraClimate);
244 addCategoricalValue(state, fieldDescription, habitatUuid, Feature.HABITAT().getUuid());
245 addCategoricalValue(state, fieldDescription, lifeFormUuid, uuidFeatureAlgaTerraLifeForm);
246
247
248 //collection
249 String voucher = rs.getString("Voucher");
250 if (StringUtils.isNotBlank(voucher)){
251 facade.setAccessionNumber(voucher);
252 }
253
254 //parameters
255 makeParameter(state, rs, getFieldObservationDescription(facade));
256
257 }
258
259
260
261
262 private void addCategoricalValue(AlgaTerraImportState importState, DescriptionBase description, String uuidTerm, UUID featureUuid) {
263 if (uuidTerm != null){
264 State state = this.getStateTerm(importState, UUID.fromString(uuidTerm));
265 Feature feature = getFeature(importState, featureUuid);
266 CategoricalData categoricalData = CategoricalData.NewInstance(state, feature);
267 description.addElement(categoricalData);
268 }
269 }
270
271 private void makeParameter(AlgaTerraImportState state, ResultSet rs, DescriptionBase<?> descriptionBase) throws SQLException {
272 for (int i = 1; i <= 10; i++){
273 String valueStr = rs.getString(String.format("P%dValue", i));
274 String unitStr = rs.getString(String.format("P%dUnit", i));
275 String parameter = rs.getString(String.format("P%dParameter", i));
276 String method = rs.getString(String.format("P%dMethod", i));
277
278 //method
279 if (StringUtils.isNotBlank(method)){
280 logger.warn("Methods not yet handled: " + method);
281 }
282 //parameter
283 TermVocabulary<Feature> vocParameter = getVocabulary(uuidVocParameter, "Feature vocabulary for AlgaTerra measurement parameters", "Parameters", null, null, false, Feature.COMMON_NAME());
284 if (StringUtils.isNotBlank(parameter)){
285 UUID featureUuid = getParameterFeatureUuid(state, parameter);
286 Feature feature = getFeature(state, featureUuid, parameter, parameter, null, vocParameter);
287 QuantitativeData quantData = QuantitativeData.NewInstance(feature);
288
289 //unit
290 MeasurementUnit unit = getMeasurementUnit(state, unitStr);
291 quantData.setUnit(unit);
292 try {
293
294 Set<Modifier> valueModifier = new HashSet<Modifier>();
295 valueStr = normalizeAndModifyValue(state, valueStr, valueModifier);
296 //value
297 Float valueFlt = Float.valueOf(valueStr); //TODO maybe change model to Double ??
298
299 StatisticalMeasure measureSingleValue = getStatisticalMeasure(state, uuidStatMeasureSingleValue, "Value", "Single measurement value", null, null);
300 StatisticalMeasurementValue value = StatisticalMeasurementValue.NewInstance(measureSingleValue, valueFlt);
301 quantData.addStatisticalValue(value);
302 descriptionBase.addElement(quantData);
303
304 } catch (NumberFormatException e) {
305 logger.warn(String.format("Value '%s' can't be converted to double. Parameter %s not imported.", valueStr, parameter));
306 }
307 }else if (isNotBlank(valueStr) || isNotBlank(unitStr) ){
308 logger.warn("There is value or unit without parameter: " + i);
309 }
310
311
312 }
313
314 }
315
316 private String normalizeAndModifyValue(AlgaTerraImportState state, String valueStr, Set<Modifier> valueModifier) {
317 valueStr = valueStr.replace(",", ".");
318 if (valueStr.startsWith("<")){
319 TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());
320 Modifier modifier = getModifier(state, uuidModifierLowerThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
321 valueModifier.add(modifier);
322 valueStr = valueStr.replace("<", "");
323 }
324 if (valueStr.startsWith(">")){
325 TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());
326 Modifier modifier = getModifier(state, uuidModifierGreaterThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
327 valueModifier.add(modifier);
328 valueStr = valueStr.replace(">", "");
329 }
330 return valueStr;
331 }
332
333
334
335 private UUID getParameterFeatureUuid(AlgaTerraImportState state, String key) {
336 //TODO define some UUIDs in Transformer
337 UUID uuid = state.getParameterFeatureUuid(key);
338 if (uuid == null){
339 uuid = UUID.randomUUID();
340 state.putParameterFeatureUuid(key, uuid);
341 }
342 return uuid;
343 }
344
345
346
347 /**
348 * TODO move to InputTransformerBase
349 * @param state
350 * @param unitStr
351 * @return
352 */
353 private MeasurementUnit getMeasurementUnit(AlgaTerraImportState state, String unitStr) {
354 if (StringUtils.isNotBlank(unitStr)){
355 UUID uuidMeasurementUnitMgL = UUID.fromString("7ac302c5-3cbd-4334-964a-bf5d11eb9ead");
356 UUID uuidMeasurementUnitMolMol = UUID.fromString("96b78d78-3e49-448f-8100-e7779b71dd53");
357 UUID uuidMeasurementUnitMicroMolSiL = UUID.fromString("2cb8bc85-a4af-42f1-b80b-34c36c9f75d4");
358 UUID uuidMeasurementUnitMicroMolL = UUID.fromString("a631f62e-377e-405c-bd1a-76885b13a72b");
359 UUID uuidMeasurementUnitDegreeC = UUID.fromString("55222aec-d5be-413e-8db7-d9a48c316c6c");
360 UUID uuidMeasurementUnitPercent = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");
361 UUID uuidMeasurementUnitCm = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");
362 UUID uuidMeasurementUnitMicroSiCm = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");
363
364
365 if (unitStr.equalsIgnoreCase("mg/L")){
366 return getMeasurementUnit(state, uuidMeasurementUnitMgL, unitStr, unitStr, unitStr, null);
367 }else if (unitStr.equalsIgnoreCase("mol/mol")){
368 return getMeasurementUnit(state, uuidMeasurementUnitMolMol, unitStr, unitStr, unitStr, null);
369 }else if (unitStr.equalsIgnoreCase("\u00B5mol Si/L")){ //µmol Si/L
370 return getMeasurementUnit(state, uuidMeasurementUnitMicroMolSiL, unitStr, unitStr, unitStr, null);
371 }else if (unitStr.equalsIgnoreCase("\u00B5mol/L")){ //µmol/L
372 return getMeasurementUnit(state, uuidMeasurementUnitMicroMolL, unitStr, unitStr, unitStr, null);
373 }else if (unitStr.equalsIgnoreCase("\u00B0C")){ //°C
374 return getMeasurementUnit(state, uuidMeasurementUnitDegreeC, unitStr, unitStr, unitStr, null);
375 }else if (unitStr.equalsIgnoreCase("%")){
376 return getMeasurementUnit(state, uuidMeasurementUnitPercent, unitStr, unitStr, unitStr, null);
377 }else if (unitStr.equalsIgnoreCase("cm")){
378 return getMeasurementUnit(state, uuidMeasurementUnitCm, unitStr, unitStr, unitStr, null);
379 }else if (unitStr.equalsIgnoreCase("\u00B5S/cm")){ //µS/cm
380 return getMeasurementUnit(state, uuidMeasurementUnitMicroSiCm, unitStr, unitStr, unitStr, null);
381 }else{
382 logger.warn("MeasurementUnit was not recognized");
383 return null;
384 }
385 }else{
386 return null;
387 }
388 }
389
390
391
392
393
394 /**
395 * @param state
396 * @param ecoFactId
397 * @param derivedUnitMap
398 * @param type
399 * @return
400 */
401 private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int ecoFactId, Map<String, DerivedUnit> derivedUnitMap, DerivedUnitType type) {
402 String key = String.valueOf(ecoFactId);
403 DerivedUnit derivedUnit = derivedUnitMap.get(key);
404 DerivedUnitFacade facade;
405 if (derivedUnit == null){
406 facade = DerivedUnitFacade.NewInstance(type);
407 derivedUnitMap.put(key, derivedUnit);
408 }else{
409 try {
410 facade = DerivedUnitFacade.NewInstance(derivedUnit);
411 } catch (DerivedUnitFacadeNotSupportedException e) {
412 logger.error(e.getMessage());
413 facade = DerivedUnitFacade.NewInstance(type);
414 }
415 }
416
417 return facade;
418 }
419
420 private Feature makeFeature(DerivedUnitType type) {
421 if (type.equals(DerivedUnitType.DerivedUnit)){
422 return Feature.INDIVIDUALS_ASSOCIATION();
423 }else if (type.equals(DerivedUnitType.FieldObservation) || type.equals(DerivedUnitType.Observation) ){
424 return Feature.OBSERVATION();
425 }else if (type.equals(DerivedUnitType.Fossil) || type.equals(DerivedUnitType.LivingBeing) || type.equals(DerivedUnitType.Specimen )){
426 return Feature.SPECIMEN();
427 }
428 logger.warn("No feature defined for derived unit type: " + type);
429 return null;
430 }
431
432
433 private DerivedUnitType makeDerivedUnitType(String recordBasis) {
434 DerivedUnitType result = null;
435 if (StringUtils.isBlank(recordBasis)){
436 result = DerivedUnitType.DerivedUnit;
437 } else if (recordBasis.equalsIgnoreCase("FossileSpecimen")){
438 result = DerivedUnitType.Fossil;
439 }else if (recordBasis.equalsIgnoreCase("HumanObservation")){
440 result = DerivedUnitType.Observation;
441 }else if (recordBasis.equalsIgnoreCase("Literature")){
442 logger.warn("Literature record basis not yet supported");
443 result = DerivedUnitType.DerivedUnit;
444 }else if (recordBasis.equalsIgnoreCase("LivingSpecimen")){
445 result = DerivedUnitType.LivingBeing;
446 }else if (recordBasis.equalsIgnoreCase("MachineObservation")){
447 logger.warn("MachineObservation record basis not yet supported");
448 result = DerivedUnitType.Observation;
449 }else if (recordBasis.equalsIgnoreCase("PreservedSpecimen")){
450 result = DerivedUnitType.Specimen;
451 }
452 return result;
453 }
454
455 /* (non-Javadoc)
456 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
457 */
458 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
459 String nameSpace;
460 Class cdmClass;
461 Set<String> idSet;
462 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
463
464 try{
465 Set<String> taxonIdSet = new HashSet<String>();
466 Set<String> fieldObservationIdSet = new HashSet<String>();
467 Set<String> termsIdSet = new HashSet<String>();
468
469 while (rs.next()){
470 handleForeignKey(rs, taxonIdSet, "taxonId");
471 handleForeignKey(rs, fieldObservationIdSet, "ecoFactId");
472 handleForeignKey(rs, termsIdSet, "ClimateFk");
473 handleForeignKey(rs, termsIdSet, "HabitatFk");
474 handleForeignKey(rs, termsIdSet, "LifeFormFk");
475 }
476
477 //taxon map
478 nameSpace = BerlinModelTaxonImport.NAMESPACE;
479 cdmClass = TaxonBase.class;
480 idSet = taxonIdSet;
481 Map<String, TaxonBase> objectMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
482 result.put(nameSpace, objectMap);
483
484 //field observation map map
485 nameSpace = AlgaTerraSpecimenImport.ECO_FACT_NAMESPACE;
486 cdmClass = FieldObservation.class;
487 idSet = fieldObservationIdSet;
488 Map<String, FieldObservation> fieldObservationMap = (Map<String, FieldObservation>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
489 result.put(nameSpace, fieldObservationMap);
490
491 //terms
492 nameSpace = AlgaTerraSpecimenImport.TERMS_NAMESPACE;
493 cdmClass = FieldObservation.class;
494 idSet = termsIdSet;
495 Map<String, DefinedTermBase> termMap = (Map<String, DefinedTermBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
496 result.put(nameSpace, termMap);
497
498 } catch (SQLException e) {
499 throw new RuntimeException(e);
500 }
501 return result;
502 }
503
504
505 /**
506 * Use same TaxonDescription if two records belong to the same taxon
507 * @param state
508 * @param newTaxonId
509 * @param oldTaxonId
510 * @param oldDescription
511 * @param taxonMap
512 * @return
513 */
514 private TaxonDescription getTaxonDescription(AlgaTerraImportState state, int newTaxonId, Map<String, TaxonBase> taxonMap, int factId, Reference<?> sourceSec){
515 TaxonDescription result = null;
516 TaxonBase<?> taxonBase = taxonMap.get(String.valueOf(newTaxonId));
517
518 //TODO for testing
519 if (taxonBase == null && ! state.getConfig().isDoTaxa()){
520 taxonBase = Taxon.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);
521 }
522
523 Taxon taxon;
524 if ( taxonBase instanceof Taxon ) {
525 taxon = (Taxon) taxonBase;
526 } else if (taxonBase != null) {
527 logger.warn("TaxonBase for Fact(Specimen) with factId" + factId + " was not of type Taxon but: " + taxonBase.getClass().getSimpleName());
528 return null;
529 } else {
530 logger.warn("TaxonBase for Fact(Specimen) " + factId + " is null.");
531 return null;
532 }
533 Set<TaxonDescription> descriptionSet= taxon.getDescriptions();
534 if (descriptionSet.size() > 0) {
535 result = descriptionSet.iterator().next();
536 }else{
537 result = TaxonDescription.NewInstance();
538 result.setTitleCache(sourceSec.getTitleCache(), true);
539 taxon.addDescription(result);
540 }
541 return result;
542 }
543
544
545 /* (non-Javadoc)
546 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
547 */
548 @Override
549 protected boolean doCheck(BerlinModelImportState state){
550 IOValidator<BerlinModelImportState> validator = new AlgaTerraSpecimenImportValidator();
551 return validator.validate(state);
552 }
553
554 /* (non-Javadoc)
555 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
556 */
557 @Override
558 protected String getTableName() {
559 return dbTableName;
560 }
561
562 /* (non-Javadoc)
563 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
564 */
565 @Override
566 public String getPluralString() {
567 return pluralString;
568 }
569
570 /* (non-Javadoc)
571 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
572 */
573 protected boolean isIgnore(BerlinModelImportState state){
574 return ! ((AlgaTerraImportState)state).getAlgaTerraConfigurator().isDoSpecimen();
575 }
576
577 }