Added findByReferenceTitle()
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / taxon / TaxonomicTreeDaoHibernateImpl.java
index e1af5d15afcaa53b7cef29900b87992cd52ad3ed..fd58dcca2ac7ef86e2e3de7659242c4e309a7f74 100644 (file)
 \r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;\r
 \r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Set;\r
+import java.util.UUID;\r
+\r
 import org.apache.log4j.Logger;\r
+import org.hibernate.Query;\r
+import org.hibernate.Session;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.stereotype.Repository;\r
 \r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\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.dao.taxon.ITaxonNodeDao;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonomicTreeDao;\r
 \r
 /**\r
@@ -30,11 +46,57 @@ public class TaxonomicTreeDaoHibernateImpl extends IdentifiableDaoBase<Taxonomic
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(TaxonomicTreeDaoHibernateImpl.class);\r
        \r
+       @Autowired\r
+       private ITaxonNodeDao taxonNodeDao;\r
+       \r
        public TaxonomicTreeDaoHibernateImpl() {\r
                super(TaxonomicTree.class);\r
                indexedClasses = new Class[1];\r
                indexedClasses[0] = TaxonomicTree.class;\r
        }\r
        \r
+       @SuppressWarnings("unchecked")\r
+       public List<TaxonNode> loadRankSpecificRootNodes(TaxonomicTree taxonomicTree, Rank rank, List<String> propertyPaths){\r
+               List<TaxonNode> results;\r
+               if(rank == null){\r
+                       taxonomicTree = load(taxonomicTree.getUuid());\r
+                       results = new ArrayList(); \r
+                       results.addAll(taxonomicTree.getChildNodes());\r
+               } else {\r
+                       String hql = "SELECT DISTINCT tn FROM TaxonNode tn LEFT JOIN tn.childNodes as ctn" +\r
+                               " WHERE tn.taxonomicTree = :tree  AND (" +\r
+                               " tn.taxon.name.rank = :rank" +\r
+                               " OR (tn.taxon.name.rank.orderIndex > :rankOrderIndex AND tn.parent = null)" +\r
+                               " OR (tn.taxon.name.rank.orderIndex < :rankOrderIndex AND ctn.taxon.name.rank.orderIndex > :rankOrderIndex)" +\r
+                               " )";\r
+                       Query query = getSession().createQuery(hql);\r
+                       query.setParameter("rank", rank);\r
+                       query.setParameter("rankOrderIndex", rank.getOrderIndex());\r
+                       query.setParameter("tree", taxonomicTree);\r
+                       results = query.list();\r
+               }\r
+               defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+               return results;\r
+               \r
+       }\r
+       \r
+       @Override\r
+       public UUID delete(TaxonomicTree persistentObject){\r
+               //delete all childnodes, then delete the tree\r
+               \r
+               Set<TaxonNode> nodes = persistentObject.getChildNodes();\r
+               Iterator<TaxonNode> nodesIterator = nodes.iterator();\r
+               \r
+               while(nodesIterator.hasNext()){\r
+                       TaxonNode node = nodesIterator.next();\r
+                       taxonNodeDao.delete(node);\r
+               }\r
+                               \r
+               super.delete(persistentObject);\r
+               \r
+               return persistentObject.getUuid();\r
+       }\r
+\r
+       \r
        \r
 }\r