From: <jbo...@li...> - 2006-01-10 23:22:26
|
Author: mic...@jb... Date: 2006-01-10 18:22:04 -0500 (Tue, 10 Jan 2006) New Revision: 2058 Added: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java Modified: trunk/labs/jbossrules/drools-repository/pom.xml trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 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/resources/org/drools/repository/RuleSetDef.hbm.xml trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml Log: more working stuff Modified: trunk/labs/jbossrules/drools-repository/pom.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/pom.xml 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/pom.xml 2006-01-10 23:22:04 UTC (rev 2058) @@ -32,7 +32,14 @@ <version>1.8.0.1</version> </dependency> + <dependency> + <groupId>xstream</groupId> + <artifactId>xstream</artifactId> + <version>1.1.2</version> + </dependency> + + </dependencies> Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -1,8 +1,14 @@ package org.drools.repository; -/** All assets that support major versioning must implement this. */ -interface IVersionable { +/** All assets that support versioning must implement this. */ +public interface IVersionable { + /** + * This is used to indicate that the asset is un-attached to + * any ruleset. Basically deleted. + */ + public static final long NO_VERSION = -1; + /** of course they have to have an id ! * Ids are always assigned by the database. */ Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -29,18 +29,19 @@ /** * Use tagging to aid with searching and sorting of large numbers of rules. * Tags should not effect the versioning of the rules. - * - * */ public RuleDef addTag(String tag) { this.tags.add(new Tag(tag)); return this; } - + public RuleDef addTag(Tag tag) { + this.tags.add(tag); + return this; + } + + RuleDef() {} - public RuleDef() {} - /** * This is for creating a brand new rule. * @param name @@ -177,7 +178,9 @@ } public String toString() { - return "{ id = " + this.getId() + "name= (" + this.name + ") version = " + this.getVersionNumber() + " }"; + return "{ id = " + this.getId() + + " name = (" + this.name + ") version = " + + this.getVersionNumber() + " }"; } } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -8,8 +8,21 @@ * The ruleset definition contains a grouping of rules for editing/release. The * workingVersionNumber drives what version of rules will be included in this * ruleset. Changing this number will mean that different versions of ruledefs - * are loaded etc. + * are loaded etc. This number is set when you load the rulebase (it starts with + * 1 for a new RuleSet). * + * Assets such as RuleDefs, Functions etc can be added to the RuleSet. + * When an asset that already has an identity (eg a Rule that is + * already is in the repository) is added to a RuleSet, it is copied, + * and its version is set to to match the working version number of the RuleSet. + * This is to stop in advertent changes effecting unrelated rulesets, in cases + * where rules are "shared". + * + * Note that as RuleDefs are taged, it is possible to load Rules based on these tags, + * and thus build up rulesets dynamically (without using a RuleSetDef object). This + * is possible for environments where rules are changed and managed individually, + * rather then as part of a ruleset. + * * @author <a href="mailto:mic...@gm..."> Michael Neale</a> */ public class RuleSetDef extends Persistent @@ -40,6 +53,7 @@ this.applicationData = new HashSet(); this.imports = new HashSet(); this.workingVersionNumber = 1; + this.versionHistory.add(new RuleSetVersionInfo(1, "New")); } /** @@ -48,6 +62,12 @@ RuleSetDef() { } + /** + * This returns a version history of RuleSet versions. + * You can think of these as "major" versions. Past versions + * can be loaded from the repository on demand, using the versionNumber + * from the appropriate history record that you wish to retrieve. + */ public Set getVersionHistory() { return versionHistory; } @@ -80,40 +100,51 @@ * Removes a rule from the current ruleset. This * DOES NOT delete the rule, and DOES NOT effect any other versions * of the ruleset. + * + * Note that assets are removed by setting their version number to + * IVersionable.NO_VERSION (-1) so that the do not show up. + * This may be changed so they are archived in future, and deleted. + * + * The repository API has a delete(RuleDef rule) method + * */ public void removeRule(RuleDef rule) { - //rule.setVersionNumber(-1); - this.rules.remove(rule); + rule.setVersionNumber(IVersionable.NO_VERSION); } public void removeFunction(FunctionDef function) { - this.functions.remove(function); + function.setVersionNumber(IVersionable.NO_VERSION); } public void removeApplicationData(ApplicationDataDef appData) { - this.applicationData.remove(appData); + appData.setVersionNumber(IVersionable.NO_VERSION); } public void removeImport(ImportDef imp) { - this.imports.remove(imp); + imp.setVersionNumber(IVersionable.NO_VERSION); } public void removeAttachment(RuleSetAttachment attachment) { - this.attachments.remove(attachment); + attachment.setVersionNumber(IVersionable.NO_VERSION); } public RuleSetDef addFunction(FunctionDef function) { return addAssetToSet( function, this.functions ); } + + public void removeTag(Tag tag) { + this.tags.remove(tag); + } /** * This adds a versionable asset to the specified set. * - * Copy/versus linking: If the asset already has an Id, and it is a - * different version number, then it will be copied for the set. If it has - * the same version number, then it will be shared. Sharing is generally not - * recommended, but can be useful. + * Copy/versus linking: If the asset already has an Id, it will be copied + * for this ruleset. + * If it does not have an id, well it is obviously new, + * and will be given an id when the RuleSet is synchronized with + * the repository. */ RuleSetDef addAssetToSet(IVersionable asset, Set set) { @@ -122,13 +153,11 @@ asset.setVersionComment( "New" ); set.add( asset ); } - else if ( asset.getVersionNumber() == this.workingVersionNumber ) { - set.add( asset ); - } else { IVersionable copy = asset.copy(); copy.setVersionNumber( this.workingVersionNumber ); - copy.setVersionComment( "Copied for this version." ); + copy.setVersionComment( "Copied for this version from version: " + + asset.getVersionNumber() ); set.add( copy ); } return this; @@ -171,6 +200,11 @@ this.tags.add( new Tag( tag ) ); return this; } + + public RuleSetDef addTag(Tag tag) { + this.tags.add(tag); + return this; + } public long getWorkingVersionNumber() { return workingVersionNumber; 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-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/HibernateUtil.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -2,6 +2,7 @@ import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; +import org.hibernate.event.SaveOrUpdateEventListener; public class HibernateUtil { @@ -10,16 +11,25 @@ static { try { // Create the SessionFactory from hibernate.cfg.xml - sessionFactory = new Configuration().configure().buildSessionFactory(); - } catch (Throwable ex) { + + Configuration cfg = new Configuration(); + + SaveOrUpdateEventListener[] listeners = new SaveOrUpdateEventListener[]{new StoreEventListener()}; + + cfg.setInterceptor( new StoreEventListener() ); + cfg.getEventListeners().setUpdateEventListeners( listeners ); + cfg.configure(); + sessionFactory = cfg.buildSessionFactory(); + } + catch ( Throwable ex ) { // Make sure you log the exception, as it might be swallowed - System.err.println("Initial SessionFactory creation failed." + ex); - throw new ExceptionInInitializerError(ex); + System.err.println( "Initial SessionFactory creation failed." + ex ); + throw new ExceptionInInitializerError( ex ); } } 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-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -127,6 +127,23 @@ session.getTransaction().commit(); } + + /** Returns List<String> of Rule set names */ + public List listRuleSets() { + Session session = getSession(); + session.beginTransaction(); + List list = session.createQuery("select name from RuleSetDef where name is not null").list(); + session.getTransaction().commit(); + return list; + } + + + public void delete(RuleDef rule) { + Session session = getSession(); + session.beginTransaction(); + session.delete(rule); + session.getTransaction().commit(); + } Added: 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-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -0,0 +1,47 @@ +package org.drools.repository.db; + +import java.io.Serializable; + +import org.drools.repository.IVersionable; +import org.hibernate.EmptyInterceptor; +import org.hibernate.HibernateException; +import org.hibernate.event.SaveOrUpdateEvent; +import org.hibernate.event.SaveOrUpdateEventListener; +import org.hibernate.type.Type; + +public class StoreEventListener extends EmptyInterceptor implements SaveOrUpdateEventListener { + + private static final long serialVersionUID = -5634072610999632779L; + + public boolean onSave(Object entity, + Serializable id, + Object[] state, + String[] propertyNames, + Type[] types) { + if (entity instanceof IVersionable) { + // System.out.println("VERSIONABLE INTERCEPT: " + id); + IVersionable versionable = (IVersionable) entity; + if (versionable.getId() != null) { + System.out.println("ITS A NEW VERSION"); + } + } + + return false; + } + + public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { + Object ent = event.getEntity(); + System.out.println("OnSaveOrUpdate"); + if (ent instanceof IVersionable) { + IVersionable versionable = (IVersionable) ent; + if (versionable.getId() != null) { + System.out.println("!!!! WE have an update"); + } + } + + } + + + + +} Property changes on: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml 2006-01-10 23:22:04 UTC (rev 2058) @@ -12,7 +12,7 @@ </id> - <property name="name" /> + <property name="name" not-null="true" /> <component name="metaData"> <property name="title" /> @@ -32,7 +32,7 @@ <!-- tags to aid with searching and management of rules --> - <set name="tags" table="RULESET_TAGS" lazy="false" cascade="all"> + <set name="tags" table="RULESET_TAGS" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.Tag"/> </set> @@ -43,31 +43,31 @@ </set> <!-- now come the versioned assets --> - <set name="rules" lazy="false" cascade="all"> + <set name="rules" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.RuleDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> - <set name="attachments" lazy="false" cascade="all"> + <set name="attachments" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.RuleSetAttachment"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> - <set name="imports" lazy="false" cascade="all"> + <set name="imports" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.ImportDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> - <set name="functions" lazy="false" cascade="all"> + <set name="functions" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.FunctionDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> - <set name="applicationData" lazy="false" cascade="all"> + <set name="applicationData" lazy="false" cascade="all" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.ApplicationDataDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> Added: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -0,0 +1,35 @@ +package org.drools.repository; + +import org.drools.repository.db.PersistentCase; +import org.drools.repository.db.RepositoryImpl; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +public class LocalPersistTest extends PersistentCase { + + public void testXStream() { + RuleSetDef def = new RuleSetDef("xstream1", new MetaData()); + def.addRule(new RuleDef("rulex1", "ndklsanlkdsan")); + XStream xstream = new XStream(new DomDriver()); + String xml = xstream.toXML(def); + //System.out.println(xml); + + def = (RuleSetDef) xstream.fromXML(xml); + + RepositoryImpl repo = getRepo(); + repo.save(def); + + def = repo.loadRuleSet("xstream1", 1); + xml = xstream.toXML(def); + //System.out.println(xml); + + def = (RuleSetDef) xstream.fromXML(xml); + def.addRule( new RuleDef("xstream2", "xxxx")); + repo.save(def); + + assertNotNull(def); + + } + +} Property changes on: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -16,10 +16,22 @@ repo.save(def); assertNotNull(def.getId()); repo.save(new RuleDef("myRule2", "A rule2")); + def = new RuleDef("myRule3", "A rule3"); def.addTag("tag1").addTag("tag2").addTag("HR"); - repo.save(def); + repo.save(def); + assertNotNull(def.getId()); + Long id = def.getId(); + + def.setContent("new content"); + repo.save(def); + + + def = repo.loadRule("myRule3", 1); + assertEquals(id, def.getId()); + + assertEquals("new content", def.getContent()); } public void testRetreieveRuleWithTags() { Modified: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-10 23:22:04 UTC (rev 2058) @@ -2,6 +2,7 @@ import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import org.drools.repository.db.PersistentCase; @@ -10,7 +11,7 @@ /** * Some quasi unit tests, and some quasi integration tests including versioning. * @author <a href="mailto:mic...@gm..."> Michael Neale</a> - * + * Take deep breaths... its not really that scary... */ public class RuleSetPersistenceTest extends PersistentCase { @@ -21,6 +22,7 @@ RuleSetDef def = new RuleSetDef("my ruleset", meta); def.addTag("ME"); + def.addRule(new RuleDef("simple", "x")); RepositoryImpl repo = getRepo(); repo.save(def); @@ -29,6 +31,14 @@ assertEquals("Michael Neale", def2.getMetaData().getCreator()); assertEquals(1, def2.getTags().size()); + //now modify the content of a rule, ensure it is saved + RuleDef rule = (RuleDef) def2.getRules().iterator().next(); + rule.setContent("Something new"); + repo.save(def2); + + def2 = repo.loadRuleSet("my ruleset", 1); + RuleDef rule2 = (RuleDef) def2.getRules().iterator().next(); + assertEquals("Something new", rule2.getContent()); } public void testRuleSetWithRules() { @@ -217,8 +227,9 @@ assertEquals(1, old.getRules().size()); assertEquals(1, newRs.getRules().size()); - + //add a rule to new one newRs.addRule(new RuleDef("para2", "xxx")); + newRs.addTag("HR"); repo.save(newRs); @@ -226,14 +237,64 @@ old = repo.loadRuleSet("para", 1); assertEquals(2, newRs.getRules().size()); assertEquals(1, old.getRules().size()); + RuleDef originalRule = (RuleDef) old.getRules().iterator().next(); //check that the original one still has the right version number - assertEquals(1, originalRule.getVersionNumber()); + assertEquals(1, originalRule.getVersionNumber()); + assertEquals(1, old.getRules().size()); + repo.delete(originalRule); + old = repo.loadRuleSet("para", 1); + assertEquals(0, old.getRules().size()); + } + + /** just make sure it works for at least one other asset type */ + public void testRuleSetWithFunction() { + RuleSetDef def = new RuleSetDef("with functions", null); + def.addFunction(new FunctionDef("abc", "123")); + RepositoryImpl repo = getRepo(); + repo.save(def); + def = repo.loadRuleSet("with functions", 1); + FunctionDef func = (FunctionDef) def.getFunctions().iterator().next(); + assertEquals("abc", func.getFunctionContent()); + //just make sure it preserves content, and same ID (now new versions). + func.setFunctionContent("xyz"); + Long id = func.getId(); + repo.save(def); + def = repo.loadRuleSet("with functions", 1); + func = (FunctionDef) def.getFunctions().iterator().next(); + assertEquals(id, func.getId()); + assertEquals("xyz", func.getFunctionContent()); + } -} + public void testRuleSetNameList() { + List list = getRepo().listRuleSets(); + assertTrue(list.size() > 0); + } + +// public void testLargeNumbers() { +// RuleSetDef large = new RuleSetDef("Large1", null); +// +// for (int i = 0; i < 4000; i++) { +// RuleDef def = new RuleDef("RuleNumber " + i, "Content"); +// def.addTag("HR" + i); +// large.addRule(def); +// } +// RepositoryImpl repo = getRepo(); +// repo.save(large); +// +// large = repo.loadRuleSet("Large1", 1); +// assertEquals(4000, large.getRules().size()); +// +// List list = repo.findRulesByTag("HR1024"); +// assertEquals(1, list.size()); +// +// +// } + +} \ No newline at end of file Modified: trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml 2006-01-10 23:00:47 UTC (rev 2057) +++ trunk/labs/jbossrules/drools-repository/src/test/resources/hibernate.cfg.xml 2006-01-10 23:22:04 UTC (rev 2058) @@ -43,8 +43,6 @@ <mapping resource="org/drools/repository/ImportDef.hbm.xml" /> - - </session-factory> </hibernate-configuration> \ No newline at end of file |