Author: mic...@jb... Date: 2006-01-07 00:49:55 -0500 (Sat, 07 Jan 2006) New Revision: 2015 Added: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java 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/RuleSetAttachment.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/RepositoryImpl.java trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetAttachment.hbm.xml 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 Log: better versioning, generic interface Added: 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -0,0 +1,15 @@ +package org.drools.repository; + +/** All assets that support major versioning must implement this. */ +interface IVersionable { + + /** must create a fresh copy OF THE SAME TYPE, with a null Id */ + IVersionable copy(); + + void setVersionNumber(long versionNumber); + + void setVersionComment(String comment); + + long getVersionNumber(); + +} Property changes on: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/IVersionable.java ___________________________________________________________________ Name: svn:eol-style + native 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -5,7 +5,7 @@ import java.util.Iterator; import java.util.Set; -public class RuleDef extends Persistent { +public class RuleDef extends Persistent implements IVersionable { private static final long serialVersionUID = -677781085801764266L; @@ -96,7 +96,7 @@ public long getVersionNumber(){ return this.versionNumber; } - void setVersionNumber(long versionNumber){ + public void setVersionNumber(long versionNumber){ this.versionNumber = versionNumber; } public String getDocumentation(){ @@ -161,7 +161,7 @@ /** * This is used for versioning. */ - RuleDef copy() { + public IVersionable copy() { RuleDef newVersion = new RuleDef(); newVersion.content = this.content; newVersion.documentation = this.documentation; Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java 2006-01-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -14,7 +14,7 @@ * @author <a href="mailto:mic...@gm..."> Michael Neale</a> * */ -public class RuleSetAttachment extends Persistent { +public class RuleSetAttachment extends Persistent implements IVersionable { private static final long serialVersionUID = 7474038734785975202L; @@ -26,6 +26,7 @@ private String name; private long versionNumber = 1; + private String versionComment; public RuleSetAttachment(String typeOfAttachment, @@ -64,7 +65,7 @@ return versionNumber; } - void setVersionNumber(long versionNumber){ + public void setVersionNumber(long versionNumber){ this.versionNumber = versionNumber; } @@ -84,6 +85,22 @@ this.originalFileName = originalFileName; } + public IVersionable copy() { + RuleSetAttachment copy = new RuleSetAttachment(this.typeOfAttachment, + this.name, + this.content, + this.originalFileName); + return copy; + } + + public void setVersionComment(String comment){ + this.versionComment = comment; + } + public String getVersionComment() { + return this.versionComment; + } + + } 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -47,7 +47,7 @@ } - public void setVersionHistory(Set versionHistory){ + void setVersionHistory(Set versionHistory){ this.versionHistory = versionHistory; } @@ -65,8 +65,9 @@ } else if (rule.getVersionNumber() == this.workingVersionNumber) { this.rules.add(rule); } else { - RuleDef copy = rule.copy(); + RuleDef copy = (RuleDef) rule.copy(); copy.setVersionNumber(this.workingVersionNumber); + copy.setVersionComment("Copied for this version."); this.rules.add(copy); } return this; @@ -97,7 +98,7 @@ public String getName(){ return name; } - public void setName(String name){ + private void setName(String name){ this.name = name; } @@ -158,45 +159,50 @@ public void createNewVersion(String comment, String newStatus) { this.workingVersionNumber++; - RuleSetVersionInfo newVersion = new RuleSetVersionInfo(); - newVersion.setStatus(newStatus); - newVersion.setVersionNumber(this.workingVersionNumber); - this.versionHistory.add(newVersion); + addNewVersionHistory( newStatus ); - //as the Ids are null, copied objects - //will get a new identity, and have the new workingVersionNumber //now have to create new rules and add to the collection - createNewRuleVersions( comment, this.workingVersionNumber ); + createAndAddNewVersions( this.rules, comment, this.workingVersionNumber ); -// //create new attachment -// for ( Iterator iter = this.attachments.iterator(); iter.hasNext(); ) { -// RuleSetAttachment att = (RuleSetAttachment) iter.next(); -// //TODO: need too finish this. -// att.copy(); -// -// } + //now attachments + createAndAddNewVersions( this.attachments, comment, this.workingVersionNumber ); + //create new functions, app data and imports etc. System.out.println("DON'T FORGET FUNCTIONS ETC !!"); } - private void createNewRuleVersions(String comment, long newVersionNumber){ + private void addNewVersionHistory(String newStatus){ + RuleSetVersionInfo newVersion = new RuleSetVersionInfo(); + newVersion.setStatus(newStatus); + newVersion.setVersionNumber(this.workingVersionNumber); + this.versionHistory.add(newVersion); + } + + /** This will work on any set of <code>IVersionable</code> objects. They are copied, and + * then added to the original set (with null Ids). The comment is added, as is the new version number. + */ + private void createAndAddNewVersions(Set assets, String comment, long newVersionNumber){ + //as the Ids are null, copied objects + //will get a new identity, and have the new workingVersionNumber Set newVersions = new HashSet(); - for ( Iterator iter = this.rules.iterator(); iter.hasNext(); ) { - RuleDef old = (RuleDef) iter.next(); + for ( Iterator iter = assets.iterator(); iter.hasNext(); ) { + IVersionable old = (IVersionable) iter.next(); if (old.getVersionNumber() == newVersionNumber - 1) { //we only want to clone rules that are for the version being cloned - RuleDef clone = old.copy(); + IVersionable clone = (IVersionable) old.copy(); clone.setVersionComment(comment); clone.setVersionNumber(newVersionNumber); newVersions.add(clone); } } - this.rules.addAll(newVersions); + assets.addAll(newVersions); } + + public String toString() { return "{ name=" + this.name + " , workingVersionNumber=" + this.workingVersionNumber + " }"; } 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepositoryImpl.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -77,25 +77,20 @@ Session session = getSession(); session.beginTransaction(); - session.enableFilter("workingVersionFilter") - .setParameter("filteredVersionNumber", - new Long(workingVersionNumber)); + enableVersionFilter( workingVersionNumber, + session ); + RuleSetDef def = (RuleSetDef) session.createQuery("from RuleSetDef where name = :name") .setString("name", ruleSetName ).uniqueResult(); - def.setWorkingVersionNumber(workingVersionNumber); - session.disableFilter("workingVersionFilter"); + + def.setWorkingVersionNumber(workingVersionNumber); + removeVersionFilter( session ); session.getTransaction().commit(); return def; } + - public void save(RuleSetAttachment attachment) { - Session session = getSession(); - session.beginTransaction(); - session.saveOrUpdate(attachment); - session.getTransaction().commit(); - } - public RuleSetAttachment loadAttachment(String name) { Session session = getSession(); session.beginTransaction(); @@ -105,10 +100,33 @@ .uniqueResult(); session.getTransaction().commit(); return at; + } + + + private void enableVersionFilter(long workingVersionNumber, + Session session){ + session.enableFilter("workingVersionFilter") + .setParameter("filteredVersionNumber", + new Long(workingVersionNumber)); } + + + + private void removeVersionFilter(Session session){ + session.disableFilter("workingVersionFilter"); + } + public void save(RuleSetAttachment attachment) { + Session session = getSession(); + session.beginTransaction(); + session.saveOrUpdate(attachment); + session.getTransaction().commit(); + } + + + private Session getSession(){ Session session = HibernateUtil.getSessionFactory().getCurrentSession(); return session; Modified: trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetAttachment.hbm.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetAttachment.hbm.xml 2006-01-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetAttachment.hbm.xml 2006-01-07 05:49:55 UTC (rev 2015) @@ -15,6 +15,8 @@ <property name="typeOfAttachment" /> <property name="content" /> <property name="originalFileName" /> + <property name="versionNumber" /> + <property name="versionComment" /> </class> 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml 2006-01-07 05:49:55 UTC (rev 2015) @@ -52,6 +52,7 @@ <set name="attachments" lazy="false" cascade="all"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.RuleSetAttachment"/> + <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -54,7 +54,7 @@ rule1.setMetaData(meta); repo.save(rule1); - RuleDef ruleCopy = rule1.copy(); + RuleDef ruleCopy = (RuleDef) rule1.copy(); assertEquals(null, ruleCopy.getId()); assertEquals(2, ruleCopy.getTags().size()); assertEquals("Peter Jackson", ruleCopy.getMetaData().getCreator()); 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-07 05:06:14 UTC (rev 2014) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-07 05:49:55 UTC (rev 2015) @@ -94,16 +94,20 @@ def1.addTag("S").addTag("A"); set.addRule(def1).addRule(def2); + set.addAttachment(new RuleSetAttachment("x", "x", "x".getBytes(), "x")); assertEquals(2, set.getRules().size()); assertEquals(1, def1.getVersionNumber()); assertEquals(1, def2.getVersionNumber()); assertEquals(1, set.getWorkingVersionNumber()); + //once we create a new version, we double the asset counts, one for each version set.createNewVersion("New version", "Draft"); assertEquals(4, set.getRules().size()); + assertEquals(2, set.getAttachments().size()); + assertEquals(1, def1.getVersionNumber()); - assertEquals(1, def1.getVersionNumber()); + //now check that the new version rules are kosher (tag wise) for ( Iterator iter = set.getRules().iterator(); iter.hasNext(); ) { RuleDef rule = (RuleDef) iter.next(); if (rule.getVersionNumber() == 2) { @@ -114,16 +118,34 @@ } } + RepositoryImpl repo = getRepo(); repo.save(set); + //now when we load it, the filter only loads the workingVersion that we specify RuleSetDef loaded = repo.loadRuleSet("InMemory", 2); - assertEquals(2, loaded.getRules().size()); + //now should have half as many as before, as old versions are not loaded. + assertEquals(2, loaded.getRules().size()); + assertEquals(1, loaded.getAttachments().size()); + //now check the version numbers and comment, use attachment as there is only one in set so easy.. + RuleSetAttachment att = (RuleSetAttachment) loaded.getAttachments().iterator().next(); + assertEquals(2, att.getVersionNumber()); + assertEquals("New version", att.getVersionComment()); + //now run it again, with OLD VERSION... + loaded = repo.loadRuleSet("InMemory", 1); + assertEquals(2, loaded.getRules().size()); + assertEquals(1, loaded.getAttachments().size()); + + //now the version number should be one + att = (RuleSetAttachment) loaded.getAttachments().iterator().next(); + assertEquals(1, att.getVersionNumber()); + assertFalse("New version".equals(att.getVersionComment())); + } } |