bugfixes and new features for ferns
authorAndreas Müller <a.mueller@bgbm.org>
Tue, 11 Jan 2011 14:48:34 +0000 (14:48 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Tue, 11 Jan 2011 14:48:34 +0000 (14:48 +0000)
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsImportBase.java
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsImportState.java
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsTaxonImport.java
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsTaxonRelationImport.java

index 1811ebd1c3760bdfec0391c18a21ac5b29873fda..cf060c18fb2e553f2517e2b37b72988a189213b7 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Map;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.log4j.Logger;\r
 import org.joda.time.DateTime;\r
 \r
@@ -32,6 +33,7 @@ import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
 import eu.etaxonomy.cdm.io.common.Source;\r
 import eu.etaxonomy.cdm.io.common.IImportConfigurator.EDITOR;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;\r
+import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
@@ -41,6 +43,9 @@ import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
 \r
 /**\r
  * @author a.mueller\r
@@ -56,6 +61,8 @@ public abstract class CentralAfricaFernsImportBase<CDM_BASE extends CdmBase> ext
        protected static final String NAME_NAMESPACE = "African_pteridophytes_Name";\r
        protected static final String HIGHER_TAXON_NAMESPACE = "African_pteridophytes_Higher_Taxon";\r
        \r
+       private NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();\r
+       \r
 \r
        private String pluralString;\r
        private String dbTableName;\r
@@ -196,15 +203,6 @@ public abstract class CentralAfricaFernsImportBase<CDM_BASE extends CdmBase> ext
                        annotation.setCommentator(config.getCommentator());\r
                        annotation.setAnnotationType(AnnotationType.TECHNICAL());\r
                        annotatableEntity.addAnnotation(annotation);\r
-               }else if (config.getEditor().equals(EDITOR.EDITOR_AS_EDITOR)){\r
-                       User creator = getUser(createdWho, state);\r
-                       User updator = getUser(updatedWho, state);\r
-                       DateTime created = getDateTime(createdWhen);\r
-                       DateTime updated = getDateTime(updatedWhen);\r
-                       annotatableEntity.setCreatedBy(creator);\r
-                       annotatableEntity.setUpdatedBy(updator);\r
-                       annotatableEntity.setCreated(created);\r
-                       annotatableEntity.setUpdated(updated);\r
                }else {\r
                        logger.warn("Editor type not yet implemented: " + config.getEditor());\r
                }\r
@@ -225,39 +223,7 @@ public abstract class CentralAfricaFernsImportBase<CDM_BASE extends CdmBase> ext
                return success;\r
        }\r
        \r
-       private User getUser(String userString, CentralAfricaFernsImportState state){\r
-               if (CdmUtils.isEmpty(userString)){\r
-                       return null;\r
-               }\r
-               userString = userString.trim();\r
-               \r
-               User user = state.getUser(userString);\r
-               if (user == null){\r
-                       user = getTransformedUser(userString,state);\r
-               }\r
-               if (user == null){\r
-                       user = makeNewUser(userString, state);\r
-               }\r
-               if (user == null){\r
-                       logger.warn("User is null");\r
-               }\r
-               return user;\r
-       }\r
        \r
-       private User getTransformedUser(String userString, CentralAfricaFernsImportState state){\r
-               Method method = state.getConfig().getUserTransformationMethod();\r
-               if (method == null){\r
-                       return null;\r
-               }\r
-               try {\r
-                       userString = (String)state.getConfig().getUserTransformationMethod().invoke(null, userString);\r
-               } catch (Exception e) {\r
-                       logger.warn("Error when trying to transform userString " +  userString + ". No transformation done.");\r
-               }\r
-               User user = state.getUser(userString);\r
-               return user;\r
-       }\r
-\r
        private User makeNewUser(String userString, CentralAfricaFernsImportState state){\r
                String pwd = getPassword(); \r
                User user = User.NewInstance(userString, pwd);\r
@@ -397,6 +363,89 @@ public abstract class CentralAfricaFernsImportBase<CDM_BASE extends CdmBase> ext
                if ((count % recordsPerLog ) == 0 && count!= 0 ){ logger.info(pluralString + " handled: " + (count));}\r
        }\r
        \r
+       \r
+       \r
+       protected void setAuthor(BotanicalName taxonName, ResultSet rs, String taxonNumber, boolean isHigherTaxon) throws SQLException {\r
+               \r
+               String authorsFull = null;\r
+               String authorsAbbrev = null;\r
+               if (! isHigherTaxon){\r
+                       authorsFull = rs.getString("Author/s - full");\r
+                       authorsAbbrev = rs.getString("Author/s - abbreviated");\r
+               }\r
+\r
+               Rank rank = taxonName.getRank();\r
+               String authorString = null;\r
+               if (rank != null){\r
+                       if (rank.equals(Rank.ORDER())){\r
+                               authorString =  rs.getString("Order name author");\r
+                       }else if (rank.equals(Rank.SUBORDER())){\r
+                               authorString = rs.getString("Suborder name author");\r
+                       }else if (rank.equals(Rank.FAMILY())){\r
+                               authorString = rs.getString("Family name author");\r
+                       }else if (rank.equals(Rank.SUBFAMILY())){\r
+                               authorString = rs.getString("Subfamily name author");\r
+                       }else if (rank.equals(Rank.TRIBE())){\r
+                               authorString = rs.getString("Tribus author");\r
+                       }else if (rank.equals(Rank.SUBTRIBE())){\r
+                               authorString = rs.getString("Subtribus author");\r
+                       }else if (rank.equals(Rank.SECTION_BOTANY())){\r
+                               authorString = rs.getString("Section name author");\r
+                       }else if (rank.equals(Rank.SUBSECTION_BOTANY())){\r
+                               authorString = rs.getString("Subsection author");\r
+                       }else if (rank.equals(Rank.GENUS())){\r
+                               authorString = rs.getString("Genus name author");\r
+                       }else if (rank.equals(Rank.SUBGENUS())){\r
+                               authorString = rs.getString("Subgenus name author");\r
+                       }else if (rank.equals(Rank.SERIES())){\r
+                               authorString = rs.getString("Series name author");\r
+                       }else if (rank.equals(Rank.SPECIES())){\r
+                               authorString =  rs.getString("Specific epithet author");\r
+                       }else if (rank.equals(Rank.SUBSPECIES())){\r
+                               authorString = rs.getString("Subspecies author");\r
+                       }else if (rank.equals(Rank.VARIETY())){\r
+                               authorString =  rs.getString("Variety name author");\r
+                       }else if (rank.equals(Rank.SUBVARIETY())){\r
+                               authorString = rs.getString("Subvariety author");\r
+                       }else if (rank.equals(Rank.FORM())){\r
+                               authorString = rs.getString("Forma name author");\r
+                       }else if (rank.equals(Rank.SUBFORM())){\r
+                               authorString = rs.getString("Subforma author");\r
+                       }else{\r
+                               logger.warn("Author string could not be defined");\r
+                               if (! isHigherTaxon){\r
+                                       authorString = authorsAbbrev;\r
+                                       if (StringUtils.isBlank(authorString)){\r
+                                               logger.warn("Authors abbrev string could not be defined");\r
+                                               authorString = authorsFull;     \r
+                                       }\r
+                               }\r
+                       }\r
+               }else{\r
+                       logger.warn(taxonNumber + ": Rank is null");\r
+                       authorString = authorsAbbrev;\r
+                       if (StringUtils.isBlank(authorString)){\r
+                               logger.warn(taxonNumber + ": Authors abbrev string could not be defined");\r
+                               authorString = authorsFull;     \r
+                       }\r
+               }\r
+               \r
+               if (StringUtils.isNotBlank(authorString)){\r
+                       parser.handleAuthors(taxonName, taxonName.getNameCache().trim() + " " + authorString, authorString);\r
+               }\r
+               if (! isHigherTaxon){\r
+                       String combinationAuthor = taxonName.getCombinationAuthorTeam()==null ? "" :taxonName.getCombinationAuthorTeam().getNomenclaturalTitle();\r
+                       if (StringUtils.isNotBlank(authorsAbbrev) && ! authorsAbbrev.equalsIgnoreCase(combinationAuthor)){\r
+                               //it is expected that the fullAuthor and the abbrevAuthor are the combination authors but very often it is not\r
+                               logger.warn(taxonNumber + ": Rank author and abbrev author are not equal: " + authorString + "\t<-> " + combinationAuthor + "\t<-> " + authorsAbbrev);\r
+                       }\r
+       //              if (StringUtils.isNotBlank(authorsFull) && ! authorsFull.equalsIgnoreCase(authorString)){\r
+       //                      logger.warn("Rank author and full author are not equal Rankauthor: " + authorString + ", full author " + authorsFull);\r
+       //              }\r
+               }\r
+       }\r
+       \r
+       \r
 \r
 \r
        \r
index 12f9819a696999cce3b4b391f828ee8903eeb67d..3459d0f44012ea92c3d768408b7ba6a4b9c25209 100644 (file)
@@ -32,6 +32,8 @@ public class CentralAfricaFernsImportState extends DbImportStateBase<CentralAfri
        Map<String, DefinedTermBase> dbCdmDefTermMap = new HashMap<String, DefinedTermBase>();\r
        \r
        Map<String, User> usernameMap = new HashMap<String, User>();\r
+\r
+       private String taxonNumber;\r
        \r
        \r
        /* (non-Javadoc)\r
@@ -69,6 +71,14 @@ public class CentralAfricaFernsImportState extends DbImportStateBase<CentralAfri
                usernameMap.put(username, user);\r
        }\r
 \r
+       public void setTaxonNumber(String taxonNumber) {\r
+               this.taxonNumber = taxonNumber;\r
+       }\r
+\r
+       public String getTaxonNumber() {\r
+               return taxonNumber;\r
+       }\r
+\r
  \r
     \r
 }\r
index 96dbf2a5fe91480fac6d462b812a3229e178477b..8b7947baaa838e69c34c9609ef30256839040de2 100644 (file)
@@ -28,6 +28,7 @@ import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportAnnotationMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;\r
+import eu.etaxonomy.cdm.io.common.mapping.DbImportMethodMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportObjectCreationMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbNotYetImplementedMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;\r
@@ -35,6 +36,11 @@ import eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns.validation.CentralAfricaFe
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;\r
@@ -57,14 +63,12 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
        \r
        public static final UUID TNS_EXT_UUID = UUID.fromString("41cb0450-ac84-4d73-905e-9c7773c23b05");\r
        \r
-       private NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();\r
        \r
        private DbImportMapping mapping;\r
        \r
        //second path is not used anymore, there is now an ErmsTaxonRelationImport class instead\r
        private boolean isSecondPath = false;\r
        \r
-       private int modCount = 10000;\r
        private static final String pluralString = "taxa";\r
        private static final String dbTableName = "[African pteridophytes]";\r
        private static final Class cdmTargetClass = TaxonBase.class;\r
@@ -98,11 +102,12 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 //                     mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeTypes", ResultSet.class, TaxonBase.class, CentralAfricaFernsImportState.class));\r
                        mapping.addMapper(DbImportAnnotationMapper.NewInstance("Notes", AnnotationType.EDITORIAL()));\r
 \r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeCommonName", ResultSet.class, CentralAfricaFernsImportState.class));\r
+                       \r
                        //not yet implemented or ignore\r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Basionym of", "Needs better understanding"));\r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Synonym of", "Needs better understanding. Strange values like "));\r
                        \r
-                       mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Common names", "Very view values. Needs parsing for author"));\r
                        \r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Author/s - full", "Difference to Author/s abbreviated needs to be clarified. Do authors belong to reference? Sometimes authors are not equal to name authors"));\r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Author/s abbreviated" , "Difference to Author/s - full needs to be clarified. Do authors belong to reference? Sometimes authors are not equal to name authors"));\r
@@ -134,7 +139,7 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Reprint no" , "What's this?"));\r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Date verified" , "Needed?"));\r
                        \r
-                       mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Ecology" , "Needs implementation"));\r
+                       DbImportMethodMapper.NewInstance(this, "makeEcology", ResultSet.class, CentralAfricaFernsImportState.class);\r
 //                     mapping.addMapper(DbImportTextDataCreationMapper.NewInstance(dbIdAttribute, objectToCreateNamespace, dbTaxonFkAttribute, taxonNamespace, dbTextAttribute, Language.ENGLISH(), Feature.ECOLOGY(), null));\r
                        \r
                        \r
@@ -162,7 +167,8 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                String strSelect = " SELECT * ";\r
                String strFrom = " FROM [African pteridophytes] as ap";\r
                String strWhere = " WHERE ( ap.[taxon number] IN (" + ID_LIST_TOKEN + ") )";\r
-               String strRecordQuery = strSelect + strFrom + strWhere;\r
+               String strOrderBy = " ORDER BY [Taxon number]";\r
+               String strRecordQuery = strSelect + strFrom + strWhere + strOrderBy;\r
                return strRecordQuery;\r
        }\r
 \r
@@ -240,6 +246,51 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
        }\r
 \r
 \r
+       /**\r
+        * for internal use only, used by MethodMapper\r
+        */\r
+       private TaxonBase makeCommonName(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               String taxonNumber = rs.getString("Taxon number");\r
+               String commonNames = rs.getString("Common names");\r
+               TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
+               if (StringUtils.isNotBlank(commonNames)){\r
+                       if (taxonBase.isInstanceOf(Taxon.class)){\r
+                               Taxon taxon = (Taxon)taxonBase;\r
+                               TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+                               String[] split = commonNames.split(",");\r
+                               for (String commonNameString: split){\r
+                                       CommonTaxonName commonName = CommonTaxonName.NewInstance(commonNameString.trim(), Language.ENGLISH());\r
+                                       description.addElement(commonName);                             \r
+                               }\r
+                       }else{\r
+                               logger.warn("Taxon with common name is of type synonym but must be accepted taxon: " + taxonNumber);\r
+                       }\r
+               }\r
+               return taxonBase;\r
+       }\r
+       \r
+       /**\r
+        * for internal use only, used by MethodMapper\r
+        * @param commonNames \r
+        */\r
+       private TaxonBase makeEcology(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               String taxonNumber = rs.getString("Taxon number");\r
+               String ecologyString = rs.getString("Ecology");\r
+               TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
+               if (StringUtils.isNotBlank(ecologyString)){\r
+                       if (taxonBase.isInstanceOf(Taxon.class)){\r
+                               Taxon taxon = (Taxon)taxonBase;\r
+                               TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+                               TextData ecology = TextData.NewInstance(Feature.ECOLOGY());\r
+                               ecology.putText(ecologyString.trim(), Language.ENGLISH());\r
+                               description.addElement(ecology);                                \r
+                       }else{\r
+                               logger.warn("Taxon with ecology is of type synonym but must be accepted taxon: " + taxonNumber);\r
+                       }\r
+               }\r
+               return taxonBase;\r
+       }\r
+       \r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet)\r
@@ -271,21 +322,13 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                \r
                String status = rs.getString("Current/Synonym");\r
                \r
