import java.util.ArrayList;\r
import java.util.Comparator;\r
import java.util.HashSet;\r
-import java.util.Iterator;\r
import java.util.List;\r
import java.util.Set;\r
import java.util.UUID;\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.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.BeanInitializer;\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
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
+import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
\r
\r
+/**\r
+ * @author a.kohlbecker\r
+ * @date 10.09.2010\r
+ *\r
+ */\r
@Service\r
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)\r
public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDao> implements ITaxonService{\r
@Autowired\r
private ITaxonNameDao nameDao;\r
\r
+ @Autowired \r
+ private IDescriptionDao descriptionDao;\r
\r
@Autowired\r
private IOrderedTermVocabularyDao orderedVocabularyDao;\r
- @Autowired\r
- private IDescriptionDao descriptionDao;\r
- @Autowired\r
- private BeanInitializer defaultBeanInitializer;\r
- \r
- private Comparator<? super TaxonNode> taxonNodeComparator;\r
- @Autowired\r
- public void setTaxonNodeComparator(ITaxonNodeComparator<? super TaxonNode> taxonNodeComparator){\r
- this.taxonNodeComparator = (Comparator<? super TaxonNode>) taxonNodeComparator;\r
- }\r
\r
/**\r
* Constructor\r
return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
}\r
\r
+ public List<TaxonBase> listTaxaByName(Class<? extends TaxonBase> clazz, String uninomial, String infragenericEpithet, String specificEpithet, String infraspecificEpithet, Rank rank, Integer pageSize,Integer pageNumber) {\r
+ Integer numberOfResults = dao.countTaxaByName(clazz, uninomial, infragenericEpithet, specificEpithet, infraspecificEpithet, rank);\r
+ \r
+ List<TaxonBase> results = new ArrayList<TaxonBase>();\r
+ if(numberOfResults > 0) { // no point checking again\r
+ results = dao.findTaxaByName(clazz, uninomial, infragenericEpithet, specificEpithet, infraspecificEpithet, rank, pageSize, pageNumber); \r
+ }\r
+ \r
+ return results;\r
+ }\r
+\r
public List<TaxonRelationship> listToTaxonRelationships(Taxon taxon, TaxonRelationshipType type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){\r
Integer numberOfResults = dao.countTaxonRelationships(taxon, type, TaxonRelationship.Direction.relatedTo);\r
\r
return heterotypicSynonymyGroups;\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#findTaxaAndNames(eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator)\r
+ */\r
public Pager<IdentifiableEntity> findTaxaAndNames(ITaxonServiceConfigurator configurator) {\r
\r
List<IdentifiableEntity> results = new ArrayList<IdentifiableEntity>();\r
\r
Class<? extends TaxonBase> clazz = null;\r
List<String> propertyPath = new ArrayList<String>();\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
//propertyPath.addAll(configurator.getTaxonPropertyPath());\r
}\r
\r
if(clazz != null){\r
- numberTaxaResults = \r
- dao.countTaxaByName(clazz, \r
- configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(),\r
- configurator.getNamedAreas());\r
- if(numberTaxaResults > configurator.getPageSize() * configurator.getPageNumber()){ // no point checking again if less results\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
+ }\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.getNamedAreas(), configurator.getPageSize(), \r
if (configurator.isDoTaxaByCommonNames()) {\r
taxa = null;\r
numberTaxaResults = 0;\r
- numberTaxaResults = dao.countTaxaByCommonName(configurator.getSearchString(), configurator.getTaxonomicTree(), configurator.getMatchMode(), configurator.getNamedAreas());\r
- if(numberTaxaResults > configurator.getPageSize() * configurator.getPageNumber()){\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
+ }\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
}\r
if(taxa != null){\r
}\r
return results;\r
}\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#matchToTaxon(eu.etaxonomy.cdm.model.name.NonViralName)\r
+ */\r
+ @Override\r
+ public Taxon findBestMatchingTaxon(String taxonName) {\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
+ 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
+ \r
}\r