Unifiy name and taxon creation
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraTypeImport.java
index 9dded95acf1d6e87ea61fe3162d9fcff8644cecc..534d15658229bbdeb9351745715ba94ec3dc6632 100644 (file)
@@ -11,26 +11,38 @@ package eu.etaxonomy.cdm.io.algaterra;
 \r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
+import java.sql.Timestamp;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Map;\r
 import java.util.Set;\r
+import java.util.UUID;\r
 \r
 import org.apache.commons.lang.StringUtils;\r
 import org.apache.log4j.Logger;\r
+import org.joda.time.DateTime;\r
 import org.springframework.stereotype.Component;\r
 \r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;\r
 import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;\r
+import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;\r
+import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelRefDetailImport;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelReferenceImport;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonNameImport;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator.EDITOR;\r
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
+import eu.etaxonomy.cdm.model.common.AnnotatableEntity;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.DefinedTerm;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.User;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;\r
@@ -42,11 +54,9 @@ import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 \r
-\r
 /**\r
  * @author a.mueller\r
  * @created 20.03.2008\r
- * @version 1.0\r
  */\r
 @Component\r
 public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {\r
@@ -66,9 +76,6 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
        }\r
        \r
        \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()\r
-        */\r
        @Override\r
        protected String getIdQuery(BerlinModelImportState state) {\r
                String result = " SELECT TypeDesignationId "  \r
@@ -77,28 +84,29 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                return result;\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)\r
-        */\r
        @Override\r
        protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
                        String strQuery =    \r
                                        \r
-                       " SELECT ts.*, ts.TypeSpecimenId as unitId, td.*, gz.ID as GazetteerId, gz.L2Code, gz.L3Code, gz.L4Code, gz.ISOCountry, gz.Country, ts.WaterBody, " + \r
-               " ts.RefFk as tsRefFk, ts.RefDetailFk as tsRefDetailFk, td.RefFk as tdRefFk, td.RefDetailFk as tdRefDetailFk " +\r
+                       " SELECT ts.*, ts.TypeSpecimenId as unitId, td.*, gz.ID as GazetteerId,  gz.L1Code, gz.L2Code, gz.L3Code, gz.L4Code, gz.ISOCountry, gz.Country, gz.subL4, ts.WaterBody, " + \r
+               " ts.RefFk as tsRefFk, ts.RefDetailFk as tsRefDetailFk, ts.MaterialCategoryFK as tsMaterialCategoryFK, td.RefFk as tdRefFk, td.RefDetailFk as tdRefDetailFk, " +\r
+               " RefDet.Details as tdRefDetails, " +\r
+               " td.created_When as tdCreated_When, tsd.created_When as tsdCreated_When, td.updated_when as tdUpdated_when, " +\r
+               " td.created_who as tdCreated_who, tsd.created_who as tsdCreated_who, td.updated_who tdUpdated_who,  " +\r
+               " mc.* " +\r
             " FROM TypeSpecimenDesignation tsd  " \r
                + " LEFT OUTER JOIN TypeSpecimen AS ts ON tsd.TypeSpecimenFk = ts.TypeSpecimenId " \r
                + " FULL OUTER JOIN TypeDesignation td ON  td.TypeDesignationId = tsd.TypeDesignationFk "\r
                + " LEFT OUTER JOIN TDWGGazetteer gz ON ts.TDWGGazetteerFk = gz.ID "\r
+               + " LEFT OUTER JOIN RefDetail refDet ON td.RefDetailFk = refDet.RefDetailId AND td.RefFk = refDet.RefFk "\r
+               + " LEFT OUTER JOIN MaterialCategory mc ON mc.MaterialCategoryId = ts.MaterialCategoryFK "\r
                +       " WHERE (td.TypeDesignationId IN (" + ID_LIST_TOKEN + ")  )"  \r
           + " ORDER BY NameFk "\r
             ;\r
                return strQuery;\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)\r
-        */\r
+       @Override\r
        public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {\r
                boolean success = true;\r
                \r
@@ -121,6 +129,7 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                Map<String, DerivedUnit> ecoFactMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(AlgaTerraEcoFactImport.ECO_FACT_FIELD_OBSERVATION_NAMESPACE);\r
                Map<String, DerivedUnit> typeSpecimenMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(TYPE_SPECIMEN_FIELD_OBSERVATION_NAMESPACE);\r
                Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);\r