-               TaxonBase taxon;\r
-               if ("c".equalsIgnoreCase(status)){\r
-                       taxon = Taxon.NewInstance(taxonName, sec);\r
-               }else if ("s".equalsIgnoreCase(status)){\r
-                       taxon = Synonym.NewInstance(taxonName, sec);\r
-               }else{\r
-                       logger.warn(taxonNumber + ": Status not given for taxon " );\r
-                       taxon = Taxon.NewUnknownStatusInstance(taxonName, sec);\r
-               }\r
+               TaxonBase taxon = makeTaxon(taxonName, sec, taxonNumber, status);\r
                \r
 //                     Integer parent3Rank = rs.getInt("parent3rank");\r
                \r
                //rank and epithets\r
-               Rank lowestRank = setLowestUninomial(taxonName, orderName,  subOrderName, familyName, subFamilyName, tribusName, subTribusName,sectionName, subsectionName, genusName);\r
-               lowestRank = setLowestInfraGeneric(taxonName, lowestRank, subGenusName,  seriesName);\r
+               Rank lowestRank = setLowestUninomial(taxonName, orderName,  subOrderName, familyName, subFamilyName, tribusName, subTribusName,genusName);\r
+               lowestRank = setLowestInfraGeneric(taxonName, lowestRank, subGenusName, sectionName, subsectionName, seriesName);\r
                if (StringUtils.isNotBlank(specificEpihet)){\r
                        taxonName.setSpecificEpithet(specificEpihet);\r
                        lowestRank = Rank.SPECIES();\r
@@ -293,12 +336,9 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                lowestRank = setLowestInfraSpecific(taxonName, lowestRank, subspeciesName,  varietyName, subVariety, formaName,subFormaName);\r
                \r
                taxonName.setRank(lowestRank);\r
-               setAuthor(taxonName, rs, taxonNumber);\r
-               \r
-               \r
+               setAuthor(taxonName, rs, taxonNumber, false);\r
                \r
                //set epithets\r
-\r
                \r
                //add original source for taxon name (taxon original source is added in mapper\r
                Reference citation = state.getConfig().getSourceReference();\r
@@ -309,98 +349,32 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 \r
 \r
 \r
-       private void setAuthor(BotanicalName taxonName, ResultSet rs, String taxonNumber) throws SQLException {\r
-               \r
-               String orderAuthor = rs.getString("Order name author");\r
-               String subOrderAuthor = rs.getString("Suborder name author");\r
-               String familyAuthor = rs.getString("Family name author");\r
-               String subFamilyAuthor = rs.getString("Subfamily name author");\r
-               String tribusAuthor = rs.getString("Tribus author");\r
-               String subTribusAuthor = rs.getString("Subtribus author");\r
-               String sectionAuthor = rs.getString("Section name author");\r
-               String subsectionAuthor = rs.getString("Subsection author");\r
-               String genusAuthor = rs.getString("Genus name author");\r
-               String subGenusAuthor = rs.getString("Subgenus name author");\r
-               String seriesAuthor = rs.getString("Series name author");\r
-               String specificEpihetAuthor = rs.getString("Specific epithet author");\r
-               String subspeciesAuthor = rs.getString("Subspecies author");\r
-               String varietyAuthor = rs.getString("Variety name author");\r
-               String subVarietyAuthor = rs.getString("Subvariety author");\r
-               String formaAuthor = rs.getString("Forma name author");\r
-               String subFormaAuthor = rs.getString("Subforma author");\r
-               \r
-               String authorsFull = rs.getString("Author/s - full");\r
-               String authorsAbbrev = rs.getString("Author/s - abbreviated");\r
-               \r
-\r
-               Rank rank = taxonName.getRank();\r
-               String authorString;\r
-               if (rank != null){\r
-                       if (rank.equals(Rank.ORDER())){\r
-                               authorString = orderAuthor;\r
-                       }else if (rank.equals(Rank.SUBORDER())){\r
-                               authorString = subOrderAuthor;\r
-                       }else if (rank.equals(Rank.FAMILY())){\r
-                               authorString = familyAuthor;\r
-                       }else if (rank.equals(Rank.SUBFAMILY())){\r
-                               authorString = subFamilyAuthor;\r
-                       }else if (rank.equals(Rank.TRIBE())){\r
-                               authorString = tribusAuthor;\r
-                       }else if (rank.equals(Rank.SUBTRIBE())){\r
-                               authorString = subTribusAuthor;\r
-                       }else if (rank.equals(Rank.SECTION_BOTANY())){\r
-                               authorString = sectionAuthor;\r
-                       }else if (rank.equals(Rank.SUBSECTION_BOTANY())){\r
-                               authorString = subsectionAuthor;\r
-                       }else if (rank.equals(Rank.GENUS())){\r
-                               authorString = genusAuthor;\r
-                       }else if (rank.equals(Rank.SUBGENUS())){\r
-                               authorString = subGenusAuthor;\r
-                       }else if (rank.equals(Rank.SERIES())){\r
-                               authorString = seriesAuthor;\r
-                       }else if (rank.equals(Rank.SPECIES())){\r
-                               authorString = specificEpihetAuthor;\r
-                       }else if (rank.equals(Rank.SUBSPECIES())){\r
-                               authorString = subspeciesAuthor;\r
-                       }else if (rank.equals(Rank.VARIETY())){\r
-                               authorString = varietyAuthor;\r
-                       }else if (rank.equals(Rank.SUBVARIETY())){\r
-                               authorString = subVarietyAuthor;\r
-                       }else if (rank.equals(Rank.FORM())){\r
-                               authorString = formaAuthor;\r
-                       }else if (rank.equals(Rank.SUBFORM())){\r
-                               authorString = subFormaAuthor;\r
-                       }else{\r
-                               logger.warn("Author string could not be defined");\r
-                               authorString = authorsAbbrev;\r
-                               if (StringUtils.isBlank(authorString)){\r
-                                       logger.warn("Authors abbrev string could not be defined");\r
-                                       authorString = authorsFull;     \r
-                               }\r
+       /**\r
+        * Creates the taxon object depending on name, sec and status\r
+        * @param taxonName\r
+        * @param sec\r
+        * @param taxonNumber\r
+        * @param status\r
+        * @return\r
+        */\r
+       private TaxonBase makeTaxon(BotanicalName taxonName, Reference sec,\r
+                       String taxonNumber, String status) {\r
+               TaxonBase taxon;\r
+               if ("c".equalsIgnoreCase(status)|| "incertus".equalsIgnoreCase(status) ){\r
+                       taxon = Taxon.NewInstance(taxonName, sec);\r
+                       if ("incertus".equalsIgnoreCase(status)){\r
+                               taxon.setDoubtful(true);\r
                        }\r
+               }else if ("s".equalsIgnoreCase(status)){\r
+                       taxon = Synonym.NewInstance(taxonName, sec);\r
                }else{\r
-                       logger.warn(taxonNumber + ": Rank is null");\r
-                       authorString = authorsAbbrev;\r
-                       if (StringUtils.isBlank(authorString)){\r
-                               logger.warn(taxonNumber + ": Authors abbrev string could not be defined");\r
-                               authorString = authorsFull;     \r
-                       }\r
-               }\r
-               \r
-               if (authorString != null){\r
-                       parser.handleAuthors(taxonName, taxonName.getNameCache().trim() + " " + authorString, authorString);\r
-               }\r
-               if (StringUtils.isNotBlank(authorsAbbrev) && ! authorsAbbrev.equalsIgnoreCase(taxonName.getCombinationAuthorTeam()==null ? "" :taxonName.getCombinationAuthorTeam().getNomenclaturalTitle())){\r
-                       logger.warn(taxonNumber + ": Rank author and abbrev author are not equal: " + authorString + "\t\t " + authorsAbbrev);\r
+                       logger.warn(taxonNumber + ": Status not given for taxon " );\r
+                       taxon = Taxon.NewUnknownStatusInstance(taxonName, sec);\r
                }\r
-//             if (StringUtils.isNotBlank(authorsFull) && ! authorsFull.equalsIgnoreCase(authorString)){\r
-//                     logger.warn("Rank author and full author are not equal Rankauthor: " + authorString + ", full author " + authorsFull);\r
-//             }\r
-       \r
+               return taxon;\r
        }\r
 \r
 \r
-\r
        private Rank setLowestInfraSpecific(BotanicalName taxonName, Rank lowestRank, String subspeciesName, String varietyName,\r
                        String subVariety, String formaName, String subFormaName) {\r
                if (StringUtils.isNotBlank(subFormaName)){\r
@@ -425,10 +399,16 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 \r
 \r
 \r
-       private Rank setLowestInfraGeneric(BotanicalName taxonName, Rank lowestRank, String subGenusName, String seriesName) {\r
+       private Rank setLowestInfraGeneric(BotanicalName taxonName, Rank lowestRank, String subGenusName, String sectionName, String subSectionName, String seriesName) {\r
                if (StringUtils.isNotBlank(seriesName)){\r
                        taxonName.setInfraGenericEpithet(seriesName);\r
                        return Rank.SERIES();\r
+               }else if (StringUtils.isNotBlank(subSectionName)){\r
+                       taxonName.setInfraGenericEpithet(subSectionName);\r
+                       return Rank.SUBSECTION_BOTANY();\r
+               }else if (StringUtils.isNotBlank(sectionName)){\r
+                       taxonName.setInfraGenericEpithet(sectionName);\r
+                       return Rank.SECTION_BOTANY();\r
                }else if (StringUtils.isNotBlank(subGenusName)){\r
                        taxonName.setInfraGenericEpithet(subGenusName);\r
                        return Rank.SUBGENUS();\r
@@ -440,17 +420,11 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 \r
 \r
        private Rank setLowestUninomial(BotanicalName taxonName, String orderName, String subOrderName, String familyName, String subFamilyName,\r
-                       String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName) {\r
+                       String tribusName, String subTribusName, String genusName) {\r
                \r
                if (StringUtils.isNotBlank(genusName)){\r
                        taxonName.setGenusOrUninomial(genusName);\r
                        return Rank.GENUS();\r
-               }else if (StringUtils.isNotBlank(subsectionName)){\r
-                       taxonName.setGenusOrUninomial(subsectionName);\r
-                       return Rank.SUBSECTION_BOTANY();\r
-               }else if (StringUtils.isNotBlank(sectionName)){\r
-                       taxonName.setGenusOrUninomial(sectionName);\r
-                       return Rank.SECTION_BOTANY();\r
                }else if (StringUtils.isNotBlank(subTribusName)){\r
                        taxonName.setGenusOrUninomial(subTribusName);\r
                        return Rank.SUBTRIBE();\r
index 8be6db23b3893a91613b86a63614fa46a8058401..9d70fdf1d5aa1ab4d7ab379ea6566dc8940b1350 100644 (file)
@@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;\r
 \r
 import eu.etaxonomy.cdm.api.service.IClassificationService;\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportMethodMapper;\r
@@ -32,11 +33,15 @@ import eu.etaxonomy.cdm.io.common.mapping.DbImportTaxIncludedInMapper;
 import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;\r
 import eu.etaxonomy.cdm.io.eflora.centralAfrica.checklist.CentralAfricaChecklistImportState;\r
 import eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns.validation.CentralAfricaFernsTaxonImportValidator;\r
+import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\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.SynonymRelationshipType;\r
@@ -58,12 +63,11 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
        private DbImportMapping mapping;\r
        \r
        \r
-       private int modCount = 10000;\r
-       private static final String pluralString = "taxa";\r
+       private static final String pluralString = "taxon relations";\r
        private static final String dbTableName = "[African pteridophytes]";\r
        private static final Class cdmTargetClass = TaxonBase.class;\r
 \r
-       private Map<String, UUID> taxonMap = new HashMap<String, UUID>();\r
+       private Map<String, UUID> taxonMap3 = new HashMap<String, UUID>();\r
 \r
        \r
        public CentralAfricaFernsTaxonRelationImport(){\r
@@ -108,7 +112,8 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                String strSelect = " SELECT * ";\r
                String strFrom = " FROM [African pteridophytes] as ap";\r
                String strWhere = " WHERE ( ap.[taxon number] IN (" + ID_LIST_TOKEN + ") )";\r
-               String strRecordQuery = strSelect + strFrom + strWhere;\r
+               String strOrderBy = " ORDER BY [Taxon number]";\r
+               String strRecordQuery = strSelect + strFrom + strWhere + strOrderBy ;\r
                return strRecordQuery;\r
        }\r
        \r
@@ -134,7 +139,7 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                List<Taxon> taxonList = (List)getTaxonService().list(Taxon.class, null, null, null, propPath );\r
                for (Taxon taxon : taxonList){\r
                        NonViralName nvn = CdmBase.deproxy(taxon.getName(), NonViralName.class);\r
-                       UUID uuid = taxon.getName().getUuid();\r
+                       UUID uuid = taxon.getUuid();\r
                        String name = nvn.getNameCache();\r
                        taxonMap.put(name, uuid);\r
                        \r
@@ -189,7 +194,8 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                TaxonBase result = null;\r
                try {\r
                        String status = rs.getString("Current/Synonym");\r
-                       \r
+                       String taxonNumber = rs.getString("Taxon number");\r
+                       state.setTaxonNumber(taxonNumber);\r
                        if ("s".equalsIgnoreCase(status)){\r
                                //synonym\r
                                result = handleSynonym(rs, state);\r
@@ -209,7 +215,7 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
 \r
        private Synonym handleSynonym(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException {\r
                String accTaxonId = rs.getString("Current");\r
-               String synonymId = rs.getString("Taxon number");\r
+               String synonymId = state.getTaxonNumber();\r
                Synonym synonym = (Synonym)state.getRelatedObject(TAXON_NAMESPACE, synonymId);\r
                if (synonym == null){\r
                        logger.warn ("Synonym ("+synonymId+")not found.");\r
@@ -257,7 +263,7 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                String formaName = rs.getString("Forma name");\r
                String subFormaName = rs.getString("Subforma");\r
                \r
-               makeNextHigherTaxon(state, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName,\r
+               makeNextHigherTaxon(state, rs, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName,\r
                                subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
                return child;\r
        }\r
@@ -265,44 +271,119 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
 \r
 \r
        /**\r
-        * @param state\r
-        * @param child\r
-        * @param orderName\r
-        * @param subOrderName\r
-        * @param familyName\r
-        * @param subFamilyName\r
-        * @param tribusName\r
-        * @param subTribusName\r
-        * @param sectionName\r
-        * @param subsectionName\r
-        * @param genusName\r
-        * @param subGenusName\r
-        * @param seriesName\r
-        * @param specificEpihet\r
-        * @param subspeciesName\r
-        * @param varietyName\r
-        * @param subVariety\r
-        * @param formaName\r
-        * @param subFormaName\r
+        * Adds recursively this taxon to the next higher taxon. If the taxon exists already the relationship is not added\r
+        * again but if the author is missing in the old taxon but not in the new taxon the old taxon will get the new taxons\r
+        * author. If authors differ a new taxon is created.\r
+        * If a higher taxon exists the method is called recursively on this taxon.\r
+        * @throws SQLException \r
         */\r
-       private void makeNextHigherTaxon(CentralAfricaFernsImportState state, Taxon child, String orderName, String subOrderName,\r
+       private void makeNextHigherTaxon(CentralAfricaFernsImportState state, ResultSet rs, Taxon child, String orderName, String subOrderName,\r
                        String familyName, String subFamilyName, String tribusName, String subTribusName, String sectionName, String subsectionName,\r
                        String genusName, String subGenusName, String seriesName, String specificEpihet, String subspeciesName, String varietyName,\r
-                       String subVariety, String formaName, String subFormaName) {\r
+                       String subVariety, String formaName, String subFormaName) throws SQLException {\r
 \r
-               Taxon higherTaxon = getNextHigherTaxon(state, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
+               Taxon higherTaxon = getNextHigherTaxon(state, rs, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
                \r
-               Reference citation = null;\r
+               Reference<?> citation = null;\r
+               String microcitation = null;\r
                if (higherTaxon != null){\r
-                       if (! includedRelationshipExists(child, higherTaxon)){\r
-                               makeTaxonomicallyIncluded(state, null, child, higherTaxon, citation, null);\r
+                       Taxon existingHigherTaxon = getExistingHigherTaxon(child, higherTaxon);\r
+                       if (existingHigherTaxon != null){\r
+                               boolean authorsAreSame = handleHigherTaxonAuthors(higherTaxon, existingHigherTaxon);\r
+                               if (authorsAreSame){\r
+                                       higherTaxon = existingHigherTaxon;\r
+                               }\r
+                       }else if (! includedRelationshipExists(child, higherTaxon)){\r
+                               makeTaxonomicallyIncluded(state, null, child, higherTaxon, citation, microcitation);\r
                        }else{\r
-                               logger.info("Included exists");\r
+                               //TODO it can appear because includeRelationshipExists works on strings not on taxon objects\r
+                               logger.warn("State should  not appear: " + state.getTaxonNumber() + "-" + higherTaxon.getName().getTitleCache() + "; " + child.getName().getTitleCache());\r
+                       }\r
+                       makeNextHigherTaxon(state, rs, higherTaxon, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
+               }else{\r
+                       //add taxon to tree if not yet added\r
+                       if (child.getTaxonNodes().size() == 0){\r
+                               makeTaxonomicallyIncluded(state, null, child, null, citation, microcitation);\r
+                       }\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Adds the higherTaxon authors to the existingHigherTaxon authors if the higherTaxon has authors and \r
+        * the existingHigherTaxon has no authors.\r
+        * Returns false if both taxa have authors and the authors differ from each other.\r
+        * @param higherTaxon\r
+        * @param existingHigherTaxon\r
+        */\r
+       private boolean handleHigherTaxonAuthors(Taxon higherTaxon, Taxon existingHigherTaxon) {\r
+               NonViralName existingName = CdmBase.deproxy(higherTaxon.getName(), NonViralName.class);\r
+               NonViralName newName = CdmBase.deproxy(existingHigherTaxon.getName(), NonViralName.class);\r
+               if (existingName == newName){\r
+                       return true;\r
+               }\r
+               if (! hasAuthors(newName)){\r
+                       return true;\r
+               }\r
+               if (!hasAuthors(existingName)){\r
+                       existingName.setCombinationAuthorTeam(newName.getCombinationAuthorTeam());\r
+                       existingName.setExCombinationAuthorTeam(newName.getExCombinationAuthorTeam());\r
+                       existingName.setBasionymAuthorTeam(newName.getBasionymAuthorTeam());\r
+                       existingName.setExBasionymAuthorTeam(newName.getExBasionymAuthorTeam());\r
+                       return true;\r
+               }\r
+               boolean authorsAreSame = true;\r
+               authorsAreSame &= getNomTitleNotNull(existingName.getCombinationAuthorTeam()).equals(getNomTitleNotNull(newName.getCombinationAuthorTeam()));\r
+               authorsAreSame &= getNomTitleNotNull(existingName.getExCombinationAuthorTeam()).equals(getNomTitleNotNull(newName.getExCombinationAuthorTeam()));\r
+               authorsAreSame &= getNomTitleNotNull(existingName.getBasionymAuthorTeam()).equals(getNomTitleNotNull(newName.getBasionymAuthorTeam()));\r
+               authorsAreSame &= getNomTitleNotNull(existingName.getExBasionymAuthorTeam()).equals(getNomTitleNotNull(newName.getExBasionymAuthorTeam()));\r
+               return authorsAreSame;\r
+               \r
+               \r
+       }\r
+\r
+\r
+\r
+       private String getNomTitleNotNull(INomenclaturalAuthor author) {\r
+               if (author != null){\r
+                       return CdmUtils.Nz(author.getNomenclaturalTitle());\r
+               }else{\r
+                       return "";\r
+               }\r
+       }\r
+\r
+\r
+\r
+       private boolean hasAuthors(NonViralName name) {\r
+               return (name.getCombinationAuthorTeam() != null || \r
+                               name.getExCombinationAuthorTeam() != null ||\r
+                               name.getBasionymAuthorTeam() != null ||\r
+                               name.getExBasionymAuthorTeam() != null);\r
+       }\r
+\r
+\r
+\r
+       private Taxon getExistingHigherTaxon(Taxon child, Taxon higherTaxon) {\r
+               int countNodes = child.getTaxonNodes().size();\r
+               if (countNodes < 1){\r
+                       return null;\r
+               }else if (countNodes > 1){\r
+                       throw new IllegalStateException("Multiple nodes exist for child taxon. This is an invalid state.");\r
+               }else{\r
+                       TaxonNode childNode = child.getTaxonNodes().iterator().next();\r
+                       TaxonNode parentNode = childNode.getParent();\r
+                       if (parentNode != null){\r
+                               String existingParentTitle = parentNode.getTaxon().getName().getTitleCache();\r
+                               String newParentTitle = higherTaxon.getName().getTitleCache();\r
+                               if (existingParentTitle.equals(newParentTitle)){\r
+                                       return parentNode.getTaxon();\r
+                               }\r
                        }\r
-                       makeNextHigherTaxon(state, higherTaxon, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
+                       return null;\r
                }\r
        }\r
 \r
+\r
+\r
        /**\r
         * Tests if this the child taxon already is a child of the higher taxon.\r
         * @param child\r
@@ -377,32 +458,45 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                        state.addRelatedObject(DbImportTaxIncludedInMapper.TAXONOMIC_TREE_NAMESPACE, treeKey, tree);\r
                }\r
                \r
-               TaxonNode childNode = tree.addParentChild(parent, child, citation, microCitation);\r
+               TaxonNode childNode;\r
+               if (parent != null){\r
+                       childNode = tree.addParentChild(parent, child, citation, microCitation);\r
+               }else{\r
+                       childNode = tree.addChildTaxon(child, citation, microCitation, null);\r
+               }\r
                return (childNode != null);\r
        }\r
 \r
 \r
 \r
-       private Taxon getNextHigherTaxon(CentralAfricaFernsImportState state, Taxon childTaxon, String orderName, String subOrderName, String familyName, String subFamilyName,\r
-                       String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName, String subGenusName, String seriesName, String speciesName, String subspeciesName, String varietyName, String subVariety, String formaName, String subFormaName) {\r
+       /**\r
+        * Reasons if a higher taxon should exist. If it should exist it tries to match with an existing taxon otherwise\r
+        * creates a new taxon.\r
+        * @return\r
+        * @throws SQLException\r
+        */\r
+       private Taxon getNextHigherTaxon(CentralAfricaFernsImportState state, ResultSet rs, Taxon childTaxon, String orderName, String subOrderName, String familyName, String subFamilyName,\r
+                       String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName, String subGenusName, String seriesName, String speciesName, String subspeciesName, String varietyName, String subVariety, String formaName, String subFormaName) throws SQLException {\r
                \r
                Taxon result = null;\r
                BotanicalName childName = CdmBase.deproxy(childTaxon.getName(), BotanicalName.class);\r
                Rank childRank = childName.getRank();\r
-               BotanicalName higherName; \r
+               BotanicalName higherName;\r
                higherName = handleInfraSpecific(childRank, genusName, speciesName, subspeciesName, varietyName, subVariety, formaName, subFormaName);\r
                if (higherName.getRank() == null){\r
-                       handleSpecies(childRank, higherName, genusName, speciesName);\r
+                       handleSpecies(childRank, higherName,  genusName, speciesName);\r
                }\r
                if (higherName.getRank() == null){\r
-                       handleInfraGeneric(childRank, higherName, genusName, subGenusName, seriesName);\r
+                       handleInfraGeneric(childRank, higherName,  genusName, subGenusName, sectionName, subsectionName, seriesName);\r
                }\r
                if (higherName.getRank() == null){\r
-                       handleUninomial(childRank, higherName, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName);\r
+                       handleUninomial(childRank, higherName, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, genusName);\r
                }\r
                //if higher taxon must exist, create it if it was not yet created\r
-               if (higherName.getRank() != null && getExistingTaxon(higherName, state) == null ){\r
+               result = getExistingTaxon(higherName, state);\r
+               if (higherName.getRank() != null && result == null ){\r
                        result = Taxon.NewInstance(higherName, childTaxon.getSec());\r
+                       setAuthor(higherName, rs, state.getTaxonNumber(), true);\r
                        UUID uuid = higherName.getUuid();\r
                        String name = higherName.getNameCache();\r
                        taxonMap.put(name, uuid);\r
@@ -417,16 +511,26 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                String nameCache = higherName.getNameCache();\r
                UUID uuid = taxonMap.get(nameCache);\r
                \r
-               Taxon taxon = null;\r
+               Taxon persistedTaxon = null;\r
+               Taxon relatedTaxon = null;\r
                if (uuid != null){\r
-                       taxon = CdmBase.deproxy(getTaxonService().find(uuid), Taxon.class);\r
-                       Taxon taxon2 = state.getRelatedObject(HIGHER_TAXON_NAMESPACE, nameCache, Taxon.class);\r
-                       if (taxon != taxon2){\r
-                               logger.warn("Difference in related taxa: " + nameCache);\r
+                       //persistedTaxon = CdmBase.deproxy(getTaxonService().find(uuid), Taxon.class);\r
+                       relatedTaxon = state.getRelatedObject(HIGHER_TAXON_NAMESPACE, nameCache, Taxon.class);\r
+                       if (relatedTaxon == null){\r
+                               //TODO find for partition\r
+                               relatedTaxon = (Taxon)getTaxonService().find(uuid);\r
+                               if (relatedTaxon == null){\r
+                                       logger.info(state.getTaxonNumber() +  " - Could not find existing name ("+nameCache+") in related objects map");\r
+                               }else{\r
+                                       state.addRelatedObject(HIGHER_TAXON_NAMESPACE, nameCache, relatedTaxon);\r
+                               }\r
+                       }\r
+                       if (persistedTaxon != relatedTaxon){\r
+                               //logger.warn("Difference in related taxa: " + nameCache );\r
                        }\r
                        \r
                }\r
-               return taxon;\r
+               return relatedTaxon; //persistedTaxon;\r
        }\r
 \r
 \r
@@ -476,12 +580,18 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                return taxonName;\r
        }\r
 \r
-       private BotanicalName handleInfraGeneric(Rank lowerTaxonRank, BotanicalName taxonName, String genusName, String subGenusName, String seriesName) {\r
+       private BotanicalName handleInfraGeneric(Rank lowerTaxonRank, BotanicalName taxonName, String genusName, String subGenusName, String sectionName, String subsectionName, String seriesName) {\r
                Rank newRank = null;\r
                \r
                if (StringUtils.isNotBlank(seriesName)  && lowerTaxonRank.isLower(Rank.SERIES())){\r
                        taxonName.setInfraGenericEpithet(seriesName);\r
                        newRank = Rank.SERIES();\r
+               }else if (StringUtils.isNotBlank(subsectionName)  && lowerTaxonRank.isLower(Rank.SUBSECTION_BOTANY())){\r
+                       taxonName.setInfraGenericEpithet(subsectionName);\r
+                       newRank =  Rank.SUBSECTION_BOTANY();\r
+               }else if (StringUtils.isNotBlank(sectionName)  && lowerTaxonRank.isLower(Rank.SECTION_BOTANY())){\r
+                       taxonName.setInfraGenericEpithet(sectionName);\r
+                       newRank =  Rank.SECTION_BOTANY();\r
                }else if (StringUtils.isNotBlank(subGenusName) && lowerTaxonRank.isLower(Rank.SUBGENUS())){\r
                        taxonName.setInfraGenericEpithet(subGenusName);\r
                        newRank = Rank.SUBGENUS();\r
@@ -496,18 +606,12 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
 \r
 \r
        private BotanicalName handleUninomial(Rank lowerTaxonRank, BotanicalName taxonName,  String orderName, String subOrderName, String familyName, String subFamilyName,\r
-                               String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName) {\r
+                               String tribusName, String subTribusName, String genusName) {\r
                \r
                Rank newRank = null;\r
                if (StringUtils.isNotBlank(genusName) && lowerTaxonRank.isLower(Rank.GENUS())){\r
                        taxonName.setGenusOrUninomial(genusName);\r
                        newRank =  Rank.GENUS();\r
-               }else if (StringUtils.isNotBlank(subsectionName)  && lowerTaxonRank.isLower(Rank.SUBSECTION_BOTANY())){\r
-                       taxonName.setGenusOrUninomial(subsectionName);\r
-                       newRank =  Rank.SUBSECTION_BOTANY();\r
-               }else if (StringUtils.isNotBlank(sectionName)  && lowerTaxonRank.isLower(Rank.SECTION_BOTANY())){\r
-                       taxonName.setGenusOrUninomial(sectionName);\r
-                       newRank =  Rank.SECTION_BOTANY();\r
                }else if (StringUtils.isNotBlank(subTribusName) && lowerTaxonRank.isLower(Rank.SUBTRIBE())){\r
                        taxonName.setGenusOrUninomial(subTribusName);\r
                        newRank =  Rank.SUBTRIBE();\r
@@ -533,96 +637,6 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
 \r
 \r
 \r
-\r
-       private void setAuthor(BotanicalName taxonName, ResultSet rs) throws SQLException {\r
-               String orderAuthor = rs.getString("Order name author");\r
-               String subOrderAuthor = rs.getString("Suborder name author");\r
-               String familyAuthor = rs.getString("Family name author");\r
-               String subFamilyAuthor = rs.getString("Subfamily name author");\r
-               String tribusAuthor = rs.getString("Tribus author");\r
-               String subTribusAuthor = rs.getString("Subtribus author");\r
-               String sectionAuthor = rs.getString("Section name author");\r
-               String subsectionAuthor = rs.getString("Subsection author");\r
-               String genusAuthor = rs.getString("Genus name author");\r
-               String subGenusAuthor = rs.getString("Subgenus name author");\r
-               String seriesAuthor = rs.getString("Series name author");\r
-               String specificEpihetAuthor = rs.getString("Specific epithet author");\r
-               String subspeciesAuthor = rs.getString("Subspecies author");\r
-               String varietyAuthor = rs.getString("Variety name author");\r
-               String subVarietyAuthor = rs.getString("Subvariety author");\r
-               String formaAuthor = rs.getString("Forma name author");\r
-               String subFormaAuthor = rs.getString("Subforma author");\r
-               \r
-               String authorsFull = rs.getString("Author/s - full");\r
-               String authorsAbbrev = rs.getString("Author/s - abbreviated");\r
-               \r
-\r
-               Rank rank = taxonName.getRank();\r
-               String authorString;\r
-               if (rank != null){\r
-                       if (rank.equals(Rank.ORDER())){\r
-                               authorString = orderAuthor;\r
-                       }else if (rank.equals(Rank.SUBORDER())){\r
-                               authorString = subOrderAuthor;\r
-                       }else if (rank.equals(Rank.FAMILY())){\r
-                               authorString = familyAuthor;\r
-                       }else if (rank.equals(Rank.SUBFAMILY())){\r
-                               authorString = subFamilyAuthor;\r
-                       }else if (rank.equals(Rank.TRIBE())){\r
-                               authorString = tribusAuthor;\r
-                       }else if (rank.equals(Rank.SUBTRIBE())){\r
-                               authorString = subTribusAuthor;\r
-                       }else if (rank.equals(Rank.SECTION_BOTANY())){\r
-                               authorString = sectionAuthor;\r
-                       }else if (rank.equals(Rank.SUBSECTION_BOTANY())){\r
-                               authorString = subsectionAuthor;\r
-                       }else if (rank.equals(Rank.GENUS())){\r
-                               authorString = genusAuthor;\r
-                       }else if (rank.equals(Rank.SUBGENUS())){\r
-                               authorString = subGenusAuthor;\r
-                       }else if (rank.equals(Rank.SERIES())){\r
-                               authorString = seriesAuthor;\r
-                       }else if (rank.equals(Rank.SPECIES())){\r
-                               authorString = specificEpihetAuthor;\r
-                       }else if (rank.equals(Rank.SUBSPECIES())){\r
-                               authorString = subspeciesAuthor;\r
-                       }else if (rank.equals(Rank.VARIETY())){\r
-                               authorString = varietyAuthor;\r
-                       }else if (rank.equals(Rank.SUBVARIETY())){\r
-                               authorString = subVarietyAuthor;\r
-                       }else if (rank.equals(Rank.FORM())){\r
-                               authorString = formaAuthor;\r
-                       }else if (rank.equals(Rank.SUBFORM())){\r
-                               authorString = subFormaAuthor;\r
-                       }else{\r
-                               logger.warn("Author string could not be defined");\r
-                               authorString = authorsAbbrev;\r
-                               if (StringUtils.isBlank(authorString)){\r
-                                       logger.warn("Authors abbrev string could not be defined");\r
-                                       authorString = authorsFull;     \r
-                               }\r
-                       }\r
-               }else{\r
-                       logger.warn("Rank is null");\r
-                       authorString = authorsAbbrev;\r
-                       if (StringUtils.isBlank(authorString)){\r
-                               logger.warn("Authors abbrev string could not be defined");\r
-                               authorString = authorsFull;     \r
-                       }\r
-               }\r
-               if (StringUtils.isNotBlank(authorsAbbrev) && ! authorsAbbrev.equalsIgnoreCase(authorString)){\r
-                       logger.warn("Rank author and abbrev author are not equal");\r
-               }\r
-               if (StringUtils.isNotBlank(authorsFull) && ! authorsFull.equalsIgnoreCase(authorString)){\r
-                       logger.warn("Rank author and full author are not equal");\r
-               }\r
-       \r
-               Team team = Team.NewTitledInstance(authorString, authorString);\r
-               taxonName.setCombinationAuthorTeam(team);\r
-       \r
-       }       \r
-\r
-       \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
         */\r