added @Qualifier to help autowiring in cdmlib-remote
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / taxon / TaxonDaoHibernateImpl.java
index d0318b6c23fdcc9368992530524e063575f3ce69..db6d8c18657445d4e9ff1f580ee4f8b95fd2b1e4 100644 (file)
@@ -1,11 +1,11 @@
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;\r
 \r
 import java.util.ArrayList;\r
@@ -13,21 +13,32 @@ import java.util.List;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
-import javax.persistence.FetchType;\r
-\r
 import org.apache.log4j.Logger;\r
 import org.hibernate.Criteria;\r
 import org.hibernate.FetchMode;\r
+import org.hibernate.LazyInitializationException;\r
 import org.hibernate.Query;\r
+import org.hibernate.criterion.Criterion;\r
+import org.hibernate.criterion.Projections;\r
 import org.hibernate.criterion.Restrictions;\r
+import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.dao.DataAccessException;\r
 import org.springframework.stereotype.Repository;\r
 \r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.OriginalSource;\r
+import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\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.Taxon;\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.ITitledDao;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
 import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
@@ -36,9 +47,22 @@ import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;
  * @author a.mueller\r
  *\r
  */\r
+/**\r
+ * @author a.mueller\r
+ * @created 24.11.2008\r
+ * @version 1.0\r
+ */\r
+/**\r
+ * @author a.mueller\r
+ * @created 24.11.2008\r
+ * @version 1.0\r
+ */\r
 @Repository\r
+@Qualifier("taxonDaoHibernateImpl")\r
 public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implements ITaxonDao {\r
-       static Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
+       \r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
 \r
        public TaxonDaoHibernateImpl() {\r
                super(TaxonBase.class);\r
@@ -48,47 +72,58 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
         * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase)\r
         */\r
        public List<Taxon> getRootTaxa(ReferenceBase sec) {\r
-               return getRootTaxa(sec, CdmFetch.FETCH_CHILDTAXA(), true);\r
+               return getRootTaxa(sec, CdmFetch.FETCH_CHILDTAXA(), true, false);\r
        }\r
+       \r
+\r
 \r
        /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean)\r
+        * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, eu.etaxonomy.cdm.persistence.fetch.CdmFetch, java.lang.Boolean, java.lang.Boolean)\r
         */\r
