import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
import eu.etaxonomy.cdm.io.eflora.EfloraImportConfigurator;\r
import eu.etaxonomy.cdm.io.eflora.centralAfrica.ericaceae.CentralAfricaEricaceaeImportConfigurator;\r
-import eu.etaxonomy.cdm.io.eflora.floraMalesiana.FloraMalesianaTransformer;\r
+import eu.etaxonomy.cdm.io.eflora.centralAfrica.ericaceae.CentralAfricaEricaceaeTransformer;\r
import eu.etaxonomy.cdm.model.description.Feature;\r
import eu.etaxonomy.cdm.model.description.FeatureNode;\r
import eu.etaxonomy.cdm.model.description.FeatureTree;\r
private static final Logger logger = Logger.getLogger(CentralAfricaEricaceaeActivator.class);\r
\r
//database validation status (create, update, validate ...)\r
- static DbSchemaValidation hbm2dll = DbSchemaValidation.VALIDATE;\r
+ static DbSchemaValidation hbm2dll = DbSchemaValidation.CREATE;\r
static final String source = EfloraSources.ericacea_local();\r
\r
\r
// static final ICdmDataSource cdmDestination = CdmDestinations.cdm_test_andreasM3();\r
- static final ICdmDataSource cdmDestination = CdmDestinations.cdm_flora_central_africa_preview();\r
+// static final ICdmDataSource cdmDestination = CdmDestinations.cdm_flora_central_africa_preview();\r
// static final ICdmDataSource cdmDestination = CdmDestinations.cdm_flora_central_africa_production();\r
-// static final ICdmDataSource cdmDestination = CdmDestinations.localH2();\r
+ static final ICdmDataSource cdmDestination = CdmDestinations.localH2();\r
\r
//feature tree uuid\r
public static final UUID featureTreeUuid = UUID.fromString("051d35ee-22f1-42d8-be07-9e9bfec5bcf7");\r
//taxa\r
static final boolean doTaxa = true;\r
\r
- private boolean includeSapindaceae1 = true;\r
+ private boolean includeEricaceae = true;\r
\r
\r
\r
\r
\r
//Sapindaceae1\r
- if (includeSapindaceae1){\r
+ if (includeEricaceae){\r
System.out.println("Start import from ("+ source.toString() + ") ...");\r
config.setSourceReference(getSourceReference(config.getSourceReferenceTitle()));\r
myImport.invoke(config);\r
}\r
\r
private FeatureTree makeFeatureNode(ITermService service){\r
- FloraMalesianaTransformer transformer = new FloraMalesianaTransformer();\r
+ CentralAfricaEricaceaeTransformer transformer = new CentralAfricaEricaceaeTransformer();\r
\r
FeatureTree result = FeatureTree.NewInstance(featureTreeUuid);\r
- result.setTitleCache("Flora Malesiana Presentation Feature Tree");\r
+ result.setTitleCache("Central Africa Ericaceae Feature Tree");\r
FeatureNode root = result.getRoot();\r
FeatureNode newNode;\r
\r
- newNode = FeatureNode.NewInstance(Feature.CITATION());\r
- root.addChild(newNode);\r
- \r
newNode = FeatureNode.NewInstance(Feature.DESCRIPTION());\r
root.addChild(newNode);\r
\r
root.addChild(newNode);\r
\r
addFeataureNodesByStringList(chomosomesList, root, transformer, service);\r
+\r
+ newNode = FeatureNode.NewInstance(Feature.COMMON_NAME());\r
+ root.addChild(newNode);\r
+ \r
+ newNode = FeatureNode.NewInstance(Feature.CITATION());\r
+ root.addChild(newNode);\r
\r
return result;\r
}\r
\r
package eu.etaxonomy.cdm.io.eflora.centralAfrica.ericaceae;\r
\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
import org.apache.log4j.Logger;\r
+import org.jdom.Element;\r
import org.springframework.stereotype.Component;\r
\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.ext.ipni.IpniService;\r
+import eu.etaxonomy.cdm.io.eflora.EfloraImportState;\r
import eu.etaxonomy.cdm.io.eflora.EfloraTaxonImport;\r
+import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
+import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.TimePeriod;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\r
+import eu.etaxonomy.cdm.model.name.NonViralName;\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.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
\r
\r
/**\r
private static final Logger logger = Logger.getLogger(CentralAfricaEricaceaeTaxonImport.class);\r
\r
\r
+\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.io.eflora.EfloraTaxonImport#handleNomenclaturalReference(eu.etaxonomy.cdm.model.name.NonViralName, java.lang.String)\r
+ */\r
+ @Override\r
+ protected TeamOrPersonBase handleNomenclaturalReference(NonViralName name, String value) {\r
+ ReferenceBase nomRef = ReferenceFactory.newGeneric();\r
+ nomRef.setTitleCache(value, true);\r
+ parseNomStatus(nomRef, name);\r
+ name.setNomenclaturalReference(nomRef);\r
+ \r
+ String microReference = parseReferenceYearAndDetail(nomRef);\r
+ \r
+ microReference = parseHomonym(microReference, name);\r
+ name.setNomenclaturalMicroReference(microReference);\r
+ \r
+ TeamOrPersonBase nameTeam = CdmBase.deproxy(name.getCombinationAuthorTeam(), TeamOrPersonBase.class);\r
+ if (nameTeam == null ){\r
+ logger.warn("Name has nom. ref. but no author team. Name: " + name.getTitleCache() + ", Nom.Ref.: " + value);\r
+ }else if (nomRef.getAuthorTeam() == null ){\r
+ logger.warn("Name has nom. ref. but no nom.ref. author. Name: " + name.getTitleCache() + ", Nom.Ref.: " + value);\r
+ }else if (! authorTeamsMatch(nomRef.getAuthorTeam(), nameTeam)){\r
+ logger.warn("Nom.Ref. author and comb. author do not match: " + nomRef.getTitleCache() + " <-> " + nameTeam.getNomenclaturalTitle());\r
+ }else {\r
+ nomRef.setAuthorTeam(nameTeam);\r
+ nameTeam.setTitleCache(nomRef.getAuthorTeam().getTitleCache(), true);\r
+ }\r
+ return nameTeam;\r
+ }\r
+ \r
+ /**\r
+ * Extracts the date published part and returns micro reference\r
+ * @param ref\r
+ * @return\r
+ */\r
+ protected String parseReferenceYearAndDetail(ReferenceBase ref){\r
+ String detailResult = null;\r
+ String titleToParse = ref.getTitleCache();\r
+ titleToParse = removeReferenceBracket(titleToParse, ref);\r
+ \r
+ int detailStart = titleToParse.indexOf(":");\r
+ if (detailStart >= 0){\r
+ detailResult = titleToParse.substring(detailStart + 1);\r
+ titleToParse = titleToParse.substring(0, titleToParse.length() - detailResult.length() - 1).trim();\r
+ detailResult = detailResult.trim();\r
+ }\r
+ \r
+ String reYear = "\\s[1-2]{1}[0-9]{3}";\r
+ String reYearPeriod = reYear;\r
+// \r
+// //pattern for the whole string\r
+ Pattern patReference = Pattern.compile( reYearPeriod );\r
+ Matcher matcher = patReference.matcher(titleToParse);\r
+ if (matcher.find()){\r
+ int start = matcher.start();\r
+ int end = matcher.end();\r
+// \r
+ String strPeriod = titleToParse.substring(start, end);\r
+ TimePeriod datePublished = TimePeriod.parseString(strPeriod);\r
+ ref.setDatePublished(datePublished);\r
+ String author = titleToParse.substring(0, start).trim();\r
+ Team team = Team.NewTitledInstance(author, author);\r
+ ref.setAuthorTeam(team);\r
+ ref.setProtectedTitleCache(false);\r
+ }else{\r
+ logger.warn("Could not parse reference: " + titleToParse);\r
+ }\r
+ return detailResult;\r
+ \r
+ }\r
+\r
+ private String removeReferenceBracket(String refString, ReferenceBase ref) {\r
+ String titleToParse = refString;\r
+ String reBracket = "\\(.*\\).?";\r
+ Pattern patBracket = Pattern.compile(reBracket);\r
+ Matcher matcher = patBracket.matcher(titleToParse);\r
+ \r
+ if (matcher.matches()){\r
+ int start = matcher.start() + 1;\r
+ int end = matcher.end() -1 ;\r
+ if (! titleToParse.endsWith("")){\r
+ end = end - 1;\r
+ }\r
+ titleToParse = titleToParse.substring(start, end);\r
+ \r
+ ref.setTitleCache(titleToParse);\r
+ }\r
+ return titleToParse;\r
+ }\r
+ \r
+ /**\r
+ * @param taxon\r
+ * @param name\r
+ * @param value\r
+ */\r
+ @Override\r
+ protected TeamOrPersonBase handleNameUsage(Taxon taxon, NonViralName name, String referenceTitle, TeamOrPersonBase lastTeam) {\r
+ ReferenceBase ref = ReferenceFactory.newGeneric();\r
+ \r
+ ref.setTitleCache(referenceTitle, true);\r
+ \r
+ TeamOrPersonBase team = getReferenceAuthor(ref, name);\r
+ ref.setAuthorTeam(team);\r
+ \r
+ String[] multipleReferences = ref.getTitleCache().split("&");\r
+ \r
+ TaxonDescription description = getDescription(taxon);\r
+ for (String singleReferenceString : multipleReferences){\r
+ ReferenceBase singleRef = ReferenceFactory.newGeneric();\r
+ singleRef.setTitleCache(singleReferenceString, true);\r
+ singleRef.setAuthorTeam(team);\r
+ \r
+ String microReference = parseReferenceYearAndDetailForUsage(singleRef);\r
+ \r
+ // parseReferenceType(ref);\r
+ \r
+ TextData textData = TextData.NewInstance(Feature.CITATION());\r
+ textData.addSource(null, null, ref, microReference, name, null);\r
+ description.addElement(textData);\r
+ }\r
+ return team;\r
+ }\r
+\r
+ private String parseReferenceYearAndDetailForUsage(ReferenceBase ref) {\r
+ String detailResult = null;\r
+ String titleToParse = ref.getTitleCache().trim();\r
+ \r
+ int detailStart = titleToParse.indexOf(":");\r
+ if (detailStart >= 0){\r
+ detailResult = titleToParse.substring(detailStart + 1);\r
+ titleToParse = titleToParse.substring(0, titleToParse.length() - detailResult.length() - 1).trim();\r
+ detailResult = detailResult.trim();\r
+ }\r
+ \r
+ String reYear = "^[1-2]{1}[0-9]{3}[a-e]?$";\r
+ String reYearPeriod = reYear;\r
+// \r
+// //pattern for the whole string\r
+ Pattern patReference = Pattern.compile( reYearPeriod );\r
+ Matcher matcher = patReference.matcher(titleToParse);\r
+ if (! matcher.find()){\r
+ logger.warn("Could not parse year: " + titleToParse);\r
+ }\r
+ TimePeriod datePublished = TimePeriod.parseString(titleToParse);\r
+ ref.setDatePublished(datePublished);\r
+ return detailResult;\r
+ \r
+ }\r
+\r
+ protected TeamOrPersonBase getReferenceAuthor (ReferenceBase ref, NonViralName name) {\r
+ String titleString = ref.getTitleCache();\r
+ String re = "\\(.*\\)";\r
+ Pattern pattern = Pattern.compile(re);\r
+ Matcher matcher = pattern.matcher(titleString);\r
+ if (matcher.find()){\r
+ int start = matcher.start();\r
+ String authorString = titleString.substring(0, start).trim();\r
+ String restString = titleString.substring(start + 1 , matcher.end() - 1);\r
+ TeamOrPersonBase team = getAuthorTeam(authorString, name);\r
+ ref.setTitleCache(restString, true);\r
+ return team;\r
+ }else{\r
+ logger.warn("Title does not match: " + titleString);\r
+ return null;\r
+ }\r
+ \r
+ }\r
+\r
+ private TeamOrPersonBase getAuthorTeam(String authorString, NonViralName name) {\r
+ //TODO atomize\r
+// TeamOrPersonBase nameTeam = CdmBase.deproxy(name.getCombinationAuthorTeam(), TeamOrPersonBase.class);\r
+// String nameTeamTitle = nameTeam == null ? "" : nameTeam.getNomenclaturalTitle();\r
+ \r
+// if (nameTeam == null || ! authorTeamsMatch(authorString, nameTeamTitle)){\r
+// logger.warn("Author teams do not match: " + authorString + " <-> " + nameTeamTitle);\r
+ Team result = Team.NewInstance();\r
+ result.setTitleCache(authorString, true);\r
+ return result;\r
+// }else{\r
+// nameTeam.setTitleCache(authorString, true);\r
+// return nameTeam;\r
+// }\r
+ }\r
+\r
+ /**\r
+ * @param refAuthorTeam\r
+ * @param nameTeam\r
+ * @return\r
+ */\r
+ private boolean authorTeamsMatch(TeamOrPersonBase refAuthorTeam, TeamOrPersonBase nameTeam) {\r
+ String nameTeamString = nameTeam.getNomenclaturalTitle();\r
+ String refAuthorTeamString = refAuthorTeam.getTitleCache();\r
+ if (nameTeamString.equalsIgnoreCase(refAuthorTeamString)){\r
+ return true;\r
+ }\r
+ \r
+ if (nameTeamString.endsWith(".")){\r
+ nameTeamString = nameTeamString.substring(0, nameTeamString.length() - 1 );\r
+ if (refAuthorTeamString.startsWith(nameTeamString)){\r
+ return true;\r
+ }else{\r
+ return checkIpniAuthor(nameTeamString + ".", refAuthorTeam);\r
+ }\r
+ }else{\r
+ if (nameTeamString.endsWith(refAuthorTeamString) || refAuthorTeamString.endsWith(nameTeamString)){\r
+ return true;\r
+ }else{\r
+ return checkIpniAuthor(nameTeamString, refAuthorTeam);\r
+ }\r
+ }\r
+ }\r
+ \r
+ private boolean checkIpniAuthor(String nameTeamString, TeamOrPersonBase refAuthorTeam) {\r
+ IpniService ipniService = new IpniService();\r
+ List<Person> ipniAuthors = ipniService.getAuthors(nameTeamString, null, null, null, null, null);\r
+ for (Person ipniAuthor : ipniAuthors){\r
+ if (ipniAuthor.getLastname() != null && ipniAuthor.getLastname().equalsIgnoreCase(refAuthorTeam.getTitleCache())){\r
+ return true;\r
+ }\r
+ System.out.println(ipniAuthor.getTitleCache() + " <-> " + refAuthorTeam.getTitleCache());\r
+ }\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * @param state\r
+ * @param elNom\r
+ * @param taxon\r
+ * @param homotypicalGroup \r
+ */\r
+ @Override\r
+ protected void handleTypeRef(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup) {\r
+ verifyNoChildren(elNom);\r
+ String typeRef = elNom.getTextNormalize();\r
+ typeRef = removeStartingTypeRefMinus(typeRef);\r
+ typeRef = removeTypePrefix(typeRef);\r
+ TypeDesignationBase typeDesignation = SpecimenTypeDesignation.NewInstance();\r
+ makeSpecimenTypeDesignation(new StringBuffer("Type"), typeRef, typeDesignation);\r
+ for (TaxonNameBase name : homotypicalGroup.getTypifiedNames()){\r
+ name.addTypeDesignation(typeDesignation, true);\r
+ }\r
+ }\r
+\r
+ private String removeTypePrefix(String typeRef) {\r
+ typeRef = typeRef.trim().replace("Type: ", "").replace("Types: ", "").trim();\r
+ return typeRef;\r
+ }\r
+\r
+ \r
+ \r
}\r
\r
package eu.etaxonomy.cdm.io.eflora.centralAfrica.ericaceae;\r
\r
+import java.util.UUID;\r
+\r
import org.apache.log4j.Logger;\r
\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
import eu.etaxonomy.cdm.io.eflora.EfloraTransformer;\r
\r
/**\r
@SuppressWarnings("unused")\r
private static final Logger logger = Logger.getLogger(CentralAfricaEricaceaeTransformer.class);\r
\r
+ //Languages\r
+ private static final UUID uuidKinyarwanda = UUID.fromString("95d170f5-7654-42bf-8293-c3584191a45a");\r
+ private static final UUID uuidKibemba = UUID.fromString("6069b231-101a-4a7b-84c5-4116b92db99c");\r
+ private static final UUID uuidMashi = UUID.fromString("fca40807-6b89-49c9-9a4a-9e0b7a928309");\r
+ private static final UUID uuidKihavu = UUID.fromString("050821ee-fac0-4c82-837d-f0a3d2206eb3");\r
+ private static final UUID uuidKinande = UUID.fromString("9ba45e39-86af-4200-b578-c45f8425acad");\r
+ private static final UUID uuidKihunde = UUID.fromString("8077644c-6deb-48de-a9d0-a649201184ed");\r
+ private static final UUID uuidKiluba = UUID.fromString("a90ac2df-3391-4cf7-91c5-b32c2f32a068");\r
+ private static final UUID uuidKitabwa = UUID.fromString("a8008e51-01a7-4432-8bf7-4b18fa60a1c7");\r
+ private static final UUID uuidKibatwa = UUID.fromString("b0130472-3ab1-4bb9-9605-0bf7b3d5c798");\r
+ private static final UUID uuidKinyanga = UUID.fromString("706661cb-0086-4fd7-a421-7476850b34f9");\r
+ private static final UUID uuidKirundi = UUID.fromString("089cab72-d673-42de-83e8-d20ff6937986");\r
+ private static final UUID uuidKinyindu = UUID.fromString("e4e405fe-4ff0-46b9-bd1e-bf09d1a6f3a9");\r
+ private static final UUID uuidKifulero = UUID.fromString("6cadd25c-b2f3-4d5b-a44e-cb88d0f184fe");\r
+ private static final UUID uuidKitembo = UUID.fromString("09a7da83-0e1f-42ae-886b-88675800d245");\r
+ private static final UUID uuidKinyabongo = UUID.fromString("cae69a27-77f9-46db-b7ea-646c0c037cfe");\r
+\r
+ \r
+ @Override\r
+ public UUID getLanguageUuid(String key) throws UndefinedTransformerMethodException {\r
+ if (CdmUtils.isEmpty(key)){return null;\r
+ \r
+ }else if (key.equalsIgnoreCase("Kinyarwanda")){return uuidKinyarwanda;\r
+ }else if (key.equalsIgnoreCase("Kibemba")){return uuidKibemba;\r
+ }else if (key.equalsIgnoreCase("Mashi")){return uuidMashi;\r
+ }else if (key.equalsIgnoreCase("Kihavu")){return uuidKihavu;\r
+ }else if (key.equalsIgnoreCase("Kinande")){return uuidKinande;\r
+ }else if (key.equalsIgnoreCase("Kihunde")){return uuidKihunde;\r
+ }else if (key.equalsIgnoreCase("Kiluba")){return uuidKiluba;\r
+ }else if (key.equalsIgnoreCase("Kitabwa")){return uuidKitabwa;\r
+ }else if (key.equalsIgnoreCase("Viele ")){return uuidKibatwa;\r
+ }else if (key.equalsIgnoreCase("Kinyanga")){return uuidKinyanga;\r
+ }else if (key.equalsIgnoreCase("Kirundi")){return uuidKirundi;\r
+ }else if (key.equalsIgnoreCase("Kinyindu")){return uuidKinyindu;\r
+ }else if (key.equalsIgnoreCase("Kifulero")){return uuidKifulero;\r
+ }else if (key.equalsIgnoreCase("Kitembo")){return uuidKitembo;\r
+ }else if (key.equalsIgnoreCase("Kinyabongo")){return uuidKinyabongo;\r
+ }else{\r
+ return null;\r
+ }\r
+ }\r
+ \r
}\r