[jboss-svn-commits] JBL Code SVN: r5961 - in labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository: . test

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Aug 23 00:45:20 EDT 2006


Author: bentruitt
Date: 2006-08-23 00:45:14 -0400 (Wed, 23 Aug 2006)
New Revision: 5961

Added:
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/ItemVersionIterator.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/VersionableItem.java
Modified:
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/CategoryItem.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/DslItem.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/Item.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RuleItem.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulePackageItem.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulesRepository.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/DslItemTestCase.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RuleItemTestCase.java
   labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RulePackageItemTestCase.java
Log:
Added some version operations, and abstracted them out to the type hierarchy inheriting from Item.

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/CategoryItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/CategoryItem.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/CategoryItem.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -6,6 +6,8 @@
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.log4j.Logger;
 
@@ -106,5 +108,5 @@
             log.error("Caught Exception: " + e);
             throw new RulesRepositoryException(e);
         }
-    }
+    }        
 }

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/DslItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/DslItem.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/DslItem.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -2,12 +2,16 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.log4j.Logger;
 
@@ -16,7 +20,7 @@
  * 
  * @author btruitt
  */
-public class DslItem extends Item {
+public class DslItem extends VersionableItem {
     private Logger log = Logger.getLogger(DslItem.class);
     
     /**
@@ -148,4 +152,58 @@
             return null;
         }
     }
+    
+    /**
+     * @return a List of DslItem objects encapsulating each Version node in the VersionHistory 
+     *         of this Item's node
+     * @throws RulesRepositoryException
+     */
+    public List getHistory() throws RulesRepositoryException {
+        List returnList = new ArrayList();
+        try {
+            VersionIterator it = this.node.getVersionHistory().getAllVersions();
+            while(it.hasNext()) {
+                Version currentVersion = it.nextVersion();
+                DslItem item = new DslItem(this.rulesRepository, currentVersion);
+                returnList.add(item);
+            }
+        }
+        catch(Exception e) {
+            log.error("Caught exception: " + e);
+            throw new RulesRepositoryException(e);
+        }
+        return returnList;
+    }
+    
+    public VersionableItem getPrecedingVersion() throws RulesRepositoryException {
+        try {
+            Node precedingVersionNode = this.getPrecedingVersionNode();
+            if(precedingVersionNode != null) {
+                return new DslItem(this.rulesRepository, precedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }               
+    }
+
+    public VersionableItem getSucceedingVersion() throws RulesRepositoryException {
+        try {
+            Node succeedingVersionNode = this.getSucceedingVersionNode();
+            if(succeedingVersionNode != null) {
+                return new DslItem(this.rulesRepository, succeedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
+    }          
 }

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/Item.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/Item.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/Item.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -1,13 +1,13 @@
 package org.drools.repository;
 
+import java.util.List;
+
 import javax.jcr.Node;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.log4j.Logger;
 
-//TODO: may need to change this so that it has the path as its attribute rather than the 
-//      node reference itself. Then add a getNode() convenience function for getting a reference
-//      to the node from the rulesRepository attribute.  This is potentially a better design
-//      for passing this object around.
 
 /**
  * The item class is used to abstract away the underlying details of the JCR repository.
@@ -48,7 +48,8 @@
     }    
     
     /**
-     * gets the name of the node that this item encapsulates
+     * gets the name of this item (unless overridden in a subclass, this just returns the
+     * name of the node that this Item encapsulates.
      * 
      * @return the name of the node that this item encapsultes
      * @throws RulesRepositoryException 
@@ -82,5 +83,24 @@
 
     public int hashCode() {
         return this.node.hashCode();
+    }        
+    
+    /**
+     * @return the name of the version for this node in the version history
+     * @throws RulesRepositoryException
+     */
+    public String getVersionName() throws RulesRepositoryException {
+        try {
+            if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
+                return this.node.getName();
+            }
+            else {
+                return this.node.getBaseVersion().getName();
+            }            
+        }
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
     }
 }

Added: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/ItemVersionIterator.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/ItemVersionIterator.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/ItemVersionIterator.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -0,0 +1,68 @@
+package org.drools.repository;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Implements the Iterator interface, allowing iteration over the version history of versionableItem 
+ * nodes
+ * 
+ * @author btruitt
+ */
+public class ItemVersionIterator implements Iterator {
+    private static final Logger log = Logger.getLogger(ItemVersionIterator.class);
+    
+    private VersionableItem currentVersionableItem;
+    private int iterationType;
+    
+    public static final int ITERATION_TYPE_SUCCESSOR = 1;
+    public static final int ITERATION_TYPE_PREDECESSOR = 2;
+
+    public ItemVersionIterator(VersionableItem versionableItem, int iterationType) {
+        this.currentVersionableItem = versionableItem;
+        this.iterationType = iterationType;
+    }
+    
+    public boolean hasNext() {
+        if(this.currentVersionableItem == null) {
+            return false;
+        }
+        
+        if(this.iterationType == ITERATION_TYPE_SUCCESSOR) {
+            return (this.currentVersionableItem.getSucceedingVersion() != null);
+        }
+        else if(this.iterationType == ITERATION_TYPE_PREDECESSOR) {
+            return (this.currentVersionableItem.getPrecedingVersion() != null);
+        }
+        else {
+            //shouldn't reach this block
+            log.error("Reached unexpected path of execution because iterationType is set to: " + this.iterationType);
+            return false;
+        }
+    }
+
+    public Object next() {
+        if(this.iterationType == ITERATION_TYPE_SUCCESSOR) {
+            this.currentVersionableItem = this.currentVersionableItem.getSucceedingVersion();            
+        }
+        else if(this.iterationType == ITERATION_TYPE_PREDECESSOR) {
+            this.currentVersionableItem = this.currentVersionableItem.getPrecedingVersion();
+        }
+        else {
+            //shouldn't reach this block
+            log.error("Reached unexpected path of execution because iterationType is set to: " + this.iterationType);
+            return false;
+        }
+        
+        if(this.currentVersionableItem == null) {
+            throw new NoSuchElementException();
+        }
+        return this.currentVersionableItem;
+    }
+
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+}

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RuleItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RuleItem.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RuleItem.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -14,6 +14,8 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.log4j.Logger;
 
@@ -23,7 +25,7 @@
  * 
  * @author btruitt
  */
-public class RuleItem extends Item {
+public class RuleItem extends VersionableItem {
     private Logger log = Logger.getLogger(RuleItem.class);
     
     /**
@@ -49,14 +51,9 @@
     /**
      * The name of the last modified property on the rule node type
      */
-    public static final String LAST_MODIFIED_PROPERTY_NAME = "drools:last_modified"; 
+    public static final String LAST_MODIFIED_PROPERTY_NAME = "drools:last_modified";         
     
     /**
-     * The name of the name property on the rule node type
-     */
-    public static final String NAME_PROPERTY_NAME = "drools:name";
-    
-    /**
      * The name of the lhs property on the rule node type
      */
     public static final String LHS_PROPERTY_NAME = "drools:lhs";
@@ -107,7 +104,7 @@
             }    
         }
         catch(Exception e) {
-            log.error("Caught exception: " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -259,7 +256,7 @@
             String message = "";
             try {
                 message = "Error: Caught UnsupportedRepositoryOperationException when attempting to checkout rule: " + this.node.getName() + ". Are you sure your JCR repository supports versioning? ";
-                log.error(message + e);
+                log.error(message, e);
             }
             catch (RepositoryException e1) {
                 log.error("Caught Exception", e);
@@ -330,7 +327,7 @@
             String message = "";
             try {
                 message = "Error: Caught UnsupportedRepositoryOperationException when attempting to checkout rule: " + this.node.getName() + ". Are you sure your JCR repository supports versioning? ";
-                log.error(message + e);
+                log.error(message, e);
             }
             catch (RepositoryException e1) {
                 log.error("Caught Exception", e);
@@ -397,7 +394,7 @@
             String message = "";
             try {
                 message = "Error: Caught UnsupportedRepositoryOperationException when attempting to checkout rule: " + this.node.getName() + ". Are you sure your JCR repository supports versioning? ";
-                log.error(message + e);
+                log.error(message, e);
             }
             catch (RepositoryException e1) {
                 log.error("Caught Exception", e);
@@ -441,7 +438,7 @@
             String message = "";
             try {
                 message = "Error: Caught UnsupportedRepositoryOperationException when attempting to checkout rule: " + this.node.getName() + ". Are you sure your JCR repository supports versioning? ";
-                log.error(message + e);
+                log.error(message, e);
             }
             catch (RepositoryException e1) {
                 log.error("Caught Exception", e);
@@ -485,7 +482,7 @@
             String message = "";
             try {
                 message = "Error: Caught UnsupportedRepositoryOperationException when attempting to checkout rule: " + this.node.getName() + ". Are you sure your JCR repository supports versioning? ";
-                log.error(message + e);
+                log.error(message, e);
             }
             catch (RepositoryException e1) {
                 log.error("Caught Exception", e);
@@ -569,7 +566,7 @@
             }
         }
         catch(Exception e) {
-            log.error("Caught exception " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -642,7 +639,7 @@
             }
         }
         catch(Exception e) {
-            log.error("Caught exception " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -679,7 +676,7 @@
             return returnList;
         }
         catch(Exception e) {
-            log.error("Caught exception: " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -696,7 +693,7 @@
             this.setState(stateItem);
         }
         catch(Exception e) {
-            log.error("Caught exception: " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -724,7 +721,7 @@
             this.node.checkin();        
         }
         catch(Exception e) {
-            log.error("Caught exception " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -747,7 +744,7 @@
             return null;
         }
         catch(Exception e) {
-            log.error("Caught exception: " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -771,7 +768,7 @@
             return null;
         }
         catch(Exception e) {
-            log.error("Caught exception: " + e);
+            log.error("Caught exception", e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -782,7 +779,7 @@
     public String toString() {                
         try {
             StringBuffer returnString = new StringBuffer();
-            returnString.append("Content of rule node named " + this.node.getName() + ":\n");
+            returnString.append("Content of rule item named '" + this.getName() + "':\n");
             returnString.append("LHS: " + this.getLhs() + "\n");
             returnString.append("RHS: " + this.getRhs() + "\n");
             returnString.append("------\n");
@@ -790,6 +787,7 @@
             returnString.append("Date Effective: " + this.getDateEffective() + "\n");
             returnString.append("Date Expired: " + this.getDateExpired() + "\n");
             returnString.append("Rule Language: " + this.getRuleLanguage() + "\n");
+            returnString.append("Version Name: " + this.getVersionName() + "\n");
             returnString.append("------\n");
             
             returnString.append("Rule state: ");
@@ -798,7 +796,7 @@
                 returnString.append(this.getState().getName() + "\n");
             }
             else {
-                returnString.append("NO STATE SET FOR THIS NODE");
+                returnString.append("NO STATE SET FOR THIS NODE\n");
             }            
             returnString.append("------\n");
             
@@ -815,4 +813,36 @@
             return null;
         }
     }
+        
+    public VersionableItem getPrecedingVersion() throws RulesRepositoryException {
+        try {
+            Node precedingVersionNode = this.getPrecedingVersionNode();
+            if(precedingVersionNode != null) {
+                return new RuleItem(this.rulesRepository, precedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }               
+    }
+
+    public VersionableItem getSucceedingVersion() throws RulesRepositoryException {
+        try {
+            Node succeedingVersionNode = this.getSucceedingVersionNode();
+            if(succeedingVersionNode != null) {
+                return new RuleItem(this.rulesRepository, succeedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
+    }           
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulePackageItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulePackageItem.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulePackageItem.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -10,6 +10,8 @@
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
 import javax.jcr.ValueFactory;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.log4j.Logger;
 
@@ -27,7 +29,7 @@
  * 
  * @author btruitt
  */
-public class RulePackageItem extends Item {       
+public class RulePackageItem extends VersionableItem {       
     private static Logger log = Logger.getLogger(RulePackageItem.class);
     
     /**
@@ -263,4 +265,58 @@
             return null;
         }
     }
-}
+
+    /**
+     * @return a List of RulePackageItem objects encapsulating each Version node in the 
+     *         VersionHistory of this Item's node
+     * @throws RulesRepositoryException
+     */
+    public List getHistory() throws RulesRepositoryException {
+        List returnList = new ArrayList();
+        try {
+            VersionIterator it = this.node.getVersionHistory().getAllVersions();
+            while(it.hasNext()) {
+                Version currentVersion = it.nextVersion();
+                RulePackageItem item = new RulePackageItem(this.rulesRepository, currentVersion);
+                returnList.add(item);
+            }
+        }
+        catch(Exception e) {
+            log.error("Caught exception: " + e);
+            throw new RulesRepositoryException(e);
+        }
+        return returnList;
+    }
+    
+    public VersionableItem getPrecedingVersion() throws RulesRepositoryException {
+        try {
+            Node precedingVersionNode = this.getPrecedingVersionNode();
+            if(precedingVersionNode != null) {
+                return new RulePackageItem(this.rulesRepository, precedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }               
+    }
+
+    public VersionableItem getSucceedingVersion() throws RulesRepositoryException {
+        try {
+            Node succeedingVersionNode = this.getSucceedingVersionNode();
+            if(succeedingVersionNode != null) {
+                return new RulePackageItem(this.rulesRepository, succeedingVersionNode);
+            }
+            else {
+                return null;
+            }
+        }        
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
+    }          
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulesRepository.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulesRepository.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/RulesRepository.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -54,6 +54,13 @@
  * Rules can be associated with 0 or 1 states.  States are created in a seperate area of the 
  * repository. States are intended to help track the progress of a rule as it traverses its life-
  * cycle. (e.g. draft, approved, deprecated, etc.)
+ * <p>
+ * The RulesRepository provides versioning of rules, rule packages, and DSLs.  This versioning works
+ * in a strictly linear fashion, with one version having at most 1 predecessor version (or none, if
+ * it is the first version), and at most 1 successor version (or none, if it is the most recently
+ * checked-in version).  The JCR specification supports a more complicated versioning system, and 
+ * if there is sufficient demand, we can modify our versioning scheme to be better aligned with JCR's
+ * versioning abilities.
  * 
  * @author btruitt
  */

Added: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/VersionableItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/VersionableItem.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/VersionableItem.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -0,0 +1,156 @@
+package org.drools.repository;
+
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.Value;
+
+import org.drools.repository.Item;
+
+public abstract class VersionableItem extends Item {
+    
+    /**
+     * The name of the name property on the node type
+     */
+    public static final String NAME_PROPERTY_NAME = "drools:name";
+    
+    /**
+     * Sets this object's node attribute to the specified node
+     * 
+     * @param rulesRepository the RulesRepository object that this object is being created from
+     * @param node the node in the repository that this item corresponds to
+     */
+    public VersionableItem(RulesRepository rulesRepository, Node node) {
+        super(rulesRepository, node);
+    }
+    
+    /**
+     * @return the predessor node of this node in the version history, or null if no predecessor version exists
+     * @throws RulesRepositoryException
+     */
+    protected Node getPrecedingVersionNode() throws RulesRepositoryException {
+        try {
+            Node versionNode;
+            if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
+                versionNode = this.node;
+            }
+            else {                
+                versionNode = this.node.getBaseVersion();
+            }                       
+            
+            Property predecessorsProperty = versionNode.getProperty("jcr:predecessors");
+            Value [] predecessorValues = predecessorsProperty.getValues();                                              
+            
+            if(predecessorValues.length > 0) {
+                Node predecessorNode = this.node.getSession().getNodeByUUID(predecessorValues[0].getString());
+                
+                //we don't want to return the root node - it isn't a true predecessor
+                if(predecessorNode.getName().equals("jcr:rootVersion")) {
+                    return null; 
+                }
+                
+                return predecessorNode;
+            }           
+        }
+        catch(PathNotFoundException e) {
+            //do nothing - this will happen if no predecessors exits
+        }
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
+        return null;               
+    }
+
+    /**
+     * @return the successor node of this node in the version history
+     * @throws RulesRepositoryException
+     */
+    protected Node getSucceedingVersionNode() throws RulesRepositoryException {
+        try {
+            Property successorsProperty = this.node.getProperty("jcr:successors");
+            Value [] successorValues = successorsProperty.getValues();                      
+            
+            if(successorValues.length > 0) {
+                Node successorNode = this.node.getSession().getNodeByUUID(successorValues[0].getString());
+                return successorNode;
+            }           
+        }
+        catch(PathNotFoundException e) {
+            //do nothing - this will happen if no successors exist
+        }
+        catch(Exception e) {
+            log.error("Caught exception", e);
+            throw new RulesRepositoryException(e);
+        }
+        return null;
+    }
+
+    /**
+     * @return an Iterator over VersionableItem objects encapsulating each successor node of this 
+     *         Item's node
+     * @throws RulesRepositoryException
+     */
+    public ItemVersionIterator getSuccessorVersionsIterator() throws RulesRepositoryException {
+        return new ItemVersionIterator(this, ItemVersionIterator.ITERATION_TYPE_SUCCESSOR);
+    }
+
+
+    /**
+     * @return an Iterator over VersionableItem objects encapsulating each predecessor node of this 
+     *         Item's node
+     * @throws RulesRepositoryException
+     */
+    public ItemVersionIterator getPredecessorVersionsIterator() throws RulesRepositoryException {
+        return new ItemVersionIterator(this, ItemVersionIterator.ITERATION_TYPE_PREDECESSOR);
+    }
+
+    /**
+     * Clients of this method can cast the resulting object to the type of object they are 
+     * calling the method on (e.g. 
+     *         <pre>
+     *           RuleItem item;
+     *           ...
+     *           RuleItem predcessor = (RuleItem) item.getPrecedingVersion();
+     *         </pre>
+     * @return a VersionableItem object encapsulating the predessor node of this node in the 
+     *         version history, or null if no predecessor version exists
+     * @throws RulesRepositoryException
+     */
+    public abstract VersionableItem getPrecedingVersion() throws RulesRepositoryException;
+    
+    /**
+     * Clients of this method can cast the resulting object to the type of object they are 
+     * calling the method on (e.g. 
+     *         <pre>
+     *           RuleItem item;
+     *           ...
+     *           RuleItem successor = (RuleItem) item.getSucceedingVersion();
+     *         </pre>
+     *         
+     * @return a VersionableItem object encapsulating the successor node of this node in the 
+     *         version history. 
+     * @throws RulesRepositoryException
+     */
+    public abstract VersionableItem getSucceedingVersion() throws RulesRepositoryException; 
+    
+    @Override
+    public String getName() throws RulesRepositoryException {
+        try {                        
+            Node ruleNode;
+            if(this.node.getPrimaryNodeType().getName().equals("nt:version")) {
+                ruleNode = this.node.getNode("jcr:frozenNode");
+            }
+            else {
+                ruleNode = this.node;
+            }
+                        
+            Property data = ruleNode.getProperty(NAME_PROPERTY_NAME);
+            return data.getValue().getString();
+        }
+        catch(Exception e) {
+            log.error("Caught Exception", e);
+            throw new RulesRepositoryException(e);
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/DslItemTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/DslItemTestCase.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/DslItemTestCase.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -1,6 +1,7 @@
 package org.drools.repository.test;
 
 import java.io.File;
+import java.util.Iterator;
 
 import org.drools.repository.DslItem;
 import org.drools.repository.RuleItem;
@@ -71,4 +72,22 @@
             fail("Unexpected Exception caught: " + e);
         }
     }
+       
+    public void testGetPrecedingVersion() {
+        //not bothering to implement this test since it is pretty much covered by the RuleItemTestCase   
+    }
+    
+    public void testGetSucceedingVersion() {
+        //not bothering to implement this test since it is pretty much covered by the RuleItemTestCase   
+    } 
+    
+    public void testGetSuccessorVersionsIterator() {
+        //This is covered by the test in RuleItemTestCase - all functionality under test
+        // resides in the common subclass, VersionableItem
+    }
+    
+    public void testGetPredecessorVersionsIterator() {
+        //This is covered by the test in RuleItemTestCase - all functionality under test
+        // resides in the common subclass, VersionableItem
+    }
 }

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RuleItemTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RuleItemTestCase.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RuleItemTestCase.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -3,6 +3,7 @@
 import java.io.File;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -320,4 +321,124 @@
             fail("Caught unexpected exception: " + e);
         }
     }
-}
+    
+    public void testGetPrecedingVersion() {
+        try {
+            RuleItem ruleItem1 = this.rulesRepository.addRule("test rule", "test lhs content", "test rhs content");
+            
+            RuleItem predecessorRuleItem = (RuleItem) ruleItem1.getPrecedingVersion();
+            assertTrue(predecessorRuleItem == null);            
+            
+            ruleItem1.updateLhs("new lhs");
+            
+            predecessorRuleItem = (RuleItem) ruleItem1.getPrecedingVersion();
+            assertNotNull(predecessorRuleItem);
+            assertEquals("test lhs content", predecessorRuleItem.getLhs());
+            
+            ruleItem1.updateLhs("newer lhs");
+            
+            predecessorRuleItem = (RuleItem) ruleItem1.getPrecedingVersion();
+            assertNotNull(predecessorRuleItem);
+            assertEquals("new lhs", predecessorRuleItem.getLhs());
+            predecessorRuleItem = (RuleItem) predecessorRuleItem.getPrecedingVersion();
+            assertNotNull(predecessorRuleItem);
+            assertEquals("test lhs content", predecessorRuleItem.getLhs());
+        }
+        catch(Exception e) {
+            fail("Caught unexpected exception: " + e);
+        }   
+    }
+    
+    public void testGetSucceedingVersion() {
+        try {
+            RuleItem ruleItem1 = this.rulesRepository.addRule("test rule", "test lhs content", "test rhs content");
+            
+            RuleItem succeedingRuleItem = (RuleItem) ruleItem1.getSucceedingVersion();
+            assertTrue(succeedingRuleItem == null);            
+            
+            ruleItem1.updateLhs("new lhs");
+            
+            RuleItem predecessorRuleItem = (RuleItem) ruleItem1.getPrecedingVersion();
+            assertEquals("test lhs content", predecessorRuleItem.getLhs());
+            succeedingRuleItem = (RuleItem) predecessorRuleItem.getSucceedingVersion();
+            assertNotNull(succeedingRuleItem);
+            assertEquals(ruleItem1.getLhs(), succeedingRuleItem.getLhs());                       
+        }        
+        catch(Exception e) {
+            fail("Caught unexpected exception: " + e);
+        }   
+    } 
+    
+    public void testGetSuccessorVersionsIterator() {
+        try {
+            RuleItem ruleItem1 = this.rulesRepository.addRule("test rule", "test lhs content", "test rhs content");                        
+            
+            Iterator iterator = ruleItem1.getSuccessorVersionsIterator();            
+            assertNotNull(iterator);
+            assertFalse(iterator.hasNext());
+            
+            ruleItem1.updateLhs("new lhs");
+            
+            iterator = ruleItem1.getSuccessorVersionsIterator();            
+            assertNotNull(iterator);
+            assertFalse(iterator.hasNext());
+            
+            RuleItem predecessorRuleItem = (RuleItem) ruleItem1.getPrecedingVersion();
+            iterator = predecessorRuleItem.getSuccessorVersionsIterator();
+            assertNotNull(iterator);
+            assertTrue(iterator.hasNext());
+            RuleItem nextRuleItem = (RuleItem) iterator.next();
+            assertEquals("new lhs", nextRuleItem.getLhs());
+            assertFalse(iterator.hasNext());
+            
+            ruleItem1.updateLhs("newer lhs");
+                        
+            iterator = predecessorRuleItem.getSuccessorVersionsIterator();
+            assertNotNull(iterator);
+            assertTrue(iterator.hasNext());
+            nextRuleItem = (RuleItem) iterator.next();
+            assertEquals("new lhs", nextRuleItem.getLhs());
+            assertTrue(iterator.hasNext());
+            nextRuleItem = (RuleItem)iterator.next();
+            assertEquals("newer lhs", nextRuleItem.getLhs());
+            assertFalse(iterator.hasNext());            
+        }
+        catch(Exception e) {
+            fail("Caught unexpected exception: " + e);
+        }
+    }
+    
+    public void testGetPredecessorVersionsIterator() {
+        try {
+            RuleItem ruleItem1 = this.rulesRepository.addRule("test rule", "test lhs content", "test rhs content");                        
+            
+            Iterator iterator = ruleItem1.getPredecessorVersionsIterator();            
+            assertNotNull(iterator);
+            assertFalse(iterator.hasNext());
+            
+            ruleItem1.updateLhs("new lhs");
+            
+            iterator = ruleItem1.getPredecessorVersionsIterator();            
+            assertNotNull(iterator);
+            assertTrue(iterator.hasNext());
+            RuleItem nextRuleItem = (RuleItem) iterator.next();
+            assertFalse(iterator.hasNext());
+            assertEquals("test lhs content", nextRuleItem.getLhs());
+            
+            ruleItem1.updateLhs("newer lhs");
+            
+            iterator = ruleItem1.getPredecessorVersionsIterator();            
+            assertNotNull(iterator);
+            assertTrue(iterator.hasNext());
+            nextRuleItem = (RuleItem) iterator.next();
+            assertTrue(iterator.hasNext());            
+            assertEquals("new lhs", nextRuleItem.getLhs());
+            nextRuleItem = (RuleItem) iterator.next();
+            assertFalse(iterator.hasNext());
+            assertEquals("test lhs content", nextRuleItem.getLhs());
+        }
+        catch(Exception e) {
+            fail("Caught unexpected exception: " + e);
+        }
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RulePackageItemTestCase.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RulePackageItemTestCase.java	2006-08-22 22:21:41 UTC (rev 5960)
+++ labs/jbossrules/trunk/drools-repository/src/java/org/drools/repository/test/RulePackageItemTestCase.java	2006-08-23 04:45:14 UTC (rev 5961)
@@ -247,4 +247,22 @@
             fail("Caught unexpected exception: " + e);
         }
     }
+    
+    public void testGetPrecedingVersion() {
+        //not bothering to implement this test since it is pretty much covered by the RuleItemTestCase   
+    }
+    
+    public void testGetSucceedingVersion() {
+        //not bothering to implement this test since it is pretty much covered by the RuleItemTestCase   
+    } 
+    
+    public void testGetSuccessorVersionsIterator() {
+        //This is covered by the test in RuleItemTestCase - all functionality under test
+        // resides in the common subclass, VersionableItem
+    }
+    
+    public void testGetPredecessorVersionsIterator() {
+        //This is covered by the test in RuleItemTestCase - all functionality under test
+        // resides in the common subclass, VersionableItem
+    }
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list