You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ra...@apache.org on 2008/12/24 07:10:08 UTC

svn commit: r729242 - in /commons/proper/digester/trunk: ./ src/java/org/apache/commons/digester/ src/java/org/apache/commons/digester/xmlrules/ src/test/org/apache/commons/digester/xmlrules/

Author: rahul
Date: Tue Dec 23 22:10:07 2008
New Revision: 729242

URL: http://svn.apache.org/viewvc?rev=729242&view=rev
Log:
Eliminate [collections] package dependencies -- ArrayStack, and therefore Buffer and BufferUnderflowException:
 - Replace ArrayStack usage with java.util.Stack<E>
 - This will allow BeanUtils to drop these classes in future releases if desired and end a rather painful tangle we got into with v1.x in this regard
 - Allows usage of generics (unlike ArrayStack)
DIGESTER-115

Modified:
    commons/proper/digester/trunk/RELEASE-NOTES.txt
    commons/proper/digester/trunk/src/java/org/apache/commons/digester/CallParamRule.java
    commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
    commons/proper/digester/trunk/src/java/org/apache/commons/digester/FactoryCreateRule.java
    commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
    commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterPatternStackTest.java

Modified: commons/proper/digester/trunk/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/RELEASE-NOTES.txt?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/RELEASE-NOTES.txt (original)
+++ commons/proper/digester/trunk/RELEASE-NOTES.txt Tue Dec 23 22:10:07 2008
@@ -25,6 +25,17 @@
    work on lower JDKs. The source has been updated to leverage Generics and
    other JDK 1.5 features where possible, and requires JDK 1.5 to compile.
 
+ * This release eliminates all dependencies on Commons Collections classes.
+   Previously, ArrayStack was used in the Digester implementation and was
+   exposed via protected fields in the following classes:
+     org.apache.commons.digester.Digester,
+     org.apache.commons.digester.CallParamRule,
+     org.apache.commons.digester.FactoryCreateRule and
+     org.apache.commons.digester.xmlrules.DigesterRuleParser
+   These classes now use java.util.Stack instead. Any subclasses of the above
+   will require appropriate migration to using java.util.Stack for use with
+   version 2.0.
+
 OTHER IMPORTANT CHANGES:
 
  * The legacy schema support has been deprecated in favor of

Modified: commons/proper/digester/trunk/src/java/org/apache/commons/digester/CallParamRule.java
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/java/org/apache/commons/digester/CallParamRule.java?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/src/java/org/apache/commons/digester/CallParamRule.java (original)
+++ commons/proper/digester/trunk/src/java/org/apache/commons/digester/CallParamRule.java Tue Dec 23 22:10:07 2008
@@ -20,9 +20,9 @@
 package org.apache.commons.digester;
 
 
-import org.xml.sax.Attributes;
+import java.util.Stack;
 
-import org.apache.commons.collections.ArrayStack;
+import org.xml.sax.Attributes;
 
 
 /**
@@ -181,7 +181,7 @@
      * Stack is used to allow nested body text to be processed.
      * Lazy creation.
      */
-    protected ArrayStack bodyTextStack;
+    protected Stack<String> bodyTextStack;
 
     // --------------------------------------------------------- Public Methods
 
@@ -238,7 +238,7 @@
             // so that we can make sure that the right set of parameters
             // is at the top of the stack
             if (bodyTextStack == null) {
-                bodyTextStack = new ArrayStack();
+                bodyTextStack = new Stack<String>();
             }
             bodyTextStack.push(bodyText.trim());
         }

Modified: commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java (original)
+++ commons/proper/digester/trunk/src/java/org/apache/commons/digester/Digester.java Tue Dec 23 22:10:07 2008
@@ -34,13 +34,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Stack;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.validation.Schema;
 
-import org.apache.commons.collections.ArrayStack;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.xml.sax.Attributes;
@@ -151,7 +151,7 @@
     /**
      * The stack of body text string buffers for surrounding elements.
      */
-    protected ArrayStack bodyTexts = new ArrayStack();
+    protected Stack<StringBuffer> bodyTexts = new Stack<StringBuffer>();
 
 
     /**
@@ -164,7 +164,7 @@
      *
      * @since 1.6
      */
