Corrected the inheritance of service configurators
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / TaxonServiceImpl.java
index 54d785803b2e07e060c8abdf4fa218ccf9e1d0aa..2b8b30bcaf8854eaf82270ed14d6b3be6d06bf19 100644 (file)
@@ -24,29 +24,25 @@ import org.springframework.transaction.annotation.Propagation;
 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
@@ -55,7 +51,6 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 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
@@ -95,7 +90,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         * 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
@@ -122,21 +117,21 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 \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
@@ -145,19 +140,19 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
        \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
@@ -184,7 +179,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         * @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
@@ -294,7 +289,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                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
@@ -462,12 +457,12 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                        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.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
@@ -507,10 +502,10 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                        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
@@ -553,13 +548,13 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                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
@@ -655,4 +650,37 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                \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