\r
package eu.etaxonomy.cdm.api.service;\r
\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.UUID;\r
+\r
import org.apache.log4j.Logger;\r
import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.stereotype.Service;\r
import org.springframework.transaction.TransactionStatus;\r
import org.springframework.transaction.annotation.Transactional;\r
\r
+import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\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.TermVocabulary;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;\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.taxon.Synonym;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.cdm.persistence.dao.common.IOrderedTermVocabularyDao;\r
+import eu.etaxonomy.cdm.persistence.dao.name.INomenclaturalStatusDao;\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
\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
\r
@Service\r
@Transactional(readOnly = true)\r
-public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonService {\r
- static Logger logger = Logger.getLogger(TaxonServiceImpl.class);\r
- \r
- private ITaxonDao taxonDao;\r
- \r
- @Autowired\r
- protected void setDao(ITaxonDao dao) {\r
- this.dao = dao;\r
- this.taxonDao = dao;\r
- }\r
+public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDao> implements ITaxonService {\r
+ private static final Logger logger = Logger.getLogger(TaxonServiceImpl.class);\r
\r
+ @Autowired\r
+ private ITaxonNameDao nameDao;\r
+ @Autowired\r
+ private IOrderedTermVocabularyDao orderedVocabularyDao;\r
+ \r
public TaxonBase getTaxonByUuid(UUID uuid) {\r
return super.getCdmObjectByUuid(uuid); \r
}\r
}\r
\r
public List<TaxonBase> searchTaxaByName(String name, ReferenceBase sec) {\r
- return taxonDao.getTaxaByName(name, sec);\r
+ return dao.getTaxaByName(name, sec);\r
}\r
\r
public List<TaxonBase> getAllTaxonBases(int limit, int start){\r
- return taxonDao.list(limit, start);\r
+ return dao.list(limit, start);\r
}\r
\r
public List<Taxon> getAllTaxa(int limit, int start){\r
- return taxonDao.getAllTaxa(limit, start);\r
+ return dao.getAllTaxa(limit, start);\r
}\r
\r
public List<Synonym> getAllSynonyms(int limit, int start) {\r
- return taxonDao.getAllSynonyms(limit, start);\r
+ return dao.getAllSynonyms(limit, start);\r
}\r
\r
/* (non-Javadoc)\r
if (cdmFetch == null){\r
cdmFetch = CdmFetch.NO_FETCH();\r
}\r
- return taxonDao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
+ return dao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
}\r
\r
\r
* @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean, boolean)\r
*/\r
public List<Taxon> getRootTaxa(ReferenceBase sec, boolean onlyWithChildren,\r
- boolean withMisaplications) {\r
- return taxonDao.getRootTaxa(sec, null, onlyWithChildren, withMisaplications);\r
+ boolean withMisapplications) {\r
+ return dao.getRootTaxa(sec, null, onlyWithChildren, withMisapplications);\r
}\r
\r
public List<RelationshipBase> getAllRelationships(int limit, int start){\r
- return taxonDao.getAllRelationships(limit, start);\r
+ return dao.getAllRelationships(limit, start);\r
}\r
\r
+ public OrderedTermVocabulary<TaxonRelationshipType> getTaxonRelationshipTypeVocabulary() {\r
+ \r
+ String taxonRelTypeVocabularyId = "15db0cf7-7afc-4a86-a7d4-221c73b0c9ac";\r
+ UUID uuid = UUID.fromString(taxonRelTypeVocabularyId);\r
+ OrderedTermVocabulary<TaxonRelationshipType> taxonRelTypeVocabulary = \r
+ (OrderedTermVocabulary)orderedVocabularyDao.findByUuid(uuid);\r
+ return taxonRelTypeVocabulary;\r
+ }\r
+\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.api.service.ITaxonService#makeTaxonSynonym(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.model.taxon.Taxon)\r
*/\r
}\r
\r
// Move oldTaxon to newTaxon\r
- TaxonNameBase synonymName = oldTaxon.getName();\r
+ TaxonNameBase<?,?> synonymName = oldTaxon.getName();\r
if (synonymType == null){\r
if (synonymName.isHomotypic(newAcceptedTaxon.getName())){\r
synonymType = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
// }\r
\r
}\r
+\r
+ @Autowired\r
+ protected void setDao(ITaxonDao dao) {\r
+ this.dao = dao;\r
+ }\r
+\r
+ public Pager<TaxonBase> findTaxaByName(Boolean accepted, String uninomial, String infragenericEpithet, String specificEpithet, String infraspecificEpithet, Rank rank, Integer pageSize,Integer pageNumber) {\r
+ Integer numberOfResults = dao.countTaxaByName(accepted, 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(accepted, uninomial, infragenericEpithet, specificEpithet, infraspecificEpithet, rank, pageSize, pageNumber); \r
+ }\r
+ \r
+ return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
+ }\r
+\r
+ public Pager<TaxonRelationship> getRelatedTaxa(Taxon taxon, TaxonRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+ Integer numberOfResults = dao.countRelatedTaxa(taxon, type);\r
+ \r
+ List<TaxonRelationship> results = new ArrayList<TaxonRelationship>();\r
+ if(numberOfResults > 0) { // no point checking again\r
+ results = dao.getRelatedTaxa(taxon, type, pageSize, pageNumber); \r
+ }\r
+ \r
+ return new DefaultPagerImpl<TaxonRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+ }\r
+\r
+ public Pager<SynonymRelationship> getSynonyms(Taxon taxon, SynonymRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+ Integer numberOfResults = dao.countSynonyms(taxon, type);\r
+ \r
+ List<SynonymRelationship> results = new ArrayList<SynonymRelationship>();\r
+ if(numberOfResults > 0) { // no point checking again\r
+ results = dao.getSynonyms(taxon, type, pageSize, pageNumber); \r
+ }\r
+ \r
+ return new DefaultPagerImpl<SynonymRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+ }\r
+\r
+ public Pager<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber) {\r
+ Integer numberOfResults = dao.countTaxa(queryString, accepted);\r
+ \r
+ List<TaxonBase> results = new ArrayList<TaxonBase>();\r
+ if(numberOfResults > 0) { // no point checking again\r
+ results = dao.searchTaxa(queryString, accepted, pageSize, pageNumber); \r
+ }\r
+ \r
+ return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
+ }\r
+\r
+ \r
+ public Pager<IdentifiableEntity> findTaxaAndNames(ITaxonServiceConfigurator configurator) {\r
+ \r
+ List<IdentifiableEntity> results = new ArrayList<IdentifiableEntity>();\r
+ int numberOfResults = 0;\r
+\r
+ if(configurator.isDoTaxa()) {\r
+ int numberTaxaResults = dao.countTaxaByName(configurator.getSearchString(), true, configurator.getSec());\r
+ if (logger.isDebugEnabled()) { logger.debug(numberTaxaResults + " taxa counted"); }\r
+ if (numberTaxaResults > 0) {\r
+ List<TaxonBase> taxa = \r
+ dao.getTaxaByName(configurator.getSearchString(), true, configurator.getSec());\r
+ if (!results.addAll(taxa)) {\r
+ logger.warn("Problem adding taxa to result");\r
+ }\r
+ numberOfResults += numberTaxaResults;\r
+ }\r
+ }\r
+\r
+ if(configurator.isDoSynonyms()) {\r
+ int numberSynonymResults = dao.countTaxaByName(configurator.getSearchString(), false, configurator.getSec());\r
+ if (logger.isDebugEnabled()) { logger.debug(numberSynonymResults + " synonyms counted"); }\r
+ if (numberSynonymResults > 0) {\r
+ List<TaxonBase> synonyms = \r
+ dao.getTaxaByName(configurator.getSearchString(), false, configurator.getSec());\r
+ if (!results.addAll(synonyms)) {\r
+ logger.warn("Problem adding synonyms to result");\r
+ }\r
+ numberOfResults += numberSynonymResults;\r
+ }\r
+ }\r
+\r
+ if (configurator.isDoNamesWithoutTaxa()) {\r
+ int numberNameResults = nameDao.countNames(configurator.getSearchString());\r
+ // TODO: Implement and use a count-method that counts names without taxa\r
+ if (logger.isDebugEnabled()) { logger.debug(numberNameResults + " names counted"); }\r
+ if (numberNameResults > 0) {\r
+ List<TaxonNameBase<?,?>> names = \r
+ nameDao.searchNames(configurator.getSearchString(), null, null);\r
+ for (TaxonNameBase<?,?> taxonName : names) {\r
+ if (taxonName.getTaxonBases().size() == 0) {\r
+ if (!results.add(taxonName)) {\r
+ logger.warn("Problem adding taxon name " + taxonName.getTitleCache() + " to result");\r
+ } else {\r
+ numberNameResults++;\r
+ }\r
+ }\r
+ }\r
+ numberOfResults += numberNameResults;\r
+ }\r
+ }\r
+ return new DefaultPagerImpl<IdentifiableEntity>\r
+ (configurator.getPageNumber(), numberOfResults, configurator.getPageSize(), results);\r
+ }\r
+ \r
}\r