Author: skitching
Date: Mon Mar  7 02:12:40 2005
New Revision: 156414

URL: http://svn.apache.org/viewcvs?view=rev&rev=156414
Log:
* remove redundant code to clear object stack (this is done again in clear 
method)
* ensure named stacks are cleared too.
* add method peek(StackName, int n) for consistency

Thanks to Brian Hanafee for the suggestion (bugzilla #33873)

Modified:
    
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
    
jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/DigesterTestCase.java

Modified: 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java?view=diff&r1=156413&r2=156414
==============================================================================
--- 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
 (original)
+++ 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
 Mon Mar  7 02:12:40 2005
@@ -962,10 +962,6 @@
             }
         }
 
-        while (getCount() > 1) {
-            pop();
-        }
-
         // Fire "finish" events for all defined rules
         Iterator rules = getRules().rules().iterator();
         while (rules.hasNext()) {
@@ -2419,6 +2415,7 @@
         params.clear();
         publicId = null;
         stack.clear();
+        stacksByName.clear();
     }
 
 
@@ -2550,6 +2547,25 @@
      * @since 1.6
      */
     public Object peek(String stackName) {
+        return peek(stackName, 0);
+    }
+
+    /**
+     * <p>Gets the top object from the stack with the given name.
+     * This method does not remove the object from the stack.
+     * </p>
+     * <p><strong>Note:</strong> a stack is considered empty
+     * if no objects have been pushed onto it yet.</p>
+     *
+     * @param stackName the name of the stack to be peeked
+     * @param n Index of the desired element, where 0 is the top of the stack,
+     *  1 is the next element down, and so on.
+     * @return the specified <code>Object</code> on the stack.
+     * @throws EmptyStackException if the named stack is empty 
+     *
+     * @since 1.6
+     */
+    public Object peek(String stackName, int n) {
         Object result = null;
         ArrayStack namedStack = (ArrayStack) stacksByName.get(stackName);
         if (namedStack == null ) {
@@ -2560,7 +2576,7 @@
         
         } else {
         
-            result = namedStack.peek();
+            result = namedStack.peek(n);
         }
         return result;
     }

Modified: 
jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/DigesterTestCase.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/DigesterTestCase.java?view=diff&r1=156413&r2=156414
==============================================================================
--- 
jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/DigesterTestCase.java
 (original)
+++ 
jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/DigesterTestCase.java
 Mon Mar  7 02:12:40 2005
@@ -393,6 +393,31 @@
         assertEquals("Peeked value:", archimedesAveragePi, 
digester.peek(testStackName));
         assertEquals("Popped value:", archimedesAveragePi, 
digester.pop(testStackName));
         assertTrue("Stack ends empty:", digester.isEmpty(testStackName));
+        
+        digester.push(testStackName, "1");
+        digester.push(testStackName, "2");
+        digester.push(testStackName, "3");
+        
+        assertEquals("Peek#1", "1", digester.peek(testStackName, 2));
+        assertEquals("Peek#2", "2", digester.peek(testStackName, 1));
+        assertEquals("Peek#3", "3", digester.peek(testStackName, 0));
+        assertEquals("Peek#3a", "3", digester.peek(testStackName));
+        
+        try {
+            // peek beyond stack
+            digester.peek(testStackName, 3);
+            fail("Peek#4 failed to throw an exception.");
+        } catch(EmptyStackException ex) {
+            // ok, expected
+        }
+        
+        try {
+            // peek a nonexistent named stack
+            digester.peek("no.such.stack", 0);
+            fail("Peeking a non-existent stack failed to throw an exception.");
+        } catch(EmptyStackException ex) {
+            // ok, expected
+        }
     }
     
     /** Tests that values are stored independently */



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to