ref #6369 adapt existing occurrences of interface to removed generics in cdmlib-app
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / cyprus / CyprusExcelImport.java
index c47d9bbaae10cd5e18b2b4a71381c12bfefefc03..ac46f71bf68c64fd02c5cd7fd98cb59fbb48f4fa 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.cyprus;\r
-\r
-import java.util.Arrays;\r
-import java.util.HashMap;\r
-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.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.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.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
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.reference.Reference;\r
-import eu.etaxonomy.cdm.model.taxon.Classification;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.strategy.parser.INonViralNameParser;\r
-import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
-\r
-/**\r
- * @author a.babadshanjan\r
- * @created 08.01.2009\r
- * @version 1.0\r
- */\r
-\r
-@Component\r
-public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {\r
-       private static final Logger logger = Logger.getLogger(CyprusExcelImport.class);\r
-       \r
-       public static Set<String> validMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "valid", "accepted", "a", "v", "t"}));\r
-       public static Set<String> synonymMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "invalid", "synonym", "s", "i"}));\r
-       \r
-       \r
-       @Override\r
-       protected boolean isIgnore(CyprusImportState state) {\r
-               return ! state.getConfig().isDoTaxa();\r
-       }\r
-       \r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
-        */\r
-       @Override\r
-       protected boolean doCheck(CyprusImportState state) {\r
-               logger.warn("DoCheck not yet implemented for CyprusExcelImport");\r
-               return true;\r
-       }\r
-\r
-//     protected static final String ID_COLUMN = "Id";\r
-       protected static final String SPECIES_COLUMN = "species";\r
-       protected static final String SUBSPECIES_COLUMN = "subspecies";\r
-       protected static final String GENUS_COLUMN = "genus";\r
-       protected static final String FAMILY_COLUMN = "family";\r
-       protected static final String DIVISION_COLUMN = "division";\r
-       protected static final String HOMOTYPIC_SYNONYM_COLUMN = "homotypic synonyms";\r
-       protected static final String HETEROTYPIC_SYNONYMS_COLUMN = "heterotypic synonyms";\r
-       protected static final String ENDEMISM_COLUMN = "endemism";\r
-\r
-       protected static final String STATUS_COLUMN = "status";\r
-       protected static final String RED_DATA_BOOK_CATEGORY_COLUMN = "red data book category";\r
-       protected static final String SYSTEMATICS_COLUMN = "systematics";\r
-       \r
-       \r
-       \r
-       // TODO: This enum is for future use (perhaps).\r
-       protected enum Columns { \r
-//             Id("Id"), \r
-               Species("species"), \r
-               Subspecies("subspecies"),\r
-               Genus("genus"),\r
-               Family("family"),\r
-               Division("division"),\r
-               HomotypicSynonyms("homotypic synonyms"),\r
-               HeterotypicSynonyms("heterotypic synonyms"),\r
-               Status("status"),\r
-               Endemism("endemism");\r
-               \r
-               private String head;\r
-               private String value;\r
-       \r
-               private Columns(String head) {\r
-                       this.head = head;\r
-               }\r
-               \r
-               public String head() {\r
-                       return this.head;\r
-               }\r
-       \r
-               public String value() {\r
-                       return this.value;\r
-               }\r
-       }\r
-       \r
-       \r
-       @Override\r
-    protected void analyzeRecord(HashMap<String, String> record, CyprusImportState state) {\r
-               \r
-               Set<String> keys = record.keySet();\r
-       \r
-       CyprusRow cyprusRow = new CyprusRow();\r
-       state.setCyprusRow(cyprusRow);\r
-       \r
-       for (String originalKey: keys) {\r
-               Integer index = 0;\r
-               String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();\r
-               String[] split = indexedKey.split("_");\r
-               String key = split[0];\r
-               if (split.length > 1){\r
-                       String indexString = split[1];\r
-                       try {\r
-                                       index = Integer.valueOf(indexString);\r
-                               } catch (NumberFormatException e) {\r
-                                       String message = "Index must be integer";\r
-                                       logger.error(message);\r
-                                       continue;\r
-                               }\r
-               }\r
-               \r
-               String value = (String) record.get(indexedKey);\r
-               if (! StringUtils.isBlank(value)) {\r
-                       if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }\r
-                       value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();\r
-               }else{\r
-                       continue;\r
-               }\r
-               \r
-               \r
-               if (key.equalsIgnoreCase(SPECIES_COLUMN)) {\r
-//                     int ivalue = floatString2IntValue(value);\r
-                       cyprusRow.setSpecies(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(SUBSPECIES_COLUMN)) {\r
-                               cyprusRow.setSubspecies(value);\r
-                               \r
-                       } else if(key.equalsIgnoreCase(HOMOTYPIC_SYNONYM_COLUMN)) {\r
-                               cyprusRow.setHomotypicSynonyms(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(HETEROTYPIC_SYNONYMS_COLUMN)) {\r
-                               cyprusRow.setHeterotypicSynonyms(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(ENDEMISM_COLUMN)) {\r
-                               cyprusRow.setEndemism(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(STATUS_COLUMN)) {\r
-                               cyprusRow.setStatus(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(RED_DATA_BOOK_CATEGORY_COLUMN)) {\r
-                               cyprusRow.setRedDataBookCategory(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(SYSTEMATICS_COLUMN)) {\r
-                               cyprusRow.setSystematics(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(GENUS_COLUMN)) {\r
-                               cyprusRow.setGenus(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(FAMILY_COLUMN)) {\r
-                               cyprusRow.setFamily(value);\r
-                       \r
-                       } else if(key.equalsIgnoreCase(DIVISION_COLUMN)) {\r
-                               cyprusRow.setDivision(value);\r
-                       \r
-                       } else {\r
-                               state.setUnsuccessfull();\r
-                               logger.error("Unexpected column header " + key);\r
-                       }\r
-       }\r
-       return;\r
-    }\r
-       \r
-       private static INonViralNameParser nameParser = NonViralNameParserImpl.NewInstance();\r
-       private static NomenclaturalCode nc = NomenclaturalCode.ICBN;\r
-       private Feature redBookCategory;\r
-       private Feature endemism;\r
-       private PresenceTerm indigenous;\r
-       private PresenceTerm indigenousDoubtful;\r
-       private PresenceTerm cultivatedDoubtful;\r
-       \r
-       private PresenceTerm casual;\r
-       private PresenceTerm casualDoubtful;\r
-       private PresenceTerm nonInvasive;\r
-       private PresenceTerm nonInvasiveDoubtful;\r
-       private PresenceTerm invasive;\r
-       private PresenceTerm invasiveDoubtful;\r
-       private PresenceTerm questionable;\r
-       private PresenceTerm 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");\r
-                               getTermService().save(redBookCategory);\r
-                               \r
-                               UUID endemismUuid = transformer.getFeatureUuid("Endemism");\r
-                               endemism = this.getFeature(state, endemismUuid, "Endemism", "Endemism", "Endemism");\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 void firstPass(CyprusImportState state) {\r
-               \r
-               makeTerms(state);\r
-               CyprusRow taxonLight = state.getCyprusRow();\r
-               Reference citation = null;\r
-               String microCitation = null;\r
-               \r
-               //species name\r
-               String speciesStr = taxonLight.getSpecies();\r
-               String subSpeciesStr = taxonLight.getSubspecies();\r
-               String homotypicSynonymsString = taxonLight.getHomotypicSynonyms();\r
-               List<String> homotypicSynonymList = Arrays.asList(homotypicSynonymsString.split(";"));\r
-               String heterotypicSynonymsString = taxonLight.getHeterotypicSynonyms();\r
-               List<String> heterotypicSynonymList = Arrays.asList(heterotypicSynonymsString.split(";"));\r
-               \r
-               String systematicsString = taxonLight.getSystematics();\r
-               String endemismString = taxonLight.getEndemism();\r
-               String statusString = taxonLight.getStatus();\r
-               String redBookCategory = taxonLight.getRedDataBookCategory();\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
-                       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
-                       makeEndemism(endemismString, mainTaxon);\r
-                       makeStatus(statusString, mainTaxon);\r
-                       makeRedBookCategory(redBookCategory, mainTaxon);\r
-                       \r
-//                     state.putHigherTaxon(higherName, uuid);//(speciesStr, mainTaxon);\r
-                       getTaxonService().save(mainTaxon);\r
-               }\r
-               return;\r
-    }\r
-\r
-\r
-       private void makeHigherTaxa(CyprusImportState state, CyprusRow taxonLight, Taxon speciesTaxon, Reference citation, String microCitation) {\r
-               String divisionStr = taxonLight.getDivision();\r
-               String genusStr = taxonLight.getGenus();\r
-               String familyStr = taxonLight.getFamily();\r
-               \r
-               Taxon division = getTaxon(state, divisionStr, Rank.DIVISION(), null, citation, microCitation);\r
-               Taxon family = getTaxon(state, familyStr, Rank.FAMILY(), division, citation, microCitation);\r
-               Taxon genus = getTaxon(state, genusStr, Rank.GENUS(), family, citation, microCitation);\r
-               makeParent(state, genus, speciesTaxon, citation, microCitation) ;\r
-       }\r
-\r
-\r
-       private Taxon getTaxon(CyprusImportState state, String taxonNameStr, Rank rank, Taxon parent, Reference citation, String microCitation) {\r
-               Taxon result;\r
-               if (state.containsHigherTaxon(taxonNameStr)){\r
-                       result = state.getHigherTaxon(taxonNameStr);\r
-               }else{\r
-                       result = (Taxon)createTaxon(state, rank, taxonNameStr, Taxon.class, nc);\r
-                       state.putHigherTaxon(taxonNameStr, result);\r
-                       if (parent == null){\r
-                               makeParent(state, null,result, citation, microCitation);\r
-                       }else{\r
-                               makeParent(state, parent, result, citation, microCitation);\r
-                       }\r
-                       \r
-               }\r
-               return result;\r
-       }\r
-\r
-\r
-       private void makeHomotypicSynonyms(CyprusImportState state,\r
-                       Reference citation, String microCitation, List<String> homotypicSynonymList, Taxon mainTaxon) {\r
-               for (String homotypicSynonym: homotypicSynonymList){\r
-                       if (StringUtils.isNotBlank(homotypicSynonym)){\r
-                               Synonym synonym = (Synonym)createTaxon(state, null, homotypicSynonym, Synonym.class, nc);\r
-                               mainTaxon.addHomotypicSynonym(synonym, citation, microCitation);\r
-                       }\r
-               }\r
-       }\r
-\r
-\r
-       private void makeHeterotypicSynonyms(CyprusImportState state, Reference citation, String microCitation, List<String> heterotypicSynonymList, Taxon mainTaxon) {\r
-               for (String heterotypicSynonym: heterotypicSynonymList){\r
-                       if (StringUtils.isNotBlank(heterotypicSynonym)){\r
-                               Synonym synonym = (Synonym)createTaxon(state, null, heterotypicSynonym, Synonym.class, nc);\r
-                               mainTaxon.addSynonym(synonym, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF(), citation, microCitation);\r
-                       }\r
-               }\r
-       }\r
-\r
-\r
-       private void makeSystematics(String systematicsString, Taxon mainTaxon) {\r
-               //Systematics\r
-               if (StringUtils.isNotBlank(systematicsString)){\r
-                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       TextData textData = TextData.NewInstance(Feature.SYSTEMATICS());\r
-                       textData.putText(Language.UNDETERMINED(), systematicsString);\r
-                       td.addElement(textData);\r
-               }\r
-       }\r
-\r
-\r
-       private void makeEndemism(String endemismString, Taxon mainTaxon) {\r
-               //endemism\r
-               if (StringUtils.isNotBlank(endemismString)){\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
-\r
-       private void makeStatus(String statusString, Taxon mainTaxon) {\r
-               //status\r
-               if (StringUtils.isNotBlank(statusString)){\r
-                       PresenceTerm 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
-                       }else if (statusString.contains("non-invasive?")){\r
-                               status = nonInvasiveDoubtful;\r
-                       }else if (statusString.contains("non-invasive")){\r
-                               status = nonInvasive;\r
-                       }else if (statusString.contains("invasive?")){\r
-                               status = invasiveDoubtful;\r
-                       }else if (statusString.contains("invasive")){\r
-                               status = invasive;\r
-                       }else if (statusString.contains("Questionable?")){\r
-                               status = questionableDoubtful;\r
-                       }else if (statusString.contains("Questionable")){\r
-                               status = questionable;\r
-                       }else if (statusString.startsWith("F")){\r
-                               status = null;\r
-                       }else if (statusString.equals("##")){\r
-                               status = null;\r
-                       }else{\r
-                               logger.warn("Unknown status: " + statusString);\r
-                               status = null;\r
-                       }\r
-                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       NamedArea area = TdwgArea.getAreaByTdwgAbbreviation("CYP");\r
-                       Distribution distribution = Distribution.NewInstance(area, status);\r
-                       td.addElement(distribution);\r
-                       \r
-                       //text data\r
-                       TextData textData = TextData.NewInstance(Feature.STATUS());\r
-                       textData.putText(Language.ENGLISH(), statusString);\r
-                       td.addElement(textData);\r
-               }\r
-       }\r
-\r
-\r
-       private void makeRedBookCategory(String redBookCategory, Taxon mainTaxon) {\r
-               //red data book category\r
-               if (StringUtils.isNotBlank(redBookCategory)){\r
-                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);\r
-                       TextData textData = TextData.NewInstance(this.redBookCategory);\r
-                       textData.putText(Language.ENGLISH(), redBookCategory);\r
-                       td.addElement(textData);\r
-               }\r
-       }\r
-\r
-\r
-\r
-\r
-       /** \r
-        *  Stores parent-child, synonym and common name relationships\r
-        */\r
-       @Override\r
-    protected void secondPass(CyprusImportState state) {\r
-//             CyprusRow cyprusRow = state.getCyprusRow();\r
-               return;\r
-       }\r
-\r
-\r
-\r
-       /**\r
-        * @param state\r
-        * @param rank\r
-        * @param taxonNameStr\r
-        * @param authorStr\r
-        * @param nameStatus\r
-        * @param nc\r
-        * @return\r
-        */\r
-       private TaxonBase createTaxon(CyprusImportState state, Rank rank, String taxonNameStr, \r
-                       Class statusClass, NomenclaturalCode nc) {\r
-               TaxonBase taxonBase;\r
-               NonViralName taxonNameBase = null;\r
-               if (nc == NomenclaturalCode.ICVCN){\r
-                       logger.warn("ICVCN not yet supported");\r
-                       \r
-               }else{\r
-                       taxonNameBase =(NonViralName) nc.getNewTaxonNameInstance(rank);\r
-                       //NonViralName nonViralName = (NonViralName)taxonNameBase;\r
-                       INonViralNameParser parser = nameParser;//NonViralNameParserImpl.NewInstance();\r
-                       taxonNameBase = (NonViralName<BotanicalName>)parser.parseFullName(taxonNameStr, nc, rank);\r
-                       \r
-                       //taxonNameBase.setNameCache(taxonNameStr);\r
-                       \r
-               }\r
-\r
-               //Create the taxon\r
-               Reference sec = state.getConfig().getSourceReference();\r
-               // Create the status\r
-               if (statusClass.equals(Taxon.class)){\r
-                       taxonBase = Taxon.NewInstance(taxonNameBase, sec);\r
-               }else if (statusClass.equals(Synonym.class)){\r
-                       taxonBase = Synonym.NewInstance(taxonNameBase, sec);\r
-               }else {\r
-                       Taxon taxon = Taxon.NewInstance(taxonNameBase, sec);\r
-                       taxon.setTaxonStatusUnknown(true);\r
-                       taxonBase = taxon;\r
-               }\r
-               return taxonBase;\r
-       }\r
-\r
-       private boolean makeParent(CyprusImportState state, Taxon parentTaxon, Taxon childTaxon, Reference citation, String microCitation){\r
-               boolean success = true;\r
-               Reference sec = state.getConfig().getSourceReference();\r
-               \r
-//             Reference sec = parentTaxon.getSec();\r
-               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
-               }else{\r
-                       logger.warn("No relationship added for child " + childTaxon.getTitleCache());\r
-               }\r
-               return success;\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.cyprus;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+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.common.CdmUtils;
+import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;
+import eu.etaxonomy.cdm.io.common.mapping.IInputTransformer;
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
+import eu.etaxonomy.cdm.io.excel.common.ExcelImporterBase;
+import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.model.description.Distribution;
+import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
+import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.cdm.model.description.TextData;
+import eu.etaxonomy.cdm.model.location.NamedArea;
+import eu.etaxonomy.cdm.model.name.INonViralName;
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.taxon.Classification;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.SynonymType;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.strategy.parser.INonViralNameParser;
+import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
+
+/**
+ * @author a.babadshanjan
+ * @created 08.01.2009
+ */
+
+@Component
+public class CyprusExcelImport extends ExcelImporterBase<CyprusImportState> {
+       private static final Logger logger = Logger.getLogger(CyprusExcelImport.class);
+
+       public static Set<String> validMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "valid", "accepted", "a", "v", "t"}));
+       public static Set<String> synonymMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "invalid", "synonym", "s", "i"}));
+
+
+       @Override
+       protected boolean isIgnore(CyprusImportState state) {
+               return ! state.getConfig().isDoTaxa();
+       }
+
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
+        */
+       @Override
+       protected boolean doCheck(CyprusImportState state) {
+               logger.warn("DoCheck not yet implemented for CyprusExcelImport");
+               return true;
+       }
+
+//     protected static final String ID_COLUMN = "Id";
+       protected static final String SPECIES_COLUMN = "species";
+       protected static final String SUBSPECIES_COLUMN = "subspecies";
+       protected static final String GENUS_COLUMN = "genus";
+       protected static final String FAMILY_COLUMN = "family";
+       protected static final String DIVISION_COLUMN = "division";
+       protected static final String HOMOTYPIC_SYNONYM_COLUMN = "homotypic synonyms";
+       protected static final String HETEROTYPIC_SYNONYMS_COLUMN = "heterotypic synonyms";
+       protected static final String ENDEMISM_COLUMN = "endemism";
+
+       protected static final String STATUS_COLUMN = "status";
+       protected static final String RED_DATA_BOOK_CATEGORY_COLUMN = "red data book category";
+       protected static final String SYSTEMATICS_COLUMN = "systematics";
+
+
+
+       // TODO: This enum is for future use (perhaps).
+       protected enum Columns {
+//             Id("Id"),
+               Species("species"),
+               Subspecies("subspecies"),
+               Genus("genus"),
+               Family("family"),
+               Division("division"),
+               HomotypicSynonyms("homotypic synonyms"),
+               HeterotypicSynonyms("heterotypic synonyms"),
+               Status("status"),
+               Endemism("endemism");
+
+               private final String head;
+               private String value;
+
+               private Columns(String head) {
+                       this.head = head;
+               }
+
+               public String head() {
+                       return this.head;
+               }
+
+               public String value() {
+                       return this.value;
+               }
+       }
+
+
+       @Override
+    protected void analyzeRecord(HashMap<String, String> record, CyprusImportState state) {
+
+               Set<String> keys = record.keySet();
+
+       CyprusRow cyprusRow = new CyprusRow();
+       state.setCyprusRow(cyprusRow);
+
+       for (String originalKey: keys) {
+               Integer index = 0;
+               String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();
+               String[] split = indexedKey.split("_");
+               String key = split[0];
+               if (split.length > 1){
+                       String indexString = split[1];
+                       try {
+                                       index = Integer.valueOf(indexString);
+                               } catch (NumberFormatException e) {
+                                       String message = "Index must be integer";
+                                       logger.error(message);
+                                       continue;
+                               }
+               }
+
+               String value = record.get(indexedKey);
+               if (! StringUtils.isBlank(value)) {
+                       if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }
+                       value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();
+               }else{
+                       continue;
+               }
+
+
+               if (key.equalsIgnoreCase(SPECIES_COLUMN)) {
+//                     int ivalue = floatString2IntValue(value);
+                       cyprusRow.setSpecies(value);
+
+                       } else if(key.equalsIgnoreCase(SUBSPECIES_COLUMN)) {
+                               cyprusRow.setSubspecies(value);
+
+                       } else if(key.equalsIgnoreCase(HOMOTYPIC_SYNONYM_COLUMN)) {
+                               cyprusRow.setHomotypicSynonyms(value);
+
+                       } else if(key.equalsIgnoreCase(HETEROTYPIC_SYNONYMS_COLUMN)) {
+                               cyprusRow.setHeterotypicSynonyms(value);
+
+                       } else if(key.equalsIgnoreCase(ENDEMISM_COLUMN)) {
+                               cyprusRow.setEndemism(value);
+
+                       } else if(key.equalsIgnoreCase(STATUS_COLUMN)) {
+                               cyprusRow.setStatus(value);
+
+                       } else if(key.equalsIgnoreCase(RED_DATA_BOOK_CATEGORY_COLUMN)) {
+                               cyprusRow.setRedDataBookCategory(value);
+
+                       } else if(key.equalsIgnoreCase(SYSTEMATICS_COLUMN)) {
+                               cyprusRow.setSystematics(value);
+
+                       } else if(key.equalsIgnoreCase(GENUS_COLUMN)) {
+                               cyprusRow.setGenus(value);
+
+                       } else if(key.equalsIgnoreCase(FAMILY_COLUMN)) {
+                               cyprusRow.setFamily(value);
+
+                       } else if(key.equalsIgnoreCase(DIVISION_COLUMN)) {
+                               cyprusRow.setDivision(value);
+
+                       } else {
+                               state.setUnsuccessfull();
+                               logger.error("Unexpected column header " + key);
+                       }
+       }
+       return;
+    }
+
+       private static INonViralNameParser nameParser = NonViralNameParserImpl.NewInstance();
+       private static NomenclaturalCode nc = NomenclaturalCode.ICNAFP;
+       private Feature redBookCategory;
+       private Feature endemism;
+       private PresenceAbsenceTerm indigenous;
+       private PresenceAbsenceTerm indigenousDoubtful;
+       private PresenceAbsenceTerm cultivatedDoubtful;
+
+       private PresenceAbsenceTerm casual;
+       private PresenceAbsenceTerm casualDoubtful;
+       private PresenceAbsenceTerm nonInvasive;
+       private PresenceAbsenceTerm nonInvasiveDoubtful;
+       private PresenceAbsenceTerm invasive;
+       private PresenceAbsenceTerm invasiveDoubtful;
+       private PresenceAbsenceTerm questionable;
+       private PresenceAbsenceTerm questionableDoubtful;
+
+       private boolean termsCreated = false;
+
+       private boolean makeTerms(CyprusImportState state) {
+               if (termsCreated == false){
+                       IInputTransformer transformer = state.getTransformer();
+
+                       try {
+                               //feature
+                               UUID redBookUuid = transformer.getFeatureUuid("Red book");
+                               redBookCategory = this.getFeature(state, redBookUuid, "Red book category", "Red data book category", "Red book", null);
+                               getTermService().save(redBookCategory);
+
+                               UUID endemismUuid = transformer.getFeatureUuid("Endemism");
+                               endemism = this.getFeature(state, endemismUuid, "Endemism", "Endemism", "Endemism", null);
+                               getTermService().save(endemism);
+
+                               //status
+
+                               UUID indigenousUuid = transformer.getPresenceTermUuid("IN");
+                               indigenous = this.getPresenceTerm(state, indigenousUuid, "indigenous", "Indigenous", "IN", false);
+                               getTermService().save(indigenous);
+                               UUID indigenousDoubtfulUuid = transformer.getPresenceTermUuid("IN?");
+                               indigenousDoubtful = this.getPresenceTerm(state, indigenousDoubtfulUuid, "indigenous?", "Indigenous?", "IN?", false);
+                               getTermService().save(indigenousDoubtful);
+
+                               UUID cultivatedDoubtfulUuid = transformer.getPresenceTermUuid("CU?");
+                               cultivatedDoubtful = this.getPresenceTerm(state, cultivatedDoubtfulUuid, "cultivated?", "Cultivated?", "CU?", false);
+                               getTermService().save(cultivatedDoubtful);
+
+
+                               UUID casualUuid = transformer.getPresenceTermUuid("CA");
+                               casual = this.getPresenceTerm(state, casualUuid, "casual", "Casual", "CA", false);
+                               getTermService().save(casual);
+                               UUID casualDoubtfulUuid = transformer.getPresenceTermUuid("CA?");
+                               casualDoubtful = this.getPresenceTerm(state, casualDoubtfulUuid, "casual?", "Casual?", "CA?", false);
+                               getTermService().save(casualDoubtful);
+
+
+                               UUID nonInvasiveUuid = transformer.getPresenceTermUuid("NN");
+                               nonInvasive = this.getPresenceTerm(state, nonInvasiveUuid, "naturalized  non-invasive", "Naturalized  non-invasive", "NN", false);
+                               getTermService().save(nonInvasive);
+                               UUID nonInvasiveDoubtfulUuid = transformer.getPresenceTermUuid("NN?");
+                               nonInvasiveDoubtful = this.getPresenceTerm(state, nonInvasiveDoubtfulUuid, "naturalized  non-invasive?", "Naturalized  non-invasive?", "NN?", false);
+                               getTermService().save(nonInvasiveDoubtful);
+
+                               UUID invasiveUuid = transformer.getPresenceTermUuid("NA");
+                               invasive = this.getPresenceTerm(state, invasiveUuid, "naturalized  invasive", "Naturalized  invasive", "NA", false);
+                               getTermService().save(invasive);
+                               UUID invasiveDoubtfulUuid = transformer.getPresenceTermUuid("NA?");
+                               invasiveDoubtful = this.getPresenceTerm(state, invasiveDoubtfulUuid, "naturalized  invasive?", "Naturalized  invasive?", "NA?", false);
+                               getTermService().save(invasiveDoubtful);
+
+                               UUID questionableUuid = transformer.getPresenceTermUuid("Q");
+                               questionable = this.getPresenceTerm(state, questionableUuid, "questionable", "Questionable", "Q", false);
+                               getTermService().save(questionable);
+                               UUID questionableDoubtfulUuid = transformer.getPresenceTermUuid("Q?");
+                               questionableDoubtful = this.getPresenceTerm(state, questionableDoubtfulUuid, "questionable?", "Questionable?", "Q?", false);
+                               getTermService().save(questionableDoubtful);
+
+                               termsCreated = true;
+
+                               return true;
+                       } catch (UndefinedTransformerMethodException e) {
+                               e.printStackTrace();
+                               return false;
+                       }
+               }
+               return true;
+
+       }
+
+       /**
+        *  Stores taxa records in DB
+        */
+       @Override
+    protected void firstPass(CyprusImportState state) {
+
+               makeTerms(state);
+               CyprusRow taxonLight = state.getCyprusRow();
+               Reference citation = null;
+               String microCitation = null;
+
+               //species name
+               String speciesStr = taxonLight.getSpecies();
+               String subSpeciesStr = taxonLight.getSubspecies();
+               String homotypicSynonymsString = taxonLight.getHomotypicSynonyms();
+               List<String> homotypicSynonymList = Arrays.asList(homotypicSynonymsString.split(";"));
+               String heterotypicSynonymsString = taxonLight.getHeterotypicSynonyms();
+               List<String> heterotypicSynonymList = Arrays.asList(heterotypicSynonymsString.split(";"));
+
+               String systematicsString = taxonLight.getSystematics();
+               String endemismString = taxonLight.getEndemism();
+               String statusString = taxonLight.getStatus();
+               String redBookCategory = taxonLight.getRedDataBookCategory();
+
+               if (StringUtils.isNotBlank(speciesStr)) {
+                       boolean speciesIsExisting = false;
+                       Taxon mainTaxon = null;
+                       //species
+                       Taxon speciesTaxon = (Taxon)createTaxon(state, Rank.SPECIES(), speciesStr, Taxon.class, nc);
+                       mainTaxon = speciesTaxon;
+
+                       //subspecies
+                       if (StringUtils.isNotBlank(subSpeciesStr)){
+                               Taxon existingSpecies = state.getHigherTaxon(speciesStr);
+                               if (existingSpecies != null){
+                                       speciesIsExisting = true;
+                                       speciesTaxon = existingSpecies;
+                               }
+
+                               Taxon subSpeciesTaxon = (Taxon)createTaxon(state, Rank.SUBSPECIES(), subSpeciesStr, Taxon.class, nc);
+
+                               if (subSpeciesTaxon != null){
+                                       makeParent(state, speciesTaxon, subSpeciesTaxon, citation, microCitation);
+                               }
+                               mainTaxon = subSpeciesTaxon;
+                               state.putHigherTaxon(speciesStr, speciesTaxon);
+                       }
+
+                       if (! speciesIsExisting){
+                               makeHigherTaxa(state, taxonLight, speciesTaxon, citation, microCitation);
+                       }
+                       makeHomotypicSynonyms(state, homotypicSynonymList, mainTaxon);
+                       makeHeterotypicSynonyms(state, heterotypicSynonymList, mainTaxon);
+                       makeSystematics(systematicsString, mainTaxon);
+                       makeEndemism(endemismString, mainTaxon);
+                       makeStatus(statusString, mainTaxon);
+                       makeRedBookCategory(redBookCategory, mainTaxon);
+
+//                     state.putHigherTaxon(higherName, uuid);//(speciesStr, mainTaxon);
+                       getTaxonService().save(mainTaxon);
+               }
+               return;
+    }
+
+
+       private void makeHigherTaxa(CyprusImportState state, CyprusRow taxonLight, Taxon speciesTaxon, Reference citation, String microCitation) {
+               String divisionStr = taxonLight.getDivision();
+               String genusStr = taxonLight.getGenus();
+               String familyStr = taxonLight.getFamily();
+
+               Taxon division = getTaxon(state, divisionStr, Rank.DIVISION(), null, citation, microCitation);
+               Taxon family = getTaxon(state, familyStr, Rank.FAMILY(), division, citation, microCitation);
+               Taxon genus = getTaxon(state, genusStr, Rank.GENUS(), family, citation, microCitation);
+               makeParent(state, genus, speciesTaxon, citation, microCitation) ;
+       }
+
+
+       private Taxon getTaxon(CyprusImportState state, String taxonNameStr, Rank rank, Taxon parent, Reference citation, String microCitation) {
+               Taxon result;
+               if (state.containsHigherTaxon(taxonNameStr)){
+                       result = state.getHigherTaxon(taxonNameStr);
+               }else{
+                       result = (Taxon)createTaxon(state, rank, taxonNameStr, Taxon.class, nc);
+                       state.putHigherTaxon(taxonNameStr, result);
+                       if (parent == null){
+                               makeParent(state, null,result, citation, microCitation);
+                       }else{
+                               makeParent(state, parent, result, citation, microCitation);
+                       }
+
+               }
+               return result;
+       }
+
+
+       private void makeHomotypicSynonyms(CyprusImportState state,
+                       List<String> homotypicSynonymList, Taxon mainTaxon) {
+               for (String homotypicSynonym: homotypicSynonymList){
+                       if (StringUtils.isNotBlank(homotypicSynonym)){
+                               Synonym synonym = (Synonym)createTaxon(state, null, homotypicSynonym, Synonym.class, nc);
+                               mainTaxon.addHomotypicSynonym(synonym);
+                       }
+               }
+       }
+
+
+       private void makeHeterotypicSynonyms(CyprusImportState state, List<String> heterotypicSynonymList, Taxon mainTaxon) {
+               for (String heterotypicSynonym: heterotypicSynonymList){
+                       if (StringUtils.isNotBlank(heterotypicSynonym)){
+                               Synonym synonym = (Synonym)createTaxon(state, null, heterotypicSynonym, Synonym.class, nc);
+                               mainTaxon.addSynonym(synonym, SynonymType.HETEROTYPIC_SYNONYM_OF());
+                       }
+               }
+       }
+
+
+       private void makeSystematics(String systematicsString, Taxon mainTaxon) {
+               //Systematics
+               if (StringUtils.isNotBlank(systematicsString)){
+                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
+                       TextData textData = TextData.NewInstance(Feature.SYSTEMATICS());
+                       textData.putText(Language.UNDETERMINED(), systematicsString);
+                       td.addElement(textData);
+               }
+       }
+
+
+       private void makeEndemism(String endemismString, Taxon mainTaxon) {
+               //endemism
+               if (StringUtils.isNotBlank(endemismString)){
+                       //OLD - not wanted as marker
+//                     boolean flag;
+//                     if (endemismString.trim().equalsIgnoreCase("not endemic") || endemismString.trim().equalsIgnoreCase("ne?")){
+//                             flag = false;
+//                     }else if (endemismString.trim().equalsIgnoreCase("endemic")){
+//                             flag = true;
+//                     }else{
+//                             throw new RuntimeException(endemismString + " is not a valid value for endemism");
+//                     }
+//                     Marker marker = Marker.NewInstance(MarkerType.ENDEMIC(), flag);
+//                     mainTaxon.addMarker(marker);
+                       //text data
+                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
+                       TextData textData = TextData.NewInstance(endemism);
+                       textData.putText(Language.ENGLISH(), endemismString);
+                       td.addElement(textData);
+               }
+       }
+
+
+       private void makeStatus(String statusString, Taxon mainTaxon) {
+               //status
+               if (StringUtils.isNotBlank(statusString)){
+                       PresenceAbsenceTerm status = null;
+                       if (statusString.contains("Indigenous?")){
+                               status = indigenousDoubtful;
+                       }else if (statusString.contains("Indigenous")){
+                               status = indigenous;
+                       }else if (statusString.contains("Casual?") || statusString.contains("Causal?")){
+                               status = casualDoubtful;
+                       }else if (statusString.contains("Casual")){
+                               status = casual;
+                       }else if (statusString.contains("Cultivated?")){
+                               status = cultivatedDoubtful;
+                       }else if (statusString.contains("Cultivated")){
+                               status = PresenceAbsenceTerm.CULTIVATED();
+                       }else if (statusString.contains("non-invasive?")){
+                               status = nonInvasiveDoubtful;
+                       }else if (statusString.contains("non-invasive")){
+                               status = nonInvasive;
+                       }else if (statusString.contains("invasive?")){
+                               status = invasiveDoubtful;
+                       }else if (statusString.contains("invasive")){
+                               status = invasive;
+                       }else if (statusString.contains("Questionable?")){
+                               status = questionableDoubtful;
+                       }else if (statusString.contains("Questionable")){
+                               status = questionable;
+                       }else if (statusString.startsWith("F")){
+                               status = null;
+                       }else if (statusString.equals("##")){
+                               status = null;
+                       }else{
+                               logger.warn("Unknown status: " + statusString);
+                               status = null;
+                       }
+                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
+                       NamedArea area = TdwgAreaProvider.getAreaByTdwgAbbreviation("CYP");
+                       Distribution distribution = Distribution.NewInstance(area, status);
+                       td.addElement(distribution);
+
+                       //text data
+                       TextData textData = TextData.NewInstance(Feature.STATUS());
+                       textData.putText(Language.ENGLISH(), statusString);
+                       td.addElement(textData);
+               }
+       }
+
+
+       private void makeRedBookCategory(String redBookCategory, Taxon mainTaxon) {
+               //red data book category
+               if (StringUtils.isNotBlank(redBookCategory)){
+                       TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
+                       TextData textData = TextData.NewInstance(this.redBookCategory);
+                       textData.putText(Language.ENGLISH(), redBookCategory);
+                       td.addElement(textData);
+               }
+       }
+
+
+
+
+       /**
+        *  Stores parent-child, synonym and common name relationships
+        */
+       @Override
+    protected void secondPass(CyprusImportState state) {
+//             CyprusRow cyprusRow = state.getCyprusRow();
+               return;
+       }
+
+
+
+       /**
+        * @param state
+        * @param rank
+        * @param taxonNameStr
+        * @param authorStr
+        * @param nameStatus
+        * @param nc
+        * @return
+        */
+       private TaxonBase createTaxon(CyprusImportState state, Rank rank, String taxonNameStr,
+                       Class statusClass, NomenclaturalCode nc) {
+               TaxonBase taxonBase;
+               INonViralName taxonNameBase = null;
+               if (nc == NomenclaturalCode.ICVCN){
+                       logger.warn("ICVCN not yet supported");
+
+               }else{
+                       taxonNameBase = nc.getNewTaxonNameInstance(rank);
+                       INonViralNameParser<INonViralName> parser = nameParser;//NonViralNameParserImpl.NewInstance();
+                       taxonNameBase = parser.parseFullName(taxonNameStr, nc, rank);
+
+                       //taxonNameBase.setNameCache(taxonNameStr);
+
+               }
+
+               //Create the taxon
+               Reference sec = state.getConfig().getSourceReference();
+               // Create the status
+               if (statusClass.equals(Taxon.class)){
+                       taxonBase = Taxon.NewInstance(taxonNameBase, sec);
+               }else if (statusClass.equals(Synonym.class)){
+                       taxonBase = Synonym.NewInstance(taxonNameBase, sec);
+               }else {
+                       Taxon taxon = Taxon.NewInstance(taxonNameBase, sec);
+                       taxon.setTaxonStatusUnknown(true);
+                       taxonBase = taxon;
+               }
+               return taxonBase;
+       }
+
+       private boolean makeParent(CyprusImportState state, Taxon parentTaxon, Taxon childTaxon, Reference citation, String microCitation){
+               boolean success = true;
+               Reference sec = state.getConfig().getSourceReference();
+
+//             Reference sec = parentTaxon.getSec();
+               Classification tree = state.getTree(sec);
+               if (tree == null){
+                       tree = makeTree(state, sec);
+                       tree.setTitleCache(state.getConfig().getSourceReferenceTitle());
+               }
+               if (sec.equals(childTaxon.getSec())){
+                       success &=  (null !=  tree.addParentChild(parentTaxon, childTaxon, citation, microCitation));
+               }else{
+                       logger.warn("No relationship added for child " + childTaxon.getTitleCache());
+               }
+               return success;
+       }
+
+
+
+}