Author: mic...@jb... Date: 2006-01-19 06:22:26 -0500 (Thu, 19 Jan 2006) New Revision: 2140 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/RuleSetDef.java trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleDef.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: improved mappings for ruleset 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-19 07:24:31 UTC (rev 2139) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-19 11:22:26 UTC (rev 2140) @@ -29,15 +29,10 @@ private Date expiryDate; private Long historicalId; private boolean historicalRecord = false; - private int lockingVersion = 0; + private int lockingVersion = 0; + private RuleSetDef owningRuleSet = null; - private int getLockingVersion() { - return lockingVersion; - } - private void setLockingVersion(int lockingVersion) { - this.lockingVersion = lockingVersion; - } /** * Use tagging to aid with searching and sorting of large numbers of rules. @@ -171,7 +166,7 @@ return name; } - private void setName(String name) { + void setName(String name) { this.name = name; } @@ -243,9 +238,31 @@ } } + /** + * When a rule is allocated to a ruleset, it is "owned" by that ruleset. + * If it is added to another ruleset, a copy is added. + * + * This may be null, meaning that it is a free floating rule. + */ + public RuleSetDef getOwningRuleSet() { + return owningRuleSet; + } + + void setOwningRuleSet(RuleSetDef owningRuleSet) { + this.owningRuleSet = owningRuleSet; + } + /** return true if different */ private boolean diffStr(String left, String right) { return !left.equals(right); } + + private int getLockingVersion() { + return lockingVersion; + } + private void setLockingVersion(int lockingVersion) { + this.lockingVersion = lockingVersion; + } + } 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-19 07:24:31 UTC (rev 2139) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-19 11:22:26 UTC (rev 2140) @@ -81,9 +81,32 @@ this.versionHistory = versionHistory; } + /** + * Adds a rule to the ruleset. + * If the rule belongs to another ruleset already, it will be copied, and the name + * prepended with the ruleset name (to ensure it is unique). + * + * ie: rulesetName:originalRuleName + * + * (if you don't like that, then copy() the rule before adding it). + * + * If a rule is new, obviously there is no copying, and the name is "as is". + * The rule may have been stored previously, "unattached" which is also fine (won't be copied). + */ public RuleSetDef addRule(RuleDef rule) { - return addAssetToSet( rule, - this.rules ); + if (rule.getOwningRuleSet() == null) { + rule.setOwningRuleSet(this); + return addAssetToSet( rule, + this.rules ); + } else { + //we have to make a copy + RuleDef newRule = (RuleDef) rule.copy(); + newRule.setName(this.getName() + ":" + rule.getName()); + newRule.setOwningRuleSet(this); + return addAssetToSet( newRule, + this.rules ); + + } } public RuleSetDef addAttachment(RuleSetAttachment attachmentFile) { @@ -127,6 +150,7 @@ * */ public void removeRule(RuleDef rule) { + rule.setOwningRuleSet(null); rule.setVersionNumber(IVersionable.NO_VERSION); } @@ -175,22 +199,13 @@ */ RuleSetDef addAssetToSet(IVersionable asset, Set set) { + asset.setVersionNumber( this.workingVersionNumber ); if ( asset.getId() == null ) { - asset.setVersionNumber( this.workingVersionNumber ); - asset.setVersionComment( "New" ); + asset.setVersionComment( "new" ); set.add( asset ); } else { - asset.setVersionNumber( this.workingVersionNumber ); set.add( asset ); -// throw new RepositoryException("The repo does not support sharing of rules across rulesets at this time." + -// "Assets must be copied, and given a unique " + -// "name before being added to the RuleSet. This asset already has a name and identity."); -//// IVersionable copy = asset.copy(); -//// copy.setVersionNumber( this.workingVersionNumber ); -//// copy.setVersionComment( "Copied for this version from version: " -//// + asset.getVersionNumber() ); -//// set.add( copy ); } return this; } Modified: trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleDef.hbm.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleDef.hbm.xml 2006-01-19 07:24:31 UTC (rev 2139) +++ trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleDef.hbm.xml 2006-01-19 11:22:26 UTC (rev 2140) @@ -32,6 +32,8 @@ <one-to-many class="org.drools.repository.Tag" /> </set> + <many-to-one name="owningRuleSet" /> + <component name="metaData"> <property name="title" /> <property name="creator" /> 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-19 07:24:31 UTC (rev 2139) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-19 11:22:26 UTC (rev 2140) @@ -34,6 +34,7 @@ def.removeTag("tag1"); repo.save(def); def = repo.loadRule("myRule3", 1); + assertEquals(null, def.getOwningRuleSet()); assertEquals(2, def.getTags().size()); } 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-19 07:24:31 UTC (rev 2139) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-19 11:22:26 UTC (rev 2140) @@ -328,8 +328,45 @@ assertEquals(1, info.getVersionNumber()); } + public void testAddRemoveCopyRules() { + RuleSetDef ruleset = new RuleSetDef("another one", null); + RepositoryManager repo = getRepo(); + + RuleDef preExist = new RuleDef("preexist", "yeah"); + repo.save(preExist); + repo.save(ruleset); + + ruleset.addRule(preExist); + assertEquals(ruleset, preExist.getOwningRuleSet()); + + repo.save(ruleset); + + RuleSetDef newruleset = new RuleSetDef("yao", null); + repo.save(ruleset); + + newruleset.addRule(preExist); + RuleDef other = newruleset.findRuleByName("yao" + ":" + preExist.getName()); + assertEquals(null, other.getId()); //so we know it is a copy + assertEquals(newruleset, other.getOwningRuleSet()); + repo.save(newruleset); + + newruleset = repo.loadRuleSet("yao", 1); + assertEquals(1, newruleset.getRules().size()); + other = (RuleDef) newruleset.getRules().iterator().next(); + assertTrue(other.getName().startsWith("yao")); + + newruleset.removeRule(other); + repo.save(newruleset); + + newruleset = repo.loadRuleSet("yao", 1); + ruleset = repo.loadRuleSet("another one", 1); + assertEquals(1, ruleset.getRules().size()); + assertEquals(0, newruleset.getRules().size()); + + } +// // public void testLargeNumbers() { // RuleSetDef large = new RuleSetDef("Large1", null); // @@ -340,9 +377,11 @@ // def.addTag("HR" + i); // large.addRule(def); // } -// RepositoryImpl repo = getRepo(); +// RepositoryManager repo = RepositoryFactory.getStatefulRepository(); // repo.save(large); +// repo.close(); // +// repo = RepositoryFactory.getStatefulRepository(); // System.out.println("Saved " + System.currentTimeMillis()); // // large = repo.loadRuleSet("Large1", 1); @@ -356,8 +395,8 @@ // large.addTag("blah"); // repo.save(large); // System.out.println("Change saved " + System.currentTimeMillis()); +// repo.close(); // -// // } } \ No newline at end of file |