ref #6369 adapt existing occurrences of interface to removed generics in cdmlib-app
[cdmlib-apps.git] / cdm-eflora / src / main / java / eu / etaxonomy / cdm / io / eflora / EfloraTaxonImport.java
index fe3a14123ab7fc634eb2aecb86e9977eb77adcf0..7a1e24ed63d5f10d07eff38d41dd6576734260e0 100644 (file)
@@ -5,7 +5,7 @@
 *\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
 \r
 package eu.etaxonomy.cdm.io.eflora;\r
 \r
@@ -46,6 +46,7 @@ import eu.etaxonomy.cdm.model.common.ISourceable;
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.OriginalSourceType;\r
 import eu.etaxonomy.cdm.model.common.TimePeriod;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
@@ -57,28 +58,29 @@ import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.description.TextData;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.INonViralName;\r
 import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\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.name.SpecimenTypeDesignation;\r
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.name.TypeDesignationBase;\r
-import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
 import eu.etaxonomy.cdm.model.reference.IBook;\r
 import eu.etaxonomy.cdm.model.reference.IJournal;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
 import eu.etaxonomy.cdm.model.taxon.Classification;\r
-import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
 import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
+import eu.etaxonomy.cdm.strategy.parser.TimePeriodParser;\r
 \r
 \r
 /**\r
@@ -90,26 +92,26 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
        private static final Logger logger = Logger.getLogger(EfloraTaxonImport.class);\r
 \r
        private static int modCount = 30000;\r
-       private NonViralNameParserImpl parser = new NonViralNameParserImpl();\r
+       private final NonViralNameParserImpl parser = new NonViralNameParserImpl();\r
 \r
        public EfloraTaxonImport(){\r
                super();\r
        }\r
-       \r
-       \r
+\r
+\r
        @Override\r
        public boolean doCheck(EfloraImportState state){\r
                boolean result = true;\r
                return result;\r
        }\r
-       \r
-       //TODO make part of state, but state is renewed when invoking the import a second time \r
+\r
+       //TODO make part of state, but state is renewed when invoking the import a second time\r
        private UnmatchedLeads unmatchedLeads;\r
-       \r
+\r
        @Override\r
        public void doInvoke(EfloraImportState state){\r
                logger.info("start make Taxa ...");\r
-               \r
+\r
                //FIXME reset state\r
                state.putTree(null, null);\r
 //             UnmatchedLeads unmatchedLeads = state.getOpenKeys();\r
@@ -117,29 +119,29 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        unmatchedLeads = UnmatchedLeads.NewInstance();\r
                }\r
                state.setUnmatchedLeads(unmatchedLeads);\r
-               \r
+\r
                TransactionStatus tx = startTransaction();\r
                unmatchedLeads.saveToSession(getPolytomousKeyNodeService());\r
-               \r
-               \r
+\r
+\r
                //TODO generally do not store the reference object in the config\r
                Reference sourceReference = state.getConfig().getSourceReference();\r
                getReferenceService().saveOrUpdate(sourceReference);\r
-               \r
+\r
                Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
                ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);\r
 \r
                Element elbody= getBodyElement(state.getConfig());\r
                List<Element> elTaxonList = elbody.getChildren();\r
-               \r
+\r
                int i = 0;\r
-               \r
+\r
                Set<String> unhandledTitleClassess = new HashSet<String>();\r
                Set<String> unhandledNomeclatureChildren = new HashSet<String>();\r
                Set<String> unhandledDescriptionChildren = new HashSet<String>();\r
-               \r
+\r
                Taxon lastTaxon = getLastTaxon(state);\r
-               \r
+\r
                //for each taxon\r
                for (Element elTaxon : elTaxonList){\r
                        try {\r
@@ -147,48 +149,48 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                if (! elTaxon.getName().equalsIgnoreCase("taxon")){\r
                                        logger.warn("body has element other than 'taxon'");\r
                                }\r
-                               \r
+\r
                                BotanicalName botanicalName = BotanicalName.NewInstance(Rank.SPECIES());\r
                                Taxon taxon = Taxon.NewInstance(botanicalName, state.getConfig().getSourceReference());\r
-                               \r
+\r
                                handleTaxonAttributes(elTaxon, taxon, state);\r
 \r
-                               \r
+\r
                                List<Element> children = elTaxon.getChildren();\r
                                handleTaxonElement(state, unhandledTitleClassess, unhandledNomeclatureChildren, unhandledDescriptionChildren, taxon, children);\r
                                handleTaxonRelation(state, taxon, lastTaxon);\r
                                lastTaxon = taxon;\r
                                taxaToSave.add(taxon);\r
                                state.getConfig().setLastTaxonUuid(lastTaxon.getUuid());\r
-                               \r
+\r
                        } catch (Exception e) {\r
                                logger.warn("Exception occurred in Sapindacea taxon import: " + e);\r
                                e.printStackTrace();\r
                        }\r
-                       \r
+\r
                }\r
-               \r
+\r
                System.out.println(state.getUnmatchedLeads().toString());\r
                logger.warn("There are taxa with attributes 'excluded' and 'dubious'");\r
-               \r
+\r
                logger.info("Children for nomenclature are: " + unhandledNomeclatureChildren);\r
                logger.info("Children for description are: " + unhandledDescriptionChildren);\r
                logger.info("Children for homotypes are: " + unhandledHomotypeChildren);\r
                logger.info("Children for nom are: " + unhandledNomChildren);\r
-               \r
-               \r
+\r
+\r
                //invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);\r
                logger.info(i + " taxa handled. Saving ...");\r
                getTaxonService().saveOrUpdate(taxaToSave);\r
                getFeatureTreeService().saveOrUpdateFeatureNodesAll(state.getFeatureNodesToSave());\r
                state.getFeatureNodesToSave().clear();\r
                commitTransaction(tx);\r
-               \r
+\r
                logger.info("end makeTaxa ...");\r
                logger.info("start makeKey ...");\r
 //             invokeDoKey(state);\r
                logger.info("end makeKey ...");\r
-               \r
+\r
                if (! success.getValue()){\r
                        state.setUnsuccessfull();\r
                }\r
@@ -233,23 +235,23 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
 //     private void invokeDoKey(SapindaceaeImportState state) {\r
 //             TransactionStatus tx = startTransaction();\r
-//             \r
+//\r
 //             Set<FeatureNode> nodesToSave = new HashSet<FeatureNode>();\r
 //             ITaxonService taxonService = getTaxonService();\r
 //             ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);\r
 //\r
 //             Element elbody= getBodyElement(state.getConfig());\r
 //             List<Element> elTaxonList = elbody.getChildren();\r
-//             \r
+//\r
 //             int i = 0;\r
-//             \r
+//\r
 //             //for each taxon\r
 //             for (Element elTaxon : elTaxonList){\r
 //                     if ((i++ % modCount) == 0 && i > 1){ logger.info("Taxa handled: " + (i-1));}\r
 //                     if (! elTaxon.getName().equalsIgnoreCase("taxon")){\r
 //                             continue;\r
 //                     }\r
-//                     \r
+//\r
 //                     List<Element> children = elTaxon.getChildren("key");\r
 //                     for (Element element : children){\r
 //                             handleKeys(state, element, null);\r
@@ -257,7 +259,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 //                     nodesToSave.add(taxon);\r
 //\r
 //             }\r
-//             \r
+//\r
 //     }\r
 \r
 \r
@@ -266,7 +268,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                AnnotatableEntity lastEntity = null;\r
                for (Element element : children){\r
                        String elName = element.getName();\r
-                       \r
+\r
                        if (elName.equalsIgnoreCase("title")){\r
                                handleTitle(state, element, taxon, unhandledTitleClassess);\r
                                lastEntity = null;\r
@@ -302,8 +304,8 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        }\r
                }\r
        }\r
-       \r
-       \r
+\r
+\r
        private void handleVernaculars(EfloraImportState state, Element elVernacular, Taxon taxon) {\r
                verifyNoAttribute(elVernacular);\r
                verifyNoChildren(elVernacular, false);\r
@@ -328,14 +330,14 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                if (matcher.find()){\r
                        String dialect = singleDialect.substring(matcher.start(), matcher.end());\r
                        dialect = dialect.replace("(dial. ", "").replace(")", "");\r
-                       \r
+\r
                        Language language = null;\r
                        try {\r
                                language = this.getLanguage(state, state.getTransformer().getLanguageUuid(dialect), dialect, dialect, dialect);\r
                        } catch (UndefinedTransformerMethodException e) {\r
                                logger.error(e.getMessage());\r
                        }\r
-                       \r
+\r
                        String commonNames = singleDialect.substring(0, matcher.start());\r
                        String[] splitNames = commonNames.split(",");\r
                        for (String commonNameString : splitNames){\r
@@ -352,12 +354,12 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
        private void handleReferences(EfloraImportState state, Element elReferences, Taxon taxon, AnnotatableEntity lastEntity) {\r
                verifyNoAttribute(elReferences);\r
                verifyNoChildren(elReferences, true);\r
-               String refString = elReferences.getTextNormalize(); \r
+               String refString = elReferences.getTextNormalize();\r
                if (lastEntity == null){\r
                        logger.warn("No last entity defined: " + refString);\r
                        return;\r
                }\r
-               \r
+\r
                Annotation annotation = Annotation.NewInstance(refString, AnnotationType.EDITORIAL(), Language.DEFAULT());\r
                lastEntity.addAnnotation(annotation);\r
        }\r
@@ -365,34 +367,34 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
        private PolytomousKey handleKeys(EfloraImportState state, Element elKey, Taxon taxon) {\r
                UnmatchedLeads openKeys = state.getUnmatchedLeads();\r
-               \r
+\r
                //title\r
                String title = makeKeyTitle(elKey);\r
-               \r
+\r
                //key\r
                PolytomousKey key = PolytomousKey.NewTitledInstance(title);\r
-               \r
+\r
                //TODO add covered taxa etc.\r
                verifyNoAttribute(elKey);\r
-               \r
+\r
                //notes\r
                makeKeyNotes(elKey, key);\r
-               \r
+\r
                //keycouplets\r
                List<Element> keychoices = new ArrayList<Element>();\r
                keychoices.addAll(elKey.getChildren("keycouplet"));\r
                keychoices.addAll(elKey.getChildren("keychoice"));\r
-               \r
-               \r
+\r
+\r
                for (Element elKeychoice : keychoices){\r
                        handleKeyChoices(state, openKeys, key, elKeychoice, taxon);\r
                        elKey.removeContent(elKeychoice);\r
                }\r
-               \r
+\r
                //\r
                verifyNoChildren(elKey);\r
                logger.info("Unmatched leads after key handling:" + openKeys.toString());\r
-               \r
+\r
 \r
                if (state.getConfig().isDoPrintKeys()){\r
                        key.print(System.err);\r
@@ -408,20 +410,20 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param openKeys\r
         * @param key\r
         * @param elKeychoice\r
-        * @param taxon \r
+        * @param taxon\r
         */\r
        private void handleKeyChoices(EfloraImportState state, UnmatchedLeads openKeys, PolytomousKey key, Element elKeychoice, Taxon taxon) {\r
-               \r
+\r
                //char Attribute\r
-               //TODO it's still unclear if char is a feature and needs to be a new attribute \r
+               //TODO it's still unclear if char is a feature and needs to be a new attribute\r
                //or if it is handled as question. Therefore both cases are handled but feature\r
                //is finally not yet set\r
                KeyStatement question = handleKeychoiceChar(state, elKeychoice);\r
                Feature feature = handleKeychoiceCharAsFeature(state, elKeychoice);\r
-               \r
+\r
                //lead\r
                List<PolytomousKeyNode> childNodes = handleKeychoiceLeads(state, key, elKeychoice, taxon, question, feature);\r
-               \r
+\r
                //num -> match with unmatched leads\r
                handleKeychoiceNum(openKeys, key, elKeychoice, childNodes);\r
 \r
@@ -452,7 +454,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                key.getRoot().addChild(childNode);\r
                        }\r
                }\r
