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 2003/10/23 22:06:09 UTC
cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester/xmlrules DigesterRuleParser.java digester-rules.dtd
rdonkin 2003/10/23 13:06:09
Modified: digester/src/java/org/apache/commons/digester/xmlrules
DigesterRuleParser.java digester-rules.dtd
Log:
Added support for ObjectParamRule to xmlrules. Patch contributed by Anton Maslovsky.
Revision Changes Path
1.20 +50 -4 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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- DigesterRuleParser.java 9 Oct 2003 21:09:48 -0000 1.19
+++ DigesterRuleParser.java 23 Oct 2003 20:06:09 -0000 1.20
@@ -1,4 +1,4 @@
-/*
+ /*
* $Header$
* $Revision$
* $Date$
@@ -72,7 +72,10 @@
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.AbstractObjectCreationFactory;
import org.apache.commons.digester.BeanPropertySetterRule;
import org.apache.commons.digester.CallMethodRule;
@@ -87,6 +90,8 @@
import org.apache.commons.digester.SetPropertiesRule;
import org.apache.commons.digester.SetPropertyRule;
import org.apache.commons.digester.SetTopRule;
+import org.apache.commons.digester.ObjectParamRule;
+
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -248,6 +253,10 @@
digester.addFactoryCreate("*/call-method-rule", new CallMethodRuleFactory());
digester.addRule("*/call-method-rule", new PatternRule("pattern"));
digester.addSetNext("*/call-method-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("*/call-param-rule", new CallParamRuleFactory());
digester.addRule("*/call-param-rule", new PatternRule("pattern"));
@@ -602,6 +611,43 @@
return callParamRule;
}
}
+
+ /**
+ * 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 required.");
+ }
+
+ // 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
1.10 +26 -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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- digester-rules.dtd 7 Jul 2003 20:52:12 -0000 1.9
+++ digester-rules.dtd 23 Oct 2003 20:06:09 -0000 1.10
@@ -10,13 +10,14 @@
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
@@ -91,6 +92,28 @@
paramnumber CDATA #REQUIRED
attrname CDATA #IMPLIED
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
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org