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>