-    protected ArrayStack matches = new ArrayStack(10);
+    protected Stack<List<Rule>> matches = new Stack<List<Rule>>();
     
     /**
      * The class loader to use for instantiating application objects.
@@ -233,12 +233,12 @@
     /**
      * Registered namespaces we are currently processing.  The key is the
      * namespace prefix that was declared in the document.  The value is an
-     * ArrayStack of the namespace URIs this prefix has been mapped to --
+     * Stack of the namespace URIs this prefix has been mapped to --
      * the top Stack element is the most current one.  (This architecture
      * is required because documents can declare nested uses of the same
      * prefix for different Namespace URIs).
      */
-    protected HashMap<String, ArrayStack> namespaces = new HashMap<String, ArrayStack>();
+    protected HashMap<String, Stack<String>> namespaces = new HashMap<String, Stack<String>>();
 
 
     /**
@@ -251,7 +251,7 @@
      * The parameters stack being utilized by CallMethodRule and
      * CallParamRule rules.
      */
-    protected ArrayStack params = new ArrayStack();
+    protected Stack<Object> params = new Stack<Object>();
 
 
     /**
@@ -314,7 +314,7 @@
     /**
      * The object stack being constructed.
      */
-    protected ArrayStack stack = new ArrayStack();
+    protected Stack<Object> stack = new Stack<Object>();
 
 
     /**
@@ -357,7 +357,7 @@
     protected Substitutor substitutor;
     
     /** Stacks used for interrule communication, indexed by name String */
-    private HashMap<String, ArrayStack> stacksByName = new HashMap<String, ArrayStack>();
+    private HashMap<String, Stack<Object>> stacksByName = new HashMap<String, Stack<Object>>();
     
     /**
      * If not null, then calls by the parser to this object's characters, 
@@ -387,12 +387,12 @@
      */
     public String findNamespaceURI(String prefix) {
         
-        ArrayStack nsStack = namespaces.get(prefix);
+        Stack<String> nsStack = namespaces.get(prefix);
         if (nsStack == null) {
             return null;
         }
         try {
-            return ((String) nsStack.peek());
+            return (nsStack.peek());
         } catch (EmptyStackException e) {
             return null;
         }
@@ -758,9 +758,9 @@
                 // we have to use parser-specific code for this. That code
                 // is hidden behind the ParserFeatureSetterFactory class.
 
-            	// The above has changed in JDK 1.5 and no longer true. The
-            	// functionality used in this block has now been deprecated.
-            	// We now use javax.xml.validation.Schema instead.
+                // The above has changed in JDK 1.5 and no longer true. The
+                // functionality used in this block has now been deprecated.
+                // We now use javax.xml.validation.Schema instead.
 
                 Properties properties = new Properties();
                 properties.put("SAXParserFactory", getFactory());
@@ -1151,10 +1151,10 @@
             log.warn("Digester is not namespace aware");
         }
         Map<String, String> currentNamespaces = new HashMap<String, String>();
