ref #6241 change @date to @since in appimport
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelTaxonImport.java
index 97a72504885a81354c063974e486fd95ece7d9ea..ad601eb3b68ee14ff9cb248fcfa3115084068a5f 100644 (file)
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-\r
-package eu.etaxonomy.cdm.io.berlinModel.in;\r
-\r
-import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_ACCEPTED;\r
-import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PARTIAL_SYN;\r
-import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PRO_PARTE_SYN;\r
-import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_SYNONYM;\r
-import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_UNRESOLVED;\r
-\r
-import java.lang.reflect.Method;\r
-import java.sql.ResultSet;\r
-import java.sql.SQLException;\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.springframework.stereotype.Component;\r
-\r
-import eu.etaxonomy.cdm.database.update.DatabaseTypeNotSupportedException;\r
-import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;\r
-import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonImportValidator;\r
-import eu.etaxonomy.cdm.io.common.IOValidator;\r
-import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
-import eu.etaxonomy.cdm.model.agent.Person;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.Extension;\r
-import eu.etaxonomy.cdm.model.common.ExtensionType;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.reference.Reference;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-\r
-\r
-/**\r
- * @author a.mueller\r
- * @created 20.03.2008\r
- * @version 1.0\r
- */\r
-@Component\r
-public class BerlinModelTaxonImport  extends BerlinModelImportBase {\r
-       private static final Logger logger = Logger.getLogger(BerlinModelTaxonImport.class);\r
-       \r
-       public static final String NAMESPACE = "Taxon";\r
-\r
-       private static final String pluralString = "Taxa";\r
-       private static final String dbTableName = "PTaxon";\r
-       \r
-       /**\r
-        * How should the publish flag in table PTaxon be interpreted\r
-        * NO_MARKER: No marker is set\r
-        * ONLY_FALSE: \r
-        */\r
-       public enum PublishMarkerChooser{\r
-               NO_MARKER,\r
-               ONLY_FALSE,\r
-               ONLY_TRUE,\r
-               ALL;\r
-               \r
-               boolean doMark(boolean value){\r
-                       if (value == true){\r
-                               return this == ALL || this == ONLY_TRUE;\r
-                       }else{\r
-                               return this == ALL || this == ONLY_FALSE;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       public BerlinModelTaxonImport(){\r
-               super(dbTableName, pluralString);\r
-       }\r
-       \r
-       @Override\r
-       protected String getIdQuery(BerlinModelImportState state) {\r
-               String sqlSelect = " SELECT RIdentifier";\r
-               String taxonTable = state.getConfig().getTaxonTable();\r
-               String sqlFrom = String.format(" FROM %s ", taxonTable);\r
-               String sqlWhere = "";\r
-               \r
-               String sql = sqlSelect + " " + sqlFrom + " " + sqlWhere ;\r
-               return sql;\r
-       }\r
-\r
-       @Override\r
-       protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
-               String sqlSelect = " SELECT pt.*  ";\r
-               String sqlFrom = " FROM PTaxon pt "; \r
-               if (isEuroMed(config) ){\r
-                       sqlFrom = " FROM PTaxon AS pt " + \r
-                                                       " INNER JOIN v_cdm_exp_taxaAll AS em ON pt.RIdentifier = em.RIdentifier " +\r
-                                                       " LEFT OUTER JOIN Reference r ON pt.LastScrutinyFk = r.RefId ";\r
-                       sqlSelect += " , em.MA, r.RefCache as LastScrutiny ";\r
-               }\r
-               \r
-               \r
-               String sqlWhere = " WHERE ( pt.RIdentifier IN (" + ID_LIST_TOKEN + ") )";\r
-               \r
-               String strRecordQuery =sqlSelect + " " + sqlFrom + " " + sqlWhere ;\r
-//                     " SELECT * " + \r
-//                     " FROM PTaxon " + state.getConfig().getTaxonTable();\r
-//                     " WHERE ( RIdentifier IN (" + ID_LIST_TOKEN + ") )";\r
-               return strRecordQuery;\r
-       }\r
-       \r
-       private boolean isEuroMed(BerlinModelImportConfigurator config) {\r
-               return config.getTaxonTable().trim().equals("v_cdm_exp_taxaAll");\r
-       }\r
-\r
-       @Override\r
-       protected boolean doCheck(BerlinModelImportState state){\r
-               IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonImportValidator();\r
-               return validator.validate(state);\r
-       }\r
-\r
-       @Override\r
-       public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
-               boolean success = true ;\r
-               \r
-               BerlinModelImportConfigurator config = state.getConfig();\r
-               Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
-               Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);\r
-               Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);\r
-               \r
-               ResultSet rs = partitioner.getResultSet();\r
-               try{\r
-                       boolean publishFlagExists = state.getConfig().getSource().checkColumnExists("PTaxon", "PublishFlag");\r
-                       boolean isEuroMed = isEuroMed(state.getConfig());\r
-                       while (rs.next()){\r
-\r
-                       //      if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}\r
-                               \r
-                               //create TaxonName element\r
-                               int taxonId = rs.getInt("RIdentifier");\r
-                               int statusFk = rs.getInt("statusFk");\r
-                               \r
-                               int nameFk = rs.getInt("PTNameFk");\r
-                               int refFkInt = rs.getInt("PTRefFk");\r
-                               String doubtful = rs.getString("DoubtfulFlag");\r
-                               String uuid = null;\r
-                               if (resultSetHasColumn(rs,"UUID")){\r
-                                       uuid = rs.getString("UUID");\r
-                               }\r
-                               \r
-                               TaxonNameBase<?,?> taxonName = null;\r
-                               taxonName  = taxonNameMap.get(String.valueOf(nameFk));\r
-                               \r
-                               Reference<?> reference = null;\r
-                               String refFk = String.valueOf(refFkInt);\r
-                               reference = refMap.get(refFk); \r
-                                       \r
-                               if(! config.isIgnoreNull()){\r
-                                       if (taxonName == null ){\r
-                                               logger.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId + ") could not be found in store. Taxon will not be imported");\r
-                                               success = false;\r
-                                               continue; //next taxon\r
-                                       }else if (reference == null ){\r
-                                               logger.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");\r
-                                               success = false;\r
-                                               continue; //next taxon\r
-                                       }\r
-                               }\r
-                               TaxonBase<?> taxonBase;\r
-                               Synonym synonym;\r
-                               Taxon taxon;\r
-                               try {\r
-                                       logger.debug(statusFk);\r
-                                       if (statusFk == T_STATUS_ACCEPTED || statusFk == T_STATUS_UNRESOLVED ){\r
-                                               taxon = Taxon.NewInstance(taxonName, reference);\r
-                                               taxonBase = taxon;\r
-                                               if (statusFk == T_STATUS_UNRESOLVED){\r
-                                                       taxon.setTaxonStatusUnknown(true);\r
-                                               }\r
-                                       }else if (statusFk == T_STATUS_SYNONYM || statusFk == T_STATUS_PRO_PARTE_SYN || statusFk == T_STATUS_PARTIAL_SYN){\r
-                                               synonym = Synonym.NewInstance(taxonName, reference);\r
-                                               taxonBase = synonym;\r
-                                               if (statusFk == T_STATUS_PRO_PARTE_SYN){\r
-                                                       config.addProParteSynonym(synonym);\r
-                                               }\r
-                                               if (statusFk == T_STATUS_PARTIAL_SYN){\r
-                                                       config.addPartialSynonym(synonym);\r
-                                               }\r
-                                       }else{\r
-                                               logger.warn("TaxonStatus " + statusFk + " not yet implemented. Taxon (RIdentifier = " + taxonId + ") left out.");\r
-                                               success = false;\r
-                                               continue;\r
-                                       }\r
-                                       if (uuid != null){\r
-                                               taxonBase.setUuid(UUID.fromString(uuid));\r
-                                       }\r
-                                       \r
-                                       //douptful\r
-                                       if (doubtful.equals("a")){\r
-                                               taxonBase.setDoubtful(false);\r
-                                       }else if(doubtful.equals("d")){\r
-                                               taxonBase.setDoubtful(true);\r
-                                       }else if(doubtful.equals("i")){\r
-                                               taxonBase.setDoubtful(false);\r
-                                               logger.warn("Doubtful = i (inactivated) does not exist in CDM. Doubtful set to false. RIdentifier: " + taxonId);\r
-                                       }\r
-                                       \r
-                                       //detail\r
-                                       String detail = rs.getString("Detail");\r
-                                       if (StringUtils.isNotBlank(detail)){\r
-                                               ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.DETAIL_EXT_UUID, "micro reference","micro reference","micro ref.");\r
-                                               Extension.NewInstance(taxonBase, detail, detailExtensionType);\r
-                                       }\r
-                                       //idInSource\r
-                                       String idInSource = rs.getString("IdInSource");\r
-                                       if (StringUtils.isNotBlank(idInSource)){\r
-                                               ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.ID_IN_SOURCE_EXT_UUID, "Berlin Model IdInSource","Berlin Model IdInSource","BM source id");\r
-                                               Extension.NewInstance(taxonBase, idInSource, detailExtensionType);\r
-                                       }\r
-                                       //namePhrase\r
-                                       String namePhrase = rs.getString("NamePhrase");\r
-                                       if (StringUtils.isNotBlank(namePhrase)){\r
-                                               taxonBase.setAppendedPhrase(namePhrase);\r
-                                       }\r
-                                       //useNameCache\r
-                                       Boolean useNameCacheFlag = rs.getBoolean("UseNameCacheFlag");\r
-                                       if (useNameCacheFlag){\r
-                                               taxonBase.setUseNameCache(true);\r
-                                       }\r
-                                       //publisheFlag\r
-                                       if (publishFlagExists){\r
-                                               Boolean publishFlag = rs.getBoolean("PublishFlag");\r
-                                               Boolean misapplied = false;\r
-                                               if (isEuroMed){\r
-                                                       misapplied = rs.getBoolean("MA");\r
-                                               }\r
-                                               \r
-                                               if ( ! misapplied){\r
-//                                                     logger.error("Publish Flag for synonyms not yet handled correctly");\r
-//                                                     taxonBase.setPublish(publishFlag);\r
-                                                       if(taxonBase.isInstanceOf(Taxon.class) ){\r
-                                                               CdmBase.deproxy(taxonBase, Taxon.class).setPublish(publishFlag);\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       //\r
-                                       if (resultSetHasColumn(rs,"LastScrutiny")){\r
-                                               String lastScrutiny = rs.getString("LastScrutiny");\r
-                                               ExtensionType extensionTypeSpeciesExpert = getExtensionType(state, BerlinModelTransformer.uuidSpeciesExpertName, "Species Expert", "Species Expert", "Species Expert");\r
-                                               taxonBase.addExtension(lastScrutiny, extensionTypeSpeciesExpert);\r
-                                               ExtensionType extensionTypeExpert = getExtensionType(state, BerlinModelTransformer.uuidExpertName, "Expert", "Expert for a taxonomic group", "Expert");\r
-                                               taxonBase.addExtension(lastScrutiny, extensionTypeExpert);\r
-                                       }\r
-                                       \r
-                                       //Notes\r
-                                       doIdCreatedUpdatedNotes(state, taxonBase, rs, taxonId, NAMESPACE);\r
-                                       \r
-                                       //external url\r
-                                       if (config.getMakeUrlForTaxon() != null){\r
-                                               Method urlMethod = config.getMakeUrlForTaxon();\r
-                                               urlMethod.invoke(null, taxonBase, rs);\r
-                                       }\r
-                                       \r
-                                       partitioner.startDoSave();\r
-                                       taxaToSave.add(taxonBase);\r
-                               } catch (Exception e) {\r
-                                       logger.warn("An exception (" +e.getMessage()+") occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");\r
-                                       success = false;\r
-                               }\r
-                       }\r
-               } catch (SQLException e) {\r
-                       logger.error("SQLException:" +  e);\r
-                       return false;\r
-               } catch (DatabaseTypeNotSupportedException e) {\r
-                       logger.error("MethodNotSupportedException:" +  e);\r
-                       return false;\r
-               }\r
-       \r
-                       \r
-               //      logger.info( i + " names handled");\r
-               getTaxonService().save(taxaToSave);\r
-               return success;\r
-       }\r
-\r
-       @Override\r
-       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {\r
-               String nameSpace;\r
-               Class<?> cdmClass;\r
-               Set<String> idSet;\r
-               Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
-               \r
-               try{\r
-                       Set<String> nameIdSet = new HashSet<String>();\r
-                       Set<String> referenceIdSet = new HashSet<String>();\r
-                       while (rs.next()){\r
-                               handleForeignKey(rs, nameIdSet, "PTNameFk");\r
-                               handleForeignKey(rs, referenceIdSet, "PTRefFk");\r
-                       }\r
-                       \r
-                       //name map\r
-                       nameSpace = BerlinModelTaxonNameImport.NAMESPACE;\r
-                       cdmClass = TaxonNameBase.class;\r
-                       idSet = nameIdSet;\r
-                       Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
-                       result.put(nameSpace, nameMap);\r
-\r
-                       //reference map\r
-                       nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;\r
-                       cdmClass = Reference.class;\r
-                       idSet = referenceIdSet;\r
-                       Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
-                       result.put(nameSpace, referenceMap);\r
-\r
-               } catch (SQLException e) {\r
-                       throw new RuntimeException(e);\r
-               }\r
-               return result;\r
-       }\r
-       \r
-       @Override\r
-       protected String getTableName() {\r
-               return dbTableName;\r
-       }\r
-       \r
-       @Override\r
-       public String getPluralString() {\r
-               return pluralString;\r
-       }\r
-       \r
-       @Override\r
-       protected boolean isIgnore(BerlinModelImportState state){\r
-               return ! state.getConfig().isDoTaxa();\r
-       }\r
-\r
-\r
-\r
-}\r
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.cdm.io.berlinModel.in;
+
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_ACCEPTED;
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PARTIAL_SYN;
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_PRO_PARTE_SYN;
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_SYNONYM;
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.T_STATUS_UNRESOLVED;
+
+import java.lang.reflect.Method;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import eu.etaxonomy.cdm.database.update.DatabaseTypeNotSupportedException;
+import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
+import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonImportValidator;
+import eu.etaxonomy.cdm.io.common.IOValidator;
+import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
+import eu.etaxonomy.cdm.model.agent.Person;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.Extension;
+import eu.etaxonomy.cdm.model.common.ExtensionType;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.cdm.model.description.TextData;
+import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+
+
+/**
+ * @author a.mueller
+ * @since 20.03.2008
+ */
+@Component
+public class BerlinModelTaxonImport  extends BerlinModelImportBase {
+    private static final long serialVersionUID = -1186364983750790695L;
+
+    private static final Logger logger = Logger.getLogger(BerlinModelTaxonImport.class);
+
+       public static final String NAMESPACE = "Taxon";
+
+       private static final String pluralString = "Taxa";
+       private static final String dbTableName = "PTaxon";
+
+       /**
+        * How should the publish flag in table PTaxon be interpreted
+        * NO_MARKER: No marker is set
+        * ONLY_FALSE:
+        */
+       public enum PublishMarkerChooser{
+               NO_MARKER,
+               ONLY_FALSE,
+               ONLY_TRUE,
+               ALL;
+
+               boolean doMark(boolean value){
+                       if (value == true){
+                               return this == ALL || this == ONLY_TRUE;
+                       }else{
+                               return this == ALL || this == ONLY_FALSE;
+                       }
+               }
+       }
+
+       public BerlinModelTaxonImport(){
+               super(dbTableName, pluralString);
+       }
+
+       @Override
+       protected String getIdQuery(BerlinModelImportState state) {
+               String sqlSelect = " SELECT RIdentifier";
+               String taxonTable = state.getConfig().getTaxonTable();
+               String sqlFrom = String.format(" FROM %s ", taxonTable);
+               String sqlWhere = "";
+
+               String sql = sqlSelect + " " + sqlFrom + " " + sqlWhere ;
+               return sql;
+       }
+
+       @Override
+       protected String getRecordQuery(BerlinModelImportConfigurator config) {
+               String sqlSelect = " SELECT pt.*  ";
+               String sqlFrom = " FROM PTaxon pt ";
+               if (isEuroMed(config) ){
+                       sqlFrom = " FROM PTaxon AS pt " +
+                                                       " INNER JOIN v_cdm_exp_taxaAll AS em ON pt.RIdentifier = em.RIdentifier " +
+                                                       " LEFT OUTER JOIN Reference r ON pt.LastScrutinyFk = r.RefId ";
+                       sqlSelect += " , em.MA, r.RefCache as LastScrutiny ";
+               }
+
+
+               String sqlWhere = " WHERE ( pt.RIdentifier IN (" + ID_LIST_TOKEN + ") )";
+
+               String strRecordQuery =sqlSelect + " " + sqlFrom + " " + sqlWhere ;
+//                     " SELECT * " +
+//                     " FROM PTaxon " + state.getConfig().getTaxonTable();
+//                     " WHERE ( RIdentifier IN (" + ID_LIST_TOKEN + ") )";
+               return strRecordQuery;
+       }
+
+       private boolean isEuroMed(BerlinModelImportConfigurator config) {
+               return config.getTaxonTable().trim().equals("v_cdm_exp_taxaAll");
+       }
+
+       @Override
+       protected boolean doCheck(BerlinModelImportState state){
+               IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonImportValidator();
+               return validator.validate(state);
+       }
+
+       @Override
+       public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
+               boolean success = true ;
+
+               BerlinModelImportConfigurator config = state.getConfig();
+               Set<TaxonBase> taxaToSave = new HashSet<>();
+               Map<String, TaxonName> taxonNameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
+               Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
+
+               ResultSet rs = partitioner.getResultSet();
+               try{
+                       boolean publishFlagExists = state.getConfig().getSource().checkColumnExists("PTaxon", "PublishFlag");
+                       boolean isEuroMed = isEuroMed(state.getConfig());
+                       while (rs.next()){
+
+                       //      if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("PTaxa handled: " + (i-1));}
+
+                               //create TaxonName element
+                               int taxonId = rs.getInt("RIdentifier");
+                               int statusFk = rs.getInt("statusFk");
+
+                               int nameFk = rs.getInt("PTNameFk");
+                               int refFkInt = rs.getInt("PTRefFk");
+                               String doubtful = rs.getString("DoubtfulFlag");
+                               String uuid = null;
+                               if (resultSetHasColumn(rs,"UUID")){
+                                       uuid = rs.getString("UUID");
+                               }
+
+                               TaxonName taxonName = null;
+                               taxonName  = taxonNameMap.get(String.valueOf(nameFk));
+
+                               Reference reference = null;
+                               String refFk = String.valueOf(refFkInt);
+                               reference = refMap.get(refFk);
+
+                               if(! config.isIgnoreNull()){
+                                       if (taxonName == null ){
+                                               logger.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId + ") could not be found in store. Taxon will not be imported");
+                                               success = false;
+                                               continue; //next taxon
+                                       }else if (reference == null ){
+                                               logger.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");
+                                               success = false;
+                                               continue; //next taxon
+                                       }
+                               }
+                               TaxonBase<?> taxonBase;
+                               Synonym synonym;
+                               Taxon taxon;
+                               try {
+                                       logger.debug(statusFk);
+                                       if (statusFk == T_STATUS_ACCEPTED || statusFk == T_STATUS_UNRESOLVED ){
+                                               taxon = Taxon.NewInstance(taxonName, reference);
+                                               taxonBase = taxon;
+                                               if (statusFk == T_STATUS_UNRESOLVED){
+                                                       taxon.setTaxonStatusUnknown(true);
+                                               }
+                                       }else if (statusFk == T_STATUS_SYNONYM || statusFk == T_STATUS_PRO_PARTE_SYN || statusFk == T_STATUS_PARTIAL_SYN){
+                                               synonym = Synonym.NewInstance(taxonName, reference);
+                                               taxonBase = synonym;
+                                               if (statusFk == T_STATUS_PRO_PARTE_SYN){
+                                                   synonym.setProParte(true);
+                                               }
+                                               if (statusFk == T_STATUS_PARTIAL_SYN){
+                                                       synonym.setPartial(true);
+                                               }
+                                       }else{
+                                               logger.warn("TaxonStatus " + statusFk + " not yet implemented. Taxon (RIdentifier = " + taxonId + ") left out.");
+                                               success = false;
+                                               continue;
+                                       }
+                                       if (uuid != null){
+                                               taxonBase.setUuid(UUID.fromString(uuid));
+                                       }
+
+                                       //doubtful
+                                       if (doubtful.equals("a")){
+                                               taxonBase.setDoubtful(false);
+                                       }else if(doubtful.equals("d")){
+                                               taxonBase.setDoubtful(true);
+                                       }else if(doubtful.equals("i")){
+                                               taxonBase.setDoubtful(false);
+                                               logger.warn("Doubtful = i (inactivated) does not exist in CDM. Doubtful set to false. RIdentifier: " + taxonId);
+                                       }
+
+                                       //detail
+                                       String detail = rs.getString("Detail");
+                                       if (isNotBlank(detail)){
+                                               ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.DETAIL_EXT_UUID, "micro reference","micro reference","micro ref.");
+                                               Extension.NewInstance(taxonBase, detail, detailExtensionType);
+                                       }
+                                       //idInSource
+                                       String idInSource = rs.getString("IdInSource");
+                                       if (isNotBlank(idInSource)){
+                                               ExtensionType detailExtensionType = getExtensionType(state, BerlinModelTransformer.ID_IN_SOURCE_EXT_UUID, "Berlin Model IdInSource","Berlin Model IdInSource","BM source id");
+                                               Extension.NewInstance(taxonBase, idInSource, detailExtensionType);
+                                       }
+                                       //namePhrase
+                                       String namePhrase = rs.getString("NamePhrase");
+                                       if (StringUtils.isNotBlank(namePhrase)){
+                                               taxonBase.setAppendedPhrase(namePhrase);
+                                       }
+                                       //useNameCache
+                                       Boolean useNameCacheFlag = rs.getBoolean("UseNameCacheFlag");
+                                       if (useNameCacheFlag){
+                                               taxonBase.setUseNameCache(true);
+                                       }
+                                       //publisheFlag
+                                       if (publishFlagExists){
+                                               Boolean publishFlag = rs.getBoolean("PublishFlag");
+                                               Boolean misapplied = false;
+                                               if (isEuroMed){
+                                                       misapplied = rs.getBoolean("MA");
+                                               }
+
+                                               if ( ! misapplied){
+                                                       taxonBase.setPublish(publishFlag);
+                                               }
+                                       }
+
+                                       //
+                                       if (resultSetHasColumn(rs,"LastScrutiny")){
+                                               String lastScrutiny = rs.getString("LastScrutiny");
+                                               ExtensionType extensionTypeSpeciesExpert = getExtensionType(state, BerlinModelTransformer.uuidSpeciesExpertName, "Species Expert", "Species Expert", "Species Expert");
+                                               taxonBase.addExtension(lastScrutiny, extensionTypeSpeciesExpert);
+                                               ExtensionType extensionTypeExpert = getExtensionType(state, BerlinModelTransformer.uuidExpertName, "Expert", "Expert for a taxonomic group", "Expert");
+                                               taxonBase.addExtension(lastScrutiny, extensionTypeExpert);
+                                       }
+
+                                       //Notes
+                                       boolean excludeNotes = state.getConfig().isTaxonNoteAsFeature() && taxonBase.isInstanceOf(Taxon.class);
+                                       doIdCreatedUpdatedNotes(state, taxonBase, rs, taxonId, NAMESPACE, false, excludeNotes);
+                                       if (excludeNotes){
+                                           makeTaxonomicNote(state, CdmBase.deproxy(taxonBase, Taxon.class), rs.getString("Notes"));
+                                       }
+
+                                       //external url
+                                       if (config.getMakeUrlForTaxon() != null){
+                                               Method urlMethod = config.getMakeUrlForTaxon();
+                                               urlMethod.invoke(null, taxonBase, rs);
+                                       }
+
+                                       partitioner.startDoSave();
+                                       taxaToSave.add(taxonBase);
+                               } catch (Exception e) {
+                                       logger.warn("An exception (" +e.getMessage()+") occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");
+                                       success = false;
+                               }
+                       }
+               } catch (DatabaseTypeNotSupportedException e) {
+                       logger.error("MethodNotSupportedException:" +  e);
+                       return false;
+               } catch (Exception e) {
+                       logger.error("SQLException:" +  e);
+                       return false;
+               }
+
+
+               //      logger.info( i + " names handled");
+               getTaxonService().save(taxaToSave);
+               return success;
+       }
+
+       /**
+     * @param state
+     * @param taxonBase
+        * @param notes
+     */
+    private void makeTaxonomicNote(BerlinModelImportState state, Taxon taxon, String notes) {
+        if (isNotBlank(notes)){
+            TaxonDescription desc = getTaxonDescription(taxon, false, true);
+            desc.setDefault(true);  //hard coded for Salvador, not used elsewhere as far as I can see
+            TextData textData = TextData.NewInstance(Feature.NOTES() , notes, Language.SPANISH_CASTILIAN(), null);
+            desc.addElement(textData);
+        }
+    }
+
+    @Override
+       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
+               String nameSpace;
+               Class<?> cdmClass;
+               Set<String> idSet;
+               Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
+
+               try{
+                       Set<String> nameIdSet = new HashSet<String>();
+                       Set<String> referenceIdSet = new HashSet<String>();
+                       while (rs.next()){
+                               handleForeignKey(rs, nameIdSet, "PTNameFk");
+                               handleForeignKey(rs, referenceIdSet, "PTRefFk");
+                       }
+
+                       //name map
+                       nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
+                       cdmClass = TaxonName.class;
+                       idSet = nameIdSet;
+                       Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
+                       result.put(nameSpace, nameMap);
+
+                       //reference map
+                       nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
+                       cdmClass = Reference.class;
+                       idSet = referenceIdSet;
+                       Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
+                       result.put(nameSpace, referenceMap);
+
+               } catch (SQLException e) {
+                       throw new RuntimeException(e);
+               }
+               return result;
+       }
+
+       @Override
+       protected String getTableName() {
+               return dbTableName;
+       }
+
+       @Override
+       public String getPluralString() {
+               return pluralString;
+       }
+
+       @Override
+       protected boolean isIgnore(BerlinModelImportState state){
+               return ! state.getConfig().isDoTaxa();
+       }
+
+
+
+}