+               Map<String, Reference> refDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.REFDETAIL_NAMESPACE);\r
                \r
                \r
                ResultSet rs = partitioner.getResultSet();\r
@@ -141,9 +150,13 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                                Integer ecoFactId = nullSafeInt(rs, "ecoFactFk");\r
                                Integer tdRefFk = nullSafeInt(rs, "tdRefFk");\r
                                Integer tdRefDetailFk = nullSafeInt(rs, "tdRefDetailFk");\r
+                               String tdRefDetails = rs.getString("tdRefDetails");\r
+                               Boolean restrictedFlag = nullSafeBoolean(rs, "RestrictedFlag");\r
                                \r
+                               String typeSpecimenPhrase = rs.getString("TypeSpecimenPhrase");\r
+                               Integer tsMaterialCategoryFK = nullSafeInt(rs, "MaterialCategoryFK");\r
                                \r
-//                             String recordBasis = rs.getString("RecordBasis");\r
+                               boolean isIcon = typeSpecimenPhrase != null && typeSpecimenPhrase.toLowerCase().startsWith("\u005bicon");\r
                                \r
                                try {\r
                                        \r
@@ -151,16 +164,30 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                                        Reference<?> sourceRef = state.getTransactionalSourceReference();\r
                                \r
                                        //facade\r
-                                       //FIXME - depends on material category\r
-//                                     DerivedUnitType type = makeDerivedUnitType(recordBasis);\r
-                                       if (i<=2){logger.warn("RecordBasis not yet implemented in TypeImport");}\r
-                                       \r
                                        SpecimenOrObservationType type = SpecimenOrObservationType.PreservedSpecimen;\r
-                                       DerivedUnitFacade facade = getDerivedUnit(state, typeSpecimenId, typeSpecimenMap, type, ecoFactMap, ecoFactId);\r
+                                       if (isIcon){\r
+                                               //TODO handle images correctly for these specimen\r
+                                               type = SpecimenOrObservationType.StillImage;\r
+                                       }else if (typeStatusFk != null && typeStatusFk.equals(39)){\r
+                                               type =  SpecimenOrObservationType.LivingSpecimen;\r
+                                       }else if (tsMaterialCategoryFK != null && tsMaterialCategoryFK.equals(4)){\r
+                                               type = SpecimenOrObservationType.Fossil;\r
+                                       }\r
+                                       \r
+                                       \r
+                                       if (tsMaterialCategoryFK != null && typeStatusFk != null && \r
+                                                       ( typeStatusFk.equals(39) && !tsMaterialCategoryFK.equals(14) || ! typeStatusFk.equals(39) && tsMaterialCategoryFK.equals(14) )){\r
+                                               logger.warn("Living Specimen type status should be 39 and materialCategoryFk 14 but one of them wasn't");\r
+                                       }\r
+                                       \r
+                                       \r
+                                       DerivedUnitFacade facade = getDerivedUnit(state, typeSpecimenId, typeSpecimenMap, type, ecoFactMap, ecoFactId, sourceRef);\r
                                        \r
                                        //field observation\r
                                        handleFieldObservationSpecimen(rs, facade, state, partitioner);\r
                                        \r
+//                                     handleTypeSpecimenSpecificFieldObservation(rs,facade, state);\r
+                                       \r
                                        //TODO divide like in EcoFact (if necessary)\r
                                        handleTypeSpecimenSpecificSpecimen(rs,facade, state, refMap, typeSpecimenId);\r
                                        \r
@@ -171,21 +198,34 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                                        TaxonNameBase<?,?> name = getTaxonName(state, taxonNameMap, nameId);\r
                                        SpecimenTypeDesignation designation = SpecimenTypeDesignation.NewInstance();\r
                                        SpecimenTypeDesignationStatus status = getSpecimenTypeDesignationStatusByKey(typeStatusFk);\r
+                                       if (typeStatusFk != null && typeStatusFk.equals(39)){\r
+                                               designation.addAnnotation(Annotation.NewInstance("Type status: Authentic strain", AnnotationType.EDITORIAL(), Language.DEFAULT()));\r
+                                       }\r
+                                       \r
                                        designation.setTypeSpecimen(facade.innerDerivedUnit());\r
                                        designation.setTypeStatus(status);\r
                                        if (tdRefFk != null){\r
-                                               Reference<?> typeDesigRef = refMap.get(String.valueOf(tdRefFk));\r
+                                               Reference<?> typeDesigRef = getReferenceFromMaps(refDetailMap, refMap, String.valueOf(tdRefDetailFk), String.valueOf(tdRefFk));\r
                                                if (typeDesigRef == null){\r
                                                        logger.warn("Type designation reference not found in maps: " + tdRefFk);\r
                                                }else{\r
                                                        designation.setCitation(typeDesigRef);\r
                                                }\r
                                        }\r
+                                       if (isNotBlank(tdRefDetails)){\r
+                                               designation.setCitationMicroReference(tdRefDetails);\r
+                                       }\r
+                                       \r
+                                       //ID: Type designations do not allow OriginalSources\r
+                                       designation.addAnnotation(Annotation.NewInstance("Id in BerlinModel-TypeDesignation: " + String.valueOf(typeDesignationId), AnnotationType.TECHNICAL(), Language.UNDETERMINED()));\r
                                        \r
-                                       if (tdRefDetailFk != null){\r
-                                               logger.warn("TypeDesignation.RefDetailFk not yet implemented: " + typeDesignationId);\r
+                                       if (restrictedFlag != null &&restrictedFlag.equals(true)){\r
+                                               logger.warn("Restricted Flag is expected to be null or 0. TypeDesignationId" + typeDesignationId);\r
                                        }\r
                                        \r
+                                       //Created, Updated\r
+                                       this.doCreatedUpdated(state, designation, rs);\r
+                                       \r
                                        if (name != null){\r
                                                name.addTypeDesignation(designation, true); //TODO check if true is correct\r
                                        }else{\r
@@ -213,6 +253,69 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                }\r
        }\r
        \r
+       /**\r
+        * same as {@link BerlinModelImportBase#doCreatedUpdatedNotes}, but handles multiple similar fields\r
+        * @throws SQLException \r
+        */\r
+       private void doCreatedUpdated(BerlinModelImportState state, AnnotatableEntity annotatableEntity, ResultSet rs) throws SQLException{\r
+               BerlinModelImportConfigurator config = state.getConfig();\r
+               Object createdWhen = rs.getObject("tsdCreated_When");\r
+               Object tdCreatedWhen = rs.getObject("tdCreated_When");\r
+               if (tdCreatedWhen != null){\r
+                       createdWhen = tdCreatedWhen;\r
+               }\r
+               \r
+               String createdWho = rs.getString("tsdCreated_Who");\r
+               String tdCreatedWho = rs.getString("tdCreated_Who");\r
+               if (tdCreatedWho != null){\r
+                       createdWho = tdCreatedWho;\r
+               }\r
+               \r
+               Object updatedWhen = rs.getObject("tdUpdated_When");\r
+               String updatedWho = rs.getString("tdUpdated_who");\r
+               \r
+               //Created When, Who, Updated When Who\r
+               if (config.getEditor() == null || config.getEditor().equals(EDITOR.NO_EDITORS)){\r
+                       //do nothing\r
+               }else if (config.getEditor().equals(EDITOR.EDITOR_AS_ANNOTATION)){\r
+                       String createdAnnotationString = "Berlin Model record was created By: " + String.valueOf(createdWho) + " (" + String.valueOf(createdWhen) + ") ";\r
+                       if (updatedWhen != null && updatedWho != null){\r
+                               createdAnnotationString += " and updated By: " + String.valueOf(updatedWho) + " (" + String.valueOf(updatedWhen) + ")";\r
+                       }\r
+                       Annotation annotation = Annotation.NewInstance(createdAnnotationString, Language.DEFAULT());\r
+                       annotation.setCommentator(config.getCommentator());\r
+                       annotation.setAnnotationType(AnnotationType.TECHNICAL());\r
+                       annotatableEntity.addAnnotation(annotation);\r
+               }else if (config.getEditor().equals(EDITOR.EDITOR_AS_EDITOR)){\r
+                       User creator = getUser(state, createdWho);\r
+                       User updator = getUser(state, updatedWho);\r
+                       DateTime created = getDateTime(createdWhen);\r
+                       DateTime updated = getDateTime(updatedWhen);\r
+                       annotatableEntity.setCreatedBy(creator);\r
+                       annotatableEntity.setUpdatedBy(updator);\r
+                       annotatableEntity.setCreated(created);\r
+                       annotatableEntity.setUpdated(updated);\r
+               }else {\r
+                       logger.warn("Editor type not yet implemented: " + config.getEditor());\r
+               }\r
+       }\r
+       \r
+\r
+       private DateTime getDateTime(Object timeString){\r
+               if (timeString == null){\r
+                       return null;\r
+               }\r
+               DateTime dateTime = null;\r
+               if (timeString instanceof Timestamp){\r
+                       Timestamp timestamp = (Timestamp)timeString;\r
+                       dateTime = new DateTime(timestamp);\r
+               }else{\r
+                       logger.warn("time ("+timeString+") is not a timestamp. Datetime set to current date. ");\r
+                       dateTime = new DateTime();\r
+               }\r
+               return dateTime;\r
+       }\r
+       \r
        \r
        protected String getDerivedUnitNameSpace(){\r
                return TYPE_SPECIMEN_DERIVED_UNIT_NAMESPACE;\r
@@ -248,6 +351,23 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                \r
                DerivedUnit derivedUnit = facade.innerDerivedUnit();\r
                \r
+               Integer tsMaterialCategoryFK = nullSafeInt(rs, "tsMaterialCategoryFK");\r
+               String matCat = rs.getString("MaterialCategory");\r
+               if (tsMaterialCategoryFK != null){\r
+                       if (tsMaterialCategoryFK.equals(16)){\r
+                               tsMaterialCategoryFK = 9;\r
+                       }\r
+                       UUID uuid = materialCategoryMapping.get(tsMaterialCategoryFK);\r
+                       if (uuid == null){\r
+                               logger.warn("Uuid was null. This should not happen.");\r
+                       }\r
+                       DefinedTerm kindOfUnit = getKindOfUnit(state, uuid, matCat, null, null, null);  //all terms should exist already\r
+                       facade.setKindOfUnit(kindOfUnit);\r
+               }else{\r
+                       logger.warn("Material Category was null. This is not expected");\r
+               }\r
+               \r
+               \r
                //collection\r
                String barcode = rs.getString("Barcode");\r
                if (StringUtils.isNotBlank(barcode)){\r
@@ -272,8 +392,6 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                        logger.warn("TypeSpecimen.RefDetailFk should always be NULL but wasn't: " + typeSpecimenId);\r
                }\r
                \r
-               \r
-               \r
        }\r
 \r
        /**\r
@@ -283,9 +401,10 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
         * @param type \r
         * @param ecoFactId2 \r
         * @param ecoFactMap \r
+        * @param sourceRef \r
         * @return\r
         */\r
-       private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int typeSpecimenId, Map<String, DerivedUnit> typeSpecimenMap, SpecimenOrObservationType type, Map<String, DerivedUnit> ecoFactMap, Integer ecoFactId2) {\r
+       private DerivedUnitFacade getDerivedUnit(AlgaTerraImportState state, int typeSpecimenId, Map<String, DerivedUnit> typeSpecimenMap, SpecimenOrObservationType type, Map<String, DerivedUnit> ecoFactMap, Integer ecoFactId2, Reference<?> sourceRef) {\r
                //TODO implement ecoFact map - if not all null anymore\r
                String typeKey = String.valueOf(typeSpecimenId);\r
                DerivedUnit derivedUnit = typeSpecimenMap.get(typeKey);\r
@@ -296,6 +415,7 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                }else{\r
                        try {\r
                                facade = DerivedUnitFacade.NewInstance(derivedUnit);\r
+                               facade.addSource(IdentifiableSource.NewDataImportInstance(typeKey, "TypeSpecimen", sourceRef));\r
                        } catch (DerivedUnitFacadeNotSupportedException e) {\r
                                logger.error(e.getMessage());\r
                                facade = DerivedUnitFacade.NewInstance(type);\r
@@ -304,31 +424,10 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                \r
                return facade;\r
        }\r
-//     private DerivedUnitType makeDerivedUnitType(String recordBasis) {\r
-//             DerivedUnitType result = null;\r
-//             if (StringUtils.isBlank(recordBasis)){\r
-//                     result = DerivedUnitType.DerivedUnit;\r
-//             } else if (recordBasis.equalsIgnoreCase("FossileSpecimen")){\r
-//                     result = DerivedUnitType.Fossil;\r
-//             }else if (recordBasis.equalsIgnoreCase("HumanObservation")){\r
-//                     result = DerivedUnitType.Observation;\r
-//             }else if (recordBasis.equalsIgnoreCase("Literature")){\r
-//                     logger.warn("Literature record basis not yet supported");\r
-//                     result = DerivedUnitType.DerivedUnit;\r
-//             }else if (recordBasis.equalsIgnoreCase("LivingSpecimen")){\r
-//                     result = DerivedUnitType.LivingBeing;\r
-//             }else if (recordBasis.equalsIgnoreCase("MachineObservation")){\r
-//                     logger.warn("MachineObservation record basis not yet supported");\r
-//                     result = DerivedUnitType.Observation;\r
-//             }else if (recordBasis.equalsIgnoreCase("PreservedSpecimen")){\r
-//                     result = DerivedUnitType.Specimen;\r
-//             }\r
-//             return result;\r
-//     }\r
 \r
        \r
        private SpecimenTypeDesignationStatus getSpecimenTypeDesignationStatusByKey(Integer typeStatusFk) {\r
-               if (typeStatusFk == null){ return null;\r
+               if (typeStatusFk == null){ return SpecimenTypeDesignationStatus.TYPE();\r
                }else if (typeStatusFk == 1) { return SpecimenTypeDesignationStatus.HOLOTYPE();\r
                }else if (typeStatusFk == 2) { return SpecimenTypeDesignationStatus.LECTOTYPE();\r
                }else if (typeStatusFk == 3) { return SpecimenTypeDesignationStatus.NEOTYPE();\r
@@ -347,7 +446,7 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                }else if (typeStatusFk == 22) { return SpecimenTypeDesignationStatus.PHOTOTYPE();\r
                }else if (typeStatusFk == 30) { return SpecimenTypeDesignationStatus.TYPE();\r
                }else if (typeStatusFk == 38) { return SpecimenTypeDesignationStatus.ISOEPITYPE();\r
-//             }else if (typeStatusFk == 39) { return SpecimenTypeDesignationStatus.;\r
+               }else if (typeStatusFk == 39) { return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();  //but add annotation\r
                }else if (typeStatusFk == 40) { return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();\r
                }else{\r
                        logger.warn("typeStatusFk undefined for " +  typeStatusFk);\r
@@ -357,12 +456,10 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
        }\r
 \r
        \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
-        */\r
-       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
+       @Override\r
+       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {\r
                String nameSpace;\r
-               Class cdmClass;\r
+               Class<?> cdmClass;\r
                Set<String> idSet;\r
                Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
                \r
@@ -370,9 +467,10 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                        Set<String> nameIdSet = new HashSet<String>();\r
                        Set<String> ecoFieldObservationIdSet = new HashSet<String>();\r
                        Set<String> typeSpecimenIdSet = new HashSet<String>();\r
-                       Set<String> termsIdSet = new HashSet<String>();\r
+//                     Set<String> termsIdSet = new HashSet<String>();\r
                        Set<String> collectionIdSet = new HashSet<String>();\r
                        Set<String> referenceIdSet = new HashSet<String>();\r
+                       Set<String> refDetailIdSet = new HashSet<String>();\r
                        \r
                        while (rs.next()){\r
                                handleForeignKey(rs, nameIdSet, "nameFk");\r
@@ -381,6 +479,7 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                                handleForeignKey(rs, collectionIdSet, "CollectionFk");\r
                                handleForeignKey(rs, referenceIdSet, "tsRefFk");\r
                                handleForeignKey(rs, referenceIdSet, "tdRefFk");\r
+                               handleForeignKey(rs, refDetailIdSet, "tdRefDetailFk");\r
                        }\r
                        \r
                        //name map\r
@@ -426,15 +525,13 @@ public class AlgaTerraTypeImport  extends AlgaTerraSpecimenImportBase {
                        Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
                        result.put(nameSpace, referenceMap);\r
                        \r
-                       //\r
-//                     //terms\r
-//                     nameSpace = AlgaTerraTypeImport.TERMS_NAMESPACE;\r
-//                     cdmClass = FieldObservation.class;\r
-//                     idSet = taxonIdSet;\r
-//                     Map<String, DefinedTermBase> termMap = (Map<String, DefinedTermBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
-//                     result.put(nameSpace, termMap);\r
-\r
-               \r
+                       //refDetail map\r
+                       nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;\r
+                       cdmClass = Reference.class;\r
+                       idSet = refDetailIdSet;\r
+                       Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, refDetailMap);\r
+       \r
                        \r
                        \r
                } catch (SQLException e) {\r