import org.springframework.transaction.annotation.Transactional;\r
\r
import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;\r
-import eu.etaxonomy.cdm.api.service.config.impl.TaxonServiceConfiguratorImpl;\r
import eu.etaxonomy.cdm.api.service.pager.Pager;\r
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction;\r
import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\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
-import eu.etaxonomy.cdm.model.description.Scope;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
import eu.etaxonomy.cdm.model.media.Media;\r
import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
import eu.etaxonomy.cdm.model.media.MediaUtils;\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\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.ReferenceBase;\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.TaxonNode;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
import eu.etaxonomy.cdm.persistence.dao.common.IOrderedTermVocabularyDao;\r
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;\r
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
* FIXME Candidate for harmonization\r
* rename searchByName ? \r
*/\r
- public List<TaxonBase> searchTaxaByName(String name, ReferenceBase sec) {\r
+ public List<TaxonBase> searchTaxaByName(String name, Reference sec) {\r
return dao.getTaxaByName(name, sec);\r
}\r
\r
\r
/**\r
* FIXME Candidate for harmonization\r
- * merge with getRootTaxa(ReferenceBase sec, ..., ...)\r
+ * merge with getRootTaxa(Reference sec, ..., ...)\r
* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.Reference)\r
*/\r
- public List<Taxon> getRootTaxa(ReferenceBase sec){\r
+ public List<Taxon> getRootTaxa(Reference sec){\r
return getRootTaxa(sec, CdmFetch.FETCH_CHILDTAXA(), true);\r
}\r
\r
/**\r
* FIXME Candidate for harmonization\r
- * merge with getRootTaxa(ReferenceBase sec, ..., ...)\r
+ * merge with getRootTaxa(Reference sec, ..., ...)\r
* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.Reference, boolean)\r
*/\r
- public List<Taxon> getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, boolean onlyWithChildren) {\r
+ public List<Taxon> getRootTaxa(Reference sec, CdmFetch cdmFetch, boolean onlyWithChildren) {\r
if (cdmFetch == null){\r
cdmFetch = CdmFetch.NO_FETCH();\r
}\r
\r
/**\r
* FIXME Candidate for harmonization\r
- * merge with getRootTaxa(ReferenceBase sec, ..., ...)\r
+ * merge with getRootTaxa(Reference sec, ..., ...)\r
* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean, boolean)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.Reference, boolean, boolean)\r
*/\r
- public List<Taxon> getRootTaxa(ReferenceBase sec, boolean onlyWithChildren,\r
+ public List<Taxon> getRootTaxa(Reference sec, boolean onlyWithChildren,\r
boolean withMisapplications) {\r
return dao.getRootTaxa(sec, null, onlyWithChildren, withMisapplications);\r
}\r
\r
/* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.name.Rank, eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean, boolean)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.name.Rank, eu.etaxonomy.cdm.model.reference.Reference, boolean, boolean)\r
*/\r
- public List<Taxon> getRootTaxa(Rank rank, ReferenceBase sec, boolean onlyWithChildren,\r
+ public List<Taxon> getRootTaxa(Rank rank, Reference sec, boolean onlyWithChildren,\r
boolean withMisapplications, List<String> propertyPaths) {\r
return dao.getRootTaxa(rank, sec, null, onlyWithChildren, withMisapplications, propertyPaths);\r
}\r
* @see eu.etaxonomy.cdm.api.service.ITaxonService#makeTaxonSynonym(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.Taxon)\r
*/\r
@Transactional(readOnly = false)\r
- public Synonym changeAcceptedTaxonToSynonym(TaxonNode oldTaxonNode, TaxonNode newAcceptedTaxonNode, SynonymRelationshipType synonymRelationshipType, ReferenceBase citation, String citationMicroReference) {\r
+ public Synonym changeAcceptedTaxonToSynonym(TaxonNode oldTaxonNode, TaxonNode newAcceptedTaxonNode, SynonymRelationshipType synonymRelationshipType, Reference citation, String citationMicroReference) {\r
\r
// TODO at the moment this method only moves synonym-, concept relations and descriptions to the new accepted taxon\r
// in a future version we also want to move cdm data like annotations, marker, so., but we will need a policy for that\r
return newAcceptedTaxon;\r
}\r
\r
- public Taxon changeSynonymToRelatedTaxon(Synonym synonym, Taxon toTaxon, TaxonRelationshipType taxonRelationshipType, ReferenceBase citation, String microcitation){\r
+ public Taxon changeSynonymToRelatedTaxon(Synonym synonym, Taxon toTaxon, TaxonRelationshipType taxonRelationshipType, Reference citation, String microcitation){\r
\r
// Get name from synonym\r
TaxonNameBase<?, ?> synonymName = synonym.getName();\r
\r
Class<? extends TaxonBase> clazz = null;\r
List<String> propertyPath = new ArrayList<String>();\r
- if(configurator.getTaxonNamePropertyPath() != null){\r
- propertyPath.addAll(configurator.getTaxonPropertyPath());\r
+ if(configurator.getTaxonPropertyPath() != null){\r
+ propertyPath.addAll(configurator.getTaxonPropertyPath());\r
}\r
if ((configurator.isDoTaxa() && configurator.isDoSynonyms())) {\r
clazz = TaxonBase.class;\r
\r
if(clazz != null){\r
if(configurator.getPageSize() != null){ // no point counting if we need all anyway\r
- numberTaxaResults = \r
- dao.countTaxaByName(clazz, \r
- configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(),\r
- configurator.getNamedAreas());\r
+ numberTaxaResults = \r
+ dao.countTaxaByName(clazz, \r
+ configurator.getSearchString(), configurator.getClassification(), configurator.getMatchMode(),\r
+ configurator.getNamedAreas());\r
}\r
if(configurator.getPageSize() == null || numberTaxaResults > configurator.getPageSize() * configurator.getPageNumber()){ // no point checking again if less results\r
taxa = dao.getTaxaByName(clazz, \r
- configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(),\r
+ configurator.getSearchString(), configurator.getClassification(), configurator.getMatchMode(),\r
configurator.getNamedAreas(), configurator.getPageSize(), \r
configurator.getPageNumber(), propertyPath);\r
}\r
taxa = null;\r
numberTaxaResults = 0;\r
if(configurator.getPageSize() != null){// no point counting if we need all anyway\r
- numberTaxaResults = dao.countTaxaByCommonName(configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(), configurator.getNamedAreas());\r
+ numberTaxaResults = dao.countTaxaByCommonName(configurator.getSearchString(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas());\r
}\r
if(configurator.getPageSize() == null || numberTaxaResults > configurator.getPageSize() * configurator.getPageNumber()){\r
- taxa = dao.getTaxaByCommonName(configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(), configurator.getNamedAreas(), configurator.getPageSize(), configurator.getPageNumber(), configurator.getTaxonPropertyPath());\r
+ taxa = dao.getTaxaByCommonName(configurator.getSearchString(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas(), configurator.getPageSize(), configurator.getPageNumber(), configurator.getTaxonPropertyPath());\r
}\r
if(taxa != null){\r
results.addAll(taxa);\r
return this.dao.countAllRelationships();\r
}\r
\r
- public List<Synonym> createAllInferredSynonyms(TaxonomicTree tree,\r
+ public List<Synonym> createAllInferredSynonyms(Classification tree,\r
Taxon taxon) {\r
\r
return this.dao.createAllInferredSynonyms(taxon, tree);\r
}\r
\r
- public List<Synonym> createInferredSynonyms(TaxonomicTree tree, Taxon taxon, SynonymRelationshipType type) {\r
+ public List<Synonym> createInferredSynonyms(Classification tree, Taxon taxon, SynonymRelationshipType type) {\r
\r
return this.dao.createInferredSynonyms(taxon, tree, type);\r
}\r
\r
Taxon matchedTaxon = null;\r
try{\r
+ // 1. search for acceptet taxa\r
List<TaxonBase> taxonList = dao.findByNameTitleCache(Taxon.class, taxonName, null, MatchMode.EXACT, null, 0, null, null);\r
for(IdentifiableEntity taxonBaseCandidate : taxonList){\r
if(taxonBaseCandidate instanceof Taxon){\r
matchedTaxon = (Taxon)taxonBaseCandidate;\r
if(taxonList.size() > 1){\r
logger.info(taxonList.size() + " TaxonBases found, using first accepted Taxon: " + matchedTaxon.getTitleCache());\r
+ return matchedTaxon;\r
} else {\r
- logger.info("using accepted Taxon: " + matchedTaxon.getTitleCache()); \r
+ logger.info("using accepted Taxon: " + matchedTaxon.getTitleCache());\r
+ return matchedTaxon;\r
}\r
//TODO extend method: search using treeUUID, using SecUUID, first find accepted then include synonyms until a matching taxon is found \r
}\r
}\r
+ \r
+ // 2. search for synonyms\r
+ List<TaxonBase> synonymList = dao.findByNameTitleCache(Synonym.class, taxonName, null, MatchMode.EXACT, null, 0, null, null);\r
+ for(TaxonBase taxonBase : synonymList){\r
+ if(taxonBase instanceof Synonym){\r
+ Set<Taxon> acceptetdCandidates = ((Synonym)taxonBase).getAcceptedTaxa();\r
+ if(!acceptetdCandidates.isEmpty()){\r
+ matchedTaxon = acceptetdCandidates.iterator().next();\r
+ if(acceptetdCandidates.size() == 1){\r
+ logger.info(acceptetdCandidates.size() + " Accepted taxa found for synonym " + taxonBase.getTitleCache() + ", using first one: " + matchedTaxon.getTitleCache());\r
+ return matchedTaxon;\r
+ } else {\r
+ logger.info("using accepted Taxon " + matchedTaxon.getTitleCache() + "for synonym " + taxonBase.getTitleCache());\r
+ return matchedTaxon;\r
+ }\r
+ //TODO extend method: search using treeUUID, using SecUUID, first find accepted then include synonyms until a matching taxon is found\r
+ }\r
+ }\r
+ }\r
+ \r
} catch (Exception e){\r
logger.error(e);\r
}\r
\r
return matchedTaxon;\r
}\r
+\r
+ @Override\r
+ public Synonym findBestMatchingSynonym(String taxonName) {\r
+ List<TaxonBase> synonymList = dao.findByNameTitleCache(Synonym.class, taxonName, null, MatchMode.EXACT, null, 0, null, null);\r
+ if(! synonymList.isEmpty()){\r
+ Synonym result = CdmBase.deproxy(synonymList.iterator().next(), Synonym.class);\r
+ if(synonymList.size() == 1){\r
+ logger.info(synonymList.size() + " Synonym found " + result.getTitleCache() );\r
+ return result;\r
+ } else {\r
+ logger.info("Several matching synonyms found. Using first: " + result.getTitleCache());\r
+ return result;\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#moveSynonymToAnotherTaxon(eu.etaxonomy.cdm.model.taxon.SynonymRelationship, eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)\r
+ */\r
+ @Override\r
+ public Taxon moveSynonymToAnotherTaxon(SynonymRelationship synonymRelation,\r
+ Taxon toTaxon, SynonymRelationshipType synonymRelationshipType, Reference reference, String referenceDetail) {\r
+ Taxon fromTaxon = synonymRelation.getAcceptedTaxon();\r
+ \r
+ fromTaxon.removeSynonymRelation(synonymRelation);\r
+ \r
+ toTaxon.addSynonym(synonymRelation.getSynonym(), synonymRelationshipType);\r
+ \r
+ return toTaxon;\r
+ }\r
+ \r
+ \r
}\r