Name search functionality for taxonomic editor
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TaxonServiceImpl.java
index e4e4d571b780333057d4f735029142cccf9dc116..6d0d9c916a8c5a897b8e177fed28488a9d8f33ee 100644 (file)
@@ -9,14 +9,31 @@
 \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
@@ -26,30 +43,23 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 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
@@ -78,19 +88,19 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
        }\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
@@ -107,7 +117,7 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
                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
@@ -115,14 +125,23 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
         * @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
@@ -133,7 +152,7 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
                }\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
@@ -230,4 +249,109 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
 //             }\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