sanders     2002/10/25 14:31:49

  Modified:    digester build.xml
  Added:       digester/src/java/org/apache/commons/digester
                        ObjectParamRule.java
               digester/src/test/org/apache/commons/digester
                        ObjectParamRuleTestCase.java
  Log:
  new object param rule, submitted by Mark Huisman <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.30      +13 -2     jakarta-commons/digester/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/digester/build.xml,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- build.xml 2 Oct 2002 20:27:17 -0000       1.29
  +++ build.xml 25 Oct 2002 21:31:48 -0000      1.30
  @@ -250,6 +250,7 @@
                                  test.matching.extended,
                                  test.rule,
                                  test.callmethod,
  +                               test.objectparam,
                                  test.bpsr,
                                  test.xmlrules,
                                  test.node
  @@ -282,10 +283,20 @@
   
     <target name="test.callmethod" depends="compile.tests"
      description="Run tests for CallMethodRule and CallParamRule ...">
  -    <echo message="Running Rule tests ..."/>
  +    <echo message="Running CallMethodRule tests ..."/>
       <java classname="${test.runner}" fork="yes"
           failonerror="${test.failonerror}">
         <arg value="org.apache.commons.digester.CallMethodRuleTestCase"/>
  +      <classpath refid="test.classpath"/>
  +    </java>
  +  </target>
  +
  +  <target name="test.objectparam" depends="compile.tests"
  +   description="Run tests for ObjectParamRule ...">
  +    <echo message="Running ObjectParamRule tests ..."/>
  +    <java classname="${test.runner}" fork="yes"
  +        failonerror="${test.failonerror}">
  +      <arg value="org.apache.commons.digester.ObjectParamRuleTestCase"/>
         <classpath refid="test.classpath"/>
       </java>
     </target>
  
  
  
  1.1                  
jakarta-commons/digester/src/java/org/apache/commons/digester/ObjectParamRule.java
  
  Index: ObjectParamRule.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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 for use by a surrounding
   * <code>CallMethodRule<code>.</p>
   *
   * <p>This parameter may be:
   * <ul>
   * <li>an arbitrary Object defined programatically, assigned when the element 
