Revision bb38665e
Added by Andreas Müller over 10 years ago
app-import/src/main/java/eu/etaxonomy/cdm/io/algaterra/AlgaTerraMorphologyImport.java | ||
---|---|---|
22 | 22 |
import org.springframework.stereotype.Component; |
23 | 23 |
|
24 | 24 |
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade; |
25 |
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType; |
|
26 | 25 |
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraMorphologyImportValidator; |
27 |
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraSpecimenImportValidator; |
|
28 | 26 |
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator; |
29 | 27 |
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState; |
30 | 28 |
import eu.etaxonomy.cdm.io.common.IOValidator; |
31 | 29 |
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner; |
32 | 30 |
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException; |
33 | 31 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
32 |
import eu.etaxonomy.cdm.model.common.DefinedTerm; |
|
34 | 33 |
import eu.etaxonomy.cdm.model.common.DefinedTermBase; |
35 | 34 |
import eu.etaxonomy.cdm.model.common.Language; |
36 | 35 |
import eu.etaxonomy.cdm.model.common.Marker; |
37 | 36 |
import eu.etaxonomy.cdm.model.common.MarkerType; |
37 |
import eu.etaxonomy.cdm.model.common.TermType; |
|
38 | 38 |
import eu.etaxonomy.cdm.model.common.TermVocabulary; |
39 | 39 |
import eu.etaxonomy.cdm.model.description.CategoricalData; |
40 | 40 |
import eu.etaxonomy.cdm.model.description.DescriptionBase; |
41 | 41 |
import eu.etaxonomy.cdm.model.description.Feature; |
42 | 42 |
import eu.etaxonomy.cdm.model.description.MeasurementUnit; |
43 |
import eu.etaxonomy.cdm.model.description.Modifier; |
|
44 | 43 |
import eu.etaxonomy.cdm.model.description.QuantitativeData; |
45 | 44 |
import eu.etaxonomy.cdm.model.description.State; |
46 | 45 |
import eu.etaxonomy.cdm.model.description.StatisticalMeasure; |
47 | 46 |
import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue; |
48 | 47 |
import eu.etaxonomy.cdm.model.description.TextData; |
49 | 48 |
import eu.etaxonomy.cdm.model.occurrence.Collection; |
50 |
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
|
|
51 |
import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
|
|
49 |
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; |
|
50 |
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
|
|
52 | 51 |
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; |
52 |
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType; |
|
53 | 53 |
import eu.etaxonomy.cdm.model.reference.Reference; |
54 | 54 |
|
55 | 55 |
|
... | ... | |
121 | 121 |
|
122 | 122 |
//TODO do we still need this map? EcoFacts are not handled separate from Facts. |
123 | 123 |
//However, they have duplicates on derived unit level. Also check duplicateFk. |
124 |
Map<String, FieldObservation> ecoFactFieldObservationMap = (Map<String, FieldObservation>) partitioner.getObjectMap(ECO_FACT_FIELD_OBSERVATION_NAMESPACE);
|
|
124 |
Map<String, FieldUnit> ecoFactFieldObservationMap = (Map<String, FieldUnit>) partitioner.getObjectMap(ECO_FACT_FIELD_OBSERVATION_NAMESPACE);
|
|
125 | 125 |
|
126 | 126 |
ResultSet rs = partitioner.getResultSet(); |
127 | 127 |
|
... | ... | |
148 | 148 |
Reference<?> sourceRef = state.getTransactionalSourceReference(); |
149 | 149 |
|
150 | 150 |
//facade |
151 |
DerivedUnitType type = makeDerivedUnitType(recordBasis);
|
|
151 |
SpecimenOrObservationType type = makeDerivedUnitType(recordBasis);
|
|
152 | 152 |
|
153 | 153 |
DerivedUnitFacade facade; |
154 | 154 |
//field observation |
... | ... | |
156 | 156 |
facade = DerivedUnitFacade.NewInstance(type); |
157 | 157 |
handleFieldObservationSpecimen(rs, facade, state, partitioner); |
158 | 158 |
handleEcoFactSpecificFieldObservation(rs,facade, state); |
159 |
FieldObservation fieldObservation = facade.getFieldObservation(true);
|
|
159 |
FieldUnit fieldObservation = facade.getFieldUnit(true);
|
|
160 | 160 |
ecoFactFieldObservationMap.put(String.valueOf(ecoFactId), fieldObservation); |
161 | 161 |
}else{ |
162 |
FieldObservation fieldObservation = ecoFactFieldObservationMap.get(String.valueOf(duplicateFk));
|
|
162 |
FieldUnit fieldObservation = ecoFactFieldObservationMap.get(String.valueOf(duplicateFk));
|
|
163 | 163 |
facade = DerivedUnitFacade.NewInstance(type, fieldObservation); |
164 | 164 |
} |
165 | 165 |
|
... | ... | |
167 | 167 |
handleEcoFactSpecificDerivedUnit(rs,facade, state); |
168 | 168 |
|
169 | 169 |
|
170 |
DerivedUnitBase<?> objectToSave = facade.innerDerivedUnit();
|
|
170 |
DerivedUnit objectToSave = facade.innerDerivedUnit(); |
|
171 | 171 |
objectsToSave.add(objectToSave); |
172 | 172 |
|
173 | 173 |
|
... | ... | |
209 | 209 |
MarkerType alkalinityMarkerType = getMarkerType(state, uuidMarkerAlkalinity, "Alkalinity", "Alkalinity", null); |
210 | 210 |
boolean alkFlag = Boolean.valueOf(alkalinityFlag.toString()); |
211 | 211 |
Marker alkalinityMarker = Marker.NewInstance(alkalinityMarkerType, alkFlag); |
212 |
facade.getFieldObservation(true).addMarker(alkalinityMarker);
|
|
212 |
facade.getFieldUnit(true).addMarker(alkalinityMarker);
|
|
213 | 213 |
} |
214 | 214 |
|
215 | 215 |
|
... | ... | |
289 | 289 |
logger.warn("Methods not yet handled: " + method); |
290 | 290 |
} |
291 | 291 |
//parameter |
292 |
TermVocabulary<Feature> vocParameter = getVocabulary(uuidVocParameter, "Feature vocabulary for AlgaTerra measurement parameters", "Parameters", null, null, false, Feature.COMMON_NAME()); |
|
292 |
TermVocabulary<Feature> vocParameter = getVocabulary(TermType.Feature, uuidVocParameter, "Feature vocabulary for AlgaTerra measurement parameters", "Parameters", null, null, false, Feature.COMMON_NAME());
|
|
293 | 293 |
if (StringUtils.isNotBlank(parameter)){ |
294 | 294 |
UUID featureUuid = getParameterFeatureUuid(state, parameter); |
295 | 295 |
Feature feature = getFeature(state, featureUuid, parameter, parameter, null, vocParameter); |
... | ... | |
300 | 300 |
quantData.setUnit(unit); |
301 | 301 |
try { |
302 | 302 |
|
303 |
Set<Modifier> valueModifier = new HashSet<Modifier>();
|
|
303 |
Set<DefinedTerm> valueModifier = new HashSet<DefinedTerm>();
|
|
304 | 304 |
valueStr = normalizeAndModifyValue(state, valueStr, valueModifier); |
305 | 305 |
//value |
306 | 306 |
Float valueFlt = Float.valueOf(valueStr); //TODO maybe change model to Double ?? |
... | ... | |
322 | 322 |
|
323 | 323 |
} |
324 | 324 |
|
325 |
private String normalizeAndModifyValue(AlgaTerraImportState state, String valueStr, Set<Modifier> valueModifier) {
|
|
325 |
private String normalizeAndModifyValue(AlgaTerraImportState state, String valueStr, Set<DefinedTerm> valueModifier) {
|
|
326 | 326 |
valueStr = valueStr.replace(",", "."); |
327 | 327 |
if (valueStr.startsWith("<")){ |
328 |
TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());
|
|
329 |
Modifier modifier = getModifier(state, uuidModifierLowerThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
|
|
328 |
TermVocabulary<DefinedTerm> measurementValueModifierVocabulary = getVocabulary(TermType.Modifier, uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, DefinedTerm.NewModifierInstance(null, null, null));
|
|
329 |
DefinedTerm modifier = getModifier(state, uuidModifierLowerThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
|
|
330 | 330 |
valueModifier.add(modifier); |
331 | 331 |
valueStr = valueStr.replace("<", ""); |
332 | 332 |
} |
333 | 333 |
if (valueStr.startsWith(">")){ |
334 |
TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());
|
|
335 |
Modifier modifier = getModifier(state, uuidModifierGreaterThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
|
|
334 |
TermVocabulary<DefinedTerm> measurementValueModifierVocabulary = getVocabulary(TermType.Modifier, uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, DefinedTerm.NewModifierInstance(null, null, null));
|
|
335 |
DefinedTerm modifier = getModifier(state, uuidModifierGreaterThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);
|
|
336 | 336 |
valueModifier.add(modifier); |
337 | 337 |
valueStr = valueStr.replace(">", ""); |
338 | 338 |
} |
... | ... | |
371 | 371 |
} |
372 | 372 |
} |
373 | 373 |
|
374 |
private Feature makeFeature(DerivedUnitType type) { |
|
375 |
if (type.equals(DerivedUnitType.DerivedUnit)){ |
|
376 |
return Feature.INDIVIDUALS_ASSOCIATION(); |
|
377 |
}else if (type.equals(DerivedUnitType.FieldObservation) || type.equals(DerivedUnitType.Observation) ){ |
|
378 |
return Feature.OBSERVATION(); |
|
379 |
}else if (type.equals(DerivedUnitType.Fossil) || type.equals(DerivedUnitType.LivingBeing) || type.equals(DerivedUnitType.Specimen )){ |
|
380 |
return Feature.SPECIMEN(); |
|
381 |
} |
|
382 |
logger.warn("No feature defined for derived unit type: " + type); |
|
383 |
return null; |
|
384 |
} |
|
385 |
|
|
386 |
|
|
387 |
private DerivedUnitType makeDerivedUnitType(String recordBasis) { |
|
388 |
DerivedUnitType result = null; |
|
389 |
if (StringUtils.isBlank(recordBasis)){ |
|
390 |
result = DerivedUnitType.DerivedUnit; |
|
391 |
} else if (recordBasis.equalsIgnoreCase("FossileSpecimen")){ |
|
392 |
result = DerivedUnitType.Fossil; |
|
393 |
}else if (recordBasis.equalsIgnoreCase("HumanObservation")){ |
|
394 |
result = DerivedUnitType.Observation; |
|
395 |
}else if (recordBasis.equalsIgnoreCase("Literature")){ |
|
396 |
logger.warn("Literature record basis not yet supported"); |
|
397 |
result = DerivedUnitType.DerivedUnit; |
|
398 |
}else if (recordBasis.equalsIgnoreCase("LivingSpecimen")){ |
|
399 |
result = DerivedUnitType.LivingBeing; |
|
400 |
}else if (recordBasis.equalsIgnoreCase("MachineObservation")){ |
|
401 |
logger.warn("MachineObservation record basis not yet supported"); |
|
402 |
result = DerivedUnitType.Observation; |
|
403 |
}else if (recordBasis.equalsIgnoreCase("PreservedSpecimen")){ |
|
404 |
result = DerivedUnitType.Specimen; |
|
405 |
} |
|
406 |
return result; |
|
407 |
} |
|
408 | 374 |
|
409 |
/* (non-Javadoc) |
|
410 |
* @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet) |
|
411 |
*/ |
|
375 |
@Override |
|
412 | 376 |
public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) { |
413 | 377 |
String nameSpace; |
414 | 378 |
Class cdmClass; |
... | ... | |
430 | 394 |
|
431 | 395 |
//field observation map for duplicates |
432 | 396 |
nameSpace = AlgaTerraMorphologyImport.ECO_FACT_FIELD_OBSERVATION_NAMESPACE; |
433 |
cdmClass = FieldObservation.class;
|
|
397 |
cdmClass = FieldUnit.class;
|
|
434 | 398 |
idSet = fieldObservationIdSet; |
435 |
Map<String, FieldObservation> fieldObservationMap = (Map<String, FieldObservation>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
|
399 |
Map<String, FieldUnit> fieldObservationMap = (Map<String, FieldUnit>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
|
|
436 | 400 |
result.put(nameSpace, fieldObservationMap); |
437 | 401 |
|
438 | 402 |
//collections |
... | ... | |
451 | 415 |
|
452 | 416 |
//terms |
453 | 417 |
nameSpace = AlgaTerraMorphologyImport.TERMS_NAMESPACE; |
454 |
cdmClass = FieldObservation.class;
|
|
418 |
cdmClass = FieldUnit.class;
|
|
455 | 419 |
idSet = termsIdSet; |
456 | 420 |
Map<String, DefinedTermBase> termMap = (Map<String, DefinedTermBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace); |
457 | 421 |
result.put(nameSpace, termMap); |
Also available in: Unified diff
reintegrate cdmlib-app-3.3 branch into trunk