[jboss-svn-commits] JBL Code SVN: r6612 - in labs/jbossrules/trunk: drools-examples/src/main/java/org/drools/benchmark drools-repository/src/main/java/org/drools/repository drools-repository/src/main/resources/node_type_definitions drools-repository/src/test/java/org/drools/repository
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Oct 5 06:12:32 EDT 2006
Author: michael.neale at jboss.com
Date: 2006-10-05 06:12:18 -0400 (Thu, 05 Oct 2006)
New Revision: 6612
Added:
labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/versionable_asset_folder_node_type.cnd
Modified:
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/benchmark/RuleSetLoadTest.java
labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositoryConfigurator.java
labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RuleItem.java
labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulePackageItem.java
labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java
labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/rulepackage_node_type.cnd
labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RuleItemTestCase.java
labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulePackageItemTestCase.java
Log:
JBRULES-511 - baselines for package level assets
Modified: labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/benchmark/RuleSetLoadTest.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/benchmark/RuleSetLoadTest.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/benchmark/RuleSetLoadTest.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -40,6 +40,10 @@
RuleSetLoadTest test = new RuleSetLoadTest();
test.testOneThousandLoad();
+ test.testOneThousandLoad();
+
+ test.testOneThousandLoad();
+
// generate the drl first to run this test
//test.testFourThousandLoad();
}
@@ -63,7 +67,7 @@
public void testOneThousandLoad() {
try {
- String file = "1000_rules.drl";
+ String file = "500_rules.drl";
long loadStart = System.currentTimeMillis();
RuleBase ruleBase = readRule( file );
long loadEnd = System.currentTimeMillis();
Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositoryConfigurator.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositoryConfigurator.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositoryConfigurator.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -109,12 +109,15 @@
ws.getNamespaceRegistry().registerNamespace("drools", RulesRepository.DROOLS_URI);
this.registerNodeTypesFromCndFile("/node_type_definitions/versionable_node_type.cnd", ws);
+ this.registerNodeTypesFromCndFile("/node_type_definitions/versionable_asset_folder_node_type.cnd", ws);
+
this.registerNodeTypesFromCndFile("/node_type_definitions/dsl_node_type.cnd", ws);
this.registerNodeTypesFromCndFile("/node_type_definitions/tag_node_type.cnd", ws);
this.registerNodeTypesFromCndFile("/node_type_definitions/state_node_type.cnd", ws);
this.registerNodeTypesFromCndFile("/node_type_definitions/rule_node_type.cnd", ws);
this.registerNodeTypesFromCndFile("/node_type_definitions/function_node_type.cnd", ws);
this.registerNodeTypesFromCndFile("/node_type_definitions/rulepackage_node_type.cnd", ws);
+
}
// Setup the rule repository node
Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RuleItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RuleItem.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RuleItem.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -8,6 +8,7 @@
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
+import javax.jcr.RepositoryException;
import javax.jcr.Value;
import org.apache.log4j.Logger;
@@ -74,7 +75,7 @@
try {
//make sure this node is a rule node
if(!(this.node.getPrimaryNodeType().getName().equals(RULE_NODE_TYPE_NAME) ||
- this.node.getPrimaryNodeType().getName().equals("nt:version"))) {
+ isHistoricalVersion())) {
String message = this.node.getName() + " is not a node of type " + RULE_NODE_TYPE_NAME + " nor nt:version. It is a node of type: " + this.node.getPrimaryNodeType().getName();
log.error(message);
throw new RulesRepositoryException(message);
@@ -158,16 +159,12 @@
* @throws RulesRepositoryException
*/
public void updateDateEffective(Calendar newDateEffective) throws RulesRepositoryException {
- checkout();
-
+ checkIsUpdateable();
+ checkout();
try {
this.node.setProperty(DATE_EFFECTIVE_PROPERTY_NAME, newDateEffective);
-
- Calendar lastModified = Calendar.getInstance();
- this.node.setProperty(LAST_MODIFIED_PROPERTY_NAME, lastModified);
-
}
- catch(Exception e) {
+ catch(RepositoryException e) {
log.error("Caught Exception", e);
throw new RulesRepositoryException(e);
}
@@ -210,10 +207,6 @@
try {
this.node.setProperty(DATE_EXPIRED_PROPERTY_NAME, newDateExpired);
-
- Calendar lastModified = Calendar.getInstance();
- this.node.setProperty(LAST_MODIFIED_PROPERTY_NAME, lastModified);
-;
}
catch(Exception e) {
log.error("Caught Exception", e);
@@ -247,25 +240,23 @@
checkout();
try {
this.node.setProperty(RULE_CONTENT_PROPERTY_NAME, newRuleContent);
- this.node.setProperty(LAST_MODIFIED_PROPERTY_NAME, Calendar.getInstance());
return this;
}
- catch(Exception e) {
+ catch(RepositoryException e) {
log.error("Caught Exception", e);
throw new RulesRepositoryException(e);
}
}
-
+ /**
+ * The URI represents a location for
+ */
public void updateRuleContentURI(String newURI) throws RulesRepositoryException {
- checkout();
-
+ checkout();
try {
this.node.setProperty(RULE_CONTENT_URI_PROPERTY_NAME, newURI);
- this.node.setProperty(LAST_MODIFIED_PROPERTY_NAME, Calendar.getInstance());
-
}
- catch(Exception e) {
+ catch(RepositoryException e) {
log.error("Caught Exception", e);
throw new RulesRepositoryException(e);
}
@@ -372,13 +363,11 @@
}
}
else {
- //TODO: remove the tag if it isn't used by anyone else
return;
}
}
catch(PathNotFoundException e) {
//the property doesn't exist yet
- //TODO: first remove the tag if it isn't used by anyone else
return;
}
finally {
@@ -434,20 +423,14 @@
* @param stateName the name of the state to set the rule node to
* @throws RulesRepositoryException
*/
- public void setState(String stateName) throws RulesRepositoryException {
+ public void updateState(String stateName) throws RulesRepositoryException {
try {
- //make sure this node is a rule node
- if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
- String message = "Error. States can only be set for the head version of a rule node";
- log.error(message);
- throw new RulesRepositoryException(message);
- }
//now set the state property of the rule
checkout();
StateItem stateItem = this.rulesRepository.getState(stateName);
- this.setState(stateItem);
+ this.updateState(stateItem);
}
catch(Exception e) {
log.error("Caught exception", e);
@@ -462,7 +445,8 @@
* property
* @throws RulesRepositoryException
*/
- public void setState(StateItem stateItem) throws RulesRepositoryException {
+ public void updateState(StateItem stateItem) throws RulesRepositoryException {
+ checkIsUpdateable();
try {
//make sure this node is a rule node
if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulePackageItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulePackageItem.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulePackageItem.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -13,6 +13,7 @@
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
+import javax.jcr.lock.LockException;
import org.apache.log4j.Logger;
@@ -70,7 +71,8 @@
try {
//make sure this node is a rule package node
- if ( !(this.node.getPrimaryNodeType().getName().equals( RULE_PACKAGE_TYPE_NAME )) ) {
+ if ( !(this.node.getPrimaryNodeType().getName().equals( RULE_PACKAGE_TYPE_NAME ) ||
+ isHistoricalVersion()) ) {
String message = this.node.getName() + " is not a node of type " + RULE_PACKAGE_TYPE_NAME + ". It is a node of type: " + this.node.getPrimaryNodeType().getName();
log.error( message );
throw new RulesRepositoryException( message );
@@ -81,6 +83,8 @@
}
}
+
+
/**
* This adds a rule to the current physical package (you can move it later).
*/
@@ -434,7 +438,8 @@
/** Return an iterator for the rules in this package */
public Iterator getRules() {
try {
- RuleItemIterator it = new RuleItemIterator( this.node.getNode( RULES_FOLDER_NAME ).getNodes(),
+ Node content = getVersionContentNode();
+ RuleItemIterator it = new RuleItemIterator( content.getNode( RULES_FOLDER_NAME ).getNodes(),
this.rulesRepository );
return it;
} catch ( PathNotFoundException e ) {
@@ -571,4 +576,27 @@
}
return result.iterator();
}
+
+ /**
+ * This will create a new version of a package, effectively freezing the state.
+ * This means in the "head" version of the package, rules can be added
+ * removed, without effecting the baseline that was created.
+ */
+ public void createBaseline(String comment,
+ StateItem state) {
+ Iterator rules = getRules();
+ while(rules.hasNext()) {
+ RuleItem rule = (RuleItem) rules.next();
+ rule.updateState( state );
+ rule.checkin( comment );
+ }
+
+ checkin( comment );
+ try {
+ this.node.checkout();
+ } catch ( RepositoryException e ) {
+ throw new RulesRepositoryException("Unable to check out package node after creating a new baseline.", e);
+ }
+
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -572,8 +572,8 @@
//create the node - see section 6.7.22.6 of the spec
Node rulePackageNode = folderNode.addNode(name, RulePackageItem.RULE_PACKAGE_TYPE_NAME);
- rulePackageNode.addNode( RulePackageItem.RULES_FOLDER_NAME, "nt:folder" );
- rulePackageNode.addNode( RulePackageItem.FUNCTION_FOLDER_NAME, "nt:folder" );
+ rulePackageNode.addNode( RulePackageItem.RULES_FOLDER_NAME, "drools:versionableAssetFolder" );
+ rulePackageNode.addNode( RulePackageItem.FUNCTION_FOLDER_NAME, "drools:versionableAssetFolder" );
rulePackageNode.setProperty(RulePackageItem.TITLE_PROPERTY_NAME, name);
@@ -585,8 +585,10 @@
Calendar lastModified = Calendar.getInstance();
rulePackageNode.setProperty(RulePackageItem.LAST_MODIFIED_PROPERTY_NAME, lastModified);
+
this.session.save();
-
+
+
return new RulePackageItem(this, rulePackageNode);
} catch (ItemExistsException e) {
throw new RulesRepositoryException("A package name must be unique.", e);
Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -61,6 +61,14 @@
}
/**
+ * This will return true if the current entity is actually a
+ * historical version (which means is effectively read only).
+ */
+ public boolean isHistoricalVersion() throws RepositoryException {
+ return this.node.getPrimaryNodeType().getName().equals("nt:version") || node.getPrimaryNodeType().getName().equals( "nt:frozenNode" );
+ }
+
+ /**
* @return the predessor node of this node in the version history, or null if no predecessor version exists
* @throws RulesRepositoryException
*/
@@ -333,6 +341,18 @@
return contentNode;
}
+
+ /**
+ * Need to get the name from the content node, not the version node
+ * if it is in fact a version !
+ */
+ public String getName() {
+ try {
+ return getVersionContentNode().getName();
+ } catch ( RepositoryException e) {
+ throw new RulesRepositoryException(e);
+ }
+ }
/**
* This will check out the node prior to editing.
@@ -364,13 +384,15 @@
/**
* This will save the content (if it hasn't been already) and
* then check it in to create a new version.
+ * It will also set the last modified property.
*/
public void checkin(String comment) {
try {
- this.node.setProperty( VersionableItem.CHECKIN_COMMENT, comment);
- this.node.getSession().save();
- this.node.checkin();
- } catch (Exception e) {
+ this.node.setProperty( VersionableItem.LAST_MODIFIED_PROPERTY_NAME, Calendar.getInstance() );
+ this.node.setProperty( VersionableItem.CHECKIN_COMMENT, comment);
+ this.node.getSession().save();
+ this.node.checkin();
+ } catch (RepositoryException e) {
throw new RulesRepositoryException("Unable to checkin.", e);
}
}
@@ -378,13 +400,18 @@
/**
* This will check to see if the node is the "head" and
* so can be updated (you can't update historical nodes ).
- * @throws RepositoryException
+ * @throws RulesRepositoryException if it is not allowed
+ * (means a programming error !).
*/
- protected void checkIsUpdateable() throws RepositoryException {
- if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
- String message = "Error. Tags can only be added to the head version of a rule node";
- log.error(message);
- throw new RulesRepositoryException(message);
+ protected void checkIsUpdateable() {
+ try {
+ if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
+ String message = "Error. Tags can only be added to the head version of a rule node";
+ log.error(message);
+ throw new RulesRepositoryException(message);
+ }
+ } catch ( RepositoryException e ) {
+ throw new RulesRepositoryException(e);
}
}
}
Modified: labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/rulepackage_node_type.cnd
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/rulepackage_node_type.cnd 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/rulepackage_node_type.cnd 2006-10-05 10:12:18 UTC (rev 6612)
@@ -13,16 +13,15 @@
// Supertypes
> 'drools:versionableNodeType'
-// Multiple rules etc are children of one physical package definition
-// ergo this has many rule nodes under it
-//+ * (drools:versionableNodeType)
-// version
+// Multiple assets are children of one physical package definition
+// ergo this has many "versionable asset folders".
+// a specific named folder will exist for rules, functions etc.
+// these folders contain the actual assets
++ * (drools:versionableAssetFolder)
+ copy
-+ * (nt:folder)
- version
-
-/* MN: retiring this structure
+/* MN: retiring this structure - may use it in future for shared rules
- drools:ruleReference (reference)
multiple
copy
Added: labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/versionable_asset_folder_node_type.cnd
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/versionable_asset_folder_node_type.cnd 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/versionable_asset_folder_node_type.cnd 2006-10-05 10:12:18 UTC (rev 6612)
@@ -0,0 +1,20 @@
+/* The node type definition for the rule node type.
+ See http://jackrabbit.apache.org/doc/nodetype/cnd.html for an explanation
+
+ This is used for folders that hold versionable assets, such as rules.
+*/
+
+// The namespace declaration
+<drools = 'http://www.jboss.org/drools-repository/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+
+// Node type name
+[drools:versionableAssetFolder]
+
+// Supertypes
+> 'nt:hierarchyNode','mix:versionable'
+
+// what it contains
++ * (drools:versionableNodeType)
+ copy
\ No newline at end of file
Property changes on: labs/jbossrules/trunk/drools-repository/src/main/resources/node_type_definitions/versionable_asset_folder_node_type.cnd
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RuleItemTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RuleItemTestCase.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RuleItemTestCase.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -168,11 +168,11 @@
public void testSetStateString() {
RuleItem ruleItem1 = getDefaultPackage().addRule("testSetStateString", "test content");
- ruleItem1.setState("TestState1");
+ ruleItem1.updateState("TestState1");
assertNotNull(ruleItem1.getState());
assertEquals("TestState1", ruleItem1.getState().getName());
- ruleItem1.setState("TestState2");
+ ruleItem1.updateState("TestState2");
assertNotNull(ruleItem1.getState());
assertEquals("TestState2", ruleItem1.getState().getName());
@@ -182,12 +182,12 @@
RuleItem ruleItem1 = getDefaultPackage().addRule("foobar", "test description");
StateItem stateItem1 = getRepo().getState("TestState1");
- ruleItem1.setState(stateItem1);
+ ruleItem1.updateState(stateItem1);
assertNotNull(ruleItem1.getState());
assertEquals(ruleItem1.getState().getName(), "TestState1");
StateItem stateItem2 = getRepo().getState("TestState2");
- ruleItem1.setState(stateItem2);
+ ruleItem1.updateState(stateItem2);
assertNotNull(ruleItem1.getState());
assertEquals("TestState2", ruleItem1.getState().getName());
@@ -199,7 +199,7 @@
StateItem stateItem1 = ruleItem1.getState();
assertNull(stateItem1);
- ruleItem1.setState("TestState1");
+ ruleItem1.updateState("TestState1");
assertNotNull(ruleItem1.getState());
assertEquals("TestState1", ruleItem1.getState().getName());
}
Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulePackageItemTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulePackageItemTestCase.java 2006-10-04 22:49:11 UTC (rev 6611)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulePackageItemTestCase.java 2006-10-05 10:12:18 UTC (rev 6612)
@@ -63,7 +63,76 @@
fail("Caught unexpected exception: " + e);
}
}
+
+ /**
+ * This tests creating a "baseline" of a RulePackage,
+ * basically updating all the resources, and checking it in as a version.
+ * This is showing off "multi dimensional versioning".
+ */
+ public void testBaselinePackage() throws Exception {
+ RulesRepository repo = getRepo();
+
+ RulePackageItem pack = repo.createRulePackage( "testBaselinePackage", "for testing baselines" );
+
+ RuleItem rule1 = pack.addRule( "rule 1", "yeah" );
+ RuleItem rule2 = pack.addRule( "rule 2", "foobar" );
+
+ StateItem state = repo.getState( "deployed" );
+
+ repo.save();
+
+ assertNull(pack.getPrecedingVersion());
+
+ //the first version, frozen with 2 rules
+ pack.createBaseline("commit comment", state);
+
+ //check head
+ pack = repo.loadRulePackage( "testBaselinePackage" );
+ assertEquals(2, iteratorToList(pack.getRules()).size());
+
+ //now remove a rule from head
+ pack.removeRule( "rule 1" );
+ repo.save();
+ assertEquals(1, iteratorToList( pack.getRules() ).size());
+
+ pack.createBaseline( "another", state );
+
+ RulePackageItem prev = (RulePackageItem) pack.getPrecedingVersion();
+ assertEquals(2, iteratorToList( prev.getRules() ).size());
+
+ }
+ /** Continues to show how multi dimensional versioning works */
+ public void testPackageBaselineWithRuleChanges() throws Exception {
+ String packName = StackUtil.getCurrentMethodName();
+ RulePackageItem pack = getRepo().createRulePackage( packName, "yeah" );
+
+ RuleItem rule = pack.addRule( "foobar", "waah" );
+ rule.updateRuleContent( "this is something" );
+ rule.checkin( "something" );
+
+ StateItem state = getRepo().getState( "something" );
+
+ pack.createBaseline( "another one", state );
+
+ pack = getRepo().loadRulePackage( packName );
+
+ rule = (RuleItem) pack.getRules().next();
+ rule.updateRuleContent( "blah" );
+ rule.checkin( "woot" );
+
+ pack.createBaseline( "yeah", state );
+
+ pack = getRepo().loadRulePackage( packName );
+ rule = (RuleItem) pack.getRules().next();
+ assertEquals("blah", rule.getRuleContent());
+
+ RulePackageItem prev = (RulePackageItem) pack.getPrecedingVersion();
+ rule = (RuleItem) prev.getRules().next();
+ assertEquals("this is something", rule.getRuleContent());
+
+ }
+
private RulesRepository getRepo() {
return RepositorySession.getRepository();
}
@@ -106,7 +175,7 @@
StateItem state = getRepo().getState( "foobar" );
- rule1.setState( "foobar" );
+ rule1.updateState( "foobar" );
rule1.checkin( "yeah" );
pack = getRepo().loadRulePackage( "package extractor" );
@@ -126,7 +195,7 @@
//now do an update, and pull it out via state
rule1.updateRuleContent( "new content" );
- rule1.setState( "draft" );
+ rule1.updateState( "draft" );
rule1.checkin( "latest" );
rules = iteratorToList( pack.getRules(getRepo().getState( "draft" )) );
More information about the jboss-svn-commits
mailing list