Unifiy name and taxon creation
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraSpecimenImportBase.java
index 1968e06d4589b50722ed97373e278f639d54fb89..bbcbf79bbb627c4373ab9ab36bb2448ba762b9e6 100644 (file)
@@ -13,6 +13,8 @@ import java.net.URI;
 import java.sql.Date;\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
@@ -29,9 +31,11 @@ import eu.etaxonomy.cdm.model.agent.Team;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
+import eu.etaxonomy.cdm.model.common.DefinedTerm;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.TermType;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.TimePeriod;\r
 import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
@@ -156,6 +160,26 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                                addOriginalSource(stateTerm, id.toString(), "EcoLifeForm", state.getTransactionalSourceReference());\r
                                getTermService().saveOrUpdate(stateTerm);\r
                        }\r
+               \r
+                       //material category\r
+                       TermVocabulary<DefinedTerm> materialCategoryVoc = getVocabulary(TermType.KindOfUnit, AlgaTerraImportTransformer.uuidKindOfUnitVoc, "Alga Terra Material Category", "Alga Terra Material Category", abbrevLabel, uri, false, DefinedTerm.NewKindOfUnitInstance(null, null, null));\r
+                       getVocabularyService().save(materialCategoryVoc);\r
+                       \r
+                       String materialSql = "SELECT * FROM MaterialCategory WHERE MaterialCategoryId <> 16 ";\r
+                       rs = source.getResultSet(materialSql);\r
+                       while (rs.next()){\r
+                               Integer id = rs.getInt("MaterialCategoryId");\r
+                               String category = rs.getString("MaterialCategory");\r
+                               String description = rs.getString("Description");\r
+                               UUID uuid = UUID.randomUUID();\r
+                               \r
+                               DefinedTerm kindOfUnit = DefinedTerm.NewKindOfUnitInstance(description, category, null);\r
+                               kindOfUnit.setUuid(uuid);\r
+                               addOriginalSource(kindOfUnit, id.toString(), "MaterialCategory", state.getTransactionalSourceReference());\r
+                               materialCategoryVoc.addTerm(kindOfUnit);\r
+                               getTermService().saveOrUpdate(kindOfUnit);\r
+                               materialCategoryMapping.put(id, uuid);\r
+                       }\r
                        \r
                        //areas\r
                        OrderedTermVocabulary<NamedArea> informalAreasVoc = (OrderedTermVocabulary<NamedArea>)getVocabulary(TermType.NamedArea, AlgaTerraImportTransformer.uuidNamedAreaVocAlgaTerraInformalAreas, "AlgaTerra Specific Areas", "AlgaTerra Specific Areas", abbrevLabel, uri, true, NamedArea.NewInstance());\r
@@ -171,12 +195,15 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                                String gazetteer = rs.getString("Gazetteer");\r
                                Integer id = rs.getInt("ID");\r
                                String notes = rs.getString("Notes");\r
+                               //TODO stable uuids\r
 //                             UUID uuid = UUID.fromString(rs.getString("UUID"));\r
+                               UUID uuid = UUID.randomUUID();\r
+                               subL4Mapping.put(id, uuid);\r
                                \r
                                String tdwgCode =  (l4Code != null) ? l4Code : (l3Code != null) ? l3Code : (l2Code != null) ? l2Code : l1Code;\r
                                \r
                                NamedArea tdwgArea = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwgCode);\r
-                               NamedArea newArea  = getNamedArea(state, AlgaTerraImportTransformer.uuidNamedAreaPatagonia,gazetteer, gazetteer, null, null, null, informalAreasVoc, TermMatchMode.UUID_ONLY, null);\r
+                               NamedArea newArea  = getNamedArea(state, uuid ,gazetteer, gazetteer, null, null, null, informalAreasVoc, TermMatchMode.UUID_ONLY, null);\r
                                if (isNotBlank(notes)){\r
                                        newArea.addAnnotation(Annotation.NewInstance(notes, AnnotationType.EDITORIAL(), Language.DEFAULT()));\r
                                }\r
@@ -193,6 +220,10 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                }       \r
        }\r
        \r
+       //tmp\r
+       static Map<Integer, UUID> subL4Mapping = new HashMap<Integer, UUID>();\r
+       static Map<Integer, UUID> materialCategoryMapping = new HashMap<Integer, UUID>();\r
+       \r
        protected String getLocalityString(){\r
                return "Locality";\r
        }\r
@@ -258,7 +289,7 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                        makeAreas(state, rs, facade);\r
 \r
                        //notes\r
