\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;\r
+import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;\r
import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraSpecimenImportValidator;\r
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase;\r
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;\r
import eu.etaxonomy.cdm.model.common.Marker;\r
import eu.etaxonomy.cdm.model.common.MarkerType;\r
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
import eu.etaxonomy.cdm.model.common.TimePeriod;\r
import eu.etaxonomy.cdm.model.description.CategoricalData;\r
import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;\r
+import eu.etaxonomy.cdm.model.description.MeasurementUnit;\r
+import eu.etaxonomy.cdm.model.description.Modifier;\r
+import eu.etaxonomy.cdm.model.description.QuantitativeData;\r
import eu.etaxonomy.cdm.model.description.SpecimenDescription;\r
import eu.etaxonomy.cdm.model.description.State;\r
+import eu.etaxonomy.cdm.model.description.StatisticalMeasure;\r
+import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
import eu.etaxonomy.cdm.model.description.TextData;\r
import eu.etaxonomy.cdm.model.location.NamedArea;\r
import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
import eu.etaxonomy.cdm.model.name.BotanicalName;\r
import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
import eu.etaxonomy.cdm.model.reference.Reference;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
public class AlgaTerraSpecimenImport extends BerlinModelImportBase {\r
private static final Logger logger = Logger.getLogger(AlgaTerraSpecimenImport.class);\r
\r
- public static final String FIELD_OBSERVATION_NAMESPACE = "FieldObservation";\r
+ public static final String ECO_FACT_NAMESPACE = "EcoFact";\r
public static final String TERMS_NAMESPACE = "ALGA_TERRA_TERMS";\r
\r
- //move to transformrer\r
+ //TODO move to transformrer\r
final static UUID uuidMarkerAlkalinity = UUID.fromString("e52d0ea2-0c1f-4d95-ae6d-e21ab317c594"); \r
final static UUID uuidRefSystemGps = UUID.fromString("c23e4928-c137-4e4a-b6ab-b430da3d0b94"); \r
final static UUID uuidFeatureSpecimenCommunity = UUID.fromString("3ff5b1ab-3999-4b5a-b8f7-01fd2f6c12c7");\r
final static UUID uuidFeatureAdditionalData = UUID.fromString("0ac82ab8-2c2b-4953-98eb-a9f718eb9c57");\r
+ final static UUID uuidFeatureHabitatExplanation = UUID.fromString("6fe32295-61a3-44fc-9fcf-a85790ea888f");\r
\r
final static UUID uuidVocAlgaTerraClimate = UUID.fromString("b0a677c6-8bb6-43f4-b1b8-fc377a10feb5");\r
final static UUID uuidVocAlgaTerraHabitat = UUID.fromString("06f30114-e19c-4e7d-a8e5-5488c41fcbc5");\r
final static UUID uuidFeatureAlgaTerraHabitat = UUID.fromString("7def3fc2-cdc5-4739-8e13-62edbd053415");\r
final static UUID uuidFeatureAlgaTerraLifeForm = UUID.fromString("9b657901-1b0d-4a2a-8d21-dd8c1413e2e6");\r
\r
+ final static UUID uuidVocParameter = UUID.fromString("45888b40-5bbb-4293-aa1e-02479796cd7c");\r
+ final static UUID uuidStatMeasureSingleValue = UUID.fromString("eb4c3d98-4d4b-4c37-8eb4-17315ce79920");\r
+ final static UUID uuidMeasurementValueModifier = UUID.fromString("0218a7a3-f6c0-4d06-a4f8-6b50b73aef5e");\r
\r
+ final static UUID uuidModifierLowerThan = UUID.fromString("2b500085-6bef-4003-b6ea-e0ad0237d79d");\r
+ final static UUID uuidModifierGreaterThan = UUID.fromString("828df49d-c745-48f7-b083-0ada43356c34");\r
\r
private static int modCount = 5000;\r
private static final String pluralString = "specimen and observation";\r
Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
\r
Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);\r
- Map<String, FieldObservation> fieldObservationMap = (Map<String, FieldObservation>) partitioner.getObjectMap(FIELD_OBSERVATION_NAMESPACE);\r
+ Map<String, DerivedUnit> ecoFactMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(ECO_FACT_NAMESPACE);\r
\r
ResultSet rs = partitioner.getResultSet();\r
\r
Reference<?> sourceRef = state.getTransactionalSourceReference();\r
\r
//facade\r
- FieldObservation fieldObservation = getFieldObservation(ecoFactId, fieldObservationMap);\r
DerivedUnitType type = makeDerivedUnitType(recordBasis);\r
- DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(type, fieldObservation);\r
-\r
+ DerivedUnitFacade facade = getDerivedUnit(state, ecoFactId, ecoFactMap, type);\r
+ \r
//field observation\r
handleSingleSpecimen(rs, facade, state);\r
\r
+ state.setCurrentFieldObservationNotNew(false);\r
+ \r
//description element\r
TaxonDescription taxonDescription = getTaxonDescription(state, newTaxonId, taxonMap, factId, sourceRef);\r
IndividualsAssociation indAssociation = IndividualsAssociation.NewInstance();\r
\r
\r
private void handleSingleSpecimen(ResultSet rs, DerivedUnitFacade facade, AlgaTerraImportState state) throws SQLException {\r
- //CollectionFk, Collector, AltitudeMethod, \r
- //ISOCountrySub, CreatedWhen/Who/Updated/who\r
- \r
- //P1-10Value/Unit/Parameter/Method\r
- \r
+ //FIXME missing fields #3084, #3085, #3080\r
try {\r
Object alkalinityFlag = rs.getBoolean("AlkalinityFlag");\r
\r
\r
\r
\r
- FieldObservation fieldObservation = facade.innerFieldObservation();\r
+ FieldObservation fieldObservation = facade.getFieldObservation(true);\r
\r
//alkalinity marker\r
if (alkalinityFlag != null){\r
\r
//habitat, ecology, community, etc.\r
DescriptionBase<?> fieldDescription = getFieldObservationDescription(facade);\r
+ \r
addCategoricalValue(state, fieldDescription, climateUuid, uuidFeatureAlgaTerraClimate);\r
addCategoricalValue(state, fieldDescription, habitatUuid, Feature.HABITAT().getUuid());\r
addCategoricalValue(state, fieldDescription, lifeFormUuid, uuidFeatureAlgaTerraLifeForm);\r
\r
if (isNotBlank(habitat)){\r
- //FIXME\r
- facade.setEcology(habitat); //or use an own feature ??\r
+ Feature habitatExplanation = getFeature(state, uuidFeatureHabitatExplanation, "Habitat Explanation", "HabitatExplanation", null, null);\r
+ TextData textData = TextData.NewInstance(habitatExplanation);\r
+ textData.putText(Language.DEFAULT(), habitat);\r
+ getFieldObservationDescription(facade).addElement(textData);\r
}\r
if (isNotBlank(community)){\r
Feature communityFeature = getFeature(state, uuidFeatureSpecimenCommunity, "Community", "The community of a specimen (e.g. other algae in the same sample)", null, null);\r
makeAreas(state, rs, facade);\r
\r
//parameters\r
- //TODO\r
+ makeParameter(state, rs, getFieldObservationDescription(facade));\r
\r
//collection\r
String voucher = rs.getString("Voucher");\r
//TODO id, created for fact + ecoFact\r
// this.doIdCreatedUpdatedNotes(state, descriptionElement, rs, id, namespace);\r
\r
- } catch (IllegalArgumentException e) {\r
- throw e;\r
+ } catch (Exception e) {\r
+ throw new RuntimeException(e);\r
}\r
\r
}\r
\r
\r
+ private void makeParameter(AlgaTerraImportState state, ResultSet rs, DescriptionBase<?> descriptionBase) throws SQLException {\r
+ for (int i = 1; i <= 10; i++){\r
+ String valueStr = rs.getString(String.format("P%dValue", i));\r
+ String unitStr = rs.getString(String.format("P%dUnit", i));\r
+ String parameter = rs.getString(String.format("P%dParameter", i));\r
+ String method = rs.getString(String.format("P%dMethod", i));\r
+ \r
+ //method\r
+ if (StringUtils.isNotBlank(method)){\r
+ logger.warn("Methods not yet handled: " + method);\r
+ }\r
+ //parameter\r
+ TermVocabulary<Feature> vocParameter = getVocabulary(uuidVocParameter, "Feature vocabulary for AlgaTerra measurement parameters", "Parameters", null, null, false, Feature.COMMON_NAME());\r
+ if (StringUtils.isNotBlank(parameter)){\r
+ UUID featureUuid = getParameterFeatureUuid(state, parameter);\r
+ Feature feature = getFeature(state, featureUuid, parameter, parameter, null, vocParameter);\r
+ QuantitativeData quantData = QuantitativeData.NewInstance(feature);\r
+ \r
+ //unit\r
+ MeasurementUnit unit = getMeasurementUnit(state, unitStr);\r
+ quantData.setUnit(unit);\r
+ try {\r
+ \r
+ Set<Modifier> valueModifier = new HashSet<Modifier>();\r
+ valueStr = normalizeAndModifyValue(state, valueStr, valueModifier);\r
+ //value\r
+ Float valueFlt = Float.valueOf(valueStr); //TODO maybe change model to Double ??\r
+ \r
+ StatisticalMeasure measureSingleValue = getStatisticalMeasure(state, uuidStatMeasureSingleValue, "Value", "Single measurement value", null, null);\r
+ StatisticalMeasurementValue value = StatisticalMeasurementValue.NewInstance(measureSingleValue, valueFlt); \r
+ quantData.addStatisticalValue(value);\r
+ descriptionBase.addElement(quantData);\r
+ \r
+ } catch (NumberFormatException e) {\r
+ logger.warn(String.format("Value '%s' can't be converted to double. Parameter %s not imported.", valueStr, parameter));\r
+ }\r
+ }else if (isNotBlank(valueStr) || isNotBlank(unitStr) ){\r
+ logger.warn("There is value or unit without parameter: " + i);\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ }\r
+\r
+ private String normalizeAndModifyValue(AlgaTerraImportState state, String valueStr, Set<Modifier> valueModifier) {\r
+ valueStr = valueStr.replace(",", ".");\r
+ if (valueStr.startsWith("<")){\r
+ TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());\r
+ Modifier modifier = getModifier(state, uuidModifierLowerThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);\r
+ valueModifier.add(modifier);\r
+ valueStr = valueStr.replace("<", "");\r
+ }\r
+ if (valueStr.startsWith(">")){\r
+ TermVocabulary<Modifier> measurementValueModifierVocabulary = getVocabulary(uuidMeasurementValueModifier, "Measurement value modifier", "Measurement value modifier", null, null, false, Modifier.NewInstance());\r
+ Modifier modifier = getModifier(state, uuidModifierGreaterThan, "Lower", "Lower than the given measurement value", "<", measurementValueModifierVocabulary);\r
+ valueModifier.add(modifier);\r
+ valueStr = valueStr.replace(">", "");\r
+ }\r
+ return valueStr;\r
+ }\r
+\r
+\r
+\r
+ private UUID getParameterFeatureUuid(AlgaTerraImportState state, String key) {\r
+ //TODO define some UUIDs in Transformer\r
+ UUID uuid = state.getParameterFeatureUuid(key);\r
+ if (uuid == null){\r
+ uuid = UUID.randomUUID();\r
+ state.putParameterFeatureUuid(key, uuid);\r
+ }\r
+ return uuid;\r
+ }\r
+\r
+\r
+\r
+ /**\r
+ * TODO move to InputTransformerBase\r
+ * @param state\r
+ * @param unitStr\r
+ * @return\r
+ */\r
+ private MeasurementUnit getMeasurementUnit(AlgaTerraImportState state, String unitStr) {\r
+ MeasurementUnit result = null;\r
+ if (StringUtils.isNotBlank(unitStr)){\r
+ UUID uuidMeasurementUnitMgL = UUID.fromString("7ac302c5-3cbd-4334-964a-bf5d11eb9ead");\r
+ UUID uuidMeasurementUnitMolMol = UUID.fromString("96b78d78-3e49-448f-8100-e7779b71dd53");\r
+ UUID uuidMeasurementUnitMicroMolSiL = UUID.fromString("2cb8bc85-a4af-42f1-b80b-34c36c9f75d4");\r
+ UUID uuidMeasurementUnitMicroMolL = UUID.fromString("a631f62e-377e-405c-bd1a-76885b13a72b");\r
+ UUID uuidMeasurementUnitDegreeC = UUID.fromString("55222aec-d5be-413e-8db7-d9a48c316c6c");\r
+ UUID uuidMeasurementUnitPercent = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");\r
+ UUID uuidMeasurementUnitCm = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");\r
+ UUID uuidMeasurementUnitMicroSiCm = UUID.fromString("3ea3110e-f048-4bed-8bfe-33c60f63626f");\r
+ \r
+ \r
+ if (unitStr.equalsIgnoreCase("mg/L")){\r
+ return getMeasurementUnit(state, uuidMeasurementUnitMgL, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("mol/mol")){\r
+ return result = getMeasurementUnit(state, uuidMeasurementUnitMolMol, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("\u00B5mol Si/L")){ //µmol Si/L\r
+ return getMeasurementUnit(state, uuidMeasurementUnitMicroMolSiL, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("\u00B5mol/L")){ //µmol/L\r
+ return getMeasurementUnit(state, uuidMeasurementUnitMicroMolL, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("\u00B0C")){ //°C\r
+ return getMeasurementUnit(state, uuidMeasurementUnitDegreeC, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("%")){\r
+ return getMeasurementUnit(state, uuidMeasurementUnitPercent, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("cm")){\r
+ return getMeasurementUnit(state, uuidMeasurementUnitCm, unitStr, unitStr, unitStr, null);\r
+ }else if (unitStr.equalsIgnoreCase("\u00B5S/cm")){ //µS/cm\r
+ return getMeasurementUnit(state, uuidMeasurementUnitMicroSiCm, unitStr, unitStr, unitStr, null);\r
+ }else{\r
+ logger.warn("MeasurementUnit was not recognized");\r
+ return null;\r
+ }\r
+ }else{\r
+ return null;\r
+ }\r
+ }\r
+\r
+\r
+\r
private void addCategoricalValue(AlgaTerraImportState importState, DescriptionBase description, String uuidTerm, UUID featureUuid) {\r
if (uuidTerm != null){\r
State state = this.getStateTerm(importState, UUID.fromString(uuidTerm));\r
}\r
}\r
\r
- private FieldObservation getFieldObservation(int ecoFactId, Map<String, FieldObservation> fieldObservationMap) {\r
+ /**\r
+ * @param state\r
+ * @param ecoFactId\r
+ * @param derivedUnitMap\r
+ * @param type \r
+ * @return\r
+ */\r
+ private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int ecoFactId, Map<String, DerivedUnit> derivedUnitMap, DerivedUnitType type) {\r
String key = String.valueOf(ecoFactId);\r
- FieldObservation fieldObservation = fieldObservationMap.get(key);\r
- if (fieldObservation == null){\r
- fieldObservation = FieldObservation.NewInstance();\r
- \r
- fieldObservationMap.put(key, fieldObservation);\r
+ DerivedUnit derivedUnit = derivedUnitMap.get(key);\r
+ DerivedUnitFacade facade;\r
+ if (derivedUnit == null){\r
+ facade = DerivedUnitFacade.NewInstance(type);\r
+ derivedUnitMap.put(key, derivedUnit);\r
+ }else{\r
+ try {\r
+ facade = DerivedUnitFacade.NewInstance(derivedUnit);\r
+ } catch (DerivedUnitFacadeNotSupportedException e) {\r
+ logger.error(e.getMessage());\r
+ facade = DerivedUnitFacade.NewInstance(type);\r
+ }\r
}\r
\r
- return fieldObservation;\r
+ return facade;\r
}\r
\r
private Feature makeFeature(DerivedUnitType type) {\r
result.put(nameSpace, objectMap);\r
\r
//field observation map map\r
- nameSpace = AlgaTerraSpecimenImport.FIELD_OBSERVATION_NAMESPACE;\r
+ nameSpace = AlgaTerraSpecimenImport.ECO_FACT_NAMESPACE;\r
cdmClass = FieldObservation.class;\r
idSet = taxonIdSet;\r
Map<String, FieldObservation> fieldObservationMap = (Map<String, FieldObservation>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r