craigmcc 01/08/26 15:13:44 Modified: digester/src/java/org/apache/commons/digester Digester.java Rule.java RulesBase.java digester/src/test/org/apache/commons/digester RuleTestCase.java Added: digester/src/java/org/apache/commons/digester RuleSet.java RuleSetBase.java digester/src/test/org/apache/commons/digester Test2.xml Test3.xml TestRuleSet.java Log: Add notion of a RuleSet that provides a convenient way to package sets of related rules, optionally associated with a namespace prefix. Add test cases for RuleSet processing, and fix a couple of bugs in rule matching. All unit tests now pass for both namespace-unaware processing (the original functionality of Digester) and namespace-aware processing (new feature where rules can only match for matching namespace URIs). Revision Changes Path 1.16 +30 -9 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.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- Digester.java 2001/08/26 05:09:36 1.15 +++ Digester.java 2001/08/26 22:13:44 1.16 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Digester.java,v 1.15 2001/08/26 05:09:36 craigmcc Exp $ - * $Revision: 1.15 $ - * $Date: 2001/08/26 05:09:36 $ + * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Digester.java,v 1.16 2001/08/26 22:13:44 craigmcc Exp $ + * $Revision: 1.16 $ + * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * @@ -106,7 +106,7 @@ * * @author Craig McClanahan * @author Scott Sanders - * @version $Revision: 1.15 $ $Date: 2001/08/26 05:09:36 $ + * @version $Revision: 1.16 $ $Date: 2001/08/26 22:13:44 $ */ public class Digester extends DefaultHandler { @@ -835,15 +835,13 @@ StringBuffer sb = new StringBuffer(match); if (match.length() > 0) sb.append('/'); - if (namespaceAware) + if ((localName == null) || (localName.length() < 1)) sb.append(qName); - else if ((localName == null) || (localName.length() < 1)) - sb.append(qName); else sb.append(localName); match = sb.toString(); - if (debug >= 3) - log("startElement(" + match + ")"); + if (debug >= 3) + log(" New match='" + match + "'"); // Fire "begin" events for all relevant rules List rules = getRules().match(namespaceURI, match); @@ -1165,6 +1163,29 @@ public void addRule(String pattern, Rule rule) { getRules().add(pattern, rule); + + } + + + + /** + * Register a set of Rule instances defined in a RuleSet. + * + * @param ruleSet The RuleSet instance to configure from + */ + public void addRuleSet(RuleSet ruleSet) { + + String oldNamespaceURI = getRuleNamespaceURI(); + String newNamespaceURI = ruleSet.getNamespaceURI(); + if (debug >= 3) { + if (newNamespaceURI == null) + log("addRuleSet() with no namespace URI"); + else + log("addRuleSet() with namespace URI " + newNamespaceURI); + } + setRuleNamespaceURI(newNamespaceURI); + ruleSet.addRuleInstances(this); + setRuleNamespaceURI(oldNamespaceURI); } 1.4 +5 -5 jakarta-commons/digester/src/java/org/apache/commons/digester/Rule.java Index: Rule.java =================================================================== RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Rule.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Rule.java 2001/08/26 05:09:36 1.3 +++ Rule.java 2001/08/26 22:13:44 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Rule.java,v 1.3 2001/08/26 05:09:36 craigmcc Exp $ - * $Revision: 1.3 $ - * $Date: 2001/08/26 05:09:36 $ + * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/Rule.java,v 1.4 2001/08/26 22:13:44 craigmcc Exp $ + * $Revision: 1.4 $ + * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * @@ -71,7 +71,7 @@ * a corresponding nested pattern of XML elements has been matched. * * @author Craig McClanahan - * @version $Revision: 1.3 $ $Date: 2001/08/26 05:09:36 $ + * @version $Revision: 1.4 $ $Date: 2001/08/26 22:13:44 $ */ public abstract class Rule { @@ -139,7 +139,7 @@ */ public void setNamespaceURI(String namespaceURI) { - this.namespaceURI = null; + this.namespaceURI = namespaceURI; } 1.3 +12 -9 jakarta-commons/digester/src/java/org/apache/commons/digester/RulesBase.java Index: RulesBase.java =================================================================== RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/RulesBase.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RulesBase.java 2001/08/26 05:09:36 1.2 +++ RulesBase.java 2001/08/26 22:13:44 1.3 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/RulesBase.java,v 1.2 2001/08/26 05:09:36 craigmcc Exp $ - * $Revision: 1.2 $ - * $Date: 2001/08/26 05:09:36 $ + * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/RulesBase.java,v 1.3 2001/08/26 22:13:44 craigmcc Exp $ + * $Revision: 1.3 $ + * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * @@ -86,7 +86,7 @@ * </ul> * * @author Craig R. McClanahan - * @version $Revision: 1.2 $ $Date: 2001/08/26 05:09:36 $ + * @version $Revision: 1.3 $ $Date: 2001/08/26 22:13:44 $ */ public class RulesBase implements Rules { @@ -193,8 +193,8 @@ cache.put(pattern, list); } list.add(rule); - rule.setNamespaceURI(namespaceURI); rules.add(rule); + rule.setNamespaceURI(this.namespaceURI); } @@ -243,7 +243,7 @@ // List rulesList = (List) this.cache.get(pattern); List rulesList = lookup(namespaceURI, pattern); - if (rulesList == null) { + if ((rulesList == null) || (rulesList.size() < 1)) { // Find the longest key, ie more discriminant String longKey = ""; Iterator keys = this.cache.keySet().iterator(); @@ -295,18 +295,21 @@ // Optimize when no namespace URI is specified List list = (List) this.cache.get(pattern); - if (list == null) + if (list == null) { return (null); - if ((namespaceURI == null) || (namespaceURI.length() == 0)) + } + if ((namespaceURI == null) || (namespaceURI.length() == 0)) { return (list); + } // Select only Rules that match on the specified namespace URI ArrayList results = new ArrayList(); Iterator items = list.iterator(); while (items.hasNext()) { Rule item = (Rule) items.next(); - if (namespaceURI.equals(item.getNamespaceURI())) + if (namespaceURI.equals(item.getNamespaceURI())) { results.add(item); + } } return (results); 1.1 jakarta-commons/digester/src/java/org/apache/commons/digester/RuleSet.java Index: RuleSet.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/RuleSet.java,v 1.1 2001/08/26 22:13:44 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 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; /** * <p>Public interface defining a shorthand means of configuring a complete * set of related <code>Rule</code> definitions, possibly associated with * a particular namespace URI, in one operation. To use an instance of a * class that imlements this interface:</p> * <ul> * <li>Create a concrete implementation of this interface.</li> * <li>Optionally, you can configure a <code>RuleSet</code> to be relevant * only for a particular namespace URI by configuring the value to be * returned by <code>getNamespaceURI()</code>.</li> * <li>As you are configuring your Digester instance, call * <code>digester.addRuleSet()</code> and pass the RuleSet instance.</li> * <li>Digester will call the <code>addRuleInstances()</code> method of * your RuleSet to configure the necessary rules.</li> * </ul> * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/08/26 22:13:44 $ */ public interface RuleSet { // ------------------------------------------------------------- Properties /** * Return the namespace URI that will be applied to all Rule instances * created from this RuleSet. */ public String getNamespaceURI(); // --------------------------------------------------------- Public Methods /** * Add the set of Rule instances defined in this RuleSet to the * specified <code>Digester</code> instance, associating them with * our namespace URI (if any). This method should only be called * by a Digester instance. * * @param digester Digester instance to which the new Rule instances * should be added. */ public void addRuleInstances(Digester digester); } 1.1 jakarta-commons/digester/src/java/org/apache/commons/digester/RuleSetBase.java Index: RuleSetBase.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/RuleSetBase.java,v 1.1 2001/08/26 22:13:44 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 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; /** * <p>Convenience base class that implements the {@link RuleSet} interface. * Concrete implementations should list all of their actual rule creation * logic in the <code>addRuleSet()</code> implementation.</p> * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/08/26 22:13:44 $ */ public abstract class RuleSetBase implements RuleSet { // ----------------------------------------------------- Instance Variables /** * The namespace URI that all Rule instances created by this RuleSet * will be associated with. */ protected String namespaceURI = null; // ------------------------------------------------------------- Properties /** * Return the namespace URI that will be applied to all Rule instances * created from this RuleSet. */ public String getNamespaceURI() { return (this.namespaceURI); } // --------------------------------------------------------- Public Methods /** * Add the set of Rule instances defined in this RuleSet to the * specified <code>Digester</code> instance, associating them with * our namespace URI (if any). This method should only be called * by a Digester instance. * * @param digester Digester instance to which the new Rule instances * should be added. */ public abstract void addRuleInstances(Digester digester); } 1.4 +118 -5 jakarta-commons/digester/src/test/org/apache/commons/digester/RuleTestCase.java Index: RuleTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/RuleTestCase.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- RuleTestCase.java 2001/08/20 22:12:02 1.3 +++ RuleTestCase.java 2001/08/26 22:13:44 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/RuleTestCase.java,v 1.3 2001/08/20 22:12:02 craigmcc Exp $ - * $Revision: 1.3 $ - * $Date: 2001/08/20 22:12:02 $ + * $Header: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/RuleTestCase.java,v 1.4 2001/08/26 22:13:44 craigmcc Exp $ + * $Revision: 1.4 $ + * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * @@ -70,13 +70,12 @@ import junit.framework.TestSuite; - /** * <p>Test Case for the Digester class. These tests perform parsing of * XML documents to exercise the built-in rules.</p> * * @author Craig R. McClanahan - * @version $Revision: 1.3 $ $Date: 2001/08/20 22:12:02 $ + * @version $Revision: 1.4 $ $Date: 2001/08/26 22:13:44 $ */ public class RuleTestCase extends TestCase { @@ -288,6 +287,120 @@ "Last Name", employee.getLastName()); + + } + + + /** + * Test object creation (and associated property setting) with nothing on + * the stack, which should cause an appropriate Employee object to be + * returned. The processing rules will process the nested Address elements + * as well, but will not attempt to add them to the Employee. + */ + public void testRuleSet1() { + + // Configure the digester as required + RuleSet rs = new TestRuleSet(); + digester.addRuleSet(rs); + + // Parse our test input. + Object root = null; + try { + root = digester.parse(getInputStream("Test1.xml")); + } catch (Throwable t) { + fail("Digester threw IOException: " + t); + } + + assertNotNull("Digester returned an object", root); + assertTrue("Digester returned an Employee", + root instanceof Employee); + Employee employee = (Employee) root; + assertEquals("First name is correct", + "First Name", + employee.getFirstName()); + assertEquals("Last name is correct", + "Last Name", + employee.getLastName()); + assertNotNull("Can retrieve home address", + employee.getAddress("home")); + assertNotNull("Can retrieve office address", + employee.getAddress("office")); + + } + + + /** + * Same as <code>testRuleSet1</code> except using a single namespace. + */ + public void testRuleSet2() { + + // Configure the digester as required + digester.setNamespaceAware(true); + RuleSet rs = new TestRuleSet(null, + "http://jakarta.apache.org/digester/Foo"); + digester.addRuleSet(rs); + + // Parse our test input. + Object root = null; + try { + root = digester.parse(getInputStream("Test2.xml")); + } catch (Throwable t) { + fail("Digester threw IOException: " + t); + } + + assertNotNull("Digester returned an object", root); + assertTrue("Digester returned an Employee", + root instanceof Employee); + Employee employee = (Employee) root; + assertEquals("First name is correct", + "First Name", + employee.getFirstName()); + assertEquals("Last name is correct", + "Last Name", + employee.getLastName()); + assertNotNull("Can retrieve home address", + employee.getAddress("home")); + assertNotNull("Can retrieve office address", + employee.getAddress("office")); + + } + + + /** + * Same as <code>testRuleSet2</code> except using a namespace + * for employee that we should recognize, and a namespace for + * address that we should skip. + */ + public void testRuleSet3() { + + // Configure the digester as required + digester.setNamespaceAware(true); + RuleSet rs = new TestRuleSet(null, + "http://jakarta.apache.org/digester/Foo"); + digester.addRuleSet(rs); + + // Parse our test input. + Object root = null; + try { + root = digester.parse(getInputStream("Test3.xml")); + } catch (Throwable t) { + fail("Digester threw IOException: " + t); + } + + assertNotNull("Digester returned an object", root); + assertTrue("Digester returned an Employee", + root instanceof Employee); + Employee employee = (Employee) root; + assertEquals("First name is correct", + "First Name", + employee.getFirstName()); + assertEquals("Last name is correct", + "Last Name", + employee.getLastName()); + assertNull("Can not retrieve home address", + employee.getAddress("home")); + assertNull("Can not retrieve office address", + employee.getAddress("office")); } 1.1 jakarta-commons/digester/src/test/org/apache/commons/digester/Test2.xml Index: Test2.xml =================================================================== <?xml version="1.0"?> <test:employee firstName="First Name" lastName="Last Name" xmlns:test="http://jakarta.apache.org/digester/Foo"> <test:address type="home" street="Home Street" city="Home City" state="HS" zipCode="HmZip"/> <test:address type="office" street="Office Street" city="Office City" state="OS" zipCode="OfZip"/> </test:employee> 1.1 jakarta-commons/digester/src/test/org/apache/commons/digester/Test3.xml Index: Test3.xml =================================================================== <?xml version="1.0"?> <foo:employee firstName="First Name" lastName="Last Name" xmlns:foo="http://jakarta.apache.org/digester/Foo" xmlns:bar="http://jakarta.apache.org/digester/Bar"> <bar:address type="home" street="Home Street" city="Home City" state="HS" zipCode="HmZip"/> <bar:address type="office" street="Office Street" city="Office City" state="OS" zipCode="OfZip"/> </foo:employee> 1.1 jakarta-commons/digester/src/test/org/apache/commons/digester/TestRuleSet.java Index: TestRuleSet.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/TestRuleSet.java,v 1.1 2001/08/26 22:13:44 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/08/26 22:13:44 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 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; /** * RuleSet that mimics the rules set used for Employee and Address creation, * optionally associated with a particular namespace URI. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/08/26 22:13:44 $ */ public class TestRuleSet extends RuleSetBase { // ----------------------------------------------------------- Constructors /** * Construct an instance of this RuleSet with default values. */ public TestRuleSet() { this(null, null); } /** * Construct an instance of this RuleSet associated with the specified * prefix, associated with no namespace URI. * * @param prefix Matching pattern prefix (must end with '/') or null. */ public TestRuleSet(String prefix) { this(prefix, null); } /** * Construct an instance of this RuleSet associated with the specified * prefix and namespace URI. * * @param prefix Matching pattern prefix (must end with '/') or null. * @param namespaceURI The namespace URI these rules belong to */ public TestRuleSet(String prefix, String namespaceURI) { super(); if (prefix == null) this.prefix = ""; else this.prefix = prefix; this.namespaceURI = namespaceURI; } // ----------------------------------------------------- Instance Variables /** * The prefix for each matching pattern added to the Digester instance, * or an empty String for no prefix. */ protected String prefix = null; // --------------------------------------------------------- Public Methods /** * Add the set of Rule instances defined in this RuleSet to the * specified <code>Digester</code> instance, associating them with * our namespace URI (if any). This method should only be called * by a Digester instance. * * @param digester Digester instance to which the new Rule instances * should be added. */ public void addRuleInstances(Digester digester) { digester.addObjectCreate(prefix + "employee", "org.apache.commons.digester.Employee"); digester.addSetProperties(prefix + "employee"); digester.addObjectCreate("employee/address", "org.apache.commons.digester.Address"); digester.addSetProperties(prefix + "employee/address"); digester.addSetNext(prefix + "employee/address", "addAddress"); } }