Correct publish flag import for BM import
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / cyprus / CyprusExcelImport.java
index 5b0df00852b4ac068a5ca22aa2f2d743457e9ad8..9554f00404f07b1da63b05f8f4205f9657e79bfa 100644 (file)
@@ -14,23 +14,24 @@ import java.util.HashMap;
 import java.util.HashSet;\r
 import java.util.List;\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.common.CdmUtils;\r
+import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;\r
+import eu.etaxonomy.cdm.io.common.mapping.IInputTransformer;\r
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
 import eu.etaxonomy.cdm.io.excel.common.ExcelImporterBase;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.common.Marker;\r
-import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.description.Distribution;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
-import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TextData;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.location.TdwgArea;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
@@ -60,7 +61,7 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
        \r
        @Override\r
        protected boolean isIgnore(CyprusImportState state) {\r
-               return false;\r
+               return ! state.getConfig().isDoTaxa();\r
        }\r
        \r
        \r
@@ -120,10 +121,9 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
        \r
        \r
        @Override\r
-    protected boolean analyzeRecord(HashMap<String, String> record, CyprusImportState state) {\r
+    protected void analyzeRecord(HashMap<String, String> record, CyprusImportState state) {\r
                \r
-               boolean success = true;\r
-       Set<String> keys = record.keySet();\r
+               Set<String> keys = record.keySet();\r
        \r
        CyprusRow cyprusRow = new CyprusRow();\r
        state.setCyprusRow(cyprusRow);\r
@@ -188,24 +188,108 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                                cyprusRow.setDivision(value);\r
                        \r
                        } else {\r
-                               success = false;\r
+                               state.setUnsuccessfull();\r
                                logger.error("Unexpected column header " + key);\r
                        }\r
        }\r
-       return success;\r
+       return;\r
     }\r
        \r
        private static INonViralNameParser nameParser = NonViralNameParserImpl.NewInstance();\r
-       private static NomenclaturalCode nc = NomenclaturalCode.ICBN;\r
+       private static NomenclaturalCode nc = NomenclaturalCode.ICNAFP;\r
+       private Feature redBookCategory;\r
+       private Feature endemism;\r
+       private PresenceAbsenceTerm indigenous;\r
+       private PresenceAbsenceTerm indigenousDoubtful;\r
+       private PresenceAbsenceTerm cultivatedDoubtful;\r
+       \r
+       private PresenceAbsenceTerm casual;\r
+       private PresenceAbsenceTerm casualDoubtful;\r
+       private PresenceAbsenceTerm nonInvasive;\r
+       private PresenceAbsenceTerm nonInvasiveDoubtful;\r
+       private PresenceAbsenceTerm invasive;\r
+       private PresenceAbsenceTerm invasiveDoubtful;\r
+       private PresenceAbsenceTerm questionable;\r
+       private PresenceAbsenceTerm questionableDoubtful;\r
+       \r
+       private boolean termsCreated = false;\r
        \r
