-/**\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();
+ }
+
+
+
+}