-               \r
+\r
                elKeychoice.removeAttribute("num");\r
        }\r
 \r
@@ -493,7 +495,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                }\r
                return statement;\r
        }\r
-       \r
+\r
        /**\r
         * @param state\r
         * @param elKeychoice\r
@@ -517,19 +519,19 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                //needs to be discussed on model side\r
                node.setQuestion(question);\r
 //             node.setFeature(feature);\r
-               \r
+\r
                //text\r
                String text = handleLeadText(elLead, node);\r
-               \r
+\r
                //num\r
                handleLeadNum(elLead, text);\r
-               \r
+\r
                //goto\r
                handleLeadGoto(state, key, elLead, taxon, node);\r
-               \r
+\r
                //others\r
                verifyNoAttribute(elLead);\r
-               \r
+\r
                return node;\r
        }\r
 \r
@@ -608,11 +610,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                if (strGoto == null){\r
                        return "";\r
                }\r
-               String strGenusName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getGenusOrUninomial();\r
+               String strGenusName = taxon.getName().getGenusOrUninomial();\r
                strGoto = strGoto.replaceAll("\\([^\\(\\)]*\\)", "");  //replace all brackets\r
                strGoto = strGoto.replaceAll("\\s+", " "); //replace multiple whitespaces by exactly one whitespace\r
-               \r
-               strGoto = strGoto.trim();  \r
+\r
+               strGoto = strGoto.trim();\r
                String[] split = strGoto.split("\\s");\r
                for (int i = 0; i<split.length; i++){\r
                        String single = split[i];\r
@@ -620,7 +622,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                split[i] = strGenusName;\r
                        }\r
 //                     if (isInfraSpecificMarker(single)){\r
-//                             String strSpeciesName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getSpecificEpithet();\r
+//                             String strSpeciesName = taxon.getName().getSpecificEpithet();\r
 //                             split[i] = strGenusName + " " + strSpeciesName + " ";\r
 //                     }\r
                        result = (result + " " + split[i]).trim();\r
@@ -631,7 +633,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
        private boolean isInfraSpecificMarker(String single) {\r
                try {\r
-                       if (Rank.getRankByAbbreviation(single).isInfraSpecific()){\r
+                       if (Rank.getRankByIdInVoc(single).isInfraSpecific()){\r
                                return true;\r
                        }\r
                } catch (UnknownCdmTypeException e) {\r
@@ -645,7 +647,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                if (! single.matches("[A-Z]\\.?")) {\r
                        return false;\r
                }else if (single.length() == 0 || strGenusName == null || strGenusName.length() == 0){\r
-                       return false; \r
+                       return false;\r
                }else{\r
                        return single.charAt(0) == strGenusName.charAt(0);\r
                }\r
@@ -700,13 +702,13 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                String chromosomesPart = getChromosomesPart(value);\r
                String references = value.replace(chromosomesPart, "").trim();\r
                chromosomesPart = chromosomesPart.replace(":", "").trim();\r
-               return addDescriptionElement(state, taxon, chromosomesPart, chromosomeFeature, references);     \r
+               return addDescriptionElement(state, taxon, chromosomesPart, chromosomeFeature, references);\r
        }\r
 \r
 \r
        /**\r
-        * @param ref \r
-        * @param string \r
+        * @param ref\r
+        * @param string\r
         * @return\r
         */\r
        private void makeOriginalSourceReferences(ISourceable sourcable, String splitter, String refAll) {\r
@@ -715,10 +717,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        Reference ref = ReferenceFactory.newGeneric();\r
                        ref.setTitleCache(strRef, true);\r
                        String refDetail = parseReferenceYearAndDetail(ref);\r
-                       sourcable.addSource(null, null, ref, refDetail);\r
+                       sourcable.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, ref, refDetail);\r
                }\r