+       private boolean makeTerms(CyprusImportState state) {\r
+               if (termsCreated == false){\r
+                       IInputTransformer transformer = state.getTransformer();\r
+                       \r
+                       try {\r
+                               //feature\r
+                               UUID redBookUuid = transformer.getFeatureUuid("Red book");\r
+                               redBookCategory = this.getFeature(state, redBookUuid, "Red book category", "Red data book category", "Red book", null);\r
+                               getTermService().save(redBookCategory);\r
+                               \r
+                               UUID endemismUuid = transformer.getFeatureUuid("Endemism");\r
+                               endemism = this.getFeature(state, endemismUuid, "Endemism", "Endemism", "Endemism", null);\r
+                               getTermService().save(endemism);\r
+                               \r
+                               //status\r
+                               \r
+                               UUID indigenousUuid = transformer.getPresenceTermUuid("IN");\r
+                               indigenous = this.getPresenceTerm(state, indigenousUuid, "indigenous", "Indigenous", "IN");\r
+                               getTermService().save(indigenous);\r
+                               UUID indigenousDoubtfulUuid = transformer.getPresenceTermUuid("IN?");\r
+                               indigenousDoubtful = this.getPresenceTerm(state, indigenousDoubtfulUuid, "indigenous?", "Indigenous?", "IN?");\r
+                               getTermService().save(indigenousDoubtful);\r
+\r
+                               UUID cultivatedDoubtfulUuid = transformer.getPresenceTermUuid("CU?");\r
+                               cultivatedDoubtful = this.getPresenceTerm(state, cultivatedDoubtfulUuid, "cultivated?", "Cultivated?", "CU?");\r
+                               getTermService().save(cultivatedDoubtful);\r
+                               \r
+                               \r
+                               UUID casualUuid = transformer.getPresenceTermUuid("CA");\r
+                               casual = this.getPresenceTerm(state, casualUuid, "casual", "Casual", "CA");\r
+                               getTermService().save(casual);\r
+                               UUID casualDoubtfulUuid = transformer.getPresenceTermUuid("CA?");\r
+                               casualDoubtful = this.getPresenceTerm(state, casualDoubtfulUuid, "casual?", "Casual?", "CA?");\r
+                               getTermService().save(casualDoubtful);\r
+\r
+                               \r
+                               UUID nonInvasiveUuid = transformer.getPresenceTermUuid("NN");\r
+                               nonInvasive = this.getPresenceTerm(state, nonInvasiveUuid, "naturalized  non-invasive", "Naturalized  non-invasive", "NN");\r
+                               getTermService().save(nonInvasive);\r
+                               UUID nonInvasiveDoubtfulUuid = transformer.getPresenceTermUuid("NN?");\r
+                               nonInvasiveDoubtful = this.getPresenceTerm(state, nonInvasiveDoubtfulUuid, "naturalized  non-invasive?", "Naturalized  non-invasive?", "NN?");\r
+                               getTermService().save(nonInvasiveDoubtful);\r
+       \r
+                               UUID invasiveUuid = transformer.getPresenceTermUuid("NA");\r
+                               invasive = this.getPresenceTerm(state, invasiveUuid, "naturalized  invasive", "Naturalized  invasive", "NA");\r
+                               getTermService().save(invasive);\r
+                               UUID invasiveDoubtfulUuid = transformer.getPresenceTermUuid("NA?");\r
+                               invasiveDoubtful = this.getPresenceTerm(state, invasiveDoubtfulUuid, "naturalized  invasive?", "Naturalized  invasive?", "NA?");\r
+                               getTermService().save(invasiveDoubtful);\r
+       \r
+                               UUID questionableUuid = transformer.getPresenceTermUuid("Q");\r
+                               questionable = this.getPresenceTerm(state, questionableUuid, "questionable", "Questionable", "Q");\r
+                               getTermService().save(questionable);\r
+                               UUID questionableDoubtfulUuid = transformer.getPresenceTermUuid("Q?");\r
+                               questionableDoubtful = this.getPresenceTerm(state, questionableDoubtfulUuid, "questionable?", "Questionable?", "Q?");\r
+                               getTermService().save(questionableDoubtful);\r
+                               \r
+                               termsCreated = true;\r
+                               \r
+                               return true;\r
+                       } catch (UndefinedTransformerMethodException e) {\r
+                               e.printStackTrace();\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+               \r
+       }\r
        \r
        /** \r
         *  Stores taxa records in DB\r
         */\r
        @Override\r
-    protected boolean firstPass(CyprusImportState state) {\r
-               boolean success = true;\r
-               Rank rank = null;\r
+    protected void firstPass(CyprusImportState state) {\r
+               \r
+               makeTerms(state);\r
                CyprusRow taxonLight = state.getCyprusRow();\r
                Reference citation = null;\r
                String microCitation = null;\r
@@ -223,25 +307,33 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                String statusString = taxonLight.getStatus();\r
                String redBookCategory = taxonLight.getRedDataBookCategory();\r
                \r
-               //              BotanicalName subSpeciesName = (BotanicalName)nameParser.parseSimpleName(subSpeciesStr, nc, Rank.SUBSPECIES());\r
-//             BotanicalName speciesName = (BotanicalName)nameParser.parseSimpleName(speciesStr, nc, Rank.SPECIES());\r
-               \r
-//             Classification classification = null;\r
-                       \r
                if (StringUtils.isNotBlank(speciesStr)) {\r
+                       boolean speciesIsExisting = false;\r
                        Taxon mainTaxon = null;\r
+                       //species\r
                        Taxon speciesTaxon = (Taxon)createTaxon(state, Rank.SPECIES(), speciesStr, Taxon.class, nc);\r
                        mainTaxon = speciesTaxon;\r
+                       \r
+                       //subspecies\r
                        if (StringUtils.isNotBlank(subSpeciesStr)){\r
+                               Taxon existingSpecies = state.getHigherTaxon(speciesStr);\r
+                               if (existingSpecies != null){\r
+                                       speciesIsExisting = true;\r
+                                       speciesTaxon = existingSpecies;\r
+                               }\r
+                               \r
                                Taxon subSpeciesTaxon = (Taxon)createTaxon(state, Rank.SUBSPECIES(), subSpeciesStr, Taxon.class, nc);\r
                                \r
                                if (subSpeciesTaxon != null){\r
                                        makeParent(state, speciesTaxon, subSpeciesTaxon, citation, microCitation);\r
                                }\r
                                mainTaxon = subSpeciesTaxon;\r
+                               state.putHigherTaxon(speciesStr, speciesTaxon);\r
                        }\r
                        \r
-                       makeHigherTaxa(state, taxonLight, speciesTaxon, citation, microCitation);\r
+                       if (! speciesIsExisting){\r
+                               makeHigherTaxa(state, taxonLight, speciesTaxon, citation, microCitation);\r
+                       }\r
                        makeHomotypicSynonyms(state, citation, microCitation, homotypicSynonymList, mainTaxon);                 \r
                        makeHeterotypicSynonyms(state, citation, microCitation, heterotypicSynonymList, mainTaxon);                     \r
                        makeSystematics(systematicsString, mainTaxon);\r
@@ -252,7 +344,7 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
 //                     state.putHigherTaxon(higherName, uuid);//(speciesStr, mainTaxon);\r
                        getTaxonService().save(mainTaxon);\r
                }\r
-               return success;\r
+               return;\r
     }\r
 \r
 \r
@@ -311,9 +403,8 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                //Systematics\r
                if (StringUtils.isNotBlank(systematicsString)){\r
                        TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       //FIXME feature type\r
-                       TextData textData = TextData.NewInstance(Feature.ANATOMY());\r
-                       textData.putText(systematicsString, Language.UNDETERMINED());\r
+                       TextData textData = TextData.NewInstance(Feature.SYSTEMATICS());\r
+                       textData.putText(Language.UNDETERMINED(), systematicsString);\r
                        td.addElement(textData);\r
                }\r
        }\r
@@ -322,17 +413,22 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
        private void makeEndemism(String endemismString, Taxon mainTaxon) {\r
                //endemism\r
                if (StringUtils.isNotBlank(endemismString)){\r
-                       boolean flag;\r
-                       if (endemismString.trim().equalsIgnoreCase("not endemic")){\r
-                               flag = false;\r
-                       }else if (endemismString.trim().equalsIgnoreCase("endemic")){\r
-                               flag = true;\r
-                       }else{\r
-                               throw new RuntimeException(endemismString + " is not a valid value for endemism");\r
-                       }\r
-                       //FIXME marker type\r
-                       Marker marker = Marker.NewInstance(MarkerType.IS_DOUBTFUL(), flag);\r
-                       mainTaxon.addMarker(marker);\r
+                       //OLD - not wanted as marker\r
+//                     boolean flag;\r
+//                     if (endemismString.trim().equalsIgnoreCase("not endemic") || endemismString.trim().equalsIgnoreCase("ne?")){\r
+//                             flag = false;\r
+//                     }else if (endemismString.trim().equalsIgnoreCase("endemic")){\r
+//                             flag = true;\r
+//                     }else{\r
+//                             throw new RuntimeException(endemismString + " is not a valid value for endemism");\r
+//                     }\r
+//                     Marker marker = Marker.NewInstance(MarkerType.ENDEMIC(), flag);\r
+//                     mainTaxon.addMarker(marker);\r
+                       //text data\r
+                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
+                       TextData textData = TextData.NewInstance(endemism);\r
+                       textData.putText(Language.ENGLISH(), endemismString);\r
+                       td.addElement(textData);\r
                }\r
        }\r
 \r
@@ -340,43 +436,47 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
        private void makeStatus(String statusString, Taxon mainTaxon) {\r
                //status\r
                if (StringUtils.isNotBlank(statusString)){\r
-                       PresenceTerm status = null;\r
-                       if (statusString.contains("Indigenous")){\r
-                               //FIXME \r
-                               status = PresenceTerm.INTRODUCED();\r
-                       }else if (statusString.contains("Casual") || statusString.contains("Causal")){\r
-                               //FIXME\r
-                               status = PresenceTerm.CULTIVATED();\r
+                       PresenceAbsenceTerm status = null;\r
+                       if (statusString.contains("Indigenous?")){\r
+                               status = indigenousDoubtful;\r
+                       }else if (statusString.contains("Indigenous")){\r
+                               status = indigenous;\r
+                       }else if (statusString.contains("Casual?") || statusString.contains("Causal?")){\r
+                               status = casualDoubtful;\r
+                       }else if (statusString.contains("Casual")){\r
+                               status = casual;\r
+                       }else if (statusString.contains("Cultivated?")){\r
+                               status = cultivatedDoubtful;\r
                        }else if (statusString.contains("Cultivated")){\r
-                               status = PresenceTerm.CULTIVATED();\r
+                               status = PresenceAbsenceTerm.CULTIVATED();\r
+                       }else if (statusString.contains("non-invasive?")){\r
+                               status = nonInvasiveDoubtful;\r
                        }else if (statusString.contains("non-invasive")){\r
-                               //FIXME\r
-                               status = PresenceTerm.NATURALISED();\r
+                               status = nonInvasive;\r
+                       }else if (statusString.contains("invasive?")){\r
+                               status = invasiveDoubtful;\r
                        }else if (statusString.contains("invasive")){\r
-                               //FIXME\r
-                               status = PresenceTerm.NATURALISED();\r
+                               status = invasive;\r
+                       }else if (statusString.contains("Questionable?")){\r
+                               status = questionableDoubtful;\r
                        }else if (statusString.contains("Questionable")){\r
-                               //FIXME\r
-                               status = PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();\r
+                               status = questionable;\r
                        }else if (statusString.startsWith("F")){\r
-                               //FIXME\r
-                               status = PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();\r
+                               status = null;\r
                        }else if (statusString.equals("##")){\r
-                               //FIXME\r
-                               status = PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();\r
+                               status = null;\r
                        }else{\r
                                logger.warn("Unknown status: " + statusString);\r
-                               status = PresenceTerm.PRESENT();\r
+                               status = null;\r
                        }\r
                        TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       NamedArea area = TdwgArea.getAreaByTdwgAbbreviation("CYP");\r
+                       NamedArea area = TdwgAreaProvider.getAreaByTdwgAbbreviation("CYP");\r
                        Distribution distribution = Distribution.NewInstance(area, status);\r
                        td.addElement(distribution);\r
                        \r
                        //text data\r
-                       //FIXME feature \r
-                       TextData textData = TextData.NewInstance(Feature.DISTRIBUTION());\r
-                       textData.putText(statusString, Language.ENGLISH());\r
+                       TextData textData = TextData.NewInstance(Feature.STATUS());\r
+                       textData.putText(Language.ENGLISH(), statusString);\r
                        td.addElement(textData);\r
                }\r
        }\r
@@ -386,9 +486,8 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                //red data book category\r
                if (StringUtils.isNotBlank(redBookCategory)){\r
                        TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       //FIXME feature type\r
-                       TextData textData = TextData.NewInstance(Feature.DESCRIPTION());\r
-                       textData.putText(redBookCategory, Language.ENGLISH());\r
+                       TextData textData = TextData.NewInstance(this.redBookCategory);\r
+                       textData.putText(Language.ENGLISH(), redBookCategory);\r
                        td.addElement(textData);\r
                }\r
        }\r
@@ -400,58 +499,9 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
         *  Stores parent-child, synonym and common name relationships\r
         */\r
        @Override\r
-    protected boolean secondPass(CyprusImportState state) {\r
-               boolean success = true;\r
-               CyprusRow cyprusRow = state.getCyprusRow();\r
-//             try {\r
-//                     String taxonNameStr = state.getTaxonLight().getScientificName();\r
-//                     String nameStatus = state.getTaxonLight().getNameStatus();\r
-//                     String commonNameStr = state.getTaxonLight().getCommonName();\r
-//                     Integer parentId = state.getTaxonLight().getParentId();\r
-//                     Integer childId = state.getTaxonLight().getId();\r
-//                     \r
-//                     Taxon parentTaxon = (Taxon)state.getTaxonBase(parentId);\r
-//                     if (CdmUtils.isNotEmpty(taxonNameStr)) {\r
-//                             nameStatus = CdmUtils.Nz(nameStatus).trim().toLowerCase();\r
-//                             if (validMarkers.contains(nameStatus)){\r
-//                                     Taxon taxon = (Taxon)state.getTaxonBase(childId);\r
-//                                     // Add the parent relationship\r
-//                                     if (state.getTaxonLight().getParentId() != 0) {\r
-//                                             if (parentTaxon != null) {\r
-//                                                     //Taxon taxon = (Taxon)state.getTaxonBase(childId);\r
-//                                                     \r
-//                                                     Reference citation = state.getConfig().getSourceReference();\r
-//                                                     String microCitation = null;\r
-//                                                     Taxon childTaxon = taxon;\r
-//                                                     success &= makeParent(state, parentTaxon, childTaxon, citation, microCitation);\r
-//                                                     getTaxonService().saveOrUpdate(parentTaxon);\r
-//                                             } else {\r
-//                                                     logger.warn("Taxonomic parent not found for " + taxonNameStr);\r
-//                                                     success = false;\r
-//                                             }\r
-//                                     }else{\r
-//                                             //do nothing (parent == 0) no parent exists\r
-//                                     }\r
-//                             }else if (synonymMarkers.contains(nameStatus)){\r
-//                                     //add synonym relationship\r
-//                                     try {\r
-//                                             TaxonBase taxonBase = state.getTaxonBase(childId);\r
-//                                             Synonym synonym = CdmBase.deproxy(taxonBase,Synonym.class);\r
-//                                             parentTaxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF());\r
-//                                             getTaxonService().saveOrUpdate(parentTaxon);\r
-//                                     } catch (Exception e) {\r
-//                                             logger.warn("Child id = " + childId);\r
-//                                             e.printStackTrace();\r
-//                                     }\r
-//                             }\r
-//                     } \r
-//                     if (CdmUtils.isNotEmpty(commonNameStr)){                        // add common name to taxon\r
-//                             handleCommonName(state, taxonNameStr, commonNameStr, parentId);\r
-//                     }\r
-//             } catch (Exception e) {\r
-//                     e.printStackTrace();\r
-//             }\r
-               return success;\r
+    protected void secondPass(CyprusImportState state) {\r
+//             CyprusRow cyprusRow = state.getCyprusRow();\r
+               return;\r
        }\r
 \r
 \r
@@ -478,7 +528,7 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                        INonViralNameParser parser = nameParser;//NonViralNameParserImpl.NewInstance();\r
                        taxonNameBase = (NonViralName<BotanicalName>)parser.parseFullName(taxonNameStr, nc, rank);\r
                        \r
-                       taxonNameBase.setNameCache(taxonNameStr);\r
+                       //taxonNameBase.setNameCache(taxonNameStr);\r
                        \r
                }\r
 \r
@@ -505,6 +555,7 @@ public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
                Classification tree = state.getTree(sec);\r
                if (tree == null){\r
                        tree = makeTree(state, sec);\r
+                       tree.setTitleCache(state.getConfig().getSourceReferenceTitle());\r
                }\r
                if (sec.equals(childTaxon.getSec())){\r
                        success &=  (null !=  tree.addParentChild(parentTaxon, childTaxon, citation, microCitation));\r