*\r
* The contents of this file are subject to the Mozilla Public License Version 1.1\r
* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/ \r
+*/\r
\r
package eu.etaxonomy.cdm.io.eflora;\r
\r
import eu.etaxonomy.cdm.model.common.Language;\r
import eu.etaxonomy.cdm.model.common.Marker;\r
import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.OriginalSourceType;\r
import eu.etaxonomy.cdm.model.common.TimePeriod;\r
import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.TextData;\r
import eu.etaxonomy.cdm.model.name.BotanicalName;\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.INonViralName;\r
import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;\r
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
-import eu.etaxonomy.cdm.model.name.NonViralName;\r
import eu.etaxonomy.cdm.model.name.Rank;\r
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;\r
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;\r
-import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
import eu.etaxonomy.cdm.model.reference.IBook;\r
import eu.etaxonomy.cdm.model.reference.IJournal;\r
import eu.etaxonomy.cdm.model.reference.Reference;\r
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
import eu.etaxonomy.cdm.model.taxon.Classification;\r
-import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymType;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
+import eu.etaxonomy.cdm.strategy.parser.TimePeriodParser;\r
\r
\r
/**\r
private static final Logger logger = Logger.getLogger(EfloraTaxonImport.class);\r
\r
private static int modCount = 30000;\r
- private NonViralNameParserImpl parser = new NonViralNameParserImpl();\r
+ private final NonViralNameParserImpl parser = new NonViralNameParserImpl();\r
\r
public EfloraTaxonImport(){\r
super();\r
}\r
- \r
- \r
+\r
+\r
@Override\r
public boolean doCheck(EfloraImportState state){\r
boolean result = true;\r
return result;\r
}\r
- \r
- //TODO make part of state, but state is renewed when invoking the import a second time \r
+\r
+ //TODO make part of state, but state is renewed when invoking the import a second time\r
private UnmatchedLeads unmatchedLeads;\r
- \r
+\r
@Override\r
public void doInvoke(EfloraImportState state){\r
logger.info("start make Taxa ...");\r
- \r
+\r
//FIXME reset state\r
state.putTree(null, null);\r
// UnmatchedLeads unmatchedLeads = state.getOpenKeys();\r
unmatchedLeads = UnmatchedLeads.NewInstance();\r
}\r
state.setUnmatchedLeads(unmatchedLeads);\r
- \r
+\r
TransactionStatus tx = startTransaction();\r
unmatchedLeads.saveToSession(getPolytomousKeyNodeService());\r
- \r
- \r
+\r
+\r
//TODO generally do not store the reference object in the config\r
Reference sourceReference = state.getConfig().getSourceReference();\r
getReferenceService().saveOrUpdate(sourceReference);\r
- \r
+\r
Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);\r
\r
Element elbody= getBodyElement(state.getConfig());\r
List<Element> elTaxonList = elbody.getChildren();\r
- \r
+\r
int i = 0;\r
- \r
+\r
Set<String> unhandledTitleClassess = new HashSet<String>();\r
Set<String> unhandledNomeclatureChildren = new HashSet<String>();\r
Set<String> unhandledDescriptionChildren = new HashSet<String>();\r
- \r
+\r
Taxon lastTaxon = getLastTaxon(state);\r
- \r
+\r
//for each taxon\r
for (Element elTaxon : elTaxonList){\r
try {\r
if (! elTaxon.getName().equalsIgnoreCase("taxon")){\r
logger.warn("body has element other than 'taxon'");\r
}\r
- \r
+\r
BotanicalName botanicalName = BotanicalName.NewInstance(Rank.SPECIES());\r
Taxon taxon = Taxon.NewInstance(botanicalName, state.getConfig().getSourceReference());\r
- \r
+\r
handleTaxonAttributes(elTaxon, taxon, state);\r
\r
- \r
+\r
List<Element> children = elTaxon.getChildren();\r
handleTaxonElement(state, unhandledTitleClassess, unhandledNomeclatureChildren, unhandledDescriptionChildren, taxon, children);\r
handleTaxonRelation(state, taxon, lastTaxon);\r
lastTaxon = taxon;\r
taxaToSave.add(taxon);\r
state.getConfig().setLastTaxonUuid(lastTaxon.getUuid());\r
- \r
+\r
} catch (Exception e) {\r
logger.warn("Exception occurred in Sapindacea taxon import: " + e);\r
e.printStackTrace();\r
}\r
- \r
+\r
}\r
- \r
+\r
System.out.println(state.getUnmatchedLeads().toString());\r
logger.warn("There are taxa with attributes 'excluded' and 'dubious'");\r
- \r
+\r
logger.info("Children for nomenclature are: " + unhandledNomeclatureChildren);\r
logger.info("Children for description are: " + unhandledDescriptionChildren);\r
logger.info("Children for homotypes are: " + unhandledHomotypeChildren);\r
logger.info("Children for nom are: " + unhandledNomChildren);\r
- \r
- \r
+\r
+\r
//invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);\r
logger.info(i + " taxa handled. Saving ...");\r
getTaxonService().saveOrUpdate(taxaToSave);\r
getFeatureTreeService().saveOrUpdateFeatureNodesAll(state.getFeatureNodesToSave());\r
state.getFeatureNodesToSave().clear();\r
commitTransaction(tx);\r
- \r
+\r
logger.info("end makeTaxa ...");\r
logger.info("start makeKey ...");\r
// invokeDoKey(state);\r
logger.info("end makeKey ...");\r
- \r
+\r
if (! success.getValue()){\r
state.setUnsuccessfull();\r
}\r
\r
// private void invokeDoKey(SapindaceaeImportState state) {\r
// TransactionStatus tx = startTransaction();\r
-// \r
+//\r
// Set<FeatureNode> nodesToSave = new HashSet<FeatureNode>();\r
// ITaxonService taxonService = getTaxonService();\r
// ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);\r
//\r
// Element elbody= getBodyElement(state.getConfig());\r
// List<Element> elTaxonList = elbody.getChildren();\r
-// \r
+//\r
// int i = 0;\r
-// \r
+//\r
// //for each taxon\r
// for (Element elTaxon : elTaxonList){\r
// if ((i++ % modCount) == 0 && i > 1){ logger.info("Taxa handled: " + (i-1));}\r
// if (! elTaxon.getName().equalsIgnoreCase("taxon")){\r
// continue;\r
// }\r
-// \r
+//\r
// List<Element> children = elTaxon.getChildren("key");\r
// for (Element element : children){\r
// handleKeys(state, element, null);\r
// nodesToSave.add(taxon);\r
//\r
// }\r
-// \r
+//\r
// }\r
\r
\r
AnnotatableEntity lastEntity = null;\r
for (Element element : children){\r
String elName = element.getName();\r
- \r
+\r
if (elName.equalsIgnoreCase("title")){\r
handleTitle(state, element, taxon, unhandledTitleClassess);\r
lastEntity = null;\r
}\r
}\r
}\r
- \r
- \r
+\r
+\r
private void handleVernaculars(EfloraImportState state, Element elVernacular, Taxon taxon) {\r
verifyNoAttribute(elVernacular);\r
verifyNoChildren(elVernacular, false);\r
if (matcher.find()){\r
String dialect = singleDialect.substring(matcher.start(), matcher.end());\r
dialect = dialect.replace("(dial. ", "").replace(")", "");\r
- \r
+\r
Language language = null;\r
try {\r
language = this.getLanguage(state, state.getTransformer().getLanguageUuid(dialect), dialect, dialect, dialect);\r
} catch (UndefinedTransformerMethodException e) {\r
logger.error(e.getMessage());\r
}\r
- \r
+\r
String commonNames = singleDialect.substring(0, matcher.start());\r
String[] splitNames = commonNames.split(",");\r
for (String commonNameString : splitNames){\r
private void handleReferences(EfloraImportState state, Element elReferences, Taxon taxon, AnnotatableEntity lastEntity) {\r
verifyNoAttribute(elReferences);\r
verifyNoChildren(elReferences, true);\r
- String refString = elReferences.getTextNormalize(); \r
+ String refString = elReferences.getTextNormalize();\r
if (lastEntity == null){\r
logger.warn("No last entity defined: " + refString);\r
return;\r
}\r
- \r
+\r
Annotation annotation = Annotation.NewInstance(refString, AnnotationType.EDITORIAL(), Language.DEFAULT());\r
lastEntity.addAnnotation(annotation);\r
}\r
\r
private PolytomousKey handleKeys(EfloraImportState state, Element elKey, Taxon taxon) {\r
UnmatchedLeads openKeys = state.getUnmatchedLeads();\r
- \r
+\r
//title\r
String title = makeKeyTitle(elKey);\r
- \r
+\r
//key\r
PolytomousKey key = PolytomousKey.NewTitledInstance(title);\r
- \r
+\r
//TODO add covered taxa etc.\r
verifyNoAttribute(elKey);\r
- \r
+\r
//notes\r
makeKeyNotes(elKey, key);\r
- \r
+\r
//keycouplets\r
List<Element> keychoices = new ArrayList<Element>();\r
keychoices.addAll(elKey.getChildren("keycouplet"));\r
keychoices.addAll(elKey.getChildren("keychoice"));\r
- \r
- \r
+\r
+\r
for (Element elKeychoice : keychoices){\r
handleKeyChoices(state, openKeys, key, elKeychoice, taxon);\r
elKey.removeContent(elKeychoice);\r
}\r
- \r
+\r
//\r
verifyNoChildren(elKey);\r
logger.info("Unmatched leads after key handling:" + openKeys.toString());\r
- \r
+\r
\r
if (state.getConfig().isDoPrintKeys()){\r
key.print(System.err);\r
* @param openKeys\r
* @param key\r
* @param elKeychoice\r
- * @param taxon \r
+ * @param taxon\r
*/\r
private void handleKeyChoices(EfloraImportState state, UnmatchedLeads openKeys, PolytomousKey key, Element elKeychoice, Taxon taxon) {\r
- \r
+\r
//char Attribute\r
- //TODO it's still unclear if char is a feature and needs to be a new attribute \r
+ //TODO it's still unclear if char is a feature and needs to be a new attribute\r
//or if it is handled as question. Therefore both cases are handled but feature\r
//is finally not yet set\r
KeyStatement question = handleKeychoiceChar(state, elKeychoice);\r
Feature feature = handleKeychoiceCharAsFeature(state, elKeychoice);\r
- \r
+\r
//lead\r
List<PolytomousKeyNode> childNodes = handleKeychoiceLeads(state, key, elKeychoice, taxon, question, feature);\r
- \r
+\r
//num -> match with unmatched leads\r
handleKeychoiceNum(openKeys, key, elKeychoice, childNodes);\r
\r
key.getRoot().addChild(childNode);\r
}\r
}\r
- \r
+\r
elKeychoice.removeAttribute("num");\r
}\r
\r
}\r
return statement;\r
}\r
- \r
+\r
/**\r
* @param state\r
* @param elKeychoice\r
//needs to be discussed on model side\r
node.setQuestion(question);\r
// node.setFeature(feature);\r
- \r
+\r
//text\r
String text = handleLeadText(elLead, node);\r
- \r
+\r
//num\r
handleLeadNum(elLead, text);\r
- \r
+\r
//goto\r
handleLeadGoto(state, key, elLead, taxon, node);\r
- \r
+\r
//others\r
verifyNoAttribute(elLead);\r
- \r
+\r
return node;\r
}\r
\r
if (strGoto == null){\r
return "";\r
}\r
- String strGenusName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getGenusOrUninomial();\r
+ String strGenusName = taxon.getName().getGenusOrUninomial();\r
strGoto = strGoto.replaceAll("\\([^\\(\\)]*\\)", ""); //replace all brackets\r
strGoto = strGoto.replaceAll("\\s+", " "); //replace multiple whitespaces by exactly one whitespace\r
- \r
- strGoto = strGoto.trim(); \r
+\r
+ strGoto = strGoto.trim();\r
String[] split = strGoto.split("\\s");\r
for (int i = 0; i<split.length; i++){\r
String single = split[i];\r
split[i] = strGenusName;\r
}\r
// if (isInfraSpecificMarker(single)){\r
-// String strSpeciesName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getSpecificEpithet();\r
+// String strSpeciesName = taxon.getName().getSpecificEpithet();\r
// split[i] = strGenusName + " " + strSpeciesName + " ";\r
// }\r
result = (result + " " + split[i]).trim();\r
\r
private boolean isInfraSpecificMarker(String single) {\r
try {\r
- if (Rank.getRankByAbbreviation(single).isInfraSpecific()){\r
+ if (Rank.getRankByIdInVoc(single).isInfraSpecific()){\r
return true;\r
}\r
} catch (UnknownCdmTypeException e) {\r
if (! single.matches("[A-Z]\\.?")) {\r
return false;\r
}else if (single.length() == 0 || strGenusName == null || strGenusName.length() == 0){\r
- return false; \r
+ return false;\r
}else{\r
return single.charAt(0) == strGenusName.charAt(0);\r
}\r
String chromosomesPart = getChromosomesPart(value);\r
String references = value.replace(chromosomesPart, "").trim();\r
chromosomesPart = chromosomesPart.replace(":", "").trim();\r
- return addDescriptionElement(state, taxon, chromosomesPart, chromosomeFeature, references); \r
+ return addDescriptionElement(state, taxon, chromosomesPart, chromosomeFeature, references);\r
}\r
\r
\r
/**\r
- * @param ref \r
- * @param string \r
+ * @param ref\r
+ * @param string\r
* @return\r
*/\r
private void makeOriginalSourceReferences(ISourceable sourcable, String splitter, String refAll) {\r
Reference ref = ReferenceFactory.newGeneric();\r
ref.setTitleCache(strRef, true);\r
String refDetail = parseReferenceYearAndDetail(ref);\r
- sourcable.addSource(null, null, ref, refDetail);\r
+ sourcable.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, ref, refDetail);\r
}\r
- \r
- \r
+\r
+\r
//TODO use regex instead\r
/* String detailResult = null;\r
String titleToParse = ref.getTitleCache();\r
String reYear = "\\([1-2]{1}[0-9]{3}\\)";\r
String reYearPeriod = reYear + "(-" + reYear + ")+";\r
String reDetail = "\\.{1,10}$";\r
-*/ \r
+*/\r
}\r
\r
\r
value = replaceStart(value, "Uses");\r
Feature feature = Feature.USES();\r
return addDescriptionElement(state, taxon, value, feature, null);\r
- \r
+\r
}\r
\r
\r
* @param state\r
* @param element\r
* @param taxon\r
- * @param unhandledNomeclatureChildren \r
+ * @param unhandledNomeclatureChildren\r
*/\r
private void handleNomenclature(EfloraImportState state, Element elNomenclature, Taxon taxon, Set<String> unhandledChildren) {\r
verifyNoAttribute(elNomenclature);\r
- \r
+\r
List<Element> elements = elNomenclature.getChildren();\r
for (Element element : elements){\r
if (element.getName().equals("homotypes")){\r
unhandledChildren.add(element.getName());\r
}\r
}\r
- \r
+\r
}\r
\r
\r
*/\r
private void handleHomotypes(EfloraImportState state, Element elHomotypes, Taxon taxon) {\r
verifyNoAttribute(elHomotypes);\r
- \r
+\r
List<Element> elements = elHomotypes.getChildren();\r
HomotypicalGroup homotypicalGroup = null;\r
for (Element element : elements){\r
unhandledHomotypeChildren.add(element.getName());\r
}\r
}\r
- \r
+\r
}\r
\r
private static Set<String> unhandledNomChildren = new HashSet<String>();\r
*/\r
private HomotypicalGroup handleNom(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup) {\r
List<Attribute> attributes = elNom.getAttributes();\r
- \r
+\r
boolean taxonBaseClassType = false;\r
for (Attribute attribute : attributes){\r
if (! attribute.getName().equalsIgnoreCase("class")){\r
}else{\r
logger.warn("Unhandled class value for nom: " + classValue);\r
}\r
- \r
+\r
}\r
}\r
- \r
+\r
List<Element> elements = elNom.getChildren();\r
for (Element element : elements){\r
if (element.getName().equals("name") || element.getName().equals("homonym") ){\r
unhandledNomChildren.add(element.getName());\r
}\r
}\r
- \r
+\r
return homotypicalGroup;\r
- \r
+\r
}\r
\r
/**\r
* @param state\r
* @param elNom\r
* @param taxon\r
- * @param homotypicalGroup \r
+ * @param homotypicalGroup\r
*/\r
protected void handleTypeRef(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup) {\r
verifyNoChildren(elNom);\r
String typeRef = elNom.getTextNormalize();\r
typeRef = removeStartingTypeRefMinus(typeRef);\r
- \r
+\r
String[] split = typeRef.split(":");\r
if (split.length < 2){\r
logger.warn("typeRef has no ':' : " + typeRef);\r
StringBuffer typeType = new StringBuffer(split[0]);\r
String typeText = split[1].trim();\r
TypeDesignationBase typeDesignation = getTypeDesignationAndReference(typeType);\r
- \r
+\r
//Name Type Desitnations\r
if (typeDesignation instanceof NameTypeDesignation){\r
makeNameTypeDesignations(typeType, typeText, typeDesignation);\r
//clean\r
typeText = cleanNameType(typeText);\r
//create name\r
- BotanicalName nameType = (BotanicalName)parser.parseFullName(typeText, NomenclaturalCode.ICBN, Rank.SPECIES());\r
+ BotanicalName nameType = (BotanicalName)parser.parseFullName(typeText, NomenclaturalCode.ICNAFP, Rank.SPECIES());\r
((NameTypeDesignation) typeDesignation).setTypeName(nameType);\r
//TODO wie können NameTypes den Namen zugeordnet werden? - wird aber vom Portal via NameCache matching gemacht\r
}\r
}else{\r
logger.warn("Unhandled type string: " + typeType);\r
}\r
- Specimen specimen = Specimen.NewInstance();\r
+ DerivedUnit specimen = DerivedUnit.NewPreservedSpecimenInstance();\r
if (typeText.length() > 255){\r
specimen.setTitleCache(typeText.substring(0, 252) + "...", true);\r
}else{\r
specimen.setTitleCache(typeText, true);\r
}\r
- specimen.addDefinition(typeText, Language.ENGLISH());\r
+ specimen.putDefinition(Language.ENGLISH(), typeText);\r
((SpecimenTypeDesignation) typeDesignation).setTypeSpecimen(specimen);\r
}\r
\r
*/\r
//body/taxon/\r
private HomotypicalGroup handleNomTaxon(EfloraImportState state, Element elNom, Taxon taxon, HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
- NonViralName name = makeName(taxon, homotypicalGroup, isSynonym);\r
- String num = null;\r
- \r
+ INonViralName nvn = makeName(taxon, homotypicalGroup, isSynonym);\r
+ TaxonNameBase<?,?> name = TaxonNameBase.castAndDeproxy(nvn);\r
+ String num = null;\r
+\r
boolean hasGenusInfo = false;\r
- TeamOrPersonBase lastTeam = null;\r
- \r
+ TeamOrPersonBase<?> lastTeam = null;\r
+\r
//genus\r
List<Element> elGenus = XmlHelp.getAttributedChildListWithValue(elNom, "name", "class", "genus");\r
if (elGenus.size() > 0){\r
List<Element> elInfraRank = XmlHelp.getAttributedChildListWithValue(elNom, "name", "class", "infrank");\r
Rank infraRank = null;\r
infraRank = handleInfRank(name, elInfraRank, infraRank);\r
- \r
+\r
//get left over elements\r
List<Element> elements = elNom.getChildren();\r
elements.removeAll(elInfraRank);\r
- \r
+\r
for (Element element : elements){\r
if (element.getName().equals("name")){\r
String classValue = element.getAttributeValue("class");\r
unhandledNomChildren.add(element.getName());\r
}\r
}\r
- \r
+\r
//handle key\r
if (! isSynonym){\r
String taxonString = name.getNameCache();\r
- //try to find matching lead nodes \r
+ //try to find matching lead nodes\r
UnmatchedLeadsKey leadsKey = UnmatchedLeadsKey.NewInstance(num, taxonString);\r
Set<PolytomousKeyNode> matchingNodes = handleMatchingNodes(state, taxon, leadsKey);\r
//same without using the num\r
logger.warn("Taxon has num but no matching nodes exist: " + num+ ", Key: " + leadsKey.toString());\r
}\r
}\r
- \r
+\r
//test nom element has no text\r
if (StringUtils.isNotBlank(elNom.getTextNormalize().replace("—", "").replace("\u002d","").replace("\u2013", ""))){\r
String strElNom = elNom.getTextNormalize();\r
//System.out.println(CharUtils.unicodeEscaped(c));\r
logger.warn("Nom tag has text: " + strElNom);\r
}\r
- \r
+\r
return name.getHomotypicalGroup();\r
}\r
\r
\r
- private void handleQuestionMark(NonViralName name, Taxon taxon) {\r
+ private void handleQuestionMark(INonViralName name, Taxon taxon) {\r
int count = name.getTaxonBases().size();\r
if (count != 1){\r
logger.warn("Name has " + count + " taxa. This is not handled for question mark");\r
}else{\r
- TaxonBase taxonBase = (TaxonBase)name.getTaxonBases().iterator().next();\r
+ TaxonBase taxonBase = name.getTaxonBases().iterator().next();\r
taxonBase.setDoubtful(true);\r
}\r
}\r
\r
\r
- //merge with handleNomTaxon \r
- private void handleHomonym(EfloraImportState state, Element elHomonym, NonViralName upperName) {\r
+ //merge with handleNomTaxon\r
+ private void handleHomonym(EfloraImportState state, Element elHomonym, TaxonNameBase upperName) {\r
verifyNoAttribute(elHomonym);\r
- \r
+\r
//hommonym name\r
BotanicalName homonymName = BotanicalName.NewInstance(upperName.getRank());\r
homonymName.setGenusOrUninomial(upperName.getGenusOrUninomial());\r
}\r
}\r
//TODO verify other information\r
- \r
+\r
\r
//rel\r
boolean homonymIsLater = false;\r
}else{\r
upperName.addRelationshipToName(homonymName, relType, null);\r
}\r
- \r
}\r
\r
\r
}\r
\r
\r
- private void handleNameNote(NonViralName name, String value) {\r
+ private void handleNameNote(INonViralName name, String value) {\r
logger.warn("Name note: " + value + ". Available in portal?");\r
Annotation annotation = Annotation.NewInstance(value, AnnotationType.EDITORIAL(), Language.DEFAULT());\r
name.addAnnotation(annotation);\r
* @param name\r
* @param value\r
*/\r
- protected TeamOrPersonBase handleNameUsage(Taxon taxon, NonViralName name, String referenceTitle, TeamOrPersonBase lastTeam) {\r
+ protected TeamOrPersonBase handleNameUsage(Taxon taxon, INonViralName name, String referenceTitle, TeamOrPersonBase lastTeam) {\r
Reference ref = ReferenceFactory.newGeneric();\r
referenceTitle = removeStartingSymbols(referenceTitle, ref);\r
- \r
+\r
ref.setTitleCache(referenceTitle, true);\r
String microReference = parseReferenceYearAndDetail(ref);\r
- TeamOrPersonBase team = getReferenceAuthor(ref);\r
+ TeamOrPersonBase<?> team = getReferenceAuthor(ref);\r
parseReferenceType(ref);\r
if (team == null){\r
team = lastTeam;\r
}\r
- ref.setAuthorTeam(team);\r
- \r
+ ref.setAuthorship(team);\r
+\r
TaxonDescription description = getDescription(taxon);\r
TextData textData = TextData.NewInstance(Feature.CITATION());\r
- textData.addSource(null, null, ref, microReference, name, null);\r
+ textData.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, ref, microReference, (TaxonNameBase)name, null);\r
description.addElement(textData);\r
return team;\r
}\r
ref.setType(ReferenceType.Book);\r
return;\r
}\r
- \r
+\r
title = title.substring(3);\r
//in reference\r
//no ,\r
logger.error("ERROR occurred when trying to split title: " + title + "; split[0]: + " + split[0]);\r
}\r
book.setTitle(title);\r
- book.setAuthorTeam(bookTeam);\r
+ book.setAuthorship(bookTeam);\r
book.setDatePublished(ref.getDatePublished());\r
ref.setTitle(null);\r
ref.setInBook(book);\r
- } \r
+ }\r
}\r
\r
\r
//no author is given\r
return null;\r
}\r
- \r
+\r
//,-references\r
split = (referenceTitle).split(",\\s*[A-Z]");\r
if (split.length > 1){\r
* @param name\r
* @return\r
*/\r
- protected String parseHomonym(String detail, NonViralName name) {\r
+ protected String parseHomonym(String detail, TaxonNameBase name) {\r
String result;\r
if (detail == null){\r
return detail;\r
}\r
\r
- \r
+\r
//non RE\r
String reNon = "(\\s|,)non\\s";\r
Pattern patReference = Pattern.compile(reNon);\r
if (matcher.find()){\r
int start = matcher.start();\r
int end = matcher.end();\r
- \r
+\r
if (detail != null){\r
logger.warn("Unhandled non part: " + detail.substring(start));\r
return detail;\r
}\r
- \r
+\r
result = detail.substring(0, start);\r
\r
//homonym string\r
String homonymString = detail.substring(end);\r
- \r
+\r
//hommonym name\r
BotanicalName homonymName = BotanicalName.NewInstance(name.getRank());\r
homonymName.setGenusOrUninomial(name.getGenusOrUninomial());\r
homonymName.setSpecificEpithet(name.getSpecificEpithet());\r
homonymName.setInfraSpecificEpithet(name.getInfraSpecificEpithet());\r
Reference homonymNomRef = ReferenceFactory.newGeneric();\r
- homonymNomRef.setTitleCache(homonymString);\r
+ homonymNomRef.setTitleCache(homonymString, true);\r
String homonymNomRefDetail = parseReferenceYearAndDetail(homonymNomRef);\r
homonymName.setNomenclaturalMicroReference(homonymNomRefDetail);\r
String authorTitle = homonymNomRef.getTitleCache();\r
Team team = Team.NewTitledInstance(authorTitle, authorTitle);\r
- homonymNomRef.setAuthorTeam(team);\r
+ homonymNomRef.setAuthorship(team);\r
homonymNomRef.setTitle("");\r
homonymNomRef.setProtectedTitleCache(false);\r
- \r
+\r
//rel\r
boolean homonymIsLater = false;\r
NameRelationshipType relType = NameRelationshipType.LATER_HOMONYM();\r
}else{\r
name.addRelationshipToName(homonymName, relType, null);\r
}\r
- \r
+\r
}else{\r
return detail;\r
}\r
* @param name\r
* @param value\r
*/\r
- protected TeamOrPersonBase handleNomenclaturalReference(NonViralName name, String value) {\r
+ protected TeamOrPersonBase handleNomenclaturalReference(TaxonNameBase name, String value) {\r
Reference nomRef = ReferenceFactory.newGeneric();\r
nomRef.setTitleCache(value, true);\r
parseNomStatus(nomRef, name);\r
name.setNomenclaturalReference(nomRef);\r
microReference = parseHomonym(microReference, name);\r
name.setNomenclaturalMicroReference(microReference);\r
- TeamOrPersonBase team = (TeamOrPersonBase)name.getCombinationAuthorTeam();\r
+ TeamOrPersonBase<?> team = name.getCombinationAuthorship();\r
if (team == null){\r
logger.warn("Name has nom. ref. but no author team. Name: " + name.getTitleCache() + ", Nom.Ref.: " + value);\r
}else{\r
- nomRef.setAuthorTeam(team);\r
+ nomRef.setAuthorship(team);\r
}\r
return team;\r
}\r
\r
- private void handleInfrAuthor(EfloraImportState state, Element elAuthor, NonViralName name, boolean overwrite) {\r
+ private void handleInfrAuthor(EfloraImportState state, Element elAuthor, INonViralName name, boolean overwrite) {\r
String strAuthor = elAuthor.getValue().trim();\r
if (strAuthor.endsWith(",")){\r
strAuthor = strAuthor.substring(0, strAuthor.length() -1);\r
}\r
TeamOrPersonBase[] team = getTeam(strAuthor);\r
- if (name.getCombinationAuthorTeam() != null && overwrite == false){\r
+ if (name.getCombinationAuthorship() != null && overwrite == false){\r
logger.warn("Try to write combination author for a name that already has a combination author. Neglected.");\r
}else{\r
- name.setCombinationAuthorTeam(team[0]);\r
- name.setExCombinationAuthorTeam(team[1]);\r
+ name.setCombinationAuthorship(team[0]);\r
+ name.setExCombinationAuthorship(team[1]);\r
}\r
- \r
- \r
+\r
+\r
}\r
\r
\r
* @param infraRank\r
* @return\r
*/\r
- private Rank handleInfRank(NonViralName name, List<Element> elInfraRank, Rank infraRank) {\r
+ private Rank handleInfRank(INonViralName name, List<Element> elInfraRank, Rank infraRank) {\r
if (elInfraRank.size() == 1){\r
String strRank = elInfraRank.get(0).getTextNormalize();\r
try {\r
- infraRank = Rank.getRankByNameOrAbbreviation(strRank);\r
+ infraRank = Rank.getRankByNameOrIdInVoc(strRank);\r
} catch (UnknownCdmTypeException e) {\r
try{\r
- infraRank = Rank.getRankByNameOrAbbreviation(strRank + ".");\r
+ infraRank = Rank.getRankByNameOrIdInVoc(strRank + ".");\r
} catch (UnknownCdmTypeException e2) {\r
logger.warn("Unknown infrank " + strRank + ". Set infraRank to (null).");\r
}\r
}\r
\r
\r
- private void handleInfrEpi(NonViralName name, Rank infraRank, String value) {\r
+ private void handleInfrEpi(INonViralName name, Rank infraRank, String value) {\r
if (infraRank != null && infraRank.isInfraSpecific()){\r
name.setInfraSpecificEpithet(value);\r
if (CdmUtils.isCapital(value)){\r
* @param isSynonym\r
* @return\r
*/\r
- private NonViralName makeName(Taxon taxon,HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
- NonViralName name;\r
+ private TaxonNameBase makeName(Taxon taxon,HomotypicalGroup homotypicalGroup, boolean isSynonym) {\r
+ TaxonNameBase<?,?> name;\r
if (isSynonym){\r
name = BotanicalName.NewInstance(Rank.SPECIES(), homotypicalGroup);\r
- SynonymRelationshipType synonymType = SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF();\r
+ SynonymType synonymType = SynonymType.HETEROTYPIC_SYNONYM_OF();\r
if (taxon.getHomotypicGroup().equals(homotypicalGroup)){\r
- synonymType = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
+ synonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();\r
}\r
taxon.addSynonymName(name, synonymType);\r
}else{\r
- name = (NonViralName)taxon.getName();\r
+ name = taxon.getName();\r
}\r
return name;\r
}\r
* @param element\r
* @param taxon\r
*/\r
- private void handleInfraspecificEpithet(Element element, String attrValue, NonViralName name) {\r
+ private void handleInfraspecificEpithet(Element element, String attrValue, INonViralName name) {\r
String value = element.getTextNormalize();\r
if (value.indexOf("subsp.") != -1){\r
//TODO genus and species epi\r
* @param element\r
* @param name\r
*/\r
- private void handleBasionymAuthor(EfloraImportState state, Element elBasionymAuthor, NonViralName name, boolean overwrite) {\r
+ private void handleBasionymAuthor(EfloraImportState state, Element elBasionymAuthor, INonViralName name, boolean overwrite) {\r
String strAuthor = elBasionymAuthor.getValue().trim();\r
Pattern reBasionymAuthor = Pattern.compile("^\\(.*\\)$");\r
if (reBasionymAuthor.matcher(strAuthor).matches()){\r
logger.warn("Brackets are missing for original combination author " + strAuthor);\r
}\r
TeamOrPersonBase[] basionymTeam = getTeam(strAuthor);\r
- if (name.getBasionymAuthorTeam() != null && overwrite == false){\r
+ if (name.getBasionymAuthorship() != null && overwrite == false){\r
logger.warn("Try to write basionym author for a name that already has a basionym author. Neglected.");\r
}else{\r
- name.setBasionymAuthorTeam(basionymTeam[0]);\r
- name.setExBasionymAuthorTeam(basionymTeam[1]);\r
+ name.setBasionymAuthorship(basionymTeam[0]);\r
+ name.setExBasionymAuthorship(basionymTeam[1]);\r
\r
}\r
}\r
\r
- private Map<String, UUID> teamMap = new HashMap<String, UUID>();\r
+ private final Map<String, UUID> teamMap = new HashMap<String, UUID>();\r
/**\r
* @param elAuthors\r
* @param name\r
- * @param elNom \r
+ * @param elNom\r
*/\r
- private void handleNameAuthors(Element elAuthor, NonViralName name) {\r
- if (name.getCombinationAuthorTeam() != null){\r
+ private void handleNameAuthors(Element elAuthor, INonViralName name) {\r
+ if (name.getCombinationAuthorship() != null){\r
logger.warn("Name already has a combination author. Name: " + name.getTitleCache() + ", Author: " + elAuthor.getTextNormalize());\r
}\r
String strAuthor = elAuthor.getValue().trim();\r
logger.warn("Author has brackets. Basionym authors should be handled in separate tags: " + strAuthor);\r
}\r
TeamOrPersonBase[] team = getTeam(strAuthor);\r
- name.setCombinationAuthorTeam(team[0]);\r
- name.setExCombinationAuthorTeam(team[1]);\r
+ name.setCombinationAuthorship(team[0]);\r
+ name.setExCombinationAuthorship(team[1]);\r
}\r
\r
\r
String[] split = strAuthor.split(" ex ");\r
String strBaseAuthor = null;\r
String strExAuthor = null;\r
- \r
+\r
if (split.length == 2){\r
- strBaseAuthor = split[1]; \r
- strExAuthor = split[0]; \r
+ strBaseAuthor = split[1];\r
+ strExAuthor = split[0];\r
}else if (split.length == 1){\r
strBaseAuthor = split[0];\r
}else{\r
result[1].setTitleCache(strExAuthor, true);\r
teamMap.put(strExAuthor, result[1].getUuid());\r
}\r
- \r
- } \r
+\r
+ }\r
return result;\r
}\r
\r
\r
private void handleDescription(EfloraImportState state, Element elDescription, Taxon taxon, Set<String> unhandledChildren) {\r
verifyNoAttribute(elDescription);\r
- \r
+\r
List<Element> elements = elDescription.getChildren();\r
for (Element element : elements){\r
if (element.getName().equalsIgnoreCase("char")){\r
logger.warn("Unhandled description child: " + element.getName());\r
}\r
}\r
- \r
+\r
}\r
- \r
- \r
+\r
+\r
/**\r
* @param state\r
* @param element\r
String value = element.getValue();\r
addDescriptionElement(state, taxon, value, feature, null);\r
}\r
- \r
+\r
}\r
}\r
- \r
+\r
List<Element> elements = element.getChildren();\r
if (! elements.isEmpty()){\r
logger.warn("Char has unhandled children");\r
\r
/**\r
* @param classValue\r
- * @param state \r
+ * @param state\r
* @return\r
- * @throws UndefinedTransformerMethodException \r
+ * @throws UndefinedTransformerMethodException\r
*/\r
private Feature getFeature(String classValue, EfloraImportState state) {\r
UUID uuid;\r
* @param state\r
* @param element\r
* @param taxon\r
- * @param unhandledTitleClassess \r
+ * @param unhandledTitleClassess\r
*/\r
private void handleTitle(EfloraImportState state, Element element, Taxon taxon, Set<String> unhandledTitleClassess) {\r
// attributes\r
try {\r
Rank rank;\r
try {\r
- rank = Rank.getRankByNameOrAbbreviation(classValue);\r
+ rank = Rank.getRankByNameOrIdInVoc(classValue);\r
} catch (Exception e) {\r
//TODO nc\r
- rank = Rank.getRankByEnglishName(classValue, NomenclaturalCode.ICBN, false);\r
+ rank = Rank.getRankByEnglishName(classValue, NomenclaturalCode.ICNAFP, false);\r
}\r
taxon.getName().setRank(rank);\r
if (rank.equals(Rank.FAMILY()) || rank.equals(Rank.GENUS())){\r
UUID uuidTitle = EfloraTransformer.uuidTitle;\r
ExtensionType titleExtension = this.getExtensionType(state, uuidTitle, "title", "title", "title");\r
taxon.addExtension(element.getTextNormalize(), titleExtension);\r
- \r
+\r
}\r
\r
\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
- private void handleSubGenus(String value, TaxonNameBase taxonNameBase) {\r
+ private void handleSubGenus(String value, INonViralName taxonNameBase) {\r
String name = value.replace("Subgenus", "").trim();\r
- ((NonViralName)taxonNameBase).setInfraGenericEpithet(name);\r
+ taxonNameBase.setInfraGenericEpithet(name);\r
}\r
- \r
+\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
- private void handleSection(String value, TaxonNameBase taxonNameBase) {\r
+ private void handleSection(String value, INonViralName taxonNameBase) {\r
String name = value.replace("Section", "").trim();\r
- ((NonViralName)taxonNameBase).setInfraGenericEpithet(name);\r
+ taxonNameBase.setInfraGenericEpithet(name);\r
}\r
- \r
+\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
private void handleSpecies(String value, TaxonNameBase taxonNameBase) {\r
//do nothing\r
}\r
- \r
+\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
private void handleVariety(String value, TaxonNameBase taxonNameBase) {\r
//do nothing\r
}\r
- \r
+\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
private void handleSubSpecies(String value, TaxonNameBase taxonNameBase) {\r
//do nothing\r
}\r
\r
- \r
- private Pattern rexGenusAuthor = Pattern.compile("(\\[|\\().*(\\]|\\))");\r
- \r
+\r
+ private final Pattern rexGenusAuthor = Pattern.compile("(\\[|\\().*(\\]|\\))");\r
+\r
/**\r
* @param value\r
- * @param taxonNameBase \r
+ * @param taxonNameBase\r
*/\r
- protected void handleGenus(String value, TaxonNameBase taxonName) {\r
+ protected void handleGenus(String value, INonViralName taxonName) {\r
Matcher matcher = rexGenusAuthor.matcher(value);\r
if (matcher.find()){\r
String author = matcher.group();\r
team.setTitleCache(author, true);\r
Credit credit = Credit.NewInstance(team, null);\r
taxonName.addCredit(credit);\r
-// NonViralName nvn = (NonViralName)taxonName;\r
-// nvn.setCombinationAuthorTeam(team);\r
-// nvn.setGenusOrUninomial(genus);\r
+// taxonName.setCombinationAuthorship(team);\r
+// taxonName.setGenusOrUninomial(genus);\r
}else{\r
logger.info("No Author match for " + value);\r
}\r
}\r
- \r
+\r
\r
/**\r
* @param taxon\r
* @param lastTaxon\r
*/\r
private void handleTaxonRelation(EfloraImportState state, Taxon taxon, Taxon lastTaxon) {\r
- \r
+\r
Classification tree = getTree(state);\r
if (lastTaxon == null){\r
- tree.addChildTaxon(taxon, null, null, null);\r
+ tree.addChildTaxon(taxon, null, null);\r
return;\r
}\r
Rank thisRank = taxon.getName().getRank();\r
if (lastTaxon.getTaxonNodes().size() > 0){\r
TaxonNode lastNode = lastTaxon.getTaxonNodes().iterator().next();\r
if (thisRank.isLower(lastRank ) ){\r
- lastNode.addChildTaxon(taxon, null, null, null);\r
+ lastNode.addChildTaxon(taxon, null, null);\r
fillMissingEpithetsForTaxa(lastTaxon, taxon);\r
}else if (thisRank.equals(lastRank)){\r
TaxonNode parent = lastNode.getParent();\r
if (parent != null){\r
- parent.addChildTaxon(taxon, null, null, null);\r
+ parent.addChildTaxon(taxon, null, null);\r
fillMissingEpithetsForTaxa(parent.getTaxon(), taxon);\r
}else{\r
- tree.addChildTaxon(taxon, null, null, null);\r
+ tree.addChildTaxon(taxon, null, null);\r
}\r
}else if (thisRank.isHigher(lastRank)){\r
handleTaxonRelation(state, taxon, lastNode.getParent().getTaxon());\r
\r
/**\r
* @param state\r
- * @return \r
+ * @return\r
*/\r
private Classification getTree(EfloraImportState state) {\r
Classification result = state.getTree(null);\r
\r
\r
/**\r
- * @param state \r
+ * @param state\r
* @param taxon\r
* @param value\r
* @param feature\r
- * @return \r
+ * @return\r
*/\r
private TextData addDescriptionElement(EfloraImportState state, Taxon taxon, String value, Feature feature, String references) {\r
TextData textData = TextData.NewInstance(feature);\r
logger.warn(element.getName() + " has unhandled attributes: " + attributes.get(0).getValue() + "..." );\r
}\r
}\r
- \r
+\r
/**\r
* @param elNomenclature\r
*/\r
protected void verifyNoChildren(Element element) {\r
verifyNoChildren(element, false);\r
}\r
- \r
+\r
/**\r
* @param elNomenclature\r
*/\r
}\r
}\r
}\r
- \r
- \r
+\r
+\r
\r
/**\r
* Parses the nomenclatural status from the references titleCache. If a nomenclatural status\r
- * exists it is added to the name and the nom. status part of the references title cache is \r
+ * exists it is added to the name and the nom. status part of the references title cache is\r
* removed. Requires protected title cache.\r
* @param ref\r
* @param nonViralName\r
*/\r
- protected void parseNomStatus(Reference ref, NonViralName nonViralName) {\r
+ protected void parseNomStatus(Reference ref, TaxonNameBase nonViralName) {\r
String titleToParse = ref.getTitleCache();\r
- \r
+\r
String noStatusTitle = parser.parseNomStatus(titleToParse, nonViralName, true);\r
if (! noStatusTitle.equals(titleToParse)){\r
ref.setTitleCache(noStatusTitle, true);\r
}\r
}\r
\r
- \r
+\r
/**\r
* Extracts the date published part and returns micro reference\r
* @param ref\r
String oneMonth = "(Feb.|Dec.|March|June|July)";\r
String reYear = oneMonth + "?\\s?[1-2]\\s?[0-9]\\s?[0-9]\\s?[0-9]\\s?";\r
String secondYear = "(\\s?[1-2]\\s?[0-9])?\\s?[0-9]\\s?[0-9]\\s?";\r
- \r
+\r
String reYearPeriod = "\\(" + reYear + "(\\-" + secondYear + ")?\\)";\r
String reDetail = "\\.{1,10}$";\r
- \r
+\r
//pattern for the whole string\r
Pattern patReference = Pattern.compile(/*reReference +*/ reYearPeriod /*+ reDetail */);\r
Matcher matcher = patReference.matcher(titleToParse);\r
if (matcher.find()){\r
int start = matcher.start();\r
int end = matcher.end();\r
- \r
+\r
//title and other information precedes the year part\r
String title = titleToParse.substring(0, start).trim();\r
//detail follows the year part\r
String detail = titleToParse.substring(end).trim();\r
- \r
+\r
//time period\r
String strPeriod = matcher.group().trim();\r
strPeriod = strPeriod.substring(1, strPeriod.length()-1); //remove brackets\r
strPeriod = strPeriod.substring(0, end) + " " + strPeriod.substring(end);\r
startMonth = getMonth(strPeriod.substring(0, end));\r
}\r
- \r
- TimePeriod datePublished = TimePeriod.parseString(strPeriod);\r
+\r
+ TimePeriod datePublished = TimePeriodParser.parseString(strPeriod);\r
if (startMonth != null){\r
datePublished.setStartMonth(startMonth);\r
}\r
logger.warn("Could not parse reference: " + titleToParse);\r
}\r
return detailResult;\r
- \r
+\r
}\r
\r
- \r
- \r
+\r
+\r
private Integer getMonth(String month) {\r
if (month.startsWith("Jan")){\r
return 1;\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
*/\r
- protected boolean isIgnore(EfloraImportState state){\r
+ @Override\r
+ protected boolean isIgnore(EfloraImportState state){\r
return ! state.getConfig().isDoTaxa();\r
}\r
\r