-               \r
-               \r
+\r
+\r
 //TODO use regex instead\r
 /*             String detailResult = null;\r
                String titleToParse = ref.getTitleCache();\r
@@ -727,7 +729,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                String reYear = "\\([1-2]{1}[0-9]{3}\\)";\r
                String reYearPeriod = reYear + "(-" + reYear + ")+";\r
                String reDetail = "\\.{1,10}$";\r
-*/             \r
+*/\r
        }\r
 \r
 \r
@@ -818,7 +820,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                value = replaceStart(value, "Uses");\r
                Feature feature = Feature.USES();\r
                return addDescriptionElement(state, taxon, value, feature, null);\r
-               \r
+\r
        }\r
 \r
 \r
@@ -895,11 +897,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param state\r
         * @param element\r
         * @param taxon\r
-        * @param unhandledNomeclatureChildren \r
+        * @param unhandledNomeclatureChildren\r
         */\r
        private void handleNomenclature(EfloraImportState state, Element elNomenclature, Taxon taxon, Set<String> unhandledChildren) {\r
                verifyNoAttribute(elNomenclature);\r
-               \r
+\r
                List<Element> elements = elNomenclature.getChildren();\r
                for (Element element : elements){\r
                        if (element.getName().equals("homotypes")){\r
@@ -910,7 +912,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                unhandledChildren.add(element.getName());\r
                        }\r
                }\r
-               \r
+\r
        }\r
 \r
 \r
@@ -933,7 +935,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         */\r
        private void handleHomotypes(EfloraImportState state, Element elHomotypes, Taxon taxon) {\r
                verifyNoAttribute(elHomotypes);\r
-               \r
+\r
                List<Element> elements = elHomotypes.getChildren();\r
                HomotypicalGroup homotypicalGroup = null;\r
                for (Element element : elements){\r
@@ -943,7 +945,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                unhandledHomotypeChildren.add(element.getName());\r
                        }\r
                }\r
-               \r
+\r
        }\r
 \r
        private static Set<String> unhandledNomChildren = new HashSet<String>();\r
@@ -955,7 +957,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         */\r
        private HomotypicalGroup handleNom(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup) {\r
                List<Attribute> attributes = elNom.getAttributes();\r
-               \r
+\r
                boolean taxonBaseClassType = false;\r
                for (Attribute attribute : attributes){\r
                        if (! attribute.getName().equalsIgnoreCase("class")){\r
@@ -973,10 +975,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                }else{\r
                                        logger.warn("Unhandled class value for nom: " + classValue);\r
                                }\r
-                               \r
+\r
                        }\r
                }\r
-               \r
+\r
                List<Element> elements = elNom.getChildren();\r
                for (Element element : elements){\r
                        if (element.getName().equals("name") || element.getName().equals("homonym") ){\r
@@ -987,22 +989,22 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                unhandledNomChildren.add(element.getName());\r
                        }\r
                }\r
-               \r
+\r
                return homotypicalGroup;\r
