update for FdAC ferns import (include types etc.)
authorAndreas Müller <a.mueller@bgbm.org>
Mon, 31 Jan 2011 10:55:47 +0000 (10:55 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Mon, 31 Jan 2011 10:55:47 +0000 (10:55 +0000)
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsImportConfigurator.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
cdmlib-eflora/src/main/java/eu/etaxonomy/cdm/io/eflora/centralAfrica/ferns/CentralAfricaFernsTransformer.java

index 7b989cf3a7318f0ae5cfb3d7c9e07eb466d71b80..a95a083b73f3543e051c1328a038fa46df9d2f5f 100644 (file)
@@ -80,9 +80,8 @@ public class CentralAfricaFernsImportConfigurator extends ImportConfiguratorBase
         * @see eu.etaxonomy.cdm.io.tcsrdf.IImportConfigurator#getSourceReference()\r
         */\r
        public Reference getSourceReference() {\r
-               ReferenceFactory refFactory = ReferenceFactory.newInstance();\r
                if (sourceReference == null){\r
-                       sourceReference =  refFactory.newDatabase();\r
+                       sourceReference =  ReferenceFactory.newDatabase();\r
                        if (getSource() != null){\r
                                sourceReference.setTitleCache(getSource().getDatabase(), true);\r
                        }\r
index 3459d0f44012ea92c3d768408b7ba6a4b9c25209..bd7c6445f9c9dbeeb8a99541846c3ee7a4121512 100644 (file)
@@ -19,6 +19,7 @@ import eu.etaxonomy.cdm.io.common.DbImportStateBase;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 \r
 /**\r
  * @author a.mueller\r
@@ -34,6 +35,7 @@ public class CentralAfricaFernsImportState extends DbImportStateBase<CentralAfri
        Map<String, User> usernameMap = new HashMap<String, User>();\r
 \r
        private String taxonNumber;\r
+       private Rank currentRank;\r
        \r
        \r
        /* (non-Javadoc)\r
@@ -79,6 +81,14 @@ public class CentralAfricaFernsImportState extends DbImportStateBase<CentralAfri
                return taxonNumber;\r
        }\r
 \r
+       public void setCurrentRank(Rank currentRank) {\r
+               this.currentRank = currentRank;\r
+       }\r
+\r
+       public Rank getCurrentRank() {\r
+               return currentRank;\r
+       }\r
+\r
  \r
     \r
 }\r
index 8829804e08a8baa9a4c7ce24f8a8de1924041778..f173a6eef51bd18ed541c02b3ecbfb9ce0a05d0b 100644 (file)
@@ -11,8 +11,10 @@ package eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns;
 \r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
+import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
 import java.util.UUID;\r
@@ -25,9 +27,11 @@ import org.springframework.stereotype.Component;
 \r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;\r
+import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;\r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportAnnotationMapper;\r
+import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;\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
@@ -40,29 +44,30 @@ import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.ExtensionType;\r
-import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.TimePeriod;\r
-import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
-import eu.etaxonomy.cdm.model.description.Distribution;\r
-import eu.etaxonomy.cdm.model.description.Feature;\r
-import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
-import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
-import eu.etaxonomy.cdm.model.description.TextData;\r
-import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.location.NamedAreaLevel;\r
-import eu.etaxonomy.cdm.model.location.NamedAreaType;\r
-import eu.etaxonomy.cdm.model.location.TdwgArea;\r
-import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\r
+import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\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.Collection;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;\r
+import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
+import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
 \r
 \r
 /**\r
@@ -93,7 +98,7 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
        \r
 \r
        /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getIdQuery()\r
+        * @see eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns.CentralAfricaFernsImportBase#getIdQuery()\r
         */\r
        @Override\r
        protected String getIdQuery() {\r
@@ -103,7 +108,7 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 \r
 \r
        /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getMapping()\r
+        * @see eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns.CentralAfricaFernsImportBase#getMapping()\r
         */\r
        protected DbImportMapping getMapping() {\r
                if (mapping == null){\r
@@ -111,14 +116,15 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                        \r
                        mapping.addMapper(DbImportObjectCreationMapper.NewInstance(this, "Taxon number", TAXON_NAMESPACE)); //id + tu_status\r
 \r
-//                     mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeTypes", ResultSet.class, TaxonBase.class, CentralAfricaFernsImportState.class));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapTypes", ResultSet.class, CentralAfricaFernsImportState.class));\r
                        mapping.addMapper(DbImportAnnotationMapper.NewInstance("Notes", AnnotationType.EDITORIAL()));\r
 \r
-                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeCommonName", ResultSet.class, CentralAfricaFernsImportState.class));\r
-                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeReferences", ResultSet.class, CentralAfricaFernsImportState.class));\r
-                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeEcology", ResultSet.class, CentralAfricaFernsImportState.class));\r
-                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "makeDistribution", ResultSet.class, CentralAfricaFernsImportState.class ));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapReferences", ResultSet.class, CentralAfricaFernsImportState.class));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapNomRemarks", ResultSet.class, CentralAfricaFernsImportState.class));\r
                        \r
+                       mapping.addMapper(DbImportExtensionMapper.NewInstance("Illustrations - non-original", CentralAfricaFernsTransformer.uuidIllustrationsNonOriginal, "Illustrations - non-original", "Illustrations - non-original", null));\r
+\r
+//                     mapping.addMapper(DbImportTextDataCreationMapper.NewInstance("Illustrations - non-original", objectToCreateNamespace, dbTaxonFkAttribute, this.TAXON_NAMESPACE, "Illustrations - non-original", Language.ENGLISH(), Feature, null);\r
 //                     mapping.addMapper(DbImportTextDataCreationMapper.NewInstance(dbIdAttribute, objectToCreateNamespace, dbTaxonFkAttribute, taxonNamespace, dbTextAttribute, Language.ENGLISH(), Feature.ECOLOGY(), null));\r
 \r
                        //not yet implemented or ignore\r
@@ -130,16 +136,11 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                        \r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Chromosome number" , "Wrong data. Seems to be 'reference full'"));\r
                        \r
-                       mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Book / Paper title" , "Needs implementation. Inreferences?"));\r
-                       \r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Book Publisher & Place" , "How to access the reference via String mapper?"));\r
-                               \r
-                       mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Nom remarks" , "Needs parsing for status, homonyms etc., the rest goes to a name annotation"));\r
                        \r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Reprint no" , "What's this?"));\r
                        mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Date verified" , "Needed?"));\r
                        \r
-                       mapping.addMapper(DbNotYetImplementedMapper.NewInstance("Illustrations - non-original" , "What's this?"));\r
                        \r
 //                     \r
 //                     UUID credibilityUuid = ErmsTransformer.uuidCredibility;\r
@@ -198,251 +199,437 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                return result;\r
        }\r
        \r
-       private TaxonBase makeTypes(ResultSet rs, TaxonBase taxonBase, CentralAfricaFernsImportState state) throws SQLException{\r
+       private TaxonBase mapTypes(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
                TaxonNameBase name = taxonBase.getName();\r
-               String typeString = rs.getString("Type");\r
-               String typeCollectorString = rs.getString("Type collector and number");\r
-               String typeLocationString = rs.getString("Type location");\r
-               makeSingleType(name, typeString, typeCollectorString, typeLocationString);\r
+               for (int i = 1; i <= 5; i++){\r
+                       String[] typeInfo = new String[3];\r
+                       typeInfo = getTypeInfo(rs, i);\r
+                       if (StringUtils.isBlank(typeInfo[0]) && StringUtils.isBlank(typeInfo[1]) && StringUtils.isBlank(typeInfo[2])){\r
+                               continue;\r
+                       }\r
+                       makeSingleType(state, name, typeInfo[0], typeInfo[1], typeInfo[2]);\r
+               }\r
                return taxonBase;\r
        }\r
        \r
        \r
-       private void makeSingleType(TaxonNameBase name, String typeString, String typeCollectorString, String typeLocationString) {\r
-               DerivedUnitFacade type = DerivedUnitFacade.NewInstance(DerivedUnitType.Specimen);\r
-               makeTypeCollectorInfo(type, typeCollectorString);\r
-               type.setLocality(typeString);\r
-               //TODO\r
-//             type.addDuplicate(duplicateSpecimen);\r
-               //FIXME handle also NameTypeDesignations\r
-               SpecimenTypeDesignation designation = SpecimenTypeDesignation.NewInstance();\r
-               designation.setTypeSpecimen(type.innerDerivedUnit());\r
-               name.addTypeDesignation(designation, false);\r
+       private String[] getTypeInfo(ResultSet rs, int i) throws SQLException {\r
+               String[] typeInfo = new String[3];\r
+               String number;\r
+               if (i == 1){\r
+                       number = "";\r
+               }else{\r
+                       number = String.valueOf(i);\r
+               }\r
+               typeInfo[0] = rs.getString("Type" + number);\r
+               typeInfo[1] = rs.getString("Type collector and number" + number);\r
+               typeInfo[2] = rs.getString("Type location" + number);\r
+               \r
+               return typeInfo;\r
        }\r
 \r
 \r
 \r
-       private void makeTypeCollectorInfo(DerivedUnitFacade type, String collectorAndNumberString) {\r
-               String reNumber = "(s\\.n\\.|\\d.*)";\r
-               Pattern reNumberPattern = Pattern.compile(reNumber);\r
-               Matcher matcher = reNumberPattern.matcher(collectorAndNumberString);\r
-               \r
-               if ( matcher.find()){\r
-                       int numberStart = matcher.start();\r
-                       String number = collectorAndNumberString.substring(numberStart).trim();\r
-                       String collectorString = collectorAndNumberString.substring(0, numberStart -1).trim();\r
-                       type.setCollectorsNumber(number);\r
-                       Team team = Team.NewTitledInstance(collectorString, collectorString);\r
-                       type.setCollector(team);\r
-                       \r
+       private void makeSingleType(CentralAfricaFernsImportState state, TaxonNameBase name, String typeString, String typeCollectorString, String typeLocationString) {\r
+               if (name.getRank().isHigher(Rank.SPECIES())){\r
+                       //TODO move to TaxonRelationImport\r
+                       handleNameType(state, name, typeString, typeCollectorString, typeLocationString);\r
                }else{\r
-                       logger.warn("collector string did not match number pattern: " + collectorAndNumberString);\r
-                       \r
+                       handleSpecimenType(state, name, typeString, typeCollectorString, typeLocationString);\r
                }\r
        }\r
 \r
-       /**\r
-        * for internal use only, used by MethodMapper\r
-        */\r
-       private TaxonBase makeDistribution(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
-               try {\r
-                       String taxonNumber = state.getTaxonNumber();\r
-//                     logger.info(taxonNumber);\r
-                       TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
-                       String countriesString = rs.getString("Distribution - Country");\r
-                       String province = rs.getString("Distribution - Province");\r
-                       String distributionDetailed = rs.getString("Distribution - detailed");\r
-                       TaxonNameBase nameUsedInSource = taxonBase.getName();\r
-                       Taxon taxon;\r
-                       if (taxonBase.isInstanceOf(Taxon.class)){\r
-                               taxon = CdmBase.deproxy(taxonBase, Taxon.class);\r
-                       }else{\r
-                               logger.warn("Distributions for synonyms not yet supported");\r
-                               taxon = Taxon.NewInstance(null, null); \r
+\r
+\r
+       private void handleSpecimenType(CentralAfricaFernsImportState state, TaxonNameBase name, String typeString, String typeCollectorString, String typeLocationString) {\r
+               List<SpecimenTypeDesignation> designations = new ArrayList<SpecimenTypeDesignation>();\r
+               typeLocationString = CdmUtils.Nz(typeLocationString);\r
+               if (typeLocationString.equalsIgnoreCase("not located")){\r
+                       \r
+               }else{\r
+                       String[] splits = typeLocationString.split(";");\r
+                       for (String split : splits){\r
+                               List<SpecimenTypeDesignation> splitDesignations = handleTypeLocationPart(state, typeString, typeCollectorString, split);\r
+                               designations.addAll(splitDesignations);\r
+                       }\r
+               }\r
+               if (designations.size() == 0){\r
+                       logger.error(state.getTaxonNumber() + " - No designations defined. TypeString: " + CdmUtils.Nz(typeString) + ", CollectorString: " + typeCollectorString);\r
+               }\r
+               //type and collector\r
+               DerivedUnitFacade lastFacade = null;\r
+               for (SpecimenTypeDesignation designation: designations){\r
+                       name.addTypeDesignation(designation, false);\r
+                       if (typeString != null && (typeString.contains("Not designated.")|| typeString.contains("No type designated."))){\r
+                               designation.setNotDesignated(true);\r
                        }\r
 \r
-                       if (StringUtils.isNotBlank(countriesString) ){\r
-                               makeCountries(state, taxonNumber, taxon, nameUsedInSource, countriesString, province, distributionDetailed);\r
+                       DerivedUnitBase specimen = designation.getTypeSpecimen();\r
+\r
+                       if (lastFacade != null){\r
+                               lastFacade.addDuplicate(specimen);\r
+                       }else{\r
+\r
+                               try {\r
+                                       lastFacade = DerivedUnitFacade.NewInstance(specimen);\r
+                               } catch (DerivedUnitFacadeNotSupportedException e) {\r
+                                       throw new RuntimeException(e);\r
+                               }\r
+                               \r
+                               //TODO not so nice\r
+                               lastFacade.setLocality(typeString);\r
+                               makeTypeCollectorInfo(lastFacade, typeCollectorString);\r
+                               \r
                        }\r
-                       makeProvince(taxon, province);\r
-                       makeDistributionDetailed(taxon, distributionDetailed);\r
+               }\r
+                       \r
+       }\r
 \r
-                       return taxonBase;\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       return null;\r
+\r
+\r
+       private List<SpecimenTypeDesignation> handleTypeLocationPart(CentralAfricaFernsImportState state, \r
+                               String typeString, String typeCollectorString, String typeLocationPart) {\r
+               List<SpecimenTypeDesignation> result = new ArrayList<SpecimenTypeDesignation>();\r
+               String[] splits = typeLocationPart.split(","); \r
+               String typeTypePattern = "(holo.|lecto.|iso.|isolecto.|syn.|isosyn.|neo.|isoneo.)";\r
+               String collectionPattern = "^[A-Z]+(\\-[A-Z]+)?";\r
+               String numberPattern = "([0-9]+([\\-\\s\\.\\/][0-9]+)?)?";\r
+               String addInfoPattern = "[!\\+\\?]?";\r
+               String typeCollectionPattern = collectionPattern + "\\s?" + numberPattern + addInfoPattern;\r
+               SpecimenTypeDesignation lastDesignation = null;\r
+               \r
+               for (String split: splits){\r
+                       split = split.trim();\r
+                       if (StringUtils.isBlank(split)){\r
+                               continue;\r
+                       }else if(split.trim().startsWith("designated by")){\r
+                               split = handleDesignatedBy(lastDesignation, split);\r
+                       }else if (split.trim().matches(typeTypePattern)){\r
+                               makeSpecimentTypeStatus(lastDesignation, split);\r
+                       }else if(split.matches(typeCollectionPattern)){\r
+                               \r
+                               lastDesignation = makeSpecimenTypeCollection(lastDesignation, split, collectionPattern, numberPattern, addInfoPattern);\r
+                       }else if(split.equalsIgnoreCase("not located")){\r
+                               lastDesignation = makeCachedSpecimenDesignation(split);\r
+                       }else{\r
+                               logger.error(state.getTaxonNumber() + " - Unknown type location part: " +  split);\r
+                               if (lastDesignation == null){\r
+                                       lastDesignation = makeCachedSpecimenDesignation(split);\r
+                               }\r
+                       }\r
+                       if (lastDesignation != null && ! result.contains(lastDesignation)){\r
+                               result.add(lastDesignation);\r
+                       }else if (lastDesignation == null){\r
+                               logger.warn("Last Designation is null");\r
+                       }\r
                }\r
+               \r
+               return result;\r
        }\r
 \r
 \r
 \r
        /**\r
-        * @param state\r
-        * @param taxonNumber\r
-        * @param taxonBase\r
-        * @param countriesString\r
+        * @param split\r
+        * @return\r
         */\r
-       private void makeCountries(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String countriesString, String province, String distributionDetailed) {\r
-               countriesString = countriesString.replaceAll("\\*", "");  \r
-               countriesString = countriesString.replace("  ", " ");\r
-               countriesString = countriesString.replace(", endemic", " - endemic");\r
-               countriesString = countriesString.replace("(endemic)", " - endemic");\r
-               countriesString = countriesString.replace("(introduced)", " - introduced");\r
-               countriesString = countriesString.replace("(naturalised)", " - naturalised");\r
-               countriesString = countriesString.replace("Madagascar-", "Madagascar -");\r
-               countriesString = countriesString.replace("Mahé", "Mahe");\r
-                \r
-               String[] split = countriesString.split("[,;]");\r
-               String remainingString = null;\r
-               for (String countryString : split){\r
-                       countryString = CdmUtils.concat(", ", remainingString , countryString);\r
-                       if (countryString.matches(".*\\(.*") && ! countryString.matches(".*\\).*")){\r
-                               remainingString = countryString;\r
-                               continue;\r
+       private SpecimenTypeDesignation makeCachedSpecimenDesignation(String split) {\r
+               SpecimenTypeDesignation lastDesignation;\r
+               lastDesignation = SpecimenTypeDesignation.NewInstance();\r
+               Specimen specimen = Specimen.NewInstance();\r
+               specimen.setTitleCache(split, true);\r
+               lastDesignation.setTypeSpecimen(specimen);\r
+               return lastDesignation;\r
+       }\r
+\r
+\r
+\r
+       private SpecimenTypeDesignation makeSpecimenTypeCollection(SpecimenTypeDesignation designation, String collectionString, String strCollectionPattern, String strNumberPattern, String strAddInfoPattern) {\r
+               SpecimenTypeDesignation result = SpecimenTypeDesignation.NewInstance();\r
+               Specimen specimen = Specimen.NewInstance();\r
+               result.setTypeSpecimen(specimen);\r
+               \r
+               //collection\r
+               Pattern collectionPattern = Pattern.compile(strCollectionPattern);\r
+               Matcher matcher = collectionPattern.matcher(collectionString);\r
+               if (! matcher.find()){\r
+                       throw new RuntimeException("collectionString doesn't match: " + collectionString);\r
+               }\r
+               String strCollection = matcher.group();\r
+               Collection collection = getCollection(strCollection);\r
+               specimen.setCollection(collection);\r
+               collectionString = collectionString.substring(strCollection.length()).trim();\r
+               \r
+               \r
+               //collection number\r
+               Pattern numberPattern = Pattern.compile(strNumberPattern);\r
+               matcher = numberPattern.matcher(collectionString);\r
+               if (matcher.find()){\r
+                       String strNumber = matcher.group();\r
+                       collectionString = collectionString.substring(strNumber.length()).trim();\r
+                       if (StringUtils.isNotBlank(strNumber)){\r
+                               specimen.setCatalogNumber(strNumber);\r
                        }\r
-                       remainingString = null;\r
-                       try {\r
-                               makeSingleCountry(state, taxonNumber, taxon, nameUsedInSource, countryString.trim());\r
-                       } catch (UndefinedTransformerMethodException e) {\r
-                               e.printStackTrace();\r
+               }else{\r
+                       //throw new RuntimeException("numberString doesn't match: " + collectionString);\r
+               }\r
+               \r
+               //additional info\r
+               Pattern addInfoPattern = Pattern.compile(strAddInfoPattern);\r
+               matcher = addInfoPattern.matcher(collectionString);\r
+               if (matcher.find()){\r
+                       String strAddInfo = matcher.group();\r
+                       collectionString = collectionString.substring(strAddInfo.length()).trim();\r
+                       if (StringUtils.isBlank(strAddInfo)){\r
+                               //do nothing\r
+                       }else if (strAddInfo.equals("!")){\r
+                               //TODO add seen by author\r
+                       }else if (strAddInfo.equals("?")){\r
+                               //TODO add doubtful\r
+                       }else if (strAddInfo.equals("+")){\r
+                               //TODO add +\r
                        }\r
+               }else{\r
+                       //throw new RuntimeException("addInfoString doesn't match: " + collectionString);\r
                }\r
-       }\r
-       \r
-       private void makeDistributionDetailed(Taxon taxon, String distributionDetailed) {\r
-               if (StringUtils.isNotBlank(distributionDetailed)){\r
-                       TaxonDescription description = getTaxonDescription(taxon, false, true);\r
-                       TextData distribution = TextData.NewInstance(Feature.DISTRIBUTION());\r
-                       description.addElement(distribution);\r
-                       distribution.putText(distributionDetailed, Language.ENGLISH());\r
+               if (StringUtils.isNotBlank(collectionString)){\r
+                       logger.error("Collection string is not empty: " + collectionString );\r
                }\r
+               return result;\r
        }\r
-       \r
-       private void makeProvince(Taxon taxon, String province) {\r
-               if (StringUtils.isNotBlank(province)){\r
-                       TaxonDescription description = getTaxonDescription(taxon, false, true);\r
-                       TextData distribution = TextData.NewInstance(Feature.DISTRIBUTION());\r
-                       description.addElement(distribution);\r
-                       distribution.putText(province, Language.ENGLISH());\r
+\r
+\r
+\r
+       private Collection getCollection(String strCollection) {\r
+               //TODO use BCI and deduplication\r
+               Collection result = Collection.NewInstance();\r
+               return result;\r
+       }\r
+\r
+\r
+\r
+       private void makeSpecimentTypeStatus(SpecimenTypeDesignation designation, String type) {\r
+               SpecimenTypeDesignationStatus status; \r
+               if (type.equalsIgnoreCase("iso.")){\r
+                       status = SpecimenTypeDesignationStatus.ISOTYPE();\r
+               }else if (type.equalsIgnoreCase("isolecto.")){\r
+                       status = SpecimenTypeDesignationStatus.ISOLECTOTYPE();\r
+               }else if (type.equalsIgnoreCase("syn.")){\r
+                       status = SpecimenTypeDesignationStatus.SYNTYPE();\r
+               }else if (type.equalsIgnoreCase("holo.")){\r
+                       status = SpecimenTypeDesignationStatus.HOLOTYPE();\r
+               }else if (type.equalsIgnoreCase("lecto.")){\r
+                       status = SpecimenTypeDesignationStatus.LECTOTYPE();\r
+               }else if (type.equalsIgnoreCase("isosyn.")){\r
+                       status = SpecimenTypeDesignationStatus.ISOSYNTYPE();\r
+               }else if (type.equalsIgnoreCase("neo.")){\r
+                       status = SpecimenTypeDesignationStatus.NEOTYPE();\r
+               }else if (type.equalsIgnoreCase("isoneo.")){\r
+                       status = SpecimenTypeDesignationStatus.ISONEOTYPE();\r
+               }else{\r
+                       logger.error("Type Status not supported: " + type);\r
+                       throw new RuntimeException("Type Status not supported: " + type);\r
+               }\r
+               if (designation == null){\r
+                       logger.error("Designation is null");\r
+               }else{\r
+                       designation.setTypeStatus(status);\r
                }\r
        }\r
 \r
 \r
 \r
-       private void makeSingleCountry(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String country) throws UndefinedTransformerMethodException {\r
-               boolean areaDoubtful = false;\r
-               Distribution distribution = Distribution.NewInstance(null, PresenceTerm.PRESENT());\r
-               distribution.addSource(taxonNumber, "Distribution_Country", state.getConfig().getSourceReference(), null, nameUsedInSource, null);\r
-               NamedArea area = null;\r
-               //empty\r
-               if (StringUtils.isBlank(country)){\r
-                       return;\r
+       private void handleNameType(CentralAfricaFernsImportState state, TaxonNameBase name, String typeString, String typeCollectorString, String typeLocation) {\r
+               String originalString = typeString; //just for testing\r
+               if (StringUtils.isNotBlank(typeCollectorString)){\r
+                       logger.error(state.getTaxonNumber() + " - Type collector string for name type is not empty: " + typeCollectorString);\r
+               }\r
+               if (StringUtils.isNotBlank(typeLocation)){\r
+                       logger.error(state.getTaxonNumber() + " - Type location string for name type is not empty: " + typeLocation);\r
+               }\r
+               NameTypeDesignation nameTypeDesignation = NameTypeDesignation.NewInstance();\r
+               NameTypeDesignationStatus status = null;\r
+               if (StringUtils.isBlank(typeString)){\r
+                       logger.warn(state.getTaxonNumber() + " - TypeString is empty");\r
                }\r
-               country = country.trim();\r
-               //doubtful\r
-               if (country.startsWith("?")){\r
-                       areaDoubtful = true;\r
-                       country = country.substring(1).trim();\r
-               }\r
-               //status\r
-               country = makeCountryStatus(state, country, distribution);\r
-               \r
-               //brackets\r
-               country = makeCountryBrackets(state, taxonNumber, taxon, nameUsedInSource, country);\r
-               String countryWithoutIslands = null;\r
-               String countryWithoutDot = null;\r
-               if (country.endsWith(" Isl.") || country.endsWith(" isl.") ){\r
-                       countryWithoutIslands = country.substring(0, country.length()-5);\r
-               }\r
-               if (country.endsWith(".")){\r
-                       countryWithoutDot = country.substring(0, country.length()-1);\r
-               }\r
-               if (country.endsWith("*")){\r
-                       country = country.substring(0, country.length()-1);\r
-               }\r
-               if (country.endsWith("Islands")){\r
-                       country = country.replace("Islands", "Is.");\r
-               }\r
-               \r
-               \r
-               //areas\r
-               if (TdwgArea.isTdwgAreaLabel(country)){\r
-                       //tdwg\r
-                       area = TdwgArea.getAreaByTdwgLabel(country);\r
-               }else if (TdwgArea.isTdwgAreaLabel(countryWithoutIslands)){\r
-                       //tdwg\r
-                       area = TdwgArea.getAreaByTdwgLabel(countryWithoutIslands);\r
-               }else if (TdwgArea.isTdwgAreaLabel(countryWithoutDot)){\r
-                       //tdwg\r
-                       area = TdwgArea.getAreaByTdwgLabel(countryWithoutDot);\r
-               }else if ( (area = state.getTransformer().getNamedAreaByKey(country)) != null) {\r
-                       //area already set\r
-               }else if (WaterbodyOrCountry.isWaterbodyOrCountryLabel(country)){\r
-                       //iso\r
-                       area = WaterbodyOrCountry.getWaterbodyOrCountryByLabel(country);\r
+               if (typeString.startsWith("None designated.")){\r
+                       nameTypeDesignation.setNotDesignated(true);\r
+                       typeString = typeString.replaceFirst("None designated\\.", "").trim();\r
+               }\r
+               if (typeString.contains("Lectotype: ")|| typeString.contains(", lecto." )){\r
+                       status = NameTypeDesignationStatus.LECTOTYPE();\r
+                       typeString = typeString.replace("Lectotype: ", "");\r
+                       typeString = typeString.replace(", lecto.", "");\r
+                       typeString = handleDesignatedBy(nameTypeDesignation, typeString);\r
                }else{\r
-                       //others\r
-                       NamedAreaLevel level = null;\r
-                       NamedAreaType areaType = null;\r
-                       \r
-                       UUID uuid = state.getTransformer().getNamedAreaUuid(country);\r
-                       if (uuid == null){\r
-                               logger.error(taxonNumber + " - Unknown country: " + country);\r
+                       typeString = handleDesignatedBy(nameTypeDesignation, typeString);\r
+               }\r
+               \r
+//             String strSecondNamePattern = "([^\\(]*|\\(.*\\))+;.+"; //never ending story\r
+               String strSecondNamePattern = ".+;.+";\r
+               String firstName;\r
+               String secondName = null;\r
+               if (typeString.matches(strSecondNamePattern)){\r
+                       String[] split = typeString.split(";");\r
+                       firstName = split[0].trim();\r
+                       secondName = split[1].trim();\r
+                       if (split.length > 2){\r
+                               logger.warn(state.getTaxonNumber() + " - There are more than 2 name types: " + typeString);\r
+                       }\r
+               }else{\r
+                       firstName = typeString;\r
+               }\r
+               if (StringUtils.isNotBlank(firstName)){\r
+                       BotanicalName[] nameTypeNames = getNameTypeName(firstName);\r
+                       BotanicalName nameTypeName = nameTypeNames[0];\r
+                       BotanicalName nameTypeAcceptedName = nameTypeNames[1];\r
+                       nameTypeDesignation.setTypeName(nameTypeName);\r
+                       if (nameTypeName.isProtectedTitleCache()){\r
+                               logger.error(state.getTaxonNumber() + " - Name type could not be parsed: " + nameTypeName.getTitleCache());\r
+                       }\r
+                       if (! nameTypeName.getRank().equals(Rank.SPECIES())){\r
+                               logger.warn(state.getTaxonNumber() + " - Name type is not of rank species: " + nameTypeName.getTitleCache());\r
+                       }\r
+               }\r
+               if (StringUtils.isNotBlank(secondName)){\r
+                       TaxonNameBase secondNameType = handleSecondNameTypeName(secondName);\r
+                       if (secondNameType.isProtectedTitleCache()){\r
+                               logger.error(state.getTaxonNumber() + " - Second name type could not be parsed: " + secondNameType.getTitleCache());\r
+                       }\r
+                       if (! secondNameType.getRank().equals(Rank.SPECIES())){\r
+                               logger.error(state.getTaxonNumber() + " - Second name type is not of rank species: " + secondNameType.getTitleCache());\r
+                       }\r
+\r
+               }\r
+               nameTypeDesignation.setTypeStatus(status);\r
+               name.addTypeDesignation(nameTypeDesignation, false);\r
+               \r
+       }\r
+\r
+\r
+\r
+       private TaxonNameBase handleSecondNameTypeName(String strName) {\r
+               //TODO needs feedbacke from Thomas\r
+               logger.info("Not yet implemented");\r
+               if (strName.endsWith(",")){\r
+                       strName = strName.substring(0, strName.length() -1);\r
+               }\r
+               BotanicalName result = (BotanicalName)NonViralNameParserImpl.NewInstance().parseFullName(strName, NomenclaturalCode.ICBN, Rank.SPECIES());\r
+               return result;\r
+       }\r
+\r
+\r
+\r
+       private BotanicalName[] getNameTypeName(String strName) {\r
+               //TODO implement get existing names \r
+               logger.info("Not yet fully implemented");\r
+               \r
+               BotanicalName[] result = new BotanicalName[2];\r
+               if (strName.endsWith(",")){\r
+                       strName = strName.substring(0, strName.length() -1);\r
+               }\r
+               String acceptedName;\r
+               String acceptedNamePattern = "\\(.*\\)\\.?$";\r
+               if (strName.matches(".*" + acceptedNamePattern)){\r
+                       int accStart = strName.lastIndexOf("(");\r
+                       String notAcceptedName = strName.substring(0, accStart -1 );\r
+                       acceptedName = strName.substring(accStart + 1, strName.length() - 1);\r
+                       if (acceptedName.endsWith(")")){\r
+                               acceptedName = acceptedName.substring(0, acceptedName.length()-1);\r
                        }\r
-                       area = getNamedArea(state, uuid, country, country, country, areaType, level);\r
+                       acceptedName = acceptedName.replaceFirst("=", "").trim();\r
+                       result[1] = (BotanicalName)NonViralNameParserImpl.NewInstance().parseFullName(acceptedName, NomenclaturalCode.ICBN, null);\r
+                       strName = notAcceptedName;\r
                }\r
                \r
-               distribution.setArea(area);\r
-               if (areaDoubtful == true){\r
-                       if (distribution.getStatus().equals(PresenceTerm.PRESENT())){\r
-                               distribution.setStatus(PresenceTerm.PRESENT_DOUBTFULLY());\r
+               result[0] = (BotanicalName)NonViralNameParserImpl.NewInstance().parseFullName(strName, NomenclaturalCode.ICBN, Rank.SPECIES());\r
+               return result;\r
+       }\r
+\r
+\r
+\r
+       private String handleDesignatedBy(TypeDesignationBase typeDesignation, String typeString) {\r
+               String[] splitDesignated = typeString.split(", designated by ");\r
+               if (splitDesignated.length > 1){\r
+                       Reference designationCitation = getDesignationCitation(typeDesignation, splitDesignated[1]);\r
+                       typeDesignation.setCitation(designationCitation);\r
+                       if (splitDesignated.length > 2){\r
+                               throw new IllegalStateException("More than one designation is not expected");\r
                        }\r
                }\r
-               TaxonDescription description = getTaxonDescription(taxon, false, true);\r
-               description.addElement(distribution);\r
+               return splitDesignated[0].trim();\r
        }\r
 \r
 \r
 \r
-       private String makeCountryBrackets(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String country) {\r
-               String[] split = (country + " ").split("\\(.*\\)");\r
-               if (split.length == 2){\r
-                       String bracket = country.substring(split[0].length()+1, country.indexOf(")"));\r
-                       country = split[0].trim();\r
-                       makeCountries(state, taxonNumber, taxon, nameUsedInSource, bracket, null, null);\r
-               }else if (split.length ==1){\r
-                       //do nothing\r
+       private Reference getDesignationCitation(TypeDesignationBase typeDesignation, String citationString) {\r
+               // TODO try to find an existing Reference\r
+               Reference result = ReferenceFactory.newGeneric();\r
+               String strBracketPattern = "\\((10 Oct. )?\\d{4}:\\s?(\\d{1,3}(--\\d{1,3})?|[XLVI]{1,7}|\\.{1,8})\\)\\.?";\r
+\r
+               String strStandardPattern = ".*" + strBracketPattern;\r
+//             strStandardPattern = ".*";\r
+               if (Pattern.matches(strStandardPattern, citationString)){\r
+                       parseStandardPattern(typeDesignation, result, citationString, strBracketPattern);\r
                }else{\r
-                       logger.warn("Illegal length");\r
+                       logger.error("Can't parse designation citation: " + citationString);\r
+                       result.setTitleCache(citationString);\r
+               }\r
+               return result;\r
+       }\r
+\r
+\r
+\r
+       private void parseStandardPattern(TypeDesignationBase typeDesignation, Reference result, String citationString, String bracketPattern) {\r
+               String authorPart = citationString.split(bracketPattern)[0];\r
+               String bracket = citationString.substring(authorPart.length()+1, citationString.length()-1).trim();\r
+               authorPart = authorPart.trim();\r
+               if (bracket.endsWith(")")){\r
+                       bracket = bracket.substring(0, bracket.length()-1);\r
                }\r
-               return country;\r
+               Team team = Team.NewTitledInstance(authorPart, authorPart);\r
+               result.setAuthorTeam(team);\r
+               String[] bracketSplit = bracket.split(":");\r
+               TimePeriod datePublished = TimePeriod.parseString(bracketSplit[0].trim());\r
+               result.setDatePublished(datePublished);\r
+               String citationMicroReference = bracketSplit[1].trim();\r
+               citationMicroReference = citationMicroReference.replace("--", "-");\r
+               typeDesignation.setCitationMicroReference(citationMicroReference);\r
        }\r
 \r
 \r
 \r
-       private String makeCountryStatus(CentralAfricaFernsImportState state, String country, Distribution distribution) throws UndefinedTransformerMethodException {\r
-               PresenceTerm status = null;\r
-               String[] split = country.split(" - ");\r
+       private void makeTypeCollectorInfo(DerivedUnitFacade specimen, String collectorAndNumberString) {\r
+               if (StringUtils.isBlank(collectorAndNumberString)){\r
+                       return;\r
+               }\r
+               String reNumber = "(s\\.n\\.|\\d.*)";\r
+               Pattern reNumberPattern = Pattern.compile(reNumber);\r
+               Matcher matcher = reNumberPattern.matcher(collectorAndNumberString);\r
                \r
-               if (split.length == 2){\r
-                       country = split[0].trim();\r
-                       String statusString = split[1];\r
-                       statusString = statusString.replace(".", "");\r
-                       status = state.getTransformer().getPresenceTermByKey(statusString);\r
-                       if (status == null){\r
-                               logger.warn("No status found: "+  statusString);\r
+               if ( matcher.find()){\r
+                       int numberStart = matcher.start();\r
+                       String number = collectorAndNumberString.substring(numberStart).trim();\r
+                       if (numberStart > 0){\r
+                               numberStart = numberStart -1;\r
                        }\r
-//                     UUID uuid = null;\r
-//                     status = getPresenceTerm(state, uuid, statusString, statusString, null);\r
-               }else if (split.length == 1){\r
-                       //nothing to do\r
+                       String collectorString = collectorAndNumberString.substring(0, numberStart).trim();\r
+                       specimen.setFieldNumber(number);\r
+                       TeamOrPersonBase team = getTeam(collectorString);\r
+                       specimen.setCollector(team);\r
+                       \r
                }else{\r
-                       logger.warn("Invalid length: " + split.length);\r
-               }\r
-               if (status != null){\r
-                       distribution.setStatus(status);\r
+                       logger.warn("collector string did not match number pattern: " + collectorAndNumberString);\r
+                       \r
                }\r
-               return country;\r
+       }\r
+\r
+\r
+       private TeamOrPersonBase getTeam(String teamString) {\r
+               //TODO check existing team\r
+               TeamOrPersonBase result = Team.NewTitledInstance(teamString, teamString);\r
+               return result;\r
        }\r
 \r
 \r
@@ -450,7 +637,7 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
        /**\r
         * for internal use only, used by MethodMapper\r
         */\r
-       private TaxonBase makeReferences(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+       private TaxonBase mapReferences(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
                String taxonNumber = state.getTaxonNumber();\r
                String referenceFullString = rs.getString("Reference full");\r
                String referenceAbbreviatedString = rs.getString("Reference - abbreviated");\r
@@ -462,8 +649,6 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                String part = rs.getString("Book / Journal part");\r
                String paperTitle = rs.getString("Book / Paper title");\r
                \r
-               \r
-               \r
                String datePublishedString = rs.getString("Date published");\r
                String referenceString = referenceFullString;\r
                if (StringUtils.isBlank(referenceString)){\r
@@ -514,49 +699,84 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
 \r
        /**\r
         * for internal use only, used by MethodMapper\r
+        * @throws Exception \r
         */\r
-       private TaxonBase makeCommonName(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
-               String taxonNumber = state.getTaxonNumber();\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(taxonNumber + " - Taxon with common name is of type synonym but must be accepted taxon: " + taxonBase.getName().getTitleCache());\r
+       private TaxonBase mapNomRemarks(ResultSet rs, CentralAfricaFernsImportState state) throws Exception{\r
+               try {\r
+                       String taxonNumber = state.getTaxonNumber();\r
+                       String nomRemarksString = rs.getString("Nom  remarks");\r
+                       String taxonStatus = rs.getString("Current/Synonym");\r
+                       \r
+                       TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
+                       if (StringUtils.isNotBlank(nomRemarksString)){\r
+                               NonViralName name = CdmBase.deproxy(taxonBase.getName(), NonViralName.class);\r
+                               parseNomRemark(state, name, nomRemarksString.trim(),taxonStatus, taxonNumber);\r
                        }\r
+                       return taxonBase;\r
+               } catch (Exception e) {\r
+                       throw e;\r
                }\r
-               return taxonBase;\r
        }\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 = state.getTaxonNumber();\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(taxonNumber + " - Taxon with ecology is of type synonym but must be accepted taxon: " + taxonBase.getName().getTitleCache());\r
+       private void parseNomRemark(CentralAfricaFernsImportState state, NonViralName name, String nomRemarksString, String taxonStatus, String taxonNumber) {\r
+               \r
+               if (nomRemarksString.equalsIgnoreCase("comb. illeg.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.COMBINATION_ILLEGITIMATE()));\r
+                       return;\r
+//             }else if (nomRemarksString.startsWith("comb. inval.")){\r
+//                     //TODO\r
+//                     nomRemarksString = nomRemarksString.replace("comb. inval.", "");\r
+//             }else if (nomRemarksString.equals("comb. nov.")){\r
+//                     name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.COMBINATION_NOVUM);\r
+               }else if (nomRemarksString.equals("nom. ambig.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.AMBIGUOUS()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. cons(erv)?\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.CONSERVED()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. illeg(it)?\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. inval(id)?\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.INVALID()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. nov\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.NOVUM()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. nud\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.NUDUM()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("nom\\. superfl\\.")){\r
+                       name.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.SUPERFLUOUS()));\r
+                       return;\r
+               }else if (nomRemarksString.matches("p(\\.|ro\\s)?p(\\.|arte)")){\r
+                       //pro parte is handled in taxon relationship import\r
+                       if (! taxonStatus.equals("s")){\r
+                               logger.warn(" - " +  taxonNumber + " Pro parte synonym is not of type synonym");\r
                        }\r
+                       return;\r
+               }else if (nomRemarksString.matches("as '.*'")){\r
+                       String nameAsString = nomRemarksString.substring(4, nomRemarksString.length()-1);\r
+                       //TODO discuss make it a name relationship\r
+                       UUID uuidPublishedAs = CentralAfricaFernsTransformer.uuidNamePublishedAs;\r
+                       ExtensionType extensionType = getExtensionType(state, uuidPublishedAs, "Name published as", "Name published as", "as");\r
+                       name.addExtension(nameAsString, extensionType);\r
+                       return;\r
                }\r
-               return taxonBase;\r
+\r
+               \r
+               if (StringUtils.isNotBlank(nomRemarksString)){\r
+                       ExtensionType extensionType = getExtensionType(state, CentralAfricaFernsTransformer.uuidNomenclaturalRemarks, "Nomenclatural remarks", "Nomenclatural remarks", null);\r
+                       name.addExtension(nomRemarksString, extensionType);\r
+               }\r
+               \r
+               \r
+               \r
+               \r
        }\r
-       \r
+\r
+\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet)\r
@@ -602,10 +822,11 @@ public class CentralAfricaFernsTaxonImport  extends CentralAfricaFernsImportBase
                lowestRank = setLowestInfraSpecific(taxonName, lowestRank, subspeciesName,  varietyName, subVariety, formaName,subFormaName);\r
                \r
                taxonName.setRank(lowestRank);\r
+               state.setCurrentRank(taxonName.getRank());\r
                setAuthor(taxonName, rs, taxonNumber, false);\r
                \r
                //add original source for taxon name (taxon original source is added in mapper\r
-               Reference citation = state.getConfig().getSourceReference();\r
+//             Reference citation = state.getConfig().getSourceReference();\r
 //             addOriginalSource(taxonName, taxonNumber, TAXON_NAMESPACE, citation);\r
                return taxon;\r
                \r
index c82e636fb1a949bb3dbc6f8952664bd343f6ec2f..cc27c48cac20ebe2424ea5dcd9566a43bedd06fc 100644 (file)
@@ -30,15 +30,30 @@ import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;
 import eu.etaxonomy.cdm.io.common.mapping.DbImportMethodMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.DbImportTaxIncludedInMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;\r
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\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.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.Distribution;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.location.NamedAreaLevel;\r
+import eu.etaxonomy.cdm.model.location.NamedAreaType;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
+import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\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.Classification;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
@@ -47,24 +62,8 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 \r
 /**\r
  * @author a.mueller\r
- * @created 20.02.2010\r
- * @version 1.0\r
- */\r
-/**\r
- * @author a.mueller\r
- * @date 12.01.2011\r
- *\r
- */\r
-/**\r
- * @author a.mueller\r
- * @date 12.01.2011\r
- *\r
- */\r
-/**\r
- * @author a.mueller\r
- * @date 12.01.2011\r
- *\r
  */\r
+\r
 @Component\r
 public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsImportBase<TaxonBase> implements IMappingImport<TaxonBase, CentralAfricaFernsImportState>{\r
        private static final Logger logger = Logger.getLogger(CentralAfricaFernsTaxonRelationImport.class);\r
@@ -79,6 +78,8 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
        private Map<String, UUID> nameCacheTaxonMap = new HashMap<String, UUID>();\r
        private Map<String, UUID> titleCacheTaxonMap = new HashMap<String, UUID>();\r
 \r
+       private CentralAfricaFernsImportState state;\r
+\r
        \r
        public CentralAfricaFernsTaxonRelationImport(){\r
                super(pluralString, dbTableName, cdmTargetClass);\r
@@ -105,6 +106,10 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                        mapping = new DbImportMapping();\r
                        \r
                        mapping.addMapper(DbImportMethodMapper.NewInstance(this, "createObject", ResultSet.class, CentralAfricaFernsImportState.class));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapCommonName", ResultSet.class, CentralAfricaFernsImportState.class));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapDistribution", ResultSet.class, CentralAfricaFernsImportState.class ));\r
+                       mapping.addMapper(DbImportMethodMapper.NewInstance(this, "mapEcology", ResultSet.class, CentralAfricaFernsImportState.class));\r
+\r
                }\r
                return mapping;\r
        }\r
@@ -128,6 +133,7 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
         */\r
        @Override\r
        protected boolean doInvoke(CentralAfricaFernsImportState state) {\r
+               this.state = state;\r
                fillTaxonMap();\r
                boolean success = super.doInvoke(state);\r
                return success;\r
@@ -179,6 +185,7 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                                \r
                                \r
                        //reference map\r
+                       this.sourceReference = getFernsSourceReference(state);\r
 //                     nameSpace = "Reference";\r
 //                     cdmClass = Reference.class;\r
 //                     Map<String, Person> referenceMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(Person.class, teamIdSet, nameSpace);\r
@@ -252,6 +259,8 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
         */\r
        private Synonym handleSynonym(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException {\r
                String accTaxonId = rs.getString("Current");\r
+               String nomRemarksString = rs.getString("Current/Synonym");\r
+               \r
                String synonymId = state.getTaxonNumber();\r
                Synonym synonym = (Synonym)state.getRelatedObject(TAXON_NAMESPACE, synonymId);\r
                if (synonym == null){\r
@@ -263,7 +272,10 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                if (taxonBase != null){\r
                        if (taxonBase.isInstanceOf(Taxon.class)){\r
                                Taxon taxon = CdmBase.deproxy(taxonBase, Taxon.class);\r
-                               taxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF());\r
+                               SynonymRelationship rel = taxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF());\r
+                               if ("p.p.".equalsIgnoreCase(nomRemarksString)){\r
+                                       rel.setProParte(true);\r
+                               }\r
                        }else{\r
                                logger.warn("Accepted taxon (" + accTaxonId + ") for synonym (" + synonymId +") is not of type 'Current'");\r
                        }               \r
@@ -882,6 +894,278 @@ public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsIm
                taxonName.setRank(newRank);\r
                return taxonName;\r
        }\r
+       \r
+\r
+       /**\r
+        * for internal use only, used by MethodMapper\r
+        */\r
+       private TaxonBase mapCommonName(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               String taxonNumber = state.getTaxonNumber();\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
+                       Taxon taxon = getAcceptedTaxon(taxonBase);\r
+                       if ( taxon != null ){\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(taxonNumber + " - Accepted taxon for synonym can't be defined for common name. Synonym " + taxonBase.getName().getTitleCache());\r
+                       }\r
+               }\r
+               return taxonBase;\r
+       }\r
+       \r
+\r
+       /**\r
+        * for internal use only, used by MethodMapper\r
+        */\r
+       private TaxonBase mapDistribution(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               try {\r
+                       String taxonNumber = state.getTaxonNumber();\r
+//                     logger.info(taxonNumber);\r
+                       TaxonBase<?> taxonBase = state.getRelatedObject(state.CURRENT_OBJECT_NAMESPACE, state.CURRENT_OBJECT_ID, TaxonBase.class);\r
+                       String countriesString = rs.getString("Distribution - Country");\r
+                       String province = rs.getString("Distribution - Province");\r
+                       String distributionDetailed = rs.getString("Distribution - detailed");\r
+                       if (taxonBase != null){\r
+                               TaxonNameBase nameUsedInSource = taxonBase.getName();\r
+                               Taxon taxon = getAcceptedTaxon(taxonBase);\r
+                               if (taxon != null){\r
+                               \r
+                                       if (StringUtils.isNotBlank(countriesString) ){\r
+                                               makeCountries(state, taxonNumber, taxon, nameUsedInSource, countriesString, province, distributionDetailed);\r
+                                       }\r
+                                       makeProvince(taxon, province);\r
+                                       makeDistributionDetailed(taxon, distributionDetailed);\r
+                               }else{\r
+                                       logger.warn(taxonNumber + " - Accepted taxon for synonym can't be defined for distribution. Synonym " + taxonBase.getName().getTitleCache());\r
+                               }\r
+                       }else{\r
+                               logger.warn(" - " + taxonNumber + ": TaxonBase was null");\r
+                       }\r
+                       return taxonBase;\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+                       return null;\r
+               }\r
+       }\r
+       \r
+       \r
+       /**\r
+        * for internal use only, used by MethodMapper\r
+        * @param commonNames \r
+        */\r
+       private TaxonBase mapEcology(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException{\r
+               String taxonNumber = state.getTaxonNumber();\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
+                       Taxon taxon = getAcceptedTaxon(taxonBase);\r
+                       \r
+                       if (taxon != null){\r
+                               TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+                               TextData ecology = TextData.NewInstance(Feature.ECOLOGY());\r
+                               ecology.putText(Language.ENGLISH(), ecologyString.trim());\r
+                               description.addElement(ecology);                                \r
+                       }else{\r
+                               logger.warn(taxonNumber + " - Accepted taxon for synonym can't be defined for ecology. Synonym " + taxonBase.getName().getTitleCache());\r
+                       }\r
+               }\r
+               return taxonBase;\r
+       }\r
+\r
+\r
+\r
+\r
+       private void makeDistributionDetailed(Taxon taxon, String distributionDetailed) {\r
+               if (StringUtils.isNotBlank(distributionDetailed)){\r
+                       TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+                       TextData distribution = TextData.NewInstance(Feature.DISTRIBUTION());\r
+                       description.addElement(distribution);\r
+                       distribution.putText(distributionDetailed, Language.ENGLISH());\r
+               }\r
+       }\r
+\r
+       \r
+       private void makeProvince(Taxon taxon, String province) {\r
+               if (StringUtils.isNotBlank(province)){\r
+                       TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+                       TextData distribution = TextData.NewInstance(Feature.DISTRIBUTION());\r
+                       description.addElement(distribution);\r
+                       distribution.putText(Language.ENGLISH(), province);\r
+               }\r
+       }\r
+       \r
+\r
+       /**\r
+        * @param state\r
+        * @param taxonNumber\r
+        * @param taxonBase\r
+        * @param countriesString\r
+        */\r
+       private void makeCountries(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String countriesString, String province, String distributionDetailed) {\r
+               countriesString = countriesString.replaceAll("\\*", "");  \r
+               countriesString = countriesString.replace("  ", " ");\r
+               countriesString = countriesString.replace(", endemic", " - endemic");\r
+               countriesString = countriesString.replace("(endemic)", " - endemic");\r
+               countriesString = countriesString.replace("(introduced)", " - introduced");\r
+               countriesString = countriesString.replace("(naturalised)", " - naturalised");\r
+               countriesString = countriesString.replace("Madagascar-", "Madagascar -");\r
+               countriesString = countriesString.replace("Mahé", "Mahe");\r
+                \r
+               String[] split = countriesString.split("[,;]");\r
+               String remainingString = null;\r
+               for (String countryString : split){\r
+                       countryString = CdmUtils.concat(", ", remainingString , countryString);\r
+                       if (countryString.matches(".*\\(.*") && ! countryString.matches(".*\\).*")){\r
+                               remainingString = countryString;\r
+                               continue;\r
+                       }\r
+                       remainingString = null;\r
+                       try {\r
+                               makeSingleCountry(state, taxonNumber, taxon, nameUsedInSource, countryString.trim());\r
+                       } catch (UndefinedTransformerMethodException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+       private void makeSingleCountry(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String country) throws UndefinedTransformerMethodException {\r
+               boolean areaDoubtful = false;\r
+               Distribution distribution = Distribution.NewInstance(null, PresenceTerm.PRESENT());\r
+               Reference sourceReference = this.sourceReference;\r
+               distribution.addSource(taxonNumber, "Distribution_Country", sourceReference, null, nameUsedInSource, null);\r
+               NamedArea area = null;\r
+               //empty\r
+               if (StringUtils.isBlank(country)){\r
+                       return;\r
+               }\r
+               country = country.trim();\r
+               //doubtful\r
+               if (country.startsWith("?")){\r
+                       areaDoubtful = true;\r
+                       country = country.substring(1).trim();\r
+               }\r
+               //status\r
+               country = makeCountryStatus(state, country, distribution);\r
+               \r
+               //brackets\r
+               country = makeCountryBrackets(state, taxonNumber, taxon, nameUsedInSource, country);\r
+               String countryWithoutIslands = null;\r
+               String countryWithoutDot = null;\r
+               if (country.endsWith(" Isl.") || country.endsWith(" isl.") ){\r
+                       countryWithoutIslands = country.substring(0, country.length()-5);\r
+               }\r
+               if (country.endsWith(".")){\r
+                       countryWithoutDot = country.substring(0, country.length()-1);\r
+               }\r
+               if (country.endsWith("*")){\r
+                       country = country.substring(0, country.length()-1);\r
+               }\r
+               if (country.endsWith("Islands")){\r
+                       country = country.replace("Islands", "Is.");\r
+               }\r
+               \r
+               \r
+               //areas\r
+               if (TdwgArea.isTdwgAreaLabel(country)){\r
+                       //tdwg\r
+                       area = TdwgArea.getAreaByTdwgLabel(country);\r
+               }else if (TdwgArea.isTdwgAreaLabel(countryWithoutIslands)){\r
+                       //tdwg\r
+                       area = TdwgArea.getAreaByTdwgLabel(countryWithoutIslands);\r
+               }else if (TdwgArea.isTdwgAreaLabel(countryWithoutDot)){\r
+                       //tdwg\r
+                       area = TdwgArea.getAreaByTdwgLabel(countryWithoutDot);\r
+               }else if ( (area = state.getTransformer().getNamedAreaByKey(country)) != null) {\r
+                       //area already set\r
+               }else if (WaterbodyOrCountry.isWaterbodyOrCountryLabel(country)){\r
+                       //iso\r
+                       area = WaterbodyOrCountry.getWaterbodyOrCountryByLabel(country);\r
+               }else{\r
+                       //others\r
+                       NamedAreaLevel level = null;\r
+                       NamedAreaType areaType = null;\r
+                       \r
+                       UUID uuid = state.getTransformer().getNamedAreaUuid(country);\r
+                       if (uuid == null){\r
+                               logger.error(taxonNumber + " - Unknown country: " + country);\r
+                       }\r
+                       area = getNamedArea(state, uuid, country, country, country, areaType, level);\r
+               }\r
+               \r
+               distribution.setArea(area);\r
+               if (areaDoubtful == true){\r
+                       if (distribution.getStatus().equals(PresenceTerm.PRESENT())){\r
+                               distribution.setStatus(PresenceTerm.PRESENT_DOUBTFULLY());\r
+                       }\r
+               }\r
+               TaxonDescription description = getTaxonDescription(taxon, false, true);\r
+               description.addElement(distribution);\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * @param state\r
+        * @return\r
+        */\r
+       Reference sourceReference = null;\r
+       private Reference getFernsSourceReference(CentralAfricaFernsImportState state) {\r
+//             if (sourceReference == null || true){\r
+                       Reference tmpReference = state.getConfig().getSourceReference();\r
+                       sourceReference = getReferenceService().find(tmpReference.getUuid());\r
+//             }\r
+               return sourceReference;\r
+       }\r
+\r
+\r
+       private String makeCountryBrackets(CentralAfricaFernsImportState state, String taxonNumber, Taxon taxon, TaxonNameBase nameUsedInSource, String country) {\r
+               String[] split = (country + " ").split("\\(.*\\)");\r
+               if (split.length == 2){\r
+                       String bracket = country.substring(split[0].length()+1, country.indexOf(")"));\r
+                       country = split[0].trim();\r
+                       makeCountries(state, taxonNumber, taxon, nameUsedInSource, bracket, null, null);\r
+               }else if (split.length ==1){\r
+                       //do nothing\r
+               }else{\r
+                       logger.warn("Illegal length");\r
+               }\r
+               return country;\r
+       }\r
+\r
+       private String makeCountryStatus(CentralAfricaFernsImportState state, String country, Distribution distribution) throws UndefinedTransformerMethodException {\r
+               PresenceTerm status = null;\r
+               String[] split = country.split(" - ");\r
+               \r
+               if (split.length == 2){\r
+                       country = split[0].trim();\r
+                       String statusString = split[1];\r
+                       statusString = statusString.replace(".", "");\r
+                       status = state.getTransformer().getPresenceTermByKey(statusString);\r
+                       if (status == null){\r
+                               logger.warn("No status found: "+  statusString);\r
+                       }\r
+//                     UUID uuid = null;\r
+//                     status = getPresenceTerm(state, uuid, statusString, statusString, null);\r
+               }else if (split.length == 1){\r
+                       //nothing to do\r
+               }else{\r
+                       logger.warn("Invalid length: " + split.length);\r
+               }\r
+               if (status != null){\r
+                       distribution.setStatus(status);\r
+               }\r
+               return country;\r
+       }\r
+\r
+\r
+       \r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
index 352dee8a4639c00dd54ad2a17b40b27bd3ef9e3d..ab9b2eb42a8d48deb46b3e8ffd42b63e8f9be5ac 100644 (file)
@@ -36,6 +36,10 @@ public final class CentralAfricaFernsTransformer extends InputTransformerBase {
        \r
        //Extensions\r
        public static UUID uuidFascicle = UUID.fromString("718bb2d6-dbcd-4e60-9cfa-154a59461ef4");\r
+       public static UUID uuidNomenclaturalRemarks = UUID.fromString("ea7ceb5c-1b31-47b2-8544-89c90aed3a44");\r
+       public static UUID uuidNamePublishedAs = UUID.fromString("8eb258aa-6342-49cd-ad7b-185a3e879031");\r
+       public static UUID uuidIllustrationsNonOriginal = UUID.fromString("b0beb324-76a6-4f76-9e0c-413383782329");\r
+               \r
        \r
        //NamedAreas\r
        public static UUID uuidZanzibar = UUID.fromString("8d7dc5e2-43a6-4e7d-af29-a43cf62ca212");\r