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]