-               \r
+\r
        }\r
 \r
        /**\r
         * @param state\r
         * @param elNom\r
         * @param taxon\r
-        * @param homotypicalGroup \r
+        * @param homotypicalGroup\r
         */\r
        protected void handleTypeRef(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup) {\r
                verifyNoChildren(elNom);\r
                String typeRef = elNom.getTextNormalize();\r
                typeRef = removeStartingTypeRefMinus(typeRef);\r
-               \r
+\r
                String[] split = typeRef.split(":");\r
                if (split.length < 2){\r
                        logger.warn("typeRef has no ':' : " + typeRef);\r
@@ -1012,7 +1014,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        StringBuffer typeType = new StringBuffer(split[0]);\r
                        String typeText = split[1].trim();\r
                        TypeDesignationBase typeDesignation = getTypeDesignationAndReference(typeType);\r
-                       \r
+\r
                        //Name Type Desitnations\r
                        if (typeDesignation instanceof NameTypeDesignation){\r
                                makeNameTypeDesignations(typeType, typeText, typeDesignation);\r
@@ -1061,7 +1063,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                //clean\r
                typeText = cleanNameType(typeText);\r
                //create name\r
-               BotanicalName nameType = (BotanicalName)parser.parseFullName(typeText, NomenclaturalCode.ICBN, Rank.SPECIES());\r
+               BotanicalName nameType = (BotanicalName)parser.parseFullName(typeText, NomenclaturalCode.ICNAFP, Rank.SPECIES());\r
                ((NameTypeDesignation) typeDesignation).setTypeName(nameType);\r
                //TODO wie können NameTypes den Namen zugeordnet werden? -  wird aber vom Portal via NameCache matching gemacht\r
        }\r
@@ -1094,13 +1096,13 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                }else{\r
                        logger.warn("Unhandled type string: " + typeType);\r
                }\r
-               Specimen specimen = Specimen.NewInstance();\r
+               DerivedUnit specimen = DerivedUnit.NewPreservedSpecimenInstance();\r
                if (typeText.length() > 255){\r
                        specimen.setTitleCache(typeText.substring(0, 252) + "...", true);\r
                }else{\r
                        specimen.setTitleCache(typeText, true);\r
                }\r
-               specimen.addDefinition(typeText, Language.ENGLISH());\r
+               specimen.putDefinition(Language.ENGLISH(), typeText);\r
                ((SpecimenTypeDesignation) typeDesignation).setTypeSpecimen(specimen);\r
        }\r
 \r
@@ -1150,12 +1152,13 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         */\r
        //body/taxon/\r
        private HomotypicalGroup handleNomTaxon(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
-               NonViralName name = makeName(taxon, homotypicalGroup, isSynonym);\r
-               String num = null;\r
-               \r
+           INonViralName nvn = makeName(taxon, homotypicalGroup, isSynonym);\r
+           TaxonNameBase<?,?> name = TaxonNameBase.castAndDeproxy(nvn);\r
+           String num = null;\r
+\r
                boolean hasGenusInfo = false;\r
-               TeamOrPersonBase lastTeam = null;\r
-               \r
+               TeamOrPersonBase<?> lastTeam = null;\r
+\r
                //genus\r
                List<Element> elGenus = XmlHelp.getAttributedChildListWithValue(elNom, "name", "class", "genus");\r
                if (elGenus.size() > 0){\r
@@ -1167,11 +1170,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                List<Element> elInfraRank = XmlHelp.getAttributedChildListWithValue(elNom, "name", "class", "infrank");\r
                Rank infraRank = null;\r
                infraRank = handleInfRank(name, elInfraRank, infraRank);\r
-               \r
+\r
                //get left over elements\r
                List<Element> elements = elNom.getChildren();\r
                elements.removeAll(elInfraRank);\r
-               \r
+\r
                for (Element element : elements){\r
                        if (element.getName().equals("name")){\r
                                String classValue = element.getAttributeValue("class");\r
@@ -1228,11 +1231,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                unhandledNomChildren.add(element.getName());\r
                        }\r
                }\r
-               \r
+\r
                //handle key\r
                if (! isSynonym){\r
                        String taxonString = name.getNameCache();\r
-                       //try to find matching lead nodes \r
+                       //try to find matching lead nodes\r
                        UnmatchedLeadsKey leadsKey = UnmatchedLeadsKey.NewInstance(num, taxonString);\r
                        Set<PolytomousKeyNode> matchingNodes = handleMatchingNodes(state, taxon, leadsKey);\r
                        //same without using the num\r
@@ -1244,7 +1247,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                logger.warn("Taxon has num but no matching nodes exist: " + num+ ", Key: " + leadsKey.toString());\r
                        }\r
                }\r
-               \r
+\r
                //test nom element has no text\r
                if (StringUtils.isNotBlank(elNom.getTextNormalize().replace("—", "").replace("\u002d","").replace("\u2013", ""))){\r
                        String strElNom = elNom.getTextNormalize();\r
@@ -1255,26 +1258,26 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        //System.out.println(CharUtils.unicodeEscaped(c));\r
                        logger.warn("Nom tag has text: " + strElNom);\r
                }\r
-               \r
+\r
                return name.getHomotypicalGroup();\r
        }\r
 \r
 \r
-       private void handleQuestionMark(NonViralName name, Taxon taxon) {\r
+       private void handleQuestionMark(INonViralName name, Taxon taxon) {\r
                int count = name.getTaxonBases().size();\r
                if (count != 1){\r
                        logger.warn("Name has " + count + " taxa. This is not handled for question mark");\r
                }else{\r
-                       TaxonBase taxonBase = (TaxonBase)name.getTaxonBases().iterator().next();\r
+                       TaxonBase taxonBase = name.getTaxonBases().iterator().next();\r
                        taxonBase.setDoubtful(true);\r
                }\r
        }\r
 \r
 \r
-       //merge with handleNomTaxon     \r
-       private void handleHomonym(EfloraImportState state, Element elHomonym, NonViralName upperName) {\r
+       //merge with handleNomTaxon\r
+       private void handleHomonym(EfloraImportState state, Element elHomonym, TaxonNameBase upperName) {\r
                verifyNoAttribute(elHomonym);\r
-               \r
+\r
                //hommonym name\r
                BotanicalName homonymName = BotanicalName.NewInstance(upperName.getRank());\r
                homonymName.setGenusOrUninomial(upperName.getGenusOrUninomial());\r
@@ -1302,7 +1305,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        }\r
                }\r
                //TODO verify other information\r
-               \r
+\r
 \r
                //rel\r
                boolean homonymIsLater = false;\r
@@ -1324,7 +1327,6 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                }else{\r
                        upperName.addRelationshipToName(homonymName, relType, null);\r
                }\r
-               \r
        }\r
 \r
 \r