-        for (Map.Entry<String, ArrayStack> nsEntry : namespaces.entrySet()) {
+        for (Map.Entry<String, Stack<String>> nsEntry : namespaces.entrySet()) {
              try {
                 currentNamespaces.put(nsEntry.getKey(),
-                    (String) nsEntry.getValue().peek());
+                    nsEntry.getValue().peek());
             } catch (RuntimeException e) {
                 // rethrow, after logging
                 log.error(e.getMessage(), e);
@@ -1270,7 +1270,7 @@
         }
 
         // Fire "body" events for all relevant rules
-        List<Rule> rules = (List<Rule>) matches.pop(); // legacy ArrayStack code
+        List<Rule> rules = matches.pop();
         if ((rules != null) && (rules.size() > 0)) {
             String bodyText = this.bodyText.toString();
             Substitutor substitutor = getSubstitutor();
@@ -1279,7 +1279,7 @@
             }
             for (int i = 0; i < rules.size(); i++) {
                 try {
-                    Rule rule = (Rule) rules.get(i);
+                    Rule rule = rules.get(i);
                     if (debug) {
                         log.debug("  Fire body() for " + rule);
                     }
@@ -1299,7 +1299,7 @@
         }
 
         // Recover the body text from the surrounding element
-        bodyText = (StringBuffer) bodyTexts.pop();
+        bodyText = bodyTexts.pop();
         if (debug) {
             log.debug("  Popping body text '" + bodyText.toString() + "'");
         }
@@ -1309,7 +1309,7 @@
             for (int i = 0; i < rules.size(); i++) {
                 int j = (rules.size() - i) - 1;
                 try {
-                    Rule rule = (Rule) rules.get(j);
+                    Rule rule = rules.get(j);
                     if (debug) {
                         log.debug("  Fire end() for " + rule);
                     }
@@ -1349,7 +1349,7 @@
         }
 
         // Deregister this prefix mapping
-        ArrayStack stack = namespaces.get(prefix);
+        Stack<String> stack = namespaces.get(prefix);
         if (stack == null) {
             return;
         }
@@ -1540,7 +1540,7 @@
             }
             for (int i = 0; i < rules.size(); i++) {
                 try {
-                    Rule rule = (Rule) rules.get(i);
+                    Rule rule = rules.get(i);
                     if (debug) {
                         log.debug("  Fire begin() for " + rule);
                     }
@@ -1578,9 +1578,9 @@
         }
 
         // Register this prefix mapping
-        ArrayStack stack = namespaces.get(prefix);
+        Stack<String> stack = namespaces.get(prefix);
         if (stack == null) {
-            stack = new ArrayStack();
+            stack = new Stack<String>();
             namespaces.put(prefix, stack);
         }
         stack.push(namespaceURI);
@@ -2872,8 +2872,13 @@
      */
     public Object peek(int n) {
 
+        int index = (stack.size() - 1) - n;
+        if (index < 0) {
+            log.warn("Empty stack (returning null)");
+            return (null);
+        }
         try {
-            return (stack.peek(n));
+            return (stack.get(index));
         } catch (EmptyStackException e) {
             log.warn("Empty stack (returning null)");
             return (null);
@@ -2933,9 +2938,9 @@
             value = stackAction.onPush(this, stackName, value);
         }
 
-        ArrayStack namedStack = stacksByName.get(stackName);
+        Stack<Object> namedStack = stacksByName.get(stackName);
         if (namedStack == null) {
-            namedStack = new ArrayStack();
+            namedStack = new Stack<Object>();
             stacksByName.put(stackName, namedStack);
         }
         namedStack.push(value);
@@ -2956,7 +2961,7 @@
      */
     public Object pop(String stackName) {
         Object result = null;
-        ArrayStack namedStack = stacksByName.get(stackName);
+        Stack<Object> namedStack = stacksByName.get(stackName);
         if (namedStack == null) {
             if (log.isDebugEnabled()) {
                 log.debug("Stack '" + stackName + "' is empty");
@@ -3008,7 +3013,7 @@
      */
     public Object peek(String stackName, int n) {
         Object result = null;
-        ArrayStack namedStack = stacksByName.get(stackName);
+        Stack<Object> namedStack = stacksByName.get(stackName);
         if (namedStack == null ) {
             if (log.isDebugEnabled()) {
                 log.debug("Stack '" + stackName + "' is empty");
@@ -3016,8 +3021,11 @@
             throw new EmptyStackException();
         
         } else {
-        
-            result = namedStack.peek(n);
+            int index = (namedStack.size() - 1) - n;
+            if (index < 0) {
+                throw new EmptyStackException();
+            }
+            result = namedStack.get(index);
         }
         return result;
     }
@@ -3034,7 +3042,7 @@
      */
     public boolean isEmpty(String stackName) {
         boolean result = true;
-        ArrayStack namedStack = stacksByName.get(stackName);
+        Stack<Object> namedStack = stacksByName.get(stackName);
         if (namedStack != null ) {
             result = namedStack.isEmpty();
         }
@@ -3235,8 +3243,13 @@
      */
     public Object peekParams(int n) {
 
+        int index = (params.size() - 1) - n;
+        if (index < 0) {
+            log.warn("Empty stack (returning null)");
+            return (null);
+        }
         try {
-            return (params.peek(n));
+            return (params.get(index));
         } catch (EmptyStackException e) {
             log.warn("Empty stack (returning null)");
             return (null);

Modified: commons/proper/digester/trunk/src/java/org/apache/commons/digester/FactoryCreateRule.java
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/java/org/apache/commons/digester/FactoryCreateRule.java?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/src/java/org/apache/commons/digester/FactoryCreateRule.java (original)
+++ commons/proper/digester/trunk/src/java/org/apache/commons/digester/FactoryCreateRule.java Tue Dec 23 22:10:07 2008
@@ -19,9 +19,9 @@
 
 package org.apache.commons.digester;
 
-import org.xml.sax.Attributes;
+import java.util.Stack;
 
-import org.apache.commons.collections.ArrayStack;
+import org.xml.sax.Attributes;
 
 
 /**
@@ -42,7 +42,7 @@
     /** Should exceptions thrown by the factory be ignored? */
     private boolean ignoreCreateExceptions;
     /** Stock to manage */
-    private ArrayStack exceptionIgnoredStack;
+    private Stack<Boolean> exceptionIgnoredStack;
 
     // ----------------------------------------------------------- Constructors
 
@@ -361,7 +361,7 @@
         if (ignoreCreateExceptions) {
         
             if (exceptionIgnoredStack == null) {
-                exceptionIgnoredStack = new ArrayStack();
+                exceptionIgnoredStack = new Stack<Boolean>();
             }
             
             try {
@@ -412,7 +412,7 @@
                 exceptionIgnoredStack != null &&
                 !(exceptionIgnoredStack.empty())) {
                 
-            if (((Boolean) exceptionIgnoredStack.pop()).booleanValue()) {
+            if (exceptionIgnoredStack.pop().booleanValue()) {
                 // creation exception was ignored
                 // nothing was put onto the stack
                 if (digester.log.isTraceEnabled()) {

Modified: commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java (original)
+++ commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java Tue Dec 23 22:10:07 2008
@@ -27,12 +27,10 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.Stack;
 import java.util.StringTokenizer;
 
 import org.apache.commons.beanutils.ConvertUtils;
-
-import org.apache.commons.collections.ArrayStack;
-
 import org.apache.commons.digester.AbstractObjectCreationFactory;
 import org.apache.commons.digester.BeanPropertySetterRule;
 import org.apache.commons.digester.CallMethodRule;
@@ -41,6 +39,7 @@
 import org.apache.commons.digester.FactoryCreateRule;
 import org.apache.commons.digester.NodeCreateRule;
 import org.apache.commons.digester.ObjectCreateRule;
+import org.apache.commons.digester.ObjectParamRule;
 import org.apache.commons.digester.Rule;
 import org.apache.commons.digester.RuleSetBase;
 import org.apache.commons.digester.Rules;
@@ -50,8 +49,6 @@
 import org.apache.commons.digester.SetPropertyRule;
 import org.apache.commons.digester.SetRootRule;
 import org.apache.commons.digester.SetTopRule;
-import org.apache.commons.digester.ObjectParamRule;
-
 import org.w3c.dom.Node;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -86,7 +83,7 @@
      * A stack whose toString method returns a '/'-separated concatenation
      * of all the elements in the stack.
      */
-    protected class PatternStack extends ArrayStack {
+    protected class PatternStack<E> extends Stack<E> {
 
         private static final long serialVersionUID = 1L;
 
@@ -111,7 +108,7 @@
      * pattern, the resulting pattern is a concatenation of that pattern with
      * all the ancestor elements' patterns. Hence the need for a stack.
      */
-    protected PatternStack patternStack;
+    protected PatternStack<String> patternStack;
     
     /**
      * Used to detect circular includes
@@ -123,7 +120,7 @@
      * until the target digester is set, via <code>setTarget(Digester)</code>
      */
     public DigesterRuleParser() {
-        patternStack = new PatternStack();
+        patternStack = new PatternStack<String>();
     }
     
     /**
@@ -133,7 +130,7 @@
      */
     public DigesterRuleParser(Digester targetDigester) {
         this.targetDigester = targetDigester;
-        patternStack = new PatternStack();
+        patternStack = new PatternStack<String>();
     }
     
     /**
@@ -147,7 +144,7 @@
      * to any pattern parsed by this rule set.
      */
     private DigesterRuleParser(Digester targetDigester,
-                                PatternStack stack, Set<String> includedFiles) {
+                                PatternStack<String> stack, Set<String> includedFiles) {
         this.targetDigester = targetDigester;
         patternStack = stack;
         this.includedFiles = includedFiles;

Modified: commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterPatternStackTest.java
URL: http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterPatternStackTest.java?rev=729242&r1=729241&r2=729242&view=diff
==============================================================================
--- commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterPatternStackTest.java (original)
+++ commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterPatternStackTest.java Tue Dec 23 22:10:07 2008
@@ -47,7 +47,7 @@
         return suite;
     }
 
-    private DigesterRuleParser.PatternStack stack;
+    private DigesterRuleParser.PatternStack<String> stack;
 
     public void setUp() {
         DigesterRuleParser parser = new DigesterRuleParser();