pattern associated with the Rule is matched
   * See {@link #ObjectParamRule(int paramIndex, Object param)}
   * <li>an arbitrary Object defined programatically, assigned if the element pattern 
AND specified attribute name are matched
   * See {@link #ObjectParamRule(int paramIndex, String attributeName, ObjectParam)}
   * </ul>
   * </p>
   *
   * @author Mark Huisman
   */
  
  public class ObjectParamRule extends Rule {
      // ----------------------------------------------------------- Constructors
      /**
       * Construct a "call parameter" rule that will save the given Object as
       * the parameter value.
       *
       * @param paramIndex The zero-relative parameter number
       * @param param the parameter to pass along
       */
      public ObjectParamRule(int paramIndex, Object param) {
          this(paramIndex, null, param);
      }
  
  
      /**
       * Construct a "call parameter" rule that will save the given Object as
       * the parameter value, provided that the specified attribute exists.
       *
       * @param paramIndex The zero-relative parameter number
       * @param attributeName The name of the attribute to match
       * @param param the parameter to pass along
       */
      public ObjectParamRule(int paramIndex, String attributeName, Object param) {
          this.paramIndex = paramIndex;
          this.attributeName = attributeName;
          this.param = param;
      }
  
  
      // ----------------------------------------------------- Instance Variables
  
      /**
       * The attribute which we are attempting to match
       */
      protected String attributeName = null;
  
      /**
       * The zero-relative index of the parameter we are saving.
       */
      protected int paramIndex = 0;
  
      /**
       * The parameter we wish to pass to the method call
       */
      protected Object param = null;
  
  
      // --------------------------------------------------------- Public Methods
  
      /**
       * Process the start of this element.
       *
       * @param attributes The attribute list for this element
       */
      public void begin(String namespace, String name,
                        Attributes attributes) throws Exception {
          Object anAttribute = null;
          Object parameters[] = (Object[]) digester.peekParams();
  
          if (attributeName != null) {
              anAttribute = attributes.getValue(attributeName);
              if(anAttribute != null) {
                  parameters[paramIndex] = param;
              }
              // note -- if attributeName != null and anAttribute == null, this rule
              // will pass null as its parameter!
          }else{
              parameters[paramIndex] = param;
          }
      }
  
      /**
       * Render a printable version of this Rule.
       */
      public String toString() {
          StringBuffer sb = new StringBuffer("ObjectParamRule[");
          sb.append("paramIndex=");
          sb.append(paramIndex);
          sb.append(", attributeName=");
          sb.append(attributeName);
          sb.append(", param=");
          sb.append(param);
          sb.append("]");
          return (sb.toString());
      }
  }
  
  
  
  1.1                  
jakarta-commons/digester/src/test/org/apache/commons/digester/ObjectParamRuleTestCase.java
  
  Index: ObjectParamRuleTestCase.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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 java.io.IOException;
  import java.io.StringReader;
  import java.util.ArrayList;
  
  import org.xml.sax.SAXException;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  
  
  /**
   * <p>Tests for the <code>ObjectParamRuleTestCase</code>
   *
   * @author Mark Huisman
   */
  public class ObjectParamRuleTestCase extends TestCase {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The digester instance we will be processing.
       */
      protected Digester digester = null;
  
  
      // ----------------------------------------------------------- Constructors
  
  
      /**
       * Construct a new instance of this test case.
       *
       * @param name Name of the test case
       */
      public ObjectParamRuleTestCase(String name) {
  
          super(name);
  
      }
  
  
      public static void main(String[] args){
  
          // so we can run standalone
          junit.textui.TestRunner.run(suite());
  
      }
  
  
      // --------------------------------------------------- Overall Test Methods
  
  
      /**
       * Set up instance variables required by this test case.
       */
      public void setUp() {
  
          digester = new Digester();
  
      }
  
  
      /**
       * Return the tests included in this test suite.
       */
      public static Test suite() {
  
          return (new TestSuite(ObjectParamRuleTestCase.class));
  
      }
  
  
      /**
       * Tear down instance variables required by this test case.
       */
      public void tearDown() {
  
          digester = null;
  
      }
  
  
  
      // ------------------------------------------------ Individual Test Methods
  
      private StringBuffer sb = new StringBuffer().
          append("<arraylist><A/><B/><C/><D desc=\"the fourth\"/><E/></arraylist>");
  
  
      /**
       * Test method calls with the ObjectParamRule rule.  It should be possible to
       * pass any subclass of Object as a parameter, provided that either the element
       * or the element + attribute has been matched.
       */
      public void testBasic() throws SAXException, IOException {
  
          // Configure the digester as required
          digester.addObjectCreate("arraylist", ArrayList.class);
  
          // Test adding a variety of objects
          digester.addCallMethod("arraylist/A", "add", 1);
          ObjectParamRule opr = new ObjectParamRule(0, new Integer(-9));
          digester.addRule("arraylist/A", opr);
          digester.addCallMethod("arraylist/B", "add", 1);
          opr = new ObjectParamRule(0, new Float(3.14159));
          digester.addRule("arraylist/B", opr);
          digester.addCallMethod("arraylist/C", "add", 1);
          opr = new ObjectParamRule(0, new Long(999999999));
          digester.addRule("arraylist/C", opr);
          digester.addCallMethod("arraylist/D", "add", 1);
          opr = new ObjectParamRule(0, "desc", new String("foobarbazbing"));
          digester.addRule("arraylist/D", opr);
          // note that this will add a null parameter to the method call and will
          // not be added to the arraylist.
          digester.addCallMethod("arraylist/E", "add", 1);
          opr = new ObjectParamRule(0, "nonexistentattribute", new String("ignore"));
          digester.addRule("arraylist/E", opr);
  
          //Parse it and obtain the ArrayList
          ArrayList al = (ArrayList)digester.parse(new StringReader(sb.toString()));
          this.assertNotNull(al);
          this.assertEquals(al.size(), 4);
          this.assertTrue(al.contains(new Integer(-9)));
          this.assertTrue(al.contains(new Float(3.14159)));
          this.assertTrue(al.contains(new Long(999999999)));
          this.assertTrue(al.contains(new String("foobarbazbing")));
          this.assertTrue(!(al.contains(new String("ignore"))));
      }
  
  }
  
  
  
  

--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>

Reply via email to