-       public List<Taxon> getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, Boolean onlyWithChildren) {\r
+       public List<Taxon> getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, Boolean onlyWithChildren, Boolean withMisapplications) {\r
                if (onlyWithChildren == null){\r
                        onlyWithChildren = true;\r
                }\r
+               if (withMisapplications == null){\r
+                       withMisapplications = true;\r
+               }\r
                if (cdmFetch == null){\r
                        cdmFetch = CdmFetch.NO_FETCH();\r
                }\r
-               \r
-               \r
+\r
+\r
 //             String query = "from Taxon root ";\r
 //             query += " where root.taxonomicParentCache is NULL ";\r
 //             if (sec != null){\r
-//                     query += " AND root.sec.id = :sec "; \r
+//             query += " AND root.sec.id = :sec "; \r
 //             }               \r
 //             Query q = getSession().createQuery(query);\r
 //             if (sec != null){\r
-//                     q.setInteger("sec", sec.getId());\r
+//             q.setInteger("sec", sec.getId());\r
 //             }\r
-               \r
-               \r
+\r
+\r
                Criteria crit = getSession().createCriteria(Taxon.class);\r
                crit.add(Restrictions.isNull("taxonomicParentCache"));\r
                if (sec != null){\r
                        crit.add(Restrictions.eq("sec", sec) );\r
                }\r
-//             if (! cdmFetch.includes(CdmFetch.FETCH_CHILDTAXA())){\r
-//                     logger.warn("no child taxa fetch qq");\r
+\r
+\r
+               if (! cdmFetch.includes(CdmFetch.FETCH_CHILDTAXA())){\r
+                       logger.warn("no child taxa fetch");\r
                        //TODO overwrite LAZY (SELECT) does not work (bug in hibernate?)\r
-//                     crit.setFetchMode("relationsToThisTaxon.fromTaxon", FetchMode.LAZY);\r
-//             }\r
-               \r
+                       crit.setFetchMode("relationsToThisTaxon.fromTaxon", FetchMode.LAZY);\r
+               }\r
+\r
                List<Taxon> results = new ArrayList<Taxon>();\r
                for(Taxon taxon : (List<Taxon>) crit.list()){\r
+                       //childTaxa\r
+                       //TODO create restriction instead\r
                        if (onlyWithChildren == false || taxon.hasTaxonomicChildren()){\r
-                               results.add(taxon);\r
+                               if (withMisapplications == true || ! taxon.isMisappliedName()){\r
+                                       results.add(taxon);\r
+                               }\r
                        }\r
                }\r
                return results;\r
@@ -97,38 +132,304 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
        public List<TaxonBase> getTaxaByName(String name, ReferenceBase sec) {\r
                Criteria crit = getSession().createCriteria(Taxon.class);\r
                if (sec != null){\r
+                       if(sec.getId() == 0){\r
+                               getSession().save(sec);\r
+                       }\r
                        crit.add(Restrictions.eq("sec", sec ) );\r
                }\r
-               crit.createCriteria("name").add(Restrictions.eq("titleCache", name));\r
+               crit.createCriteria("name").add(Restrictions.like("nameCache", name));\r
                List<TaxonBase> results = crit.list();\r
                return results;\r
        }\r
 \r
-       public List<TaxonBase> getAllTaxa(Integer pagesize, Integer page) {\r
+       public List<TaxonBase> getAllTaxonBases(Integer pagesize, Integer page) {\r
                Criteria crit = getSession().createCriteria(TaxonBase.class);\r
                List<TaxonBase> results = crit.list();\r
                // TODO add page & pagesize criteria\r
                return results;\r
        }\r
-       \r
+\r
+       public List<Synonym> getAllSynonyms(Integer limit, Integer start) {\r
+               Criteria crit = getSession().createCriteria(Synonym.class);\r
+               List<Synonym> results = crit.list();\r
+               return results;\r
+       }\r
+\r
+       public List<Taxon> getAllTaxa(Integer limit, Integer start) {\r
+               Criteria crit = getSession().createCriteria(Taxon.class);\r
+               List<Taxon> results = crit.list();\r
+               return results;\r
+       }\r
+\r
+       public List<RelationshipBase> getAllRelationships(Integer limit, Integer start) {\r
+               Criteria crit = getSession().createCriteria(RelationshipBase.class);\r
+               List<RelationshipBase> results = crit.list();\r
+               return results;\r
+       }\r
+\r
        @Override\r
-       public UUID delete(TaxonBase persistentObject) throws DataAccessException{\r
-               Set<Annotation> annotations = persistentObject.getAnnotations();\r
-               for (Annotation annotation: annotations){\r
-                       persistentObject.removeAnnotation(annotation);\r
-               }\r
-               Set<Marker> markers = persistentObject.getMarkers();\r
-               for (Marker marker: markers){\r
-                       persistentObject.removeMarker(marker);\r
-               }\r
-//             Set<Marker> markers = persistentObject.getMarkers();\r
-//             for (Marker marker: markers){\r
-//                     persistentObject.removeSource(source)(marker);\r
-//             }\r
+       public UUID delete(TaxonBase taxonBase) throws DataAccessException{\r
+               //getSession().update(taxonBase); doesn't work with lazy collections\r
+               //annotations\r
+               try {\r
+                       Set<Annotation> annotations = taxonBase.getAnnotations();\r
+                       for (Annotation annotation: annotations){\r
+                               taxonBase.removeAnnotation(annotation);\r
+                       }\r
+               } catch (LazyInitializationException e) {\r
+                       logger.warn("LazyInitializationException: " + e);\r
+               }\r
+               //markers\r
+               try {\r
+                       Set<Marker> markers = taxonBase.getMarkers();\r
+                       for (Marker marker: markers){\r
+                               taxonBase.removeMarker(marker);\r
+                       }\r
+               } catch (LazyInitializationException e) {\r
+                       logger.warn("LazyInitializationException: " + e);\r
+               }\r
+               //originalSource\r
+               try {\r
+                       Set<OriginalSource> origSources = taxonBase.getSources();\r
+                       for (OriginalSource source: origSources){\r
+                               taxonBase.removeSource(source);\r
+                       }\r
+               } catch (LazyInitializationException e) {\r
+                       logger.warn("LazyInitializationException: " + e);\r
+               }\r
+               //is Taxon\r
+               taxonBase.getName().removeTaxonBase(taxonBase);\r
+               if (taxonBase instanceof Taxon){\r
+                       //taxonRelationships\r
+                       Taxon taxon = (Taxon)taxonBase;\r
+                       Set<TaxonRelationship> taxRels = taxon.getTaxonRelations();\r
+                       for (TaxonRelationship taxRel: taxRels){\r
+                               taxon.removeTaxonRelation(taxRel);\r
+                       } ;\r
+                       //SynonymRelationships\r
+                       Set<SynonymRelationship> synRels = taxon.getSynonymRelations();\r
+                       for (SynonymRelationship synRel: synRels){\r
+                               taxon.removeSynonymRelation(synRel);\r
+                       } ;\r
+               }//is Synonym\r
+               else if (taxonBase instanceof Synonym){\r
+                       Synonym synonym = (Synonym)taxonBase;\r
+                       Set<SynonymRelationship> synRels = synonym.getSynonymRelations();\r
+                       for (SynonymRelationship synRel: synRels){\r
+                               synonym.removeSynonymRelation(synRel);\r
+                       } ;\r
+               }\r
+               return super.delete(taxonBase);\r
+       }\r
+\r
+\r
+       // TODO add generic return type !!\r
+       public List findByName(String queryString, ITitledDao.MATCH_MODE matchMode, int page, int pagesize, boolean onlyAcccepted) {\r
+               ArrayList<Criterion> criteria = new ArrayList<Criterion>();\r
+               //TODO ... Restrictions.eq(propertyName, value)\r
+               return super.findByTitle(queryString, matchMode, page, pagesize, criteria);\r
+\r
+       }\r
+\r
+       public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted) {\r
+\r
+               Criteria crit = getSession().createCriteria(type);\r
+               crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
+               crit.setProjection(Projections.rowCount());\r
+               int result = ((Integer)crit.list().get(0)).intValue();\r
+               return result;\r
+       }\r
+\r
+\r
+       public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted, List<Criterion> criteria) {\r
+\r
+               Criteria crit = getSession().createCriteria(type);\r
+               crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
+               if(criteria != null){\r
+                       for (Criterion criterion : criteria) {\r
+                               crit.add(criterion);\r
+                       }\r
+               }\r
+               crit.setProjection(Projections.rowCount());\r
+               int result = ((Integer)crit.list().get(0)).intValue();\r
+               return result;\r
+       }\r
+\r
+       public int countRelatedTaxa(Taxon taxon, TaxonRelationshipType type) {\r
+               Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\r
+               \r
+               return ((Long)query.uniqueResult()).intValue();\r
+       }\r
+\r
+       public int countSynonyms(Taxon taxon, SynonymRelationshipType type) {\r
+        Query query = null;\r
                \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
                \r
+               query.setParameter("relatedTo", taxon);\r
                \r
-               return null;\r
+               return ((Long)query.uniqueResult()).intValue();\r
+       }\r
+\r
+       public int countTaxa(String queryString, Boolean accepted) {\r
+               throw new UnsupportedOperationException("Free text searching isn't implemented yet, sorry!");\r
        }\r
+\r
+       public int countTaxaByName(Boolean accepted, String genusOrUninomial,   String infraGenericEpithet, String specificEpithet,     String infraSpecificEpithet, Rank rank) {\r
+        Criteria criteria = null;\r
+               \r
+               if(accepted == null) {\r
+                       criteria = getSession().createCriteria(TaxonBase.class);\r
+               } else {\r
+                       if(accepted) {\r
+                               criteria = getSession().createCriteria(Taxon.class);\r
+                       } else {\r
+                               criteria = getSession().createCriteria(Synonym.class);\r
+                       }\r
+               }\r
+               \r
+               criteria.setFetchMode( "name", FetchMode.JOIN );\r
+               criteria.createAlias("name", "name");\r
+               \r
+               if(genusOrUninomial != null) {\r
+                       criteria.add(Restrictions.eq("name.genusOrUninomial", genusOrUninomial));\r
+               }\r
+               \r
+               if(infraGenericEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraGenericEpithet", infraGenericEpithet));\r
+               }\r
+               \r
+               if(specificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.specificEpithet", specificEpithet));\r
+               }\r
+               \r
+               if(infraSpecificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraSpecificEpithet", infraSpecificEpithet));\r
+               }\r
+               \r
+               if(rank != null) {\r
+                       criteria.add(Restrictions.eq("name.rank", rank));\r
+               }\r
+               \r
+               criteria.setProjection(Projections.projectionList().add(Projections.rowCount()));\r
        \r
+               return (Integer)criteria.uniqueResult();\r
+       }\r
+\r
+       public List<TaxonBase> findTaxaByName(Boolean accepted, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank, Integer pageSize,  Integer pageNumber) {\r
+               Criteria criteria = null;\r
+               \r
+               if(accepted == null) {\r
+                       criteria = getSession().createCriteria(TaxonBase.class);\r
+               } else {\r
+                       if(accepted) {\r
+                               criteria = getSession().createCriteria(Taxon.class);\r
+                       } else {\r
+                               criteria = getSession().createCriteria(Synonym.class);\r
+                       }\r
+               }\r
+               \r
+               criteria.setFetchMode( "name", FetchMode.JOIN );\r
+               criteria.createAlias("name", "name");\r
+               \r
+               if(genusOrUninomial != null) {\r
+                       criteria.add(Restrictions.eq("name.genusOrUninomial", genusOrUninomial));\r
+               }\r
+               \r
+               if(infraGenericEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraGenericEpithet", infraGenericEpithet));\r
+               } else {\r
+                       criteria.add(Restrictions.isNull("name.infraGenericEpithet"));\r
+               }\r
+               \r
+               if(specificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.specificEpithet", specificEpithet));\r
+               }\r
+               \r
+               if(infraSpecificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraSpecificEpithet", infraSpecificEpithet));\r
+               }\r
+               \r
+               if(rank != null) {\r
+                       criteria.add(Restrictions.eq("name.rank", rank));\r
+               }\r
+               \r
+               if(pageSize != null) {\r
+               criteria.setMaxResults(pageSize);\r
+                   if(pageNumber != null) {\r
+                       criteria.setFirstResult(pageNumber * pageSize);\r
+                   } else {\r
+                       criteria.setFirstResult(0);\r
+                   }\r
+               }\r
+       \r
+               return (List<TaxonBase>)criteria.list();\r
+       }\r
+\r
+       public List<TaxonRelationship> getRelatedTaxa(Taxon taxon,      TaxonRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\r
+               \r
+               if(pageSize != null) {\r
+                   query.setMaxResults(pageSize);\r
+                   if(pageNumber != null) {\r
+                       query.setFirstResult(pageNumber * pageSize);\r
+                   } else {\r
+                       query.setFirstResult(0);\r
+                   }\r
+               }\r
+               \r
+               return (List<TaxonRelationship>)query.list();\r
+       }\r
+\r
+       public List<SynonymRelationship> getSynonyms(Taxon taxon, SynonymRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\r
+               \r
+               if(pageSize != null) {\r
+                   query.setMaxResults(pageSize);\r
+                   if(pageNumber != null) {\r
+                       query.setFirstResult(pageNumber * pageSize);\r
+                   } else {\r
+                       query.setFirstResult(0);\r
+                   }\r
+               }\r
+               \r
+               return (List<SynonymRelationship>)query.list();\r
+       }\r
+\r
+       public List<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber) {\r
+               throw new UnsupportedOperationException("Free text searching isn't implemented yet, sorry!");\r
+       }\r
+\r
 }
\ No newline at end of file