On 8/20/01 3:18 PM, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:

> craigmcc    01/08/20 12:18:42
> 
> Modified:    digester/src/java/org/apache/commons/digester
>                       CallMethodRule.java CallParamRule.java
>                       Digester.java
> Log:
> Allow multiple CallMethodRule rules to be fired on the same pattern.  The
> problem was that each CallMethodRule was pushing its parameter array onto
> the object stack, which interfered with the ultimate method call on the
> "top" data object.  This was fixed by using a separate stack for the the
> parameter arrays.
> 
> As long as you group the CallMethodRule and all its associated
> CallParamRules together when creating rules, you can now have an unlimited
> number of them for a particular matching pattern.

Yaaayy for Digester!! Thank Craig :-)
 
> Submitted by:  Jason van Zyl <[EMAIL PROTECTED]>
> 
> Revision  Changes    Path
> 1.7       +6 -6  
> jakarta-commons/digester/src/java/org/apache/commons/digester/CallMethodRule.j
> ava
> 
> Index: CallMethodRule.java
> ===================================================================
> RCS file: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallMe
> thodRule.java,v
> retrieving revision 1.6
> retrieving revision 1.7
> diff -u -r1.6 -r1.7
> --- CallMethodRule.java    2001/08/20 18:28:40    1.6
> +++ CallMethodRule.java    2001/08/20 19:18:42    1.7
> @@ -1,7 +1,7 @@
>  /*
> - * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallMe
> thodRule.java,v 1.6 2001/08/20 18:28:40 craigmcc Exp $
> - * $Revision: 1.6 $
> - * $Date: 2001/08/20 18:28:40 $
> + * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallMe
> thodRule.java,v 1.7 2001/08/20 19:18:42 craigmcc Exp $
> + * $Revision: 1.7 $
> + * $Date: 2001/08/20 19:18:42 $
>   *
>   * ====================================================================
>   *
> @@ -77,7 +77,7 @@
>   *
>   * @author Craig McClanahan
>   * @author Scott Sanders
> - * @version $Revision: 1.6 $ $Date: 2001/08/20 18:28:40 $
> + * @version $Revision: 1.7 $ $Date: 2001/08/20 19:18:42 $
>   */
>  
>  public class CallMethodRule extends Rule {
> @@ -217,7 +217,7 @@
>    String parameters[] = new String[paramCount];
>    for (int i = 0; i < parameters.length; i++)
>        parameters[i] = null;
> -        digester.push(parameters);
> +        digester.pushParams(parameters);
>          }
>  
>      }
> @@ -244,7 +244,7 @@
> // Retrieve or construct the parameter values array
> String parameters[] = null;
> if (paramCount > 0)
> -        parameters = (String[]) digester.pop();
> +        parameters = (String[]) digester.popParams();
> else {
>    parameters = new String[1];
>    parameters[0] = bodyText;
> 
> 
> 
> 1.5       +5 -5  
> jakarta-commons/digester/src/java/org/apache/commons/digester/CallParamRule.ja
> va
> 
> Index: CallParamRule.java
> ===================================================================
> RCS file: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallPa
> ramRule.java,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -r1.4 -r1.5
> --- CallParamRule.java    2001/08/20 18:28:40    1.4
> +++ CallParamRule.java    2001/08/20 19:18:42    1.5
> @@ -1,7 +1,7 @@
>  /*
> - * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallPa
> ramRule.java,v 1.4 2001/08/20 18:28:40 craigmcc Exp $
> - * $Revision: 1.4 $
> - * $Date: 2001/08/20 18:28:40 $
> + * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallPa
> ramRule.java,v 1.5 2001/08/20 19:18:42 craigmcc Exp $
> + * $Revision: 1.5 $
> + * $Date: 2001/08/20 19:18:42 $
>   *
>   * ====================================================================
>   *
> @@ -73,7 +73,7 @@
>   * by a surrounding CallMethodRule rule.
>   *
>   * @author Craig McClanahan
> - * @version $Revision: 1.4 $ $Date: 2001/08/20 18:28:40 $
> + * @version $Revision: 1.5 $ $Date: 2001/08/20 19:18:42 $
>   */
>  
>  public class CallParamRule extends Rule {
> @@ -169,7 +169,7 @@
>       */
>      public void end() throws Exception {
>  
> -    String parameters[] = (String[]) digester.peek();
> +    String parameters[] = (String[]) digester.peekParams();
> parameters[paramIndex] = bodyText;
>  
>      }
> 
> 
> 
> 1.14      +93 -18
> jakarta-commons/digester/src/java/org/apache/commons/digester/Digester.java
> 
> Index: Digester.java
> ===================================================================
> RCS file: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Digest
> er.java,v
> retrieving revision 1.13
> retrieving revision 1.14
> diff -u -r1.13 -r1.14
> --- Digester.java    2001/08/13 18:59:46    1.13
> +++ Digester.java    2001/08/20 19:18:42    1.14
> @@ -1,7 +1,7 @@
>  /*
> - * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Digest
> er.java,v 1.13 2001/08/13 18:59:46 craigmcc Exp $
> - * $Revision: 1.13 $
> - * $Date: 2001/08/13 18:59:46 $
> + * $Header: 
> /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Digest
> er.java,v 1.14 2001/08/20 19:18:42 craigmcc Exp $
> + * $Revision: 1.14 $
> + * $Date: 2001/08/20 19:18:42 $
>   *
>   * ====================================================================
>   *
> @@ -106,7 +106,7 @@
>   *
>   * @author Craig McClanahan
>   * @author Scott Sanders
> - * @version $Revision: 1.13 $ $Date: 2001/08/13 18:59:46 $
> + * @version $Revision: 1.14 $ $Date: 2001/08/20 19:18:42 $
>   */
>  
>  public class Digester extends DefaultHandler {
> @@ -209,6 +209,13 @@
>  
>  
>      /**
> +     * The parameters stack being utilized by CallMethodRule and
> +     * CallParamRule rules.
> +     */
> +    protected ArrayStack params = new ArrayStack();
> +
> +
> +    /**
>       * The SAXParser we will use to parse the input stream.
>       */
>      protected SAXParser parser = null;
> @@ -576,18 +583,19 @@
>      public void endElement(String namespaceURI, String localName,
>                             String qName) throws SAXException {
>  
> -    //    if (debug >= 3)
> -    //        log("endElement(" + match + ")");
> +    if (debug >= 3)
> +        log("endElement(" + match + ")");
> List rules = getRules().match(match);
>  
> // Fire "body" events for all relevant rules
> if (rules != null) {
> -        //        if (debug >= 3)
> -        //        log("  Firing 'body' events for " + rules.size() + "
rules");
>    String bodyText = this.bodyText.toString().trim();
>    for (int i = 0; i < rules.size(); i++) {
> try {
> -            ((Rule) rules.get(i)).body(bodyText);
> +                    Rule rule = (Rule) rules.get(i);
> +                    if (debug >= 4)
> +                        log("  Fire body() for " + rule);
> +                    rule.body(bodyText);
> } catch (Exception e) {
>    log("Body event threw exception", e);
>    throw new SAXException(e);
> @@ -600,12 +608,13 @@
>  
> // Fire "end" events for all relevant rules in reverse order
> if (rules != null) {
> -        //        if (debug >= 3)
> -        //        log("  Firing 'end' events for " + rules.size() + "
rules");
>    for (int i = 0; i < rules.size(); i++) {
> int j = (rules.size() - i) - 1;
> try {
> -            ((Rule) rules.get(j)).end();
> +                    Rule rule = (Rule) rules.get(j);
> +                    if (debug >= 4)
> +                        log("  Fire end() for " + rule);
> +                    rule.end();
> } catch (Exception e) {
>    log("End event threw exception", e);
>    throw new SAXException(e);
> @@ -733,18 +742,19 @@
>          else
>              sb.append(localName);
>          match = sb.toString();
> -    //    if (debug >= 3)
> -    //        log("startElement(" + match + ")");
> +    if (debug >= 3)
> +        log("startElement(" + match + ")");
>  
> // Fire "begin" events for all relevant rules
> List rules = getRules().match(match);
> if (rules != null) {
> -        //        if (debug >= 3)
> -        //        log("  Firing 'begin' events for " + rules.size() + "
rules");
>    String bodyText = this.bodyText.toString();
>    for (int i = 0; i < rules.size(); i++) {
> try {
> -            ((Rule) rules.get(i)).begin(list);
> +                    Rule rule = (Rule) rules.get(i);
> +                    if (debug >= 4)
> +                        log("  Fire begin() for " + rule);
> +                    rule.begin(list);
> } catch (Exception e) {
>    log("Begin event threw exception", e);
>    throw new SAXException(e);
> @@ -1302,7 +1312,7 @@
>      }
>  
>  
> -    // -------------------------------------------------------- Stack Methods
> +    // --------------------------------------------------- Object Stack
> Methods
>  
>  
>      /**
> @@ -1312,6 +1322,7 @@
>  
> match = "";
>          bodyTexts.clear();
> +        params.clear();
>          stack.clear();
>          getRules().clear();
>  
> @@ -1381,6 +1392,9 @@
>      }
>  
>  
> +    // ------------------------------------------------ Parameter Stack
> Methods
> +
> +
>      // -------------------------------------------------------- Package
> Methods
>  
>  
> @@ -1410,6 +1424,67 @@
>      List getRules(String match) {
>  
>          return (getRules().match(match));
> +
> +    }
> +
> +
> +    /**
> +     * Return the top object on the stack without removing it.  If there are
> +     * no objects on the stack, return <code>null</code>.
> +     */
> +    Object peekParams() {
> +
> +    try {
> +        return (params.peek());
> +    } catch (EmptyStackException e) {
> +        return (null);
> +    }
> +
> +    }
> +
> +
> +    /**
> +     * Return the n'th object down the stack, where 0 is the top element
> +     * and [getCount()-1] is the bottom element.  If the specified index
> +     * is out of range, return <code>null</code>.
> +     *
> +     * @param n Index of the desired element, where 0 is the top of the
> stack,
> +     *  1 is the next element down, and so on.
> +     */
> +    Object peekParams(int n) {
> +
> +    try {
> +        return (params.peek(n));
> +    } catch (EmptyStackException e) {
> +        return (null);
> +    }
> +
> +    }
> +
> +
> +    /**
> +     * Pop the top object off of the stack, and return it.  If there are
> +     * no objects on the stack, return <code>null</code>.
> +     */
> +    Object popParams() {
> +
> +    try {
> +        return (params.pop());
> +    } catch (EmptyStackException e) {
> +        return (null);
> +    }
> +
> +    }
> +
> +
> +    /**
> +     * Push a new object onto the top of the object stack.
> +     *
> +     * @param object The new object
> +     */
> +    void pushParams(Object object) {
> +
> +    params.push(object);
>  
>      }
>  
> 
> 
> 

-- 

jvz.

Jason van Zyl

http://tambora.zenplex.org
http://jakarta.apache.org/turbine
http://jakarta.apache.org/velocity
http://jakarta.apache.org/alexandria
http://jakarta.apache.org/commons


Reply via email to