improving loadRankSpecificRootNodes
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Fri, 5 Feb 2010 08:45:40 +0000 (08:45 +0000)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Fri, 5 Feb 2010 08:45:40 +0000 (08:45 +0000)
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/CdmPersistentDataSource.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonNodeDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonomicTreeDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonomicTreeDao.java

index 39616c7a3e1973f92d369200c67a0ae09d60e8cb..6626becb04a9478727cdee8ceb97e2f585400daa 100644 (file)
@@ -100,8 +100,11 @@ public class CdmPersistentDataSource extends CdmDataSourceBase{
                        }\r
                }\r
        }\r
+\r
+\r
+       private static String dataSourceClassName = BasicDataSource.class.getName();\r
        \r
-       \r
+\r
        //name\r
        protected String dataSourceName;\r
 \r
@@ -567,9 +570,12 @@ public class CdmPersistentDataSource extends CdmDataSourceBase{
                                        dataSource.getMode(),\r
                                        dataSource.getNomenclaturalCode());\r
                }else{\r
-                       Class<? extends DataSource> dataSourceClass =  BasicDataSource.class; //TODO make configurable\r
-\r
-                       return save(\r
+                       \r
+                       Class<? extends DataSource> dataSourceClass;\r
+                       try {\r
+                               dataSourceClass = (Class<? extends DataSource>) Class.forName(dataSourceClassName);\r
+                               \r
+                               CdmPersistentDataSource persistendDatasource =  save(\r
                                        strDataSourceName, \r
                                        dataSource.getDatabaseType(), \r
                                        getCheckedDataSourceParameter(dataSource.getServer()), \r
@@ -580,6 +586,14 @@ public class CdmPersistentDataSource extends CdmDataSourceBase{
                                        dataSourceClass, \r
                                        null, null, null, null, null, null,\r
                                        dataSource.getNomenclaturalCode());\r
+                               \r
+                               return persistendDatasource;\r
+                       } catch (ClassNotFoundException e) {\r
+                               logger.error("DataSourceClass not found - stopping application", e);\r
+                               System.exit(-1);\r
+                       }\r
+                       // will never be reached\r
+                       return null;\r
                }\r
        }\r
 \r
index 257227147c19478eee9cd2999606a2b5d1427a11..83f5e8cafe1638af40856886a26747f7b1480f2b 100644 (file)
@@ -57,7 +57,6 @@ public class TaxonNodeDaoHibernateImpl extends AnnotatableDaoImpl<TaxonNode>
                persistentObject.delete();\r
                super.delete(persistentObject);\r
                \r
-               System.err.println("number of taxa: "+ result.size() );\r
                if (result.size()==1){\r
                        taxonDao.delete(taxon);\r
                }\r
index e1af5d15afcaa53b7cef29900b87992cd52ad3ed..a56ccc474577a5e64b08e080e10092a1a6ab12c7 100644 (file)
 \r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;\r
 \r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
 import org.apache.log4j.Logger;\r
+import org.hibernate.Query;\r
 import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.stereotype.Repository;\r
 \r
+import eu.etaxonomy.cdm.model.name.Rank;\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.ITaxonomicTreeDao;\r
@@ -36,5 +43,20 @@ public class TaxonomicTreeDaoHibernateImpl extends IdentifiableDaoBase<Taxonomic
                indexedClasses[0] = TaxonomicTree.class;\r
        }\r
        \r
+       public List<TaxonNode> loadRankSpecificRootNodes(TaxonomicTree taxonomicTree, Rank rank, List<String> propertyPaths){\r
+               String hql = "SELECT 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 < :rank AND tn.parent = null)" +\r
+                               " OR (tn.taxon.name.rank > :rank AND ctn.taxon.name.rank < :rank)" +\r
+                               " )";\r
+               Query query = getSession().createQuery(hql);\r
+               query.setParameter("rank", rank);\r
+               query.setParameter("tree", taxonomicTree);\r
+               List<TaxonNode> results = query.list();\r
+               defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+               return results;\r
+       }\r
+       \r
        \r
 }\r
index 37f04f88cdd5b0722a1235d91d29229915f7b49f..7d676a9cfba6f46a46ccf3ca34818386f2c65e2d 100644 (file)
@@ -9,6 +9,10 @@
 \r
 package eu.etaxonomy.cdm.persistence.dao.taxon;\r
 \r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao;\r
 \r
@@ -18,5 +22,17 @@ import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao;
  */\r
 public interface ITaxonomicTreeDao extends IIdentifiableDao<TaxonomicTree> {\r
        \r
-       \r
+       /**\r
+        * Loads all TaxonNodes of the specified tree for a given Rank.\r
+        * If a branch does not contain a TaxonNode with a TaxonName at the given\r
+        * Rank the node associated with the next lower Rank is taken as root node.\r
+        * If the <code>rank</code> is null the absolute root nodes will be returned.\r
+        *\r
+        * @param taxonomicTree\r
+        * @param rank may be null\r
+        * @param propertyPaths\r
+        * @return\r
+        */\r
+       public List<TaxonNode> loadRankSpecificRootNodes(TaxonomicTree taxonomicTree, Rank rank, List<String> propertyPaths);\r
+\r
 }\r