\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
\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
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
\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
\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
\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
\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
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
/**\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
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
\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
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
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
\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
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
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
*/\r
@Override\r
protected boolean doInvoke(CentralAfricaFernsImportState state) {\r
+ this.state = state;\r
fillTaxonMap();\r
boolean success = super.doInvoke(state);\r
return success;\r
\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
*/\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
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
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