You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2002/08/23 15:42:57 UTC
cvs commit: jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules DigesterLoaderTest.java TestObject.java test.xml testrules.xml
rdonkin 2002/08/23 06:42:57
Modified: digester/src/java/org/apache/commons/digester/xmlrules
DigesterRuleParser.java digester-rules.dtd
digester/src/test/org/apache/commons/digester/xmlrules
DigesterLoaderTest.java TestObject.java test.xml
testrules.xml
Log:
Fix for bug 11168. This bug occured when using call-method rules from xmlrules with more than one parameter. Also added test case. Patch submitted by David Wilkinson.
Revision Changes Path
1.9 +122 -127 jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
Index: DigesterRuleParser.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- DigesterRuleParser.java 20 Aug 2002 21:15:14 -0000 1.8
+++ DigesterRuleParser.java 23 Aug 2002 13:42:56 -0000 1.9
@@ -84,21 +84,21 @@
*/
public class DigesterRuleParser extends RuleSetBase {
-
+
public static final String DIGESTER_PUBLIC_ID = "-//Jakarta Apache //DTD digester-rules XML V1.0//EN";
-
+
/**
* path to the DTD
*/
private String digesterDtdUrl;
-
+
/**
* This is the digester to which we are adding the rules that we parse
* from the Rules XML document.
*/
protected Digester targetDigester;
-
-
+
+
/**
* A stack whose toString method returns a '/'-separated concatenation
* of all the elements in the stack.
@@ -118,7 +118,7 @@
return str.toString();
}
}
-
+
/**
* A stack used to maintain the current pattern. The Rules XML document
* type allows nesting of patterns. If an element defines a matching
@@ -126,12 +126,12 @@
* all the ancestor elements' patterns. Hence the need for a stack.
*/
protected PatternStack patternStack;
-
+
/**
* Used to detect circular includes
*/
private Set includedFiles = new HashSet();
-
+
/**
* Constructs a DigesterRuleParser. This object will be inoperable
* until the target digester is set, via <code>setTarget(Digester)</code>
@@ -139,7 +139,7 @@
public DigesterRuleParser() {
patternStack = new PatternStack();
}
-
+
/**
* Constructs a rule set for converting XML digester rule descriptions
* into Rule objects, and adding them to the given Digester
@@ -149,7 +149,7 @@
this.targetDigester = targetDigester;
patternStack = new PatternStack();
}
-
+
/**
* Constructs a rule set for parsing an XML digester rule file that
* has been included within an outer XML digester rule file. In this
@@ -161,12 +161,12 @@
* to any pattern parsed by this rule set.
*/
private DigesterRuleParser(Digester targetDigester,
- PatternStack stack, Set includedFiles) {
+ PatternStack stack, Set includedFiles) {
this.targetDigester = targetDigester;
patternStack = stack;
this.includedFiles = includedFiles;
}
-
+
/**
* Sets the digester into which to add the parsed rules
* @param d the Digester to add the rules to
@@ -174,7 +174,7 @@
public void setTarget(Digester d) {
targetDigester = d;
}
-
+
/**
* Sets the location of the digester rules DTD. This is the DTD used
* to validate the rules XML file.
@@ -182,7 +182,7 @@
public void setDigesterRulesDTD(String dtdURL) {
digesterDtdUrl = dtdURL;
}
-
+
/**
* Returns the location of the DTD used to validate the digester rules
* XML document.
@@ -193,7 +193,7 @@
//return url.toString();
return digesterDtdUrl;
}
-
+
/**
* Adds a rule the the target digester. After a rule has been created by
* parsing the XML, it is added to the digester by calling this method.
@@ -204,8 +204,8 @@
public void add(Rule rule) {
targetDigester.addRule(patternStack.toString(), rule);
}
-
-
+
+
/**
* Add to the given digester the set of Rule instances used to parse an XML
* document defining Digester rules. When the digester parses an XML file,
@@ -218,43 +218,47 @@
public void addRuleInstances(Digester digester) {
final String ruleClassName = Rule.class.getName();
digester.register(DIGESTER_PUBLIC_ID, getDigesterRulesDTD());
-
- digester.addRule("*/pattern", new PatternRule(digester, "value"));
-
- digester.addRule("*/include", new IncludeRule(digester));
-
+
+ digester.addRule("*/pattern", new PatternRule("value"));
+
+ digester.addRule("*/include", new IncludeRule());
+
digester.addFactoryCreate("*/call-method-rule", new CallMethodRuleFactory());
- digester.addRule("*/call-method-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/call-method-rule", new PatternRule("pattern"));
digester.addSetNext("*/call-method-rule", "add", ruleClassName);
-
+
+ digester.addFactoryCreate("*/call-param-rule", new CallParamRuleFactory());
+ digester.addRule("*/call-param-rule", new PatternRule("pattern"));
+ digester.addSetNext("*/call-param-rule", "add", ruleClassName);
+
digester.addFactoryCreate("*/factory-create-rule", new FactoryCreateRuleFactory());
- digester.addRule("*/factory-create-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/factory-create-rule", new PatternRule("pattern"));
digester.addSetNext("*/factory-create-rule", "add", ruleClassName);
-
+
digester.addFactoryCreate("*/object-create-rule", new ObjectCreateRuleFactory());
- digester.addRule("*/object-create-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/object-create-rule", new PatternRule("pattern"));
digester.addSetNext("*/object-create-rule", "add", ruleClassName);
-
+
digester.addFactoryCreate("*/set-properties-rule", new SetPropertiesRuleFactory());
- digester.addRule("*/set-properties-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/set-properties-rule", new PatternRule("pattern"));
digester.addSetNext("*/set-properties-rule", "add", ruleClassName);
-
- digester.addRule("*/set-properties-rule/alias", new SetPropertiesAliasRule(digester));
-
+
+ digester.addRule("*/set-properties-rule/alias", new SetPropertiesAliasRule());
+
digester.addFactoryCreate("*/set-property-rule", new SetPropertyRuleFactory());
- digester.addRule("*/set-property-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/set-property-rule", new PatternRule("pattern"));
digester.addSetNext("*/set-property-rule", "add", ruleClassName);
-
+
digester.addFactoryCreate("*/set-top-rule", new SetTopRuleFactory());
- digester.addRule("*/set-top-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/set-top-rule", new PatternRule("pattern"));
digester.addSetNext("*/set-top-rule", "add", ruleClassName);
-
+
digester.addFactoryCreate("*/set-next-rule", new SetNextRuleFactory());
- digester.addRule("*/set-next-rule", new PatternRule(digester, "pattern"));
+ digester.addRule("*/set-next-rule", new PatternRule("pattern"));
digester.addSetNext("*/set-next-rule", "add", ruleClassName);
}
-
-
+
+
/**
* A rule for extracting the pattern matching strings from the rules XML.
* In the digester-rules document type, a pattern can either be declared
@@ -264,19 +268,19 @@
* element.
*/
private class PatternRule extends Rule {
-
+
private String attrName;
private String pattern = null;
-
+
/**
* @param digester the Digester used to parse the rules XML file
* @param attrName The name of the attribute containing the pattern
*/
- public PatternRule(Digester digester, String attrName) {
- super(digester);
+ public PatternRule(String attrName) {
+ super();
this.attrName = attrName;
}
-
+
/**
* If a pattern is defined for the attribute, push it onto the
* pattern stack.
@@ -287,7 +291,7 @@
patternStack.push(pattern);
}
}
-
+
/**
* If there was a pattern for this element, pop it off the pattern
* stack.
@@ -298,7 +302,7 @@
}
}
}
-
+
/**
* A rule for including one rules XML file within another. Included files
* behave as if they are 'macro-expanded' within the includer. This means
@@ -309,10 +313,10 @@
* the parse.
*/
private class IncludeRule extends Rule {
- public IncludeRule(Digester digester) {
- super(digester);
+ public IncludeRule() {
+ super();
}
-
+
/**
* To include a rules xml file, we instantiate another Digester, and
* another DigesterRulesRuleSet. We pass the
@@ -325,7 +329,7 @@
if (fileName != null && fileName.length() > 0) {
includeXMLRules(fileName);
}
-
+
// The class attribute gives the name of a class that implements
// the DigesterRulesSource interface
String className = attributes.getValue("class");
@@ -333,15 +337,15 @@
includeProgrammaticRules(className);
}
}
-
+
/**
* Creates another DigesterRuleParser, and uses it to extract the rules
* out of the give XML file. The contents of the current pattern stack
* will be prepended to all of the pattern strings parsed from the file.
*/
private void includeXMLRules(String fileName)
- throws IOException, SAXException, CircularIncludeException {
- URL fileURL = getDigester().getClassLoader().getResource(fileName);
+ throws IOException, SAXException, CircularIncludeException {
+ URL fileURL = DigesterRuleParser.this.getClass().getClassLoader().getResource(fileName);
if (fileURL == null) {
throw new FileNotFoundException("File \"" + fileName + "\" not found.");
}
@@ -352,19 +356,15 @@
}
// parse the included xml file
DigesterRuleParser includedSet =
- new DigesterRuleParser(targetDigester, patternStack, includedFiles);
+ new DigesterRuleParser(targetDigester, patternStack, includedFiles);
includedSet.setDigesterRulesDTD(getDigesterRulesDTD());
-
Digester digester = new Digester();
- digester.setUseContextClassLoader(getDigester().getUseContextClassLoader());
- digester.setClassLoader(getDigester().getClassLoader());
- digester.setErrorHandler(getDigester().getErrorHandler());
digester.addRuleSet(includedSet);
digester.push(DigesterRuleParser.this);
digester.parse(fileName);
includedFiles.remove(fileName);
}
-
+
/**
* Creates an instance of the indicated class. The class must implement
* the DigesterRulesSource interface. Passes the target digester to
@@ -374,17 +374,17 @@
* by the DigesterRulesSource instance.
*/
private void includeProgrammaticRules(String className)
- throws ClassNotFoundException, ClassCastException,
- InstantiationException, IllegalAccessException {
-
- Class cls = Class.forName(className, true, digester.getClassLoader());
+ throws ClassNotFoundException, ClassCastException,
+ InstantiationException, IllegalAccessException {
+
+ Class cls = Class.forName(className);
DigesterRulesSource rulesSource = (DigesterRulesSource) cls.newInstance();
-
+
// wrap the digester's Rules object, to prepend pattern
Rules digesterRules = targetDigester.getRules();
Rules prefixWrapper =
new RulesPrefixAdapter(patternStack.toString(), digesterRules);
-
+
targetDigester.setRules(prefixWrapper);
try {
rulesSource.getRules(targetDigester);
@@ -393,20 +393,19 @@
targetDigester.setRules(digesterRules);
}
}
-
}
-
-
+
+
/**
* Wraps a Rules object. Delegates all the Rules interface methods
* to the underlying Rules object. Overrides the add method to prepend
* a prefix to the pattern string.
*/
private class RulesPrefixAdapter implements Rules {
-
+
private Rules delegate;
private String prefix;
-
+
/**
* @param patternPrefix the pattern string to prepend to the pattern
* passed to the add method.
@@ -417,7 +416,7 @@
prefix = patternPrefix;
delegate = rules;
}
-
+
/**
* Register a new Rule instance matching a pattern which is constructed
* by concatenating the pattern prefix with the given pattern.
@@ -425,56 +424,56 @@
public void add(String pattern, Rule rule) {
delegate.add(prefix + pattern, rule);
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public void clear() {
delegate.clear();
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public Digester getDigester() {
return delegate.getDigester();
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public String getNamespaceURI() {
return delegate.getNamespaceURI();
}
-
+
/**
* @deprecated Call match(namespaceURI,pattern) instead.
*/
public List match(String pattern) {
return delegate.match(pattern);
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public List match(String namespaceURI, String pattern) {
return delegate.match(namespaceURI, pattern);
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public List rules() {
return delegate.rules();
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
public void setDigester(Digester digester) {
delegate.setDigester(digester);
}
-
+
/**
* This method passes through to the underlying Rules object.
*/
@@ -482,13 +481,13 @@
delegate.setNamespaceURI(namespaceURI);
}
}
-
-
+
+
///////////////////////////////////////////////////////////////////////
// Classes beyond this point are ObjectCreationFactory implementations,
// used to create Rule objects and initialize them from SAX attributes.
///////////////////////////////////////////////////////////////////////
-
+
/**
* Factory for creating a CallMethodRule.
*/
@@ -499,48 +498,44 @@
if (attributes.getValue("paramcount") == null) {
// call against empty method
callMethodRule = new CallMethodRule(methodName);
-
+
} else {
int paramCount = Integer.parseInt(attributes.getValue("paramcount"));
-
+
String paramTypesAttr = attributes.getValue("paramtypes");
if (paramTypesAttr == null || paramTypesAttr.length() == 0) {
- callMethodRule = new CallMethodRule(targetDigester, methodName,
- paramCount);
+ callMethodRule = new CallMethodRule(methodName, paramCount);
} else {
// Process the comma separated list or paramTypes
// into an array of String class names
ArrayList paramTypes = new ArrayList();
StringTokenizer tokens = new StringTokenizer(paramTypesAttr, " \t\n\r,");
while (tokens.hasMoreTokens()) {
- paramTypes.add(tokens.nextToken());
+ paramTypes.add(tokens.nextToken());
}
- callMethodRule = new CallMethodRule(
- targetDigester,
- methodName,
- paramCount,
- (String[])paramTypes.toArray(new String[0]));
+ callMethodRule = new CallMethodRule( methodName,
+ paramCount,
+ (String[])paramTypes.toArray(new String[0]));
}
}
return callMethodRule;
}
}
-
+
/**
- * Factory for creating a CallMethodRule.
+ * Factory for creating a CallParamRule.
*/
protected class CallParamRuleFactory extends AbstractObjectCreationFactory {
-
+
public Object createObject(Attributes attributes) {
- // create callmethodrule
- int paramNumber = Integer.parseInt(attributes.getValue("paramnumber"));
- String methodName = attributes.getValue("attrname");
- Rule callMethodRule = new CallMethodRule(targetDigester, methodName,
- paramNumber);
- return callMethodRule;
+ // create callparamrule
+ int paramIndex = Integer.parseInt(attributes.getValue("paramnumber"));
+ String attributeName = attributes.getValue("attrname");
+ Rule callParamRule = new CallParamRule( paramIndex, attributeName );
+ return callParamRule;
}
}
-
+
/**
* Factory for creating a FactoryCreateRule
*/
@@ -549,12 +544,12 @@
String className = attributes.getValue("classname");
String attrName = attributes.getValue("attrname");
return (attrName == null || attrName.length() == 0) ?
- new FactoryCreateRule(targetDigester, className)
- :
- new FactoryCreateRule(targetDigester, className, attrName);
+ new FactoryCreateRule( className)
+ :
+ new FactoryCreateRule( className, attrName);
}
}
-
+
/**
* Factory for creating a ObjectCreateRule
*/
@@ -563,21 +558,21 @@
String className = attributes.getValue("classname");
String attrName = attributes.getValue("attrname");
return (attrName == null || attrName.length() == 0) ?
- new ObjectCreateRule(targetDigester, className)
- :
- new ObjectCreateRule(targetDigester, className, attrName);
+ new ObjectCreateRule( className)
+ :
+ new ObjectCreateRule( className, attrName);
}
}
-
+
/**
* Factory for creating a SetPropertiesRule
*/
protected class SetPropertiesRuleFactory extends AbstractObjectCreationFactory {
public Object createObject(Attributes attributes) {
- return new SetPropertiesRule(targetDigester);
+ return new SetPropertiesRule();
}
}
-
+
/**
* Factory for creating a SetPropertyRule
*/
@@ -585,10 +580,10 @@
public Object createObject(Attributes attributes) {
String name = attributes.getValue("name");
String value = attributes.getValue("value");
- return new SetPropertyRule(targetDigester, name, value);
+ return new SetPropertyRule( name, value);
}
}
-
+
/**
* Factory for creating a SetTopRuleFactory
*/
@@ -597,12 +592,12 @@
String methodName = attributes.getValue("methodname");
String paramType = attributes.getValue("paramtype");
return (paramType == null || paramType.length() == 0) ?
- new SetTopRule(targetDigester, methodName)
- :
- new SetTopRule(targetDigester, methodName, paramType);
+ new SetTopRule( methodName)
+ :
+ new SetTopRule( methodName, paramType);
}
}
-
+
/**
* Factory for creating a SetNextRuleFactory
*/
@@ -611,27 +606,27 @@
String methodName = attributes.getValue("methodname");
String paramType = attributes.getValue("paramtype");
return (paramType == null || paramType.length() == 0) ?
- new SetNextRule(targetDigester, methodName)
- :
- new SetNextRule(targetDigester, methodName, paramType);
+ new SetNextRule( methodName)
+ :
+ new SetNextRule( methodName, paramType);
}
}
-
+
/**
* A rule for adding a attribute-property alias to the custom alias mappings of
* the containing SetPropertiesRule rule.
*/
protected class SetPropertiesAliasRule extends Rule {
-
+
/**
* <p>Base constructor.
*
* @param digester the Digester used to parse the rules XML file
*/
- public SetPropertiesAliasRule(Digester digester) {
- super(digester);
+ public SetPropertiesAliasRule() {
+ super();
}
-
+
/**
* Add the alias to the SetPropertiesRule object created by the
* enclosing <set-properties-rule> tag.
@@ -639,7 +634,7 @@
public void begin(Attributes attributes) {
String attrName = attributes.getValue("attr-name");
String propName = attributes.getValue("prop-name");
-
+
SetPropertiesRule rule = (SetPropertiesRule) digester.peek();
rule.addAlias(attrName, propName);
}
1.5 +3 -3 jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
Index: digester-rules.dtd
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- digester-rules.dtd 16 Jul 2002 21:23:28 -0000 1.4
+++ digester-rules.dtd 23 Aug 2002 13:42:56 -0000 1.5
@@ -103,8 +103,8 @@
<!-- An alias is a custom attribute->property name mapping -->
<!ELEMENT alias EMPTY>
<!ATTLIST alias
-���� attr-name CDATA #REQUIRED
-���� prop-name CDATA #IMPLIED>
+ attr-name CDATA #REQUIRED
+ prop-name CDATA #IMPLIED>
<!-- SetPropertyRule -->
<!ELEMENT set-property-rule EMPTY>
1.8 +2 -0 jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java
Index: DigesterLoaderTest.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DigesterLoaderTest.java 16 Jul 2002 21:23:28 -0000 1.7
+++ DigesterLoaderTest.java 23 Aug 2002 13:42:57 -0000 1.8
@@ -135,6 +135,8 @@
}
TestObject to = (TestObject)obj;
assertEquals(new Long(555),to.getLongValue());
+ assertEquals( "foo", to.getMapValue( "test1" ) );
+ assertEquals( "bar", to.getMapValue( "test2" ) );
}
/**
1.6 +11 -0 jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/TestObject.java
Index: TestObject.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/TestObject.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TestObject.java 8 Jul 2002 21:25:30 -0000 1.5
+++ TestObject.java 23 Aug 2002 13:42:57 -0000 1.6
@@ -60,6 +60,7 @@
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.HashMap;
/**
@@ -74,6 +75,8 @@
private String value = "";
private Long longValue = new Long(-1L);
+ private HashMap mapValue = new HashMap();
+
private boolean pushed = false;
public TestObject() {
@@ -114,5 +117,13 @@
public void push() {
pushed = true;
+ }
+
+ public void setMapValue( String name, String value ) {
+ this.mapValue.put( name, value );
+ }
+
+ public String getMapValue( String name ) {
+ return (String) this.mapValue.get( name );
}
}
1.4 +2 -0 jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/test.xml
Index: test.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/test.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- test.xml 8 Jul 2002 21:25:30 -0000 1.3
+++ test.xml 23 Aug 2002 13:42:57 -0000 1.4
@@ -9,6 +9,8 @@
<longValue>555</longValue>
<defaultParamType>somestringvalue</defaultParamType>
<pushIt/>
+ <mapValue name="test1">foo</mapValue>
+ <mapValue name="test2">bar</mapValue>
</call-method-rule-tests>
</foo>
<baz value="baz2"/>
1.4 +16 -12 jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/testrules.xml
Index: testrules.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/xmlrules/testrules.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- testrules.xml 8 Jul 2002 21:25:30 -0000 1.3
+++ testrules.xml 23 Aug 2002 13:42:57 -0000 1.4
@@ -1,15 +1,19 @@
<?xml version="1.0"?>
+<!DOCTYPE digester-rules PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN" "http://jakarta.apache.org/commons/digester/dtds/digester-rules.dtd">
<digester-rules>
- <pattern value="root/foo">
- <object-create-rule classname="org.apache.commons.digester.xmlrules.TestObject"/>
- <set-next-rule methodname="add" paramtype="java.lang.Object"/>
- <set-properties-rule/>
- <include path="org/apache/commons/digester/xmlrules/testrulesinclude.xml"/>
- <include class="org.apache.commons.digester.xmlrules.TestDigesterRulesSource"/>
- <pattern value="call-method-rule-tests">
- <call-method-rule pattern="longValue" methodname="setLongValue" paramcount="0" paramtypes="java.lang.Long"/>
- <call-method-rule pattern="defaultParamType" methodname="setStringValue" paramcount="0"/>
- <call-method-rule pattern="pushIt" methodname="push"/>
- </pattern>
- </pattern>
+ <pattern value="root/foo">
+ <object-create-rule classname="org.apache.commons.digester.xmlrules.TestObject"/>
+ <set-next-rule methodname="add" paramtype="java.lang.Object"/>
+ <set-properties-rule/>
+ <include path="org/apache/commons/digester/xmlrules/testrulesinclude.xml"/>
+ <include class="org.apache.commons.digester.xmlrules.TestDigesterRulesSource"/>
+ <pattern value="call-method-rule-tests">
+ <call-method-rule pattern="longValue" methodname="setLongValue" paramcount="0" paramtypes="java.lang.Long"/>
+ <call-method-rule pattern="defaultParamType" methodname="setStringValue" paramcount="0"/>
+ <call-method-rule pattern="pushIt" methodname="push"/>
+ <call-method-rule pattern="mapValue" methodname="setMapValue" paramcount="2" paramtypes="java.lang.String,java.lang.String"/>
+ <call-param-rule pattern="mapValue" attrname="name" paramnumber="0" />
+ <call-param-rule pattern="mapValue" paramnumber="1"/>
+ </pattern>
+ </pattern>
</digester-rules>
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>