@@ -1345,7 +1347,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
        }\r
 \r
 \r
-       private void handleNameNote(NonViralName name, String value) {\r
+       private void handleNameNote(INonViralName name, String value) {\r
                logger.warn("Name note: " + value + ". Available in portal?");\r
                Annotation annotation = Annotation.NewInstance(value, AnnotationType.EDITORIAL(), Language.DEFAULT());\r
                name.addAnnotation(annotation);\r
@@ -1357,22 +1359,22 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param name\r
         * @param value\r
         */\r
-       protected TeamOrPersonBase handleNameUsage(Taxon taxon, NonViralName name, String referenceTitle, TeamOrPersonBase lastTeam) {\r
+       protected TeamOrPersonBase handleNameUsage(Taxon taxon, INonViralName name, String referenceTitle, TeamOrPersonBase lastTeam) {\r
                Reference ref = ReferenceFactory.newGeneric();\r
                referenceTitle = removeStartingSymbols(referenceTitle, ref);\r
-               \r
+\r
                ref.setTitleCache(referenceTitle, true);\r
                String microReference = parseReferenceYearAndDetail(ref);\r
-               TeamOrPersonBase team = getReferenceAuthor(ref);\r
+               TeamOrPersonBase<?> team = getReferenceAuthor(ref);\r
                parseReferenceType(ref);\r
                if (team == null){\r
                        team = lastTeam;\r
                }\r
-               ref.setAuthorTeam(team);\r
-               \r
+               ref.setAuthorship(team);\r
+\r
                TaxonDescription description = getDescription(taxon);\r
                TextData textData = TextData.NewInstance(Feature.CITATION());\r
-               textData.addSource(null, null, ref, microReference, name, null);\r
+               textData.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, ref, microReference, (TaxonNameBase)name, null);\r
                description.addElement(textData);\r
                return team;\r
        }\r
@@ -1403,7 +1405,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        ref.setType(ReferenceType.Book);\r
                        return;\r
                }\r
-               \r
+\r
                title = title.substring(3);\r
                //in reference\r
                //no ,\r
@@ -1429,11 +1431,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                logger.error("ERROR occurred when trying to split title: " +  title + "; split[0]: + " + split[0]);\r
                        }\r
                        book.setTitle(title);\r
-                       book.setAuthorTeam(bookTeam);\r
+                       book.setAuthorship(bookTeam);\r
                        book.setDatePublished(ref.getDatePublished());\r
                        ref.setTitle(null);\r
                        ref.setInBook(book);\r
-               }               \r
+               }\r
        }\r
 \r
 \r
@@ -1465,7 +1467,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        //no author is given\r
                        return null;\r
                }\r
