/**\r
- * \r
- */\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\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
package eu.etaxonomy.cdm.io.tcsxml.in;\r
\r
import java.util.ArrayList;\r
+import java.util.HashMap;\r
import java.util.HashSet;\r
import java.util.Iterator;\r
import java.util.List;\r
import eu.etaxonomy.cdm.common.ResultWrapper;\r
import eu.etaxonomy.cdm.common.XmlHelp;\r
import eu.etaxonomy.cdm.io.common.ICdmIO;\r
-import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
import eu.etaxonomy.cdm.io.common.ImportHelper;\r
import eu.etaxonomy.cdm.io.common.MapWrapper;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.description.CommonTaxonName;\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.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.reference.Generic;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.name.TaxonName;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\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
*\r
*/\r
@Component\r
-public class TcsXmlTaxonImport extends TcsXmlImportBase implements ICdmIO<IImportConfigurator> {\r
+public class TcsXmlTaxonImport extends TcsXmlImportBase implements ICdmIO<TcsXmlImportState> {\r
private static final Logger logger = Logger.getLogger(TcsXmlTaxonImport.class);\r
\r
private static int modCount = 30000;\r
- \r
+\r
public TcsXmlTaxonImport(){\r
super();\r
}\r
- \r
- \r
+\r
+\r
@Override\r
- public boolean doCheck(IImportConfigurator config){\r
+ public boolean doCheck(TcsXmlImportState state){\r
boolean result = true;\r
logger.warn("Checking for Taxa not yet implemented");\r
//result &= checkArticlesWithoutJournal(bmiConfig);\r
//result &= checkPartOfJournal(bmiConfig);\r
- \r
+\r
return result;\r
}\r
- \r
+\r
/**\r
* Computes a list of all TaxonConcept ids (ref-attribute) that are related as synonyms\r
* @param elTaxonConceptList\r
*/\r
private Set<String> makeSynonymIds(List<Element> elTaxonConceptList, ResultWrapper<Boolean> success){\r
//TODO use XPath\r
- \r
+\r
Set<String> result = new HashSet<String>();\r
- \r
+\r
Namespace tcsNamespace;\r
//for each taxonConcept\r
for (Element elTaxonConcept : elTaxonConceptList){\r
tcsNamespace = elTaxonConcept.getNamespace();\r
- \r
+\r
String childName = "TaxonRelationships";\r
boolean obligatory = false;\r
Element elTaxonRelationships = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
continue;\r
}\r
String tcsElementName = "TaxonRelationship";\r
- List<Element> elTaxonRelationshipList = elTaxonRelationships.getChildren(tcsElementName, tcsNamespace);\r
+ List<Element> elTaxonRelationshipList = elTaxonRelationships == null ? new ArrayList<Element>() : elTaxonRelationships.getChildren(tcsElementName, tcsNamespace);\r
for (Element elTaxonRelationship : elTaxonRelationshipList){\r
- \r
+\r
String relationshipType = elTaxonRelationship.getAttributeValue("type");\r
if ("has synonym".equalsIgnoreCase(relationshipType)){\r
childName = "ToTaxonConcept";\r
obligatory = true;\r
Element elToTaxonConcept = XmlHelp.getSingleChildElement(success, elTaxonRelationship, childName, tcsNamespace, obligatory);\r
- \r
+\r
String linkType = elToTaxonConcept.getAttributeValue("linkType");\r
if (linkType == null || linkType.equals("local")){\r
String ref = elToTaxonConcept.getAttributeValue("ref");\r
result.add(ref);\r
}else{\r
logger.warn("External link types for synonym not yet implemented");\r
- } \r
+ }\r
}\r
}\r
}\r
return result;\r
}\r
- \r
- \r
- protected static final ReferenceBase unknownSec(){\r
- ReferenceBase result = Generic.NewInstance();\r
- result.setTitleCache("UNKNOWN");\r
- return result;\r
- }\r
- \r
+\r
+\r
+\r
+\r
@Override\r
- public boolean doInvoke(TcsXmlImportState state){\r
- \r
+ public void doInvoke(TcsXmlImportState state){\r
+\r
logger.info("start make TaxonConcepts ...");\r
MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)state.getStore(ICdmIO.TAXON_STORE);\r
- MapWrapper<TaxonNameBase<?,?>> taxonNameMap = (MapWrapper<TaxonNameBase<?,?>>)state.getStore(ICdmIO.TAXONNAME_STORE);\r
- MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)state.getStore(ICdmIO.REFERENCE_STORE);\r
+ MapWrapper<TaxonName> taxonNameMap = (MapWrapper<TaxonName>)state.getStore(ICdmIO.TAXONNAME_STORE);\r
+ MapWrapper<Reference> referenceMap = (MapWrapper<Reference>)state.getStore(ICdmIO.REFERENCE_STORE);\r
+ Map<String, CommonTaxonName> commonNameMap = new HashMap<String, CommonTaxonName>();\r
+\r
ITaxonService taxonService = getTaxonService();\r
\r
ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);\r
TcsXmlImportConfigurator config = state.getConfig();\r
Element elDataSet = getDataSetElement(config);\r
Namespace tcsNamespace = config.getTcsXmlNamespace();\r
- \r
+\r
childName = "TaxonConcepts";\r
obligatory = false;\r
Element elTaxonConcepts = XmlHelp.getSingleChildElement(success, elDataSet, childName, tcsNamespace, obligatory);\r
- \r
+\r
String tcsElementName = "TaxonConcept";\r
List<Element> elTaxonConceptList = elTaxonConcepts.getChildren(tcsElementName, tcsNamespace);\r
- \r
+\r
Set<String> synonymIdSet = makeSynonymIds(elTaxonConceptList, success);\r
//TODO make the same for the Assertions\r
- \r
+\r
int i = 0;\r
- \r
+\r
//for each taxonConcept\r
for (Element elTaxonConcept : elTaxonConceptList){\r
if ((i++ % modCount) == 0 && i > 1){ logger.info("Taxa handled: " + (i-1));}\r
- List<String> elementList = new ArrayList<String>();\r
- \r
+ List<String> elementList = new ArrayList<>();\r
+\r
//create TaxonName element\r
String strId = elTaxonConcept.getAttributeValue("id");\r
//TODO\r
String strConceptType = elTaxonConcept.getAttributeValue("type"); //original, revision, incomplete, aggregate, nominal\r
String strPrimary = elTaxonConcept.getAttributeValue("primary"); //If primary='true' the concept is the first level response to a query. If 'false' the concept may be a secondary concept linked directly or indirectly to the definition of a primary concept.\r
String strForm = elTaxonConcept.getAttributeValue("form"); //anamorph, teleomorph, hybrid\r
- \r
+\r
childName = "Name";\r
obligatory = true;\r
Element elName = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- TaxonNameBase<?,?> taxonName = makeName(elName, null, taxonNameMap, success);\r
- elementList.add(childName.toString());\r
- \r
- //TODO how to handle\r
- childName = "Rank";\r
- obligatory = false;\r
- Element elRank = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- Rank rank = TcsXmlTaxonNameImport.makeRank(elRank);\r
- if (rank != null){\r
- logger.warn("Rank in TaxonIO not yet implemented");\r
- }\r
- elementList.add(childName.toString());\r
- \r
- childName = "AccordingTo";\r
- obligatory = false;\r
- Element elAccordingTo = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- ReferenceBase sec = makeAccordingTo(elAccordingTo, referenceMap, success);\r
- elementList.add(childName.toString());\r
- // TODO may sec be null?\r
- if (sec == null){\r
- sec = unknownSec();\r
- }\r
- \r
- TaxonBase taxonBase;\r
- if (synonymIdSet.contains(strId)){\r
- taxonBase = Synonym.NewInstance(taxonName, sec);\r
+ if (isVernacular(success, elName)){\r
+ handleVernacularName(success, strId, elName, commonNameMap);\r
}else{\r
- taxonBase = Taxon.NewInstance(taxonName, sec); \r
+ TaxonName taxonName = makeScientificName(elName, null, taxonNameMap, success);\r
+ elementList.add(childName.toString());\r
+\r
+ //TODO how to handle\r
+ childName = "Rank";\r
+ obligatory = false;\r
+ Element elRank = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ Rank rank = TcsXmlTaxonNameImport.makeRank(elRank);\r
+ if (rank != null){\r
+ logger.warn("Rank in TaxonIO not yet implemented");\r
+ }\r
+ elementList.add(childName.toString());\r
+\r
+ childName = "AccordingTo";\r
+ obligatory = false;\r
+ Element elAccordingTo = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ Reference sec = makeAccordingTo(elAccordingTo, referenceMap, success);\r
+ elementList.add(childName.toString());\r
+ // TODO may sec be null?\r
+ if (sec == null){\r
+ sec = unknownSec();\r
+ }\r
+\r
+ TaxonBase<?> taxonBase;\r
+ if (synonymIdSet.contains(strId)){\r
+ taxonBase = Synonym.NewInstance(taxonName, sec);\r
+ }else{\r
+ taxonBase = Taxon.NewInstance(taxonName, sec);\r
+ }\r
+\r
+ childName = "TaxonRelationships";\r
+ obligatory = false;\r
+ Element elTaxonRelationships = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ makeTaxonRelationships(taxonBase, elTaxonRelationships, success);\r
+ elementList.add(childName.toString());\r
+\r
+ childName = "SpecimenCircumscription";\r
+ obligatory = false;\r
+ Element elSpecimenCircumscription = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ makeSpecimenCircumscription(taxonBase, elSpecimenCircumscription, success);\r
+ elementList.add(childName.toString());\r
+\r
+ childName = "CharacterCircumscription";\r
+ obligatory = false;\r
+ Element elCharacterCircumscription = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ makeCharacterCircumscription(taxonBase, elCharacterCircumscription, success);\r
+ elementList.add(childName.toString());\r
+\r
+\r
+ childName = "ProviderLink";\r
+ obligatory = false;\r
+ Element elProviderLink = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ makeProviderLink(taxonBase, elProviderLink, success);\r
+ elementList.add(childName.toString());\r
+\r
+ childName = "ProviderSpecificData";\r
+ obligatory = false;\r
+ Element elProviderSpecificData = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
+ makeProviderSpecificData(taxonBase, elProviderSpecificData, success);\r
+ elementList.add(childName.toString());\r
+\r
+ testAdditionalElements(elTaxonConcept, elementList);\r
+ ImportHelper.setOriginalSource(taxonBase, config.getSourceReference(), strId, idNamespace);\r
+ //delete the version information\r
+\r
+ taxonMap.put(removeVersionOfRef(strId), taxonBase);\r
}\r
- \r
- childName = "TaxonRelationships";\r
- obligatory = false;\r
- Element elTaxonRelationships = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- makeTaxonRelationships(taxonBase, elTaxonRelationships, success);\r
- elementList.add(childName.toString());\r
-\r
- childName = "SpecimenCircumscription";\r
- obligatory = false;\r
- Element elSpecimenCircumscription = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- makeSpecimenCircumscription(taxonBase, elSpecimenCircumscription, success);\r
- elementList.add(childName.toString());\r
-\r
- childName = "CharacterCircumscription";\r
- obligatory = false;\r
- Element elCharacterCircumscription = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- makeCharacterCircumscription(taxonBase, elCharacterCircumscription, success);\r
- elementList.add(childName.toString());\r
-\r
- \r
- childName = "ProviderLink";\r
- obligatory = false;\r
- Element elProviderLink = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- makeProviderLink(taxonBase, elProviderLink, success);\r
- elementList.add(childName.toString());\r
- \r
- childName = "ProviderSpecificData";\r
- obligatory = false;\r
- Element elProviderSpecificData = XmlHelp.getSingleChildElement(success, elTaxonConcept, childName, tcsNamespace, obligatory);\r
- makeProviderSpecificData(taxonBase, elProviderSpecificData, success);\r
- elementList.add(childName.toString());\r
-\r
- testAdditionalElements(elTaxonConcept, elementList);\r
- ImportHelper.setOriginalSource(taxonBase, config.getSourceReference(), strId, idNamespace);\r
- taxonMap.put(strId, taxonBase);\r
- \r
+\r
}\r
+ state.setCommonNameMap(commonNameMap);\r
+\r
//invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);\r
logger.info(i + " taxa handled. Saving ...");\r
- taxonService.saveTaxonAll(taxonMap.objects());\r
+ taxonService.save(taxonMap.objects());\r
logger.info("end makeTaxa ...");\r
- return success.getValue();\r
+ if (!success.getValue()){\r
+ state.setUnsuccessfull();\r
+ }\r
+ return;\r
}\r
- \r
- \r
+\r
+ private void handleVernacularName(ResultWrapper<Boolean> success, String taxonId, Element elName, Map<String, CommonTaxonName> commonNameMap) {\r
+ String name = elName.getTextNormalize();\r
+ //TODO ref\r
+\r
+ Language language = null;\r
+ String strLanguage = elName.getAttributeValue("language");\r
+ //TODO\r
+ //Language\r
+ if (strLanguage != null){\r
+ language = Language.getLanguageByLabel(strLanguage);\r
+ if (language == null){\r
+ language = Language.getLanguageByDescription(strLanguage);\r
+ }\r
+ if (language == null){\r
+ logger.warn("language ("+strLanguage+") not found for name " + name);\r
+ }\r
+ }\r
+ CommonTaxonName commonName = CommonTaxonName.NewInstance(name, language);\r
+ commonNameMap.put(taxonId, commonName);\r
+\r
+ //TODO check other elements\r
+ }\r
+\r
+\r
+ private boolean isVernacular(ResultWrapper<Boolean> success, Element elName) {\r
+ try{\r
+ String strScientific = elName.getAttributeValue("scientific");\r
+ boolean scientific = Boolean.valueOf(strScientific);\r
+ return ! scientific;\r
+ } catch (Exception e) {\r
+ logger.warn("Value for scientific is not boolean");\r
+ success.setValue(false);\r
+ return false;\r
+ }\r
+ }\r
+\r
+\r
+\r
private boolean hasIsSynonymRelation(Element taxonConcept, Namespace rdfNamespace){\r
boolean result = false;\r
if (taxonConcept == null || ! "TaxonConcept".equalsIgnoreCase(taxonConcept.getName()) ){\r
return false;\r
}\r
- \r
+\r
String elName = "relationshipCategory";\r
Filter filter = new ElementFilter(elName, taxonConcept.getNamespace());\r
Iterator<Element> relationshipCategories = taxonConcept.getDescendants(filter);\r
}\r
return result;\r
}\r
- \r
- \r
+\r
+\r
/**\r
* @param elTaxonRelationships\r
* @param success\r
*/\r
- private TaxonNameBase<?, ?> makeName(Element elName, NomenclaturalCode code, MapWrapper<? extends TaxonNameBase<?,?>> objectMap, ResultWrapper<Boolean> success){\r
- TaxonNameBase<?, ?> result = null;\r
+ private TaxonName makeScientificName(Element elName, NomenclaturalCode code, MapWrapper<? extends TaxonName> objectMap, ResultWrapper<Boolean> success){\r
+ TaxonName result = null;\r
if (elName != null){\r
- //scientific\r
- try {\r
- String strScientific = elName.getAttributeValue("scientific");\r
- boolean scientific = Boolean.valueOf(strScientific);\r
- if (! scientific){\r
- //TODO\r
- logger.warn("Non scientific names not yet implemented");\r
- success.setValue(false);\r
- }\r
- } catch (Exception e) {\r
- logger.warn("Value for scientific is not boolean");\r
- }\r
String language = elName.getAttributeValue("language");\r
- //TODO\r
//Language\r
if (language != null){\r
- logger.warn("language for name not yet implemented"); \r
- }\r
- Class<? extends IdentifiableEntity> clazz = (Class<? extends IdentifiableEntity>)NonViralName.class;\r
- if (code != null){\r
- clazz = code.getCdmClass();\r
+ logger.warn("language for name not yet implemented. Language for scientific name should always be Latin");\r
}\r
- result = (TaxonNameBase<?,?>)makeReferenceType (elName, clazz , objectMap, success);\r
+ Class<? extends IdentifiableEntity> clazz = TaxonName.class;\r
+ result = (TaxonName)makeReferenceType (elName, clazz , objectMap, success);\r
if(result == null){\r
logger.warn("Name not found");\r
success.setValue(false);\r
+ }else{\r
+ if (result.getNameType() == null){\r
+ if (code == null){\r
+ code = NomenclaturalCode.NonViral;\r
+ }\r
+ result.setNameType(code);\r
+ }\r
}\r
}else{\r
logger.warn("Name element is null");\r
}\r
return result;\r
}\r
- \r
- \r
+\r
+\r
/**\r
* @param elTaxonRelationships\r
* @param success\r
*/\r
- private void makeTaxonRelationships(TaxonBase name, Element elTaxonRelationships, ResultWrapper<Boolean> success){\r
+ private void makeTaxonRelationships(TaxonBase<?> name, Element elTaxonRelationships, ResultWrapper<Boolean> success){\r
//TaxonRelationships are handled in TcsXmlTaxonRelationsImport\r
return;\r
}\r
- \r
\r
- \r
- private void makeSpecimenCircumscription(TaxonBase name, Element elSpecimenCircumscription, ResultWrapper<Boolean> success){\r
+\r
+\r
+ private void makeSpecimenCircumscription(TaxonBase<?> name, Element elSpecimenCircumscription, ResultWrapper<Boolean> success){\r
if (elSpecimenCircumscription != null){\r
logger.warn("makeProviderLink not yet implemented");\r
success.setValue(false);\r
}\r
}\r
- \r
- \r
- private void makeCharacterCircumscription(TaxonBase name, Element elCharacterCircumscription, ResultWrapper<Boolean> success){\r
+\r
+\r
+ private void makeCharacterCircumscription(TaxonBase<?> name, Element elCharacterCircumscription, ResultWrapper<Boolean> success){\r
if (elCharacterCircumscription != null){\r
logger.warn("makeProviderLink not yet implemented");\r
success.setValue(false);\r
}\r
}\r
- \r
- private void makeProviderLink(TaxonBase name, Element elProviderLink, ResultWrapper<Boolean> success){\r
+\r
+ private void makeProviderLink(TaxonBase<?> name, Element elProviderLink, ResultWrapper<Boolean> success){\r
if (elProviderLink != null){\r
logger.warn("makeProviderLink not yet implemented");\r
success.setValue(false);\r
}\r
}\r
- \r
\r
- private void makeProviderSpecificData(TaxonBase name, Element elProviderSpecificData, ResultWrapper<Boolean> success){\r
+\r
+ private void makeProviderSpecificData(TaxonBase<?> name, Element elProviderSpecificData, ResultWrapper<Boolean> success){\r
if (elProviderSpecificData != null){\r
logger.warn("makeProviderLink not yet implemented");\r
success.setValue(false);\r
}\r
}\r
- \r
- \r
- \r
+\r
+\r
+\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
*/\r
- protected boolean isIgnore(IImportConfigurator config){\r
- return ! config.isDoTaxa();\r
+ @Override\r
+ protected boolean isIgnore(TcsXmlImportState state){\r
+ return ! state.getConfig().isDoTaxa();\r
}\r
\r
\r