latest updates for ALgaterra import
authorAndreas Müller <a.mueller@bgbm.org>
Tue, 11 Sep 2012 13:46:21 +0000 (13:46 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Tue, 11 Sep 2012 13:46:21 +0000 (13:46 +0000)
app-import/src/main/java/eu/etaxonomy/cdm/io/algaterra/AlgaTerraImportState.java
app-import/src/main/java/eu/etaxonomy/cdm/io/algaterra/AlgaTerraSpecimenImport.java

index 68be738fe89b655da378460ba2be0b45542edebf..186f348095d942f47c94b37c37a91a95fe8b4730 100644 (file)
 \r
 package eu.etaxonomy.cdm.io.algaterra;\r
 \r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.UUID;\r
+\r
 import org.apache.log4j.Logger;\r
 \r
 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;\r
+import eu.etaxonomy.cdm.model.description.StatisticalMeasure;\r
 \r
 /**\r
  * @author a.mueller\r
@@ -25,6 +30,8 @@ public class AlgaTerraImportState extends BerlinModelImportState{
        private static final Logger logger = Logger.getLogger(AlgaTerraImportState.class);\r
 \r
        private boolean specimenVocabulariesCreated = false;\r
+       private boolean currentFieldObservationNotNew = false;\r
+       private Map<String, UUID> parameterFeatureUuidMap = new HashMap<String, UUID>(); \r
        \r
        public AlgaTerraImportState(AlgaTerraImportConfigurator config) {\r
                super(config);\r
@@ -42,5 +49,21 @@ public class AlgaTerraImportState extends BerlinModelImportState{
                this.specimenVocabulariesCreated = specimenVocabulariesCreated;\r
        }\r
 \r
-    \r
+       public boolean isCurrentFieldObservationNotNew() {\r
+               return currentFieldObservationNotNew;\r
+       }\r
+\r
+       public void setCurrentFieldObservationNotNew(\r
+                       boolean currentFieldObservationNotNew) {\r
+               this.currentFieldObservationNotNew = currentFieldObservationNotNew;\r
+       }\r
+\r
+       public UUID getParameterFeatureUuid(String key) {\r
+               return parameterFeatureUuidMap.get(key);\r
+       }\r
+\r
+       public void putParameterFeatureUuid(String key, UUID parameterFeatureUuid) {\r
+               this.parameterFeatureUuidMap.put(key, parameterFeatureUuid);\r
+       }\r
+\r
 }\r
index bfb4e8503115ef870292c6909dff24513c28ec2e..d9494b432ccc64c346b81897bf1b62374c0494b4 100644 (file)
@@ -26,6 +26,7 @@ import org.springframework.transaction.TransactionStatus;
 \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
@@ -41,13 +42,19 @@ import eu.etaxonomy.cdm.model.common.Language;
 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
@@ -57,6 +64,7 @@ import eu.etaxonomy.cdm.model.location.TdwgArea;
 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
@@ -72,14 +80,15 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 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
@@ -89,7 +98,12 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
        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
@@ -154,7 +168,7 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                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
@@ -178,13 +192,14 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                                        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
@@ -295,11 +310,7 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
 \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
@@ -329,7 +340,7 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                        \r
                        \r
                        \r
-                       FieldObservation fieldObservation = facade.innerFieldObservation();\r
+                       FieldObservation fieldObservation = facade.getFieldObservation(true);\r
                        \r
                        //alkalinity marker\r
                        if (alkalinityFlag != null){\r
@@ -376,13 +387,16 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                        \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
@@ -407,7 +421,7 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                        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
@@ -422,13 +436,135 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                        //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
@@ -539,16 +675,30 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                }\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
@@ -616,7 +766,7 @@ public class AlgaTerraSpecimenImport  extends BerlinModelImportBase {
                        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