From: <jbo...@li...> - 2006-01-16 06:47:19
|
Author: mic...@jb... Date: 2006-01-16 01:47:05 -0500 (Mon, 16 Jan 2006) New Revision: 2106 Added: trunk/labs/jbossrules/drools-repository/src/test/resources/drools-repository-db.cfg.xml Removed: trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/HibernateUtil.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java Log: better configuration Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/HibernateUtil.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/HibernateUtil.java 2006-01-16 03:51:58 UTC (rev 2105) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/HibernateUtil.java 2006-01-16 06:47:05 UTC (rev 2106) @@ -1,9 +1,23 @@ package org.drools.repository.db; + + +import org.drools.repository.ApplicationDataDef; +import org.drools.repository.FunctionDef; +import org.drools.repository.ImportDef; +import org.drools.repository.RuleDef; +import org.drools.repository.RuleSetAttachment; +import org.drools.repository.RuleSetDef; +import org.drools.repository.RuleSetVersionInfo; +import org.drools.repository.Tag; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; -import org.hibernate.event.SaveOrUpdateEventListener; +/** + * The usual hibernate helper, with a few tweaks. + * @author <a href="mailto:mic...@gm..."> Michael Neale</a> + * + */ public class HibernateUtil { private static final SessionFactory sessionFactory; @@ -11,10 +25,11 @@ static { try { - // Create the SessionFactory from hibernate.cfg.xml - Configuration cfg = new Configuration(); + Configuration cfg = new Configuration(); cfg.setInterceptor( new StoreEventListener() ); - cfg.configure(); + registerPersistentClasses( cfg ); + cfg.configure("drools-repository-db.cfg.xml"); + sessionFactory = cfg.buildSessionFactory(); } catch ( Throwable ex ) { @@ -24,6 +39,21 @@ } } + /** + * Use class based registration for refactor-friendly goodness. + */ + private static void registerPersistentClasses(Configuration cfg) { + cfg + .addClass(ApplicationDataDef.class) + .addClass(FunctionDef.class) + .addClass(RuleDef.class) + .addClass(Tag.class) + .addClass(RuleSetDef.class) + .addClass(RuleSetAttachment.class) + .addClass(RuleSetVersionInfo.class) + .addClass(ImportDef.class); + } + public static SessionFactory getSessionFactory() { return sessionFactory; } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java 2006-01-16 03:51:58 UTC (rev 2105) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java 2006-01-16 06:47:05 UTC (rev 2106) @@ -8,195 +8,185 @@ import org.drools.repository.RuleSetDef; import org.hibernate.Session; - /** - * The repository manager takes care of storing and sychronising the repository data with - * the repository database. + * The repository manager takes care of storing and sychronising the repository + * data with the repository database. + * + * @author <a href ="mailto:suj...@co..."> Sujit Pal </a> * @author <a href="mailto:mic...@gm..."> Michael Neale</a> */ -public class RepositoryImpl implements Repository { +public class RepositoryImpl + implements + Repository { /** This will simply save the current version of the rule */ public void save(RuleDef newRule) { Session session = getSessionNewTx(); - session.saveOrUpdate(newRule); + session.saveOrUpdate( newRule ); commit( session ); } - - - - public RuleDef loadRule(String ruleName, long versionNumber) { + public RuleDef loadRule(String ruleName, + long versionNumber) { Session session = getSessionNewTx(); - - RuleDef result = (RuleDef) session.createQuery("from RuleDef where name = :name and versionNumber = :version") - .setString("name", ruleName) - .setLong("version", versionNumber).uniqueResult(); - + + RuleDef result = (RuleDef) session.createQuery( "from RuleDef where name = :name and versionNumber = :version" ).setString( "name", + ruleName ).setLong( "version", + versionNumber ).uniqueResult(); + commit( session ); return result; } - + public List listRuleVersions(String ruleName) { Session session = getSessionNewTx(); - - List result = (List) session.createQuery("from RuleDef where name = :name order by versionNumber") - .setString("name", ruleName).list(); - + + List result = (List) session.createQuery( "from RuleDef where name = :name order by versionNumber" ).setString( "name", + ruleName ).list(); + commit( session ); - return result; + return result; } - + public List listRuleSaveHistory(RuleDef rule) { Session session = getSessionNewTx(); - disableHistoryFilter(session); - - List result = (List) session.createQuery("from RuleDef where historicalId = :id") - .setLong("id", rule.getId().longValue()).list(); - - enableHistoryFilter(session); + disableHistoryFilter( session ); + + List result = (List) session.createQuery( "from RuleDef where historicalId = :id" ).setLong( "id", + rule.getId().longValue() ).list(); + + enableHistoryFilter( session ); commit( session ); return result; } - + public List findRulesByTag(String tag) { Session session = getSessionNewTx(); - List result = session.createQuery("from RuleDef as rule " + - "join rule.tags as tags " + - "where tags.tag = :tag") - .setString("tag", tag) - .list(); + List result = session.createQuery( "from RuleDef as rule " + + "join rule.tags as tags " + + "where tags.tag = :tag" ).setString( "tag", tag ).list(); commit( session ); return result; } - - /** Save the ruleset. The Ruleset will not be reloaded. */ public void save(RuleSetDef ruleSet) { - Session session = getSessionNewTx(); - session.saveOrUpdate(ruleSet); + Session session = getSessionNewTx(); + session.saveOrUpdate( ruleSet ); commit( session ); } - - /** - * This loads a RuleSet with the appropriate workingVersionNumber applied to its assets. - * @param workingVersionNumber The version of the ruleset and rules you want to work on. - * @param ruleSetName The ruleset name to retrieve (ruleset names must be unique). + + /** + * This loads a RuleSet with the appropriate workingVersionNumber applied to + * its assets. + * + * @param workingVersionNumber + * The version of the ruleset and rules you want to work on. + * @param ruleSetName + * The ruleset name to retrieve (ruleset names must be unique). */ - public RuleSetDef loadRuleSet(String ruleSetName, long workingVersionNumber) { + public RuleSetDef loadRuleSet(String ruleSetName, + long workingVersionNumber) { Session session = getSessionNewTx(); - + enableVersionFilter( workingVersionNumber, session ); - + RuleSetDef def = loadRuleSetByName( ruleSetName, - session ); - def.setWorkingVersionNumber(workingVersionNumber); - + session ); + def.setWorkingVersionNumber( workingVersionNumber ); + disableVersionFilter( session ); commit( session ); return def; } - - - private RuleSetDef loadRuleSetByName(String ruleSetName, Session session) { - RuleSetDef def = (RuleSetDef) - session.createQuery("from RuleSetDef where name = :name") - .setString("name", ruleSetName ).uniqueResult(); + RuleSetDef def = (RuleSetDef) session.createQuery( "from RuleSetDef where name = :name" ).setString( "name", + ruleSetName ).uniqueResult(); return def; } - public RuleSetAttachment loadAttachment(String name) { Session session = getSessionNewTx(); - RuleSetAttachment at = (RuleSetAttachment) - session.createQuery("from RuleSetAttachment where name = :name") - .setString("name", name) - .uniqueResult(); + RuleSetAttachment at = (RuleSetAttachment) session.createQuery( "from RuleSetAttachment where name = :name" ).setString( "name", + name ).uniqueResult(); commit( session ); - return at; - } + return at; + } - - - public void save(RuleSetAttachment attachment) { Session session = getSessionNewTx(); - session.saveOrUpdate(attachment); + session.saveOrUpdate( attachment ); commit( session ); } - - + /** Returns List<String> of Rule set names */ public List listRuleSets() { Session session = getSessionNewTx(); - List list = session.createQuery("select name from RuleSetDef where name is not null").list(); + List list = session.createQuery( "select distinct name from RuleSetDef where name is not null" ).list(); commit( session ); return list; } - + public void delete(RuleDef rule) { Session session = getSessionNewTx(); - session.delete(rule); + session.delete( rule ); commit( session ); } - - /** - * Searches the ruleset for a rule with a certain tag. - * This will search ALL VERSIONS. + /** + * Searches the ruleset for a rule with a certain tag. This will search ALL + * VERSIONS. */ - public List searchRulesByTag(String ruleSetName, String tag) { + public List searchRulesByTag(String ruleSetName, + String tag) { Session session = getSessionNewTx(); - - RuleSetDef def = loadRuleSetByName(ruleSetName, session); - List list = session.createFilter(def.getRules(), - "where this.tags.tag = :tag") - .setString("tag", tag).list(); + + RuleSetDef def = loadRuleSetByName( ruleSetName, + session ); + List list = session.createFilter( def.getRules(), + "where this.tags.tag = :tag" ).setString( "tag", + tag ).list(); commit( session ); session.close(); return list; } - - - private void commit(Session session) { session.getTransaction().commit(); } - - - - private Session getSessionNewTx(){ + + private Session getSessionNewTx() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); + + session.beginTransaction(); + StoreEventListener.setCurrentConnection( session.connection() ); enableHistoryFilter( session ); + return session; } private void enableHistoryFilter(Session session) { - session.enableFilter("historyFilter").setParameter("viewHistory", Boolean.FALSE); + session.enableFilter( "historyFilter" ).setParameter( "viewHistory", + Boolean.FALSE ); } - + private void disableHistoryFilter(Session session) { - session.disableFilter("historyFilter"); + session.disableFilter( "historyFilter" ); } - + private void enableVersionFilter(long workingVersionNumber, - Session session){ - session.enableFilter("workingVersionFilter") - .setParameter("filteredVersionNumber", - new Long(workingVersionNumber)); + Session session) { + session.enableFilter( "workingVersionFilter" ).setParameter( "filteredVersionNumber", + new Long( workingVersionNumber ) ); } - private void disableVersionFilter(Session session){ - session.disableFilter("workingVersionFilter"); - } - + private void disableVersionFilter(Session session) { + session.disableFilter( "workingVersionFilter" ); + } + } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java 2006-01-16 03:51:58 UTC (rev 2105) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java 2006-01-16 06:47:05 UTC (rev 2106) @@ -1,6 +1,7 @@ package org.drools.repository.db; import java.io.Serializable; +import java.sql.Connection; import java.util.Iterator; import org.drools.repository.ISaveHistory; @@ -21,6 +22,10 @@ public class StoreEventListener extends EmptyInterceptor { private static final long serialVersionUID = -5634072610999632779L; + + //use a threadlocal to get the currentConnection, + //as we may not always use currentSession semantics. + private static ThreadLocal currentConnection = new ThreadLocal(); public boolean onFlushDirty(Object entity, Serializable id, @@ -37,8 +42,8 @@ private void handleSaveHistory(Object entity) { ISaveHistory versionable = (ISaveHistory) entity; - Session current = getSessionFactory().getCurrentSession(); - Session session = getSessionFactory().openSession( current.connection() ); + + Session session = getSessionFactory().openSession( (Connection) currentConnection.get() ); System.out.println( "POSSIBLY SAVING COPY" ); @@ -66,6 +71,14 @@ } } + + /** + * Used to set the current session so the interceptor can access it. + * @param session + */ + public static void setCurrentConnection(Connection conn) { + currentConnection.set(conn); + } // public boolean onFlushDirty(Object entity, // Serializable id, Copied: trunk/labs/jbossrules/drools-repository/src/test/resources/drools-repository-db.cfg.xml (from rev 2105, trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml) =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml 2006-01-16 03:51:58 UTC (rev 2105) +++ trunk/labs/jbossrules/drools-repository/src/test/resources/drools-repository-db.cfg.xml 2006-01-16 06:47:05 UTC (rev 2106) @@ -0,0 +1,50 @@ +<?xml version='1.0' encoding='utf-8'?> +<!DOCTYPE hibernate-configuration PUBLIC + "-//Hibernate/Hibernate Configuration DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> + +<!-- + **** Drools Repository database configuration. **** + As you can see from the DTD, this makes use of Hibernate 3 for persistence and querying. + + This file is configured for HSQLDB in memory operation (not recommended for production). + + ****************************************************************************** + To provide your own configuration, place your own drools-repository-db.cfg.xml + in the front of the classpath (at the root). + ****************************************************************************** + --> + +<hibernate-configuration> + + <session-factory> + + <!-- Database connection settings --> + <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> + <property name="connection.url">jdbc:hsqldb:mem:unittest</property> + + <property name="connection.username">sa</property> + <property name="connection.password"></property> + + <!-- JDBC connection pool (use the built-in) --> + <property name="connection.pool_size">1</property> + + <!-- SQL dialect --> + <property name="dialect">org.hibernate.dialect.HSQLDialect</property> + + <!-- Enable Hibernate's automatic session context management --> + <property name="current_session_context_class">thread</property> + + <!-- Disable the second-level cache --> + <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> + + <!-- Echo all executed SQL to stdout --> + <property name="show_sql">false</property> + + <!-- Drop and re-create the database schema on startup --> + <property name="hbm2ddl.auto">create</property> + + + </session-factory> + +</hibernate-configuration> \ No newline at end of file Deleted: trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml 2006-01-16 03:51:58 UTC (rev 2105) +++ trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml 2006-01-16 06:47:05 UTC (rev 2106) @@ -1,48 +0,0 @@ -<?xml version='1.0' encoding='utf-8'?> -<!DOCTYPE hibernate-configuration PUBLIC - "-//Hibernate/Hibernate Configuration DTD 3.0//EN" - "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> - -<hibernate-configuration> - - <session-factory> - - <!-- Database connection settings --> - <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> - <property name="connection.url">jdbc:hsqldb:mem:unittest</property> - - <property name="connection.username">sa</property> - <property name="connection.password"></property> - - <!-- JDBC connection pool (use the built-in) --> - <property name="connection.pool_size">1</property> - - <!-- SQL dialect --> - <property name="dialect">org.hibernate.dialect.HSQLDialect</property> - - <!-- Enable Hibernate's automatic session context management --> - <property name="current_session_context_class">thread</property> - - <!-- Disable the second-level cache --> - <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> - - <!-- Echo all executed SQL to stdout --> - <property name="show_sql">false</property> - - <!-- Drop and re-create the database schema on startup --> - <property name="hbm2ddl.auto">create</property> - - <!-- add in all the objects below --> - <mapping resource="org/drools/repository/RuleDef.hbm.xml"/> - <mapping resource="org/drools/repository/Tag.hbm.xml"/> - <mapping resource="org/drools/repository/RuleSetDef.hbm.xml"/> - <mapping resource="org/drools/repository/RuleSetAttachment.hbm.xml"/> - <mapping resource="org/drools/repository/RuleSetVersionInfo.hbm.xml"/> - <mapping resource="org/drools/repository/ApplicationDataDef.hbm.xml" /> - <mapping resource="org/drools/repository/FunctionDef.hbm.xml" /> - <mapping resource="org/drools/repository/ImportDef.hbm.xml" /> - - - </session-factory> - -</hibernate-configuration> \ No newline at end of file |