-               \r
+\r
                //,-references\r
                split = (referenceTitle).split(",\\s*[A-Z]");\r
                if (split.length > 1){\r
@@ -1487,13 +1489,13 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param name\r
         * @return\r
         */\r
-       protected String parseHomonym(String detail, NonViralName name) {\r
+       protected String parseHomonym(String detail, TaxonNameBase name) {\r
                String result;\r
                if (detail == null){\r
                        return detail;\r
                }\r
 \r
-               \r
+\r
                //non RE\r
                String reNon = "(\\s|,)non\\s";\r
                Pattern patReference = Pattern.compile(reNon);\r
@@ -1501,17 +1503,17 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                if (matcher.find()){\r
                        int start = matcher.start();\r
                        int end = matcher.end();\r
-                       \r
+\r
                        if (detail != null){\r
                                logger.warn("Unhandled non part: " + detail.substring(start));\r
                                return detail;\r
                        }\r
-                       \r
+\r
                        result = detail.substring(0, start);\r
 \r
                        //homonym string\r
                        String homonymString = detail.substring(end);\r
-                       \r
+\r
                        //hommonym name\r
                        BotanicalName homonymName = BotanicalName.NewInstance(name.getRank());\r
                        homonymName.setGenusOrUninomial(name.getGenusOrUninomial());\r
@@ -1519,15 +1521,15 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        homonymName.setSpecificEpithet(name.getSpecificEpithet());\r
                        homonymName.setInfraSpecificEpithet(name.getInfraSpecificEpithet());\r
                        Reference homonymNomRef = ReferenceFactory.newGeneric();\r
-                       homonymNomRef.setTitleCache(homonymString);\r
+                       homonymNomRef.setTitleCache(homonymString, true);\r
                        String homonymNomRefDetail = parseReferenceYearAndDetail(homonymNomRef);\r
                        homonymName.setNomenclaturalMicroReference(homonymNomRefDetail);\r
                        String authorTitle = homonymNomRef.getTitleCache();\r
                        Team team = Team.NewTitledInstance(authorTitle, authorTitle);\r
-                       homonymNomRef.setAuthorTeam(team);\r
+                       homonymNomRef.setAuthorship(team);\r
                        homonymNomRef.setTitle("");\r
                        homonymNomRef.setProtectedTitleCache(false);\r
-                       \r
+\r
                        //rel\r
                        boolean homonymIsLater = false;\r
                        NameRelationshipType relType = NameRelationshipType.LATER_HOMONYM();\r
@@ -1543,7 +1545,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        }else{\r
                                name.addRelationshipToName(homonymName, relType, null);\r
                        }\r
-                       \r
+\r
                }else{\r
                        return detail;\r
                }\r
@@ -1556,7 +1558,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param name\r
         * @param value\r
         */\r
-       protected TeamOrPersonBase handleNomenclaturalReference(NonViralName name, String value) {\r
+       protected TeamOrPersonBase handleNomenclaturalReference(TaxonNameBase name, String value) {\r
                Reference nomRef = ReferenceFactory.newGeneric();\r
                nomRef.setTitleCache(value, true);\r
                parseNomStatus(nomRef, name);\r
@@ -1564,29 +1566,29 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                name.setNomenclaturalReference(nomRef);\r
                microReference = parseHomonym(microReference, name);\r
                name.setNomenclaturalMicroReference(microReference);\r
-               TeamOrPersonBase  team = (TeamOrPersonBase)name.getCombinationAuthorTeam();\r
+               TeamOrPersonBase<?> team = name.getCombinationAuthorship();\r
                if (team == null){\r
                        logger.warn("Name has nom. ref. but no author team. Name: " + name.getTitleCache() + ", Nom.Ref.: " + value);\r
                }else{\r
-                       nomRef.setAuthorTeam(team);\r
+                       nomRef.setAuthorship(team);\r
                }\r
                return team;\r
        }\r
 \r
-       private void handleInfrAuthor(EfloraImportState state, Element elAuthor, NonViralName name, boolean overwrite) {\r
+       private void handleInfrAuthor(EfloraImportState state, Element elAuthor, INonViralName name, boolean overwrite) {\r
                String strAuthor = elAuthor.getValue().trim();\r
                if (strAuthor.endsWith(",")){\r
                        strAuthor = strAuthor.substring(0, strAuthor.length() -1);\r
                }\r
                TeamOrPersonBase[] team = getTeam(strAuthor);\r
-               if (name.getCombinationAuthorTeam() != null && overwrite == false){\r
+               if (name.getCombinationAuthorship() != null && overwrite == false){\r
                        logger.warn("Try to write combination author for a name that already has a combination author. Neglected.");\r
                }else{\r
-                       name.setCombinationAuthorTeam(team[0]);\r
-                       name.setExCombinationAuthorTeam(team[1]);\r
+                       name.setCombinationAuthorship(team[0]);\r
+                       name.setExCombinationAuthorship(team[1]);\r
                }\r
-               \r
-               \r
+\r
+\r
        }\r
 \r
 \r
@@ -1598,14 +1600,14 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param infraRank\r
         * @return\r
         */\r
-       private Rank handleInfRank(NonViralName name, List<Element> elInfraRank, Rank infraRank) {\r
+       private Rank handleInfRank(INonViralName name, List<Element> elInfraRank, Rank infraRank) {\r
                if (elInfraRank.size() == 1){\r
                        String strRank = elInfraRank.get(0).getTextNormalize();\r
                        try {\r
-                               infraRank = Rank.getRankByNameOrAbbreviation(strRank);\r
+                               infraRank = Rank.getRankByNameOrIdInVoc(strRank);\r
                        } catch (UnknownCdmTypeException e) {\r
                                try{\r
-                                       infraRank = Rank.getRankByNameOrAbbreviation(strRank + ".");\r
+                                       infraRank = Rank.getRankByNameOrIdInVoc(strRank + ".");\r
                                } catch (UnknownCdmTypeException e2) {\r
                                        logger.warn("Unknown infrank " + strRank + ". Set infraRank to (null).");\r
                                }\r
@@ -1620,7 +1622,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
        }\r
 \r
 \r
-       private void handleInfrEpi(NonViralName name, Rank infraRank, String value) {\r
+       private void handleInfrEpi(INonViralName name, Rank infraRank, String value) {\r
                if (infraRank != null && infraRank.isInfraSpecific()){\r
                        name.setInfraSpecificEpithet(value);\r
                        if (CdmUtils.isCapital(value)){\r
@@ -1645,17 +1647,17 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param isSynonym\r
         * @return\r
         */\r
-       private NonViralName makeName(Taxon taxon,HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
-               NonViralName name;\r
+       private TaxonNameBase makeName(Taxon taxon,HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
+               TaxonNameBase<?,?> name;\r
                if (isSynonym){\r
                        name = BotanicalName.NewInstance(Rank.SPECIES(), homotypicalGroup);\r
-                       SynonymRelationshipType synonymType = SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF();\r
+                       SynonymType synonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();\r
                        if (taxon.getHomotypicGroup().equals(homotypicalGroup)){\r
-                               synonymType = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
+                               synonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();\r
                        }\r
                        taxon.addSynonymName(name, synonymType);\r
                }else{\r
-                       name = (NonViralName)taxon.getName();\r
+                       name = taxon.getName();\r
                }\r
                return name;\r
        }\r
@@ -1665,7 +1667,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param element\r
         * @param taxon\r
         */\r
-       private void handleInfraspecificEpithet(Element element, String attrValue, NonViralName name) {\r
+       private void handleInfraspecificEpithet(Element element, String attrValue, INonViralName name) {\r
                String value = element.getTextNormalize();\r
                if (value.indexOf("subsp.") != -1){\r
                        //TODO genus and species epi\r
@@ -1688,7 +1690,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param element\r
         * @param name\r
         */\r
-       private void handleBasionymAuthor(EfloraImportState state, Element elBasionymAuthor, NonViralName name, boolean overwrite) {\r
+       private void handleBasionymAuthor(EfloraImportState state, Element elBasionymAuthor, INonViralName name, boolean overwrite) {\r
                String strAuthor = elBasionymAuthor.getValue().trim();\r
                Pattern reBasionymAuthor = Pattern.compile("^\\(.*\\)$");\r
                if (reBasionymAuthor.matcher(strAuthor).matches()){\r
@@ -1697,23 +1699,23 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        logger.warn("Brackets are missing for original combination author " + strAuthor);\r
                }\r
                TeamOrPersonBase[] basionymTeam = getTeam(strAuthor);\r
-               if (name.getBasionymAuthorTeam() != null && overwrite == false){\r
+               if (name.getBasionymAuthorship() != null && overwrite == false){\r
                        logger.warn("Try to write basionym author for a name that already has a basionym author. Neglected.");\r
                }else{\r
-                       name.setBasionymAuthorTeam(basionymTeam[0]);\r
-                       name.setExBasionymAuthorTeam(basionymTeam[1]);\r
+                       name.setBasionymAuthorship(basionymTeam[0]);\r
+                       name.setExBasionymAuthorship(basionymTeam[1]);\r
 \r
                }\r
        }\r
 \r
-       private Map<String, UUID> teamMap = new HashMap<String, UUID>();\r
+       private final Map<String, UUID> teamMap = new HashMap<String, UUID>();\r
        /**\r
         * @param elAuthors\r
         * @param name\r
-        * @param elNom \r
+        * @param elNom\r
         */\r
-       private void handleNameAuthors(Element elAuthor, NonViralName name) {\r
-               if (name.getCombinationAuthorTeam() != null){\r
+       private void handleNameAuthors(Element elAuthor, INonViralName name) {\r
+               if (name.getCombinationAuthorship() != null){\r
                        logger.warn("Name already has a combination author. Name: " +  name.getTitleCache() + ", Author: " + elAuthor.getTextNormalize());\r
                }\r
                String strAuthor = elAuthor.getValue().trim();\r
@@ -1724,8 +1726,8 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        logger.warn("Author has brackets. Basionym authors should be handled in separate tags: " + strAuthor);\r
                }\r
                TeamOrPersonBase[] team = getTeam(strAuthor);\r
-               name.setCombinationAuthorTeam(team[0]);\r
-               name.setExCombinationAuthorTeam(team[1]);\r
+               name.setCombinationAuthorship(team[0]);\r
+               name.setExCombinationAuthorship(team[1]);\r
        }\r
 \r
 \r
@@ -1738,10 +1740,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                String[] split = strAuthor.split(" ex ");\r
                String strBaseAuthor = null;\r
                String strExAuthor = null;\r
-               \r
+\r
                if (split.length == 2){\r
-                       strBaseAuthor = split[1]; \r
-                       strExAuthor = split[0]; \r
+                       strBaseAuthor = split[1];\r
+                       strExAuthor = split[0];\r
                }else if (split.length == 1){\r
                        strBaseAuthor = split[0];\r
                }else{\r
@@ -1759,8 +1761,8 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                result[1].setTitleCache(strExAuthor, true);\r
                                teamMap.put(strExAuthor, result[1].getUuid());\r
                        }\r
-               \r
-               }       \r
+\r
+               }\r
                return result;\r
        }\r
 \r
@@ -1805,7 +1807,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
        private void handleDescription(EfloraImportState state, Element elDescription, Taxon taxon, Set<String> unhandledChildren) {\r
                verifyNoAttribute(elDescription);\r
-               \r
+\r
                List<Element> elements = elDescription.getChildren();\r
                for (Element element : elements){\r
                        if (element.getName().equalsIgnoreCase("char")){\r
@@ -1814,10 +1816,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                logger.warn("Unhandled description child: " + element.getName());\r
                        }\r
                }\r
-               \r
+\r
        }\r
-       \r
-       \r
+\r
+\r
        /**\r
         * @param state\r
         * @param element\r
@@ -1837,10 +1839,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                        String value = element.getValue();\r
                                        addDescriptionElement(state, taxon, value, feature, null);\r
                                }\r
-                               \r
+\r
                        }\r
                }\r
-               \r
+\r
                List<Element> elements = element.getChildren();\r
                if (! elements.isEmpty()){\r
                        logger.warn("Char has unhandled children");\r
@@ -1865,9 +1867,9 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
        /**\r
         * @param classValue\r
-        * @param state \r
+        * @param state\r
         * @return\r
-        * @throws UndefinedTransformerMethodException \r
+        * @throws UndefinedTransformerMethodException\r
         */\r
        private Feature getFeature(String classValue, EfloraImportState state) {\r
                UUID uuid;\r
@@ -1894,7 +1896,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
         * @param state\r
         * @param element\r
         * @param taxon\r
-        * @param unhandledTitleClassess \r
+        * @param unhandledTitleClassess\r
         */\r
        private void handleTitle(EfloraImportState state, Element element, Taxon taxon, Set<String> unhandledTitleClassess) {\r
                // attributes\r
@@ -1911,10 +1913,10 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                try {\r
                                        Rank rank;\r
                                        try {\r
-                                               rank = Rank.getRankByNameOrAbbreviation(classValue);\r
+                                               rank = Rank.getRankByNameOrIdInVoc(classValue);\r
                                        } catch (Exception e) {\r
                                                //TODO nc\r
-                                               rank = Rank.getRankByEnglishName(classValue, NomenclaturalCode.ICBN, false);\r
+                                               rank = Rank.getRankByEnglishName(classValue, NomenclaturalCode.ICNAFP, false);\r
                                        }\r
                                        taxon.getName().setRank(rank);\r
                                        if (rank.equals(Rank.FAMILY()) || rank.equals(Rank.GENUS())){\r
@@ -1945,60 +1947,60 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                UUID uuidTitle = EfloraTransformer.uuidTitle;\r
                ExtensionType titleExtension = this.getExtensionType(state, uuidTitle, "title", "title", "title");\r
                taxon.addExtension(element.getTextNormalize(), titleExtension);\r
-               \r
+\r
        }\r
 \r
 \r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
-       private void handleSubGenus(String value, TaxonNameBase taxonNameBase) {\r
+       private void handleSubGenus(String value, INonViralName taxonNameBase) {\r
                String name = value.replace("Subgenus", "").trim();\r
-               ((NonViralName)taxonNameBase).setInfraGenericEpithet(name);\r
+               taxonNameBase.setInfraGenericEpithet(name);\r
        }\r
-       \r
+\r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
-       private void handleSection(String value, TaxonNameBase taxonNameBase) {\r
+       private void handleSection(String value, INonViralName taxonNameBase) {\r
                String name = value.replace("Section", "").trim();\r
-               ((NonViralName)taxonNameBase).setInfraGenericEpithet(name);\r
+               taxonNameBase.setInfraGenericEpithet(name);\r
        }\r
-       \r
+\r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
        private void handleSpecies(String value, TaxonNameBase taxonNameBase) {\r
                //do nothing\r
        }\r
-       \r
+\r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
        private void handleVariety(String value, TaxonNameBase taxonNameBase) {\r
                //do nothing\r
        }\r
-       \r
+\r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
        private void handleSubSpecies(String value, TaxonNameBase taxonNameBase) {\r
                //do nothing\r
        }\r
 \r
-       \r
-       private Pattern rexGenusAuthor = Pattern.compile("(\\[|\\().*(\\]|\\))");\r
-       \r
+\r
+       private final Pattern rexGenusAuthor = Pattern.compile("(\\[|\\().*(\\]|\\))");\r
+\r
        /**\r
         * @param value\r
-        * @param taxonNameBase \r
+        * @param taxonNameBase\r
         */\r
-       protected void handleGenus(String value, TaxonNameBase taxonName) {\r
+       protected void handleGenus(String value, INonViralName taxonName) {\r
                Matcher matcher = rexGenusAuthor.matcher(value);\r
                if (matcher.find()){\r
                        String author = matcher.group();\r
@@ -2008,24 +2010,23 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        team.setTitleCache(author, true);\r
                        Credit credit = Credit.NewInstance(team, null);\r
                        taxonName.addCredit(credit);\r
-//                     NonViralName nvn = (NonViralName)taxonName;\r
-//                     nvn.setCombinationAuthorTeam(team);\r
-//                     nvn.setGenusOrUninomial(genus);\r
+//                     taxonName.setCombinationAuthorship(team);\r
+//                     taxonName.setGenusOrUninomial(genus);\r
                }else{\r
                        logger.info("No Author match for " + value);\r
                }\r
        }\r
-       \r
+\r
 \r
        /**\r
         * @param taxon\r
         * @param lastTaxon\r
         */\r
        private void handleTaxonRelation(EfloraImportState state, Taxon taxon, Taxon lastTaxon) {\r
-               \r
+\r
                Classification tree = getTree(state);\r
                if (lastTaxon == null){\r
-                       tree.addChildTaxon(taxon, null, null, null);\r
+                       tree.addChildTaxon(taxon, null, null);\r
                        return;\r
                }\r
                Rank thisRank = taxon.getName().getRank();\r
@@ -2033,15 +2034,15 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                if (lastTaxon.getTaxonNodes().size() > 0){\r
                        TaxonNode lastNode = lastTaxon.getTaxonNodes().iterator().next();\r
                        if (thisRank.isLower(lastRank )  ){\r
-                               lastNode.addChildTaxon(taxon, null, null, null);\r
+                               lastNode.addChildTaxon(taxon, null, null);\r
                                fillMissingEpithetsForTaxa(lastTaxon, taxon);\r
                        }else if (thisRank.equals(lastRank)){\r
                                TaxonNode parent = lastNode.getParent();\r
                                if (parent != null){\r
-                                       parent.addChildTaxon(taxon, null, null, null);\r
+                                       parent.addChildTaxon(taxon, null, null);\r
                                        fillMissingEpithetsForTaxa(parent.getTaxon(), taxon);\r
                                }else{\r
-                                       tree.addChildTaxon(taxon, null, null, null);\r
+                                       tree.addChildTaxon(taxon, null, null);\r
                                }\r
                        }else if (thisRank.isHigher(lastRank)){\r
                                handleTaxonRelation(state, taxon, lastNode.getParent().getTaxon());\r
@@ -2057,7 +2058,7 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
        /**\r
         * @param state\r
-        * @return \r
+        * @return\r
         */\r
        private Classification getTree(EfloraImportState state) {\r
                Classification result = state.getTree(null);\r
@@ -2088,11 +2089,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
 \r
 \r
        /**\r
-        * @param state \r
+        * @param state\r
         * @param taxon\r
         * @param value\r
         * @param feature\r
-        * @return \r
+        * @return\r
         */\r
        private TextData addDescriptionElement(EfloraImportState state, Taxon taxon, String value, Feature feature, String references) {\r
                TextData textData = TextData.NewInstance(feature);\r
@@ -2133,14 +2134,14 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        logger.warn(element.getName() + " has unhandled attributes: " + attributes.get(0).getValue() + "..." );\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * @param elNomenclature\r
         */\r
        protected void verifyNoChildren(Element element) {\r
                verifyNoChildren(element, false);\r
        }\r
-       \r
+\r
        /**\r
         * @param elNomenclature\r
         */\r
@@ -2158,26 +2159,26 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        }\r
                }\r
        }\r
-       \r
-       \r
+\r
+\r
 \r
        /**\r
         * Parses the nomenclatural status from the references titleCache. If a nomenclatural status\r
-        * exists it is added to the name and the nom. status part of the references title cache is \r
+        * exists it is added to the name and the nom. status part of the references title cache is\r
         * removed. Requires protected title cache.\r
         * @param ref\r
         * @param nonViralName\r
         */\r
-       protected void parseNomStatus(Reference ref, NonViralName nonViralName) {\r
+       protected void parseNomStatus(Reference ref, TaxonNameBase nonViralName) {\r
                String titleToParse = ref.getTitleCache();\r
-               \r
+\r
                String noStatusTitle = parser.parseNomStatus(titleToParse, nonViralName, true);\r
                if (! noStatusTitle.equals(titleToParse)){\r
                        ref.setTitleCache(noStatusTitle, true);\r
                }\r
        }\r
 \r
-       \r
+\r
        /**\r
         * Extracts the date published part and returns micro reference\r
         * @param ref\r
@@ -2192,22 +2193,22 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                String oneMonth = "(Feb.|Dec.|March|June|July)";\r
                String reYear = oneMonth + "?\\s?[1-2]\\s?[0-9]\\s?[0-9]\\s?[0-9]\\s?";\r
                String secondYear = "(\\s?[1-2]\\s?[0-9])?\\s?[0-9]\\s?[0-9]\\s?";\r
-               \r
+\r
                String reYearPeriod = "\\(" + reYear + "(\\-" + secondYear + ")?\\)";\r
                String reDetail = "\\.{1,10}$";\r
-               \r
+\r
                //pattern for the whole string\r
                Pattern patReference = Pattern.compile(/*reReference +*/ reYearPeriod /*+ reDetail */);\r
                Matcher matcher = patReference.matcher(titleToParse);\r
                if (matcher.find()){\r
                        int start = matcher.start();\r
                        int end = matcher.end();\r
-                       \r
+\r
                        //title and other information precedes the year part\r
                        String title = titleToParse.substring(0, start).trim();\r
                        //detail follows the year part\r
                        String detail = titleToParse.substring(end).trim();\r
-                       \r
+\r
                        //time period\r
                        String strPeriod = matcher.group().trim();\r
                        strPeriod = strPeriod.substring(1, strPeriod.length()-1);   //remove brackets\r
@@ -2220,8 +2221,8 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                                strPeriod = strPeriod.substring(0, end) + " " + strPeriod.substring(end);\r
                                startMonth = getMonth(strPeriod.substring(0, end));\r
                        }\r
-                       \r
-                       TimePeriod datePublished = TimePeriod.parseString(strPeriod);\r
+\r
+                       TimePeriod datePublished = TimePeriodParser.parseString(strPeriod);\r
                        if (startMonth != null){\r
                                datePublished.setStartMonth(startMonth);\r
                        }\r
@@ -2236,11 +2237,11 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
                        logger.warn("Could not parse reference: " +  titleToParse);\r
                }\r
                return detailResult;\r
-               \r
+\r
        }\r
 \r
-       \r
-       \r
+\r
+\r
        private Integer getMonth(String month) {\r
                if (month.startsWith("Jan")){\r
                        return 1;\r
@@ -2276,7 +2277,8 @@ public class EfloraTaxonImport  extends EfloraImportBase implements ICdmIO<Eflor
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
         */\r
-       protected boolean isIgnore(EfloraImportState state){\r
+       @Override\r
+    protected boolean isIgnore(EfloraImportState state){\r
                return ! state.getConfig().isDoTaxa();\r
        }\r
 \r