-                       //TODO is this an annotation on field observation or on the derived unit?\r
+                       //=> not required according to Henning\r
                        \r
                        //id, created, updated, notes\r
                        if (unitId != null){\r
@@ -275,6 +306,7 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
        protected void handleFirstDerivedSpecimen(ResultSet rs, DerivedUnitFacade facade, AlgaTerraImportState state, ResultSetPartitioner partitioner) throws SQLException {\r
                Integer unitId = nullSafeInt(rs, "unitId");\r
                Integer collectionFk = nullSafeInt(rs,"CollectionFk");\r
+               String label = rs.getString("Label"); \r
                \r
                //collection\r
                if (collectionFk != null){\r
@@ -283,10 +315,19 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                                facade.setCollection(subCollection);\r
                        }else{\r
                                Collection collection = state.getRelatedObject(AlgaTerraCollectionImport.NAMESPACE_COLLECTION, String.valueOf(collectionFk), Collection.class);\r
+                               if (collection == null){\r
+                                       logger.warn("Collection for collectionFK " + collectionFk + " can not be found.");\r
+                               }\r
                                facade.setCollection(collection);\r
                        }\r
                }\r
                \r
+               //Label\r
+               if (isNotBlank(label)){\r
+                       //TODO implement label #4218, #3090, #3084\r
+                       logger.warn("Label not yet implemented for specimen, #4218, #3090, #3084");\r
+               }\r
+               \r
                //TODO id, created for fact +  ecoFact\r
                //      this.doIdCreatedUpdatedNotes(state, descriptionElement, rs, id, namespace);\r
                if (unitId != null){\r
@@ -329,8 +370,19 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                                if (isNotBlank(tdwg3)){\r
                                        tdwgArea = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwg3);\r
                                }else{\r
-                                       Integer tdwg2 = rs.getInt("L2Code");                            \r
-                                       tdwgArea = TdwgAreaProvider.getAreaByTdwgAbbreviation(String.valueOf(tdwg2));\r
+                                       Number tdwg2D = nullSafeDouble(rs, "L2Code"); \r
+                                       if (tdwg2D != null){\r
+                                               Integer tdwg2 = tdwg2D.intValue();\r
+                                               tdwgArea = TdwgAreaProvider.getAreaByTdwgAbbreviation(String.valueOf(tdwg2));\r
+                                       }else{\r
+                                               Number tdwg1D = nullSafeDouble(rs, "L1Code");                                   \r
+                                               if (tdwg1D != null){\r
+                                                       Integer tdwg1 = tdwg1D.intValue();\r
+                                                       tdwgArea = TdwgAreaProvider.getAreaByTdwgAbbreviation(String.valueOf(tdwg1));\r
+                                               }else{\r
+                                                       tdwgArea = null;\r
+                                               }\r
+                                       }\r
                                }\r
                        }\r
                        if (tdwgArea == null){\r
@@ -350,10 +402,25 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                        }else{\r
                                \r
                        }\r
-                       if (country == null){\r
-                               boolean hasInformalArea = handleMissingCountry(state, facade, gazetteerId);\r
-                               if (hasInformalArea == false){\r
-                                       logger.warn("Country does not exist for GazetteerID " + gazetteerId);\r
+                       \r
+                       NamedArea subL4Area = null;\r
+                       Boolean subL4 = nullSafeBoolean(rs, "subL4");\r
+                       if (subL4 != null && subL4.booleanValue() == true){\r
+                               subL4Area = makeSubL4Area(state, gazetteerId);\r
+                               if (subL4Area != null){\r
+                                       facade.addCollectingArea(subL4Area);\r
+                               }else{\r
+                                       logger.warn("SubL4 area not found for gazetteerId: " + gazetteerId);\r
+                               }\r
+                       }\r
+                       \r
+                       if (country == null ){\r
+                               if (! gazetteerId.equals(40)){//special handling for Borneo, TDWG area is enough here as it matches exactly\r
+                                       if (subL4Area == null ){\r
+                                               logger.warn("Country does not exist and SubL4 could not be found for GazetteerID " + gazetteerId);\r
+                                       }else {  \r
+                                               logger.info("Country could not be defined but subL4 area was added");\r
+                                       }\r
                                }\r
                        }else{\r
                                facade.setCountry(country);\r
@@ -367,6 +434,12 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
                if (isNotBlank(waterbodyStr)){\r
                        if (waterbodyStr.equals("Atlantic Ocean")){\r
                                waterbody = NamedArea.ATLANTICOCEAN();\r
+                       }else if (waterbodyStr.equals("Pacific Ocean")){\r
+                               waterbody = NamedArea.PACIFICOCEAN();\r
+                       }else if (waterbodyStr.equals("Indian Ocean")){\r
+                               waterbody = NamedArea.INDIANOCEAN();\r
+                       }else if (waterbodyStr.equals("Arctic Ocean")){\r
+                               waterbody = NamedArea.ARCTICOCEAN();\r
                        }else{\r
                                logger.warn("Waterbody not recognized: " + waterbody);\r
                        }\r
@@ -381,6 +454,15 @@ public abstract class AlgaTerraSpecimenImportBase extends BerlinModelImportBase{
        }\r
 \r
 \r
+       private NamedArea makeSubL4Area(AlgaTerraImportState state, Integer gazetteerId) {\r
+               UUID uuid = subL4Mapping.get(gazetteerId);\r
+               NamedArea area = (NamedArea)getTermService().find(uuid);\r
+               if (area == null){\r
+                       logger.warn("SubL4 area could not be found in repository");\r
+               }\r
+               return area;\r
+       }\r
+\r
        private boolean handleMissingCountry(AlgaTerraImportState state, DerivedUnitFacade facade, Integer gazetteerId) {\r
                NamedArea area = null;\r
                if (gazetteerId != null){\r