I've added support for the ObjectParamRule in XML rules file for the Digester. The syntax is as follows:
<!--
ObjectParamRule
attrname - an arbitrary Object defined programatically, assigned if the element pattern AND specified attribute name are matched
param - an arbitrary Object defined programatically, assigned when the element pattern associated with the Rule is matched
type - class name for object
value - initial value for the object
-->
<!ELEMENT object-param-rule EMPTY>
<!ATTLIST object-param-rule
pattern CDATA #IMPLIED
paramnumber CDATA #REQUIRED
param CDATA #REQUIRED
attrname CDATA #IMPLIED
type CDATA #REQUIRED
value CDATA #IMPLIED>
XML example:
<object-param-rule paramnumber="0" type="java.lang.String" value="meter.serial"/>
Generaly, type attribute can be any Java type. The value can be a string representation of any type that stnaddard ConvertUtils classes are capable to convert into the corresponding object instance.
Tow files are patched:
DigesterRuleParser.java digester-rules.dtd
Regards, Anton
_________________________________________________________________
The new MSN 8: advanced junk mail protection and 2 months FREE* http://join.msn.com/?page=features/junkmail
--- source/DigesterRuleParser.java 2003-04-16 12:23:52.000000000 +0400 +++ target/DigesterRuleParser.java 2003-10-07 11:37:58.000000000 +0400 @@ -68,7 +68,9 @@ import java.util.Set; import java.util.StringTokenizer;
+import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.collections.ArrayStack;
+import org.apache.commons.digester.*;
import org.apache.commons.digester.AbstractObjectCreationFactory;
import org.apache.commons.digester.BeanPropertySetterRule;
import org.apache.commons.digester.CallMethodRule;
@@ -249,6 +251,10 @@
digester.addRule("*/call-param-rule", new PatternRule("pattern"));
digester.addSetNext("*/call-param-rule", "add", ruleClassName);+ digester.addFactoryCreate("*/object-param-rule", new ObjectParamRuleFactory());
+ digester.addRule("*/object-param-rule", new PatternRule("pattern"));
+ digester.addSetNext("*/object-param-rule", "add", ruleClassName);
+
digester.addFactoryCreate("*/factory-create-rule", new FactoryCreateRuleFactory());
digester.addRule("*/factory-create-rule", new PatternRule("pattern"));
digester.addSetNext("*/factory-create-rule", "add", ruleClassName);
@@ -597,6 +603,42 @@
}
/**
+ * Factory for creating a ObjectParamRule
+ */
+ protected class ObjectParamRuleFactory extends AbstractObjectCreationFactory
+ {
+ public Object createObject(Attributes attributes) throws Exception {
+ // create callparamrule
+ int paramIndex = Integer.parseInt(attributes.getValue("paramnumber"));
+ String attributeName = attributes.getValue("attrname");
+ String type = attributes.getValue("type");
+ String value = attributes.getValue("value");
+
+ Rule objectParamRule = null;
+
+ // type name is requried
+ if (type == null)
+ throw new RuntimeException("Attribute 'type' is requried.");
+
+ // create object instance
+ Object param = null;
+ Class clazz = Class.forName(type);
+ if (value == null)
+ param = clazz.newInstance();
+ else {
+ param = ConvertUtils.convert(value, clazz);
+ }
+
+ if (attributeName == null) {
+ objectParamRule = new ObjectParamRule( paramIndex, param);
+ } else {
+ objectParamRule = new ObjectParamRule( paramIndex, attributeName, param);
+ }
+ return objectParamRule;
+ }
+ }
+
+ /**
* Factory for creating a FactoryCreateRule
*/
protected class FactoryCreateRuleFactory extends AbstractObjectCreationFactory {
--- source/digester-rules.dtd 2003-03-27 18:54:46.000000000 +0300
+++ target/digester-rules.dtd 2003-10-07 10:57:54.000000000 +0400
@@ -10,13 +10,13 @@
Digester is a framework for pattern-matching-based parsing of XML into
Java objects. See http://jakarta.apache.org/commons/digester.html. -->
-<!ENTITY % rule-elements "bean-property-setter-rule | call-method-rule | call-param-rule |
+<!ENTITY % rule-elements "bean-property-setter-rule | call-method-rule | call-param-rule | object-param-rule |
factory-create-rule | object-create-rule |
set-properties-rule | set-property-rule | set-top-rule |
set-next-rule" >
<!-- digester-rules is the root element. -->
-<!ELEMENT digester-rules (pattern | include | bean-property-setter-rule | call-method-rule | call-param-rule | factory-create-rule | object-create-rule | set-properties-rule | set-property-rule | set-top-rule | set-next-rule )*>
+<!ELEMENT digester-rules (pattern | include | bean-property-setter-rule | call-method-rule | call-param-rule | object-param-rule | factory-create-rule | object-create-rule | set-properties-rule | set-property-rule | set-top-rule | set-next-rule )*>
<!-- <pattern> defines a matching pattern, or part of a matching pattern. Any
@@ -93,6 +93,22 @@
from-stack CDATA #IMPLIED>
<!--
+ ObjectParamRule
+ attrname - an arbitrary Object defined programatically, assigned if the element pattern AND specified attribute name are matched
+ param - an arbitrary Object defined programatically, assigned when the element pattern associated with the Rule is matched
+ type - class name for object
+ value - initial value for the object
+ -->
+<!ELEMENT object-param-rule EMPTY>
+<!ATTLIST object-param-rule
+ pattern CDATA #IMPLIED
+ paramnumber CDATA #REQUIRED
+ param CDATA #REQUIRED
+ attrname CDATA #IMPLIED
+ type CDATA #REQUIRED
+ value CDATA #IMPLIED>
+
+<!--
FactoryCreateRule
ignore-exceptions - if this attribute is (ignore case) 'true' then any exceptions
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
