rdonkin     2003/08/02 02:54:07

  Modified:    digester/src/java/org/apache/commons/digester
                        CallParamRule.java Digester.java
               digester/src/test/org/apache/commons/digester
                        CallMethodRuleTestCase.java SimpleTestBean.java
  Added:       digester/src/java/org/apache/commons/digester
                        PathCallParamRule.java
  Log:
  New Rule implementation that sets a call method parameter from the current Digester 
matching path.
  
  Revision  Changes    Path
  1.14      +6 -5      
jakarta-commons/digester/src/java/org/apache/commons/digester/CallParamRule.java
  
  Index: CallParamRule.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/CallParamRule.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- CallParamRule.java        17 Apr 2003 11:08:16 -0000      1.13
  +++ CallParamRule.java        2 Aug 2003 09:54:06 -0000       1.14
  @@ -80,6 +80,8 @@
    * See [EMAIL PROTECTED] #CallParamRule(int paramIndex)}
    * <li>from the top object on the stack. 
    * See [EMAIL PROTECTED] #CallParamRule(int paramIndex, boolean fromStack)}
  + * <li>the current path being processed (separate <code>Rule</code>). 
  + * See [EMAIL PROTECTED] PathCallParamRule}
    * </ul>
    * </p>
    *
  @@ -88,7 +90,6 @@
    */
   
   public class CallParamRule extends Rule {
  -
   
       // ----------------------------------------------------------- Constructors
   
  
  
  
  1.80      +17 -4     
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/Digester.java,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- Digester.java     29 Jul 2003 15:31:22 -0000      1.79
  +++ Digester.java     2 Aug 2003 09:54:06 -0000       1.80
  @@ -1854,6 +1854,19 @@
       }
       
       /**
  +     * Add a "call parameter" rule that sets a parameter from the current 
  +     * <code>Digester</code> matching path.
  +     * This is sometimes useful when using rules that support wildcards.
  +     *
  +     * @param pattern the pattern that this rule should match
  +     * @param paramIndex The zero-relative parameter number
  +     * @see CallMethodRule
  +     */
  +    public void addCallParamPath(String pattern,int paramIndex) {
  +        addRule(pattern, new PathCallParamRule(paramIndex));
  +    }
  +    
  +    /**
        * Add a "factory create" rule for the specified parameters.
        * Exceptions thrown during the object creation process will be propagated.
        *
  
  
  
  1.1                  
jakarta-commons/digester/src/java/org/apache/commons/digester/PathCallParamRule.java
  
  Index: PathCallParamRule.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/PathCallParamRule.java,v
 1.1 2003/08/02 09:54:07 rdonkin Exp $
   * $Revision: 1.1 $
   * $Date: 2003/08/02 09:54:07 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  
  package org.apache.commons.digester;
  
  
  import org.xml.sax.Attributes;
  
  /**
   * <p>Rule implementation that saves a parameter containing the 
<code>Digester</code> 
   * matching path for use by a surrounding <code>CallMethodRule</code>.
   * This Rule is most useful when using rule that allow extensive use of 
wildcards.</p>
   *
   * @author Robert Burrell Donkin
   * @version $Revision: 1.1 $ $Date: 2003/08/02 09:54:07 $
   */
  
  public class PathCallParamRule extends Rule {
  
      // ----------------------------------------------------------- Constructors
  
      /**
       * Construct a "call parameter" rule that will save the body text of this
       * element as the parameter value.
       *
       * @param paramIndex The zero-relative parameter number
       */
      public PathCallParamRule(int paramIndex) {
  
          this.paramIndex = paramIndex;
  
      }
   
      // ----------------------------------------------------- Instance Variables
  
      /**
       * The zero-relative index of the parameter we are saving.
       */
      protected int paramIndex = 0;
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Process the start of this element.
       *
       * @param namespace the namespace URI of the matching element, or an 
       *   empty string if the parser is not namespace aware or the element has
       *   no namespace
       * @param name the local name if the parser is namespace aware, or just 
       *   the element name otherwise
       * @param attributes The attribute list for this element
  
       */
      public void begin(String namespace, String name, Attributes attributes) throws 
Exception {
  
          String param = getDigester().getMatch();
          
          if(param != null) {
              Object parameters[] = (Object[]) digester.peekParams();
              parameters[paramIndex] = param;
          }
          
      }
  
      /**
       * Render a printable version of this Rule.
       */
      public String toString() {
  
          StringBuffer sb = new StringBuffer("PathCallParamRule[");
          sb.append("paramIndex=");
          sb.append(paramIndex);
          sb.append("]");
          return (sb.toString());
  
      }
  }
  
  
  
  1.9       +25 -0     
jakarta-commons/digester/src/test/org/apache/commons/digester/CallMethodRuleTestCase.java
  
  Index: CallMethodRuleTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/CallMethodRuleTestCase.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- CallMethodRuleTestCase.java       13 Jul 2003 15:57:36 -0000      1.8
  +++ CallMethodRuleTestCase.java       2 Aug 2003 09:54:07 -0000       1.9
  @@ -566,6 +566,31 @@
           assertEquals("Result not passed into hook", "The Other", rule.result);
       }
   
  +    /** Test for the PathCallParamRule */
  +    public void testPathCallParam() throws Exception {
  +        String xml = "<?xml version='1.0'?><main>"
  +            + "<alpha><beta>Ignore this</beta></alpha>"
  +            + "<beta><epsilon><gamma>Ignore that</gamma></epsilon></beta>"
  +            + "</main>";
  +    
  +        SimpleTestBean bean = new SimpleTestBean();
  +        bean.setAlphaBeta("[UNSET]", "[UNSET]");
  +        
  +        StringReader in = new StringReader(xml);
  +        Digester digester = new Digester();
  +        digester.setRules(new ExtendedBaseRules());
  +        digester.addCallParamPath("*/alpha/?", 0);
  +        digester.addCallParamPath("*/epsilon/?", 1);
  +        digester.addCallMethod("main", "setAlphaBeta", 2);
  +        
  +        digester.push(bean);
  +        
  +        digester.parse(in);
  +        
  +        assertEquals("Test alpha property setting", "main/alpha/beta" , 
bean.getAlpha());
  +        assertEquals("Test beta property setting", "main/beta/epsilon/gamma" , 
bean.getBeta());
  +    }
  +
       // ------------------------------------------------ Utility Support Methods
   
   
  
  
  
  1.6       +5 -0      
jakarta-commons/digester/src/test/org/apache/commons/digester/SimpleTestBean.java
  
  Index: SimpleTestBean.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/SimpleTestBean.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SimpleTestBean.java       5 Feb 2003 01:47:42 -0000       1.5
  +++ SimpleTestBean.java       2 Aug 2003 09:54:07 -0000       1.6
  @@ -103,6 +103,11 @@
       public void setDelta(String delta) { // "delta" is a write-only property
           this.delta = delta;
       }
  +    
  +    public void setAlphaBeta(String alpha, String beta) {
  +        setAlpha(alpha);
  +        setBeta(beta);
  +    }
   
       public String toString() {
           StringBuffer sb = new StringBuffer("[SimpleTestBean]");
  
  
  

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

Reply via email to