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 2005/09/04 22:55:35 UTC
svn commit: r278627 - in /jakarta/commons/proper/digester/trunk: ./
src/java/org/apache/commons/digester/xmlrules/
src/test/org/apache/commons/digester/xmlrules/
Author: rdonkin
Date: Sun Sep 4 13:55:28 2005
New Revision: 278627
URL: http://svn.apache.org/viewcvs?rev=278627&view=rev
Log:
Added support for node create rule for xmlrules. Contributed by Kevin Ross. Bugzilla 36482.
Modified:
jakarta/commons/proper/digester/trunk/project.xml
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java
Modified: jakarta/commons/proper/digester/trunk/project.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/project.xml?rev=278627&r1=278626&r2=278627&view=diff
==============================================================================
--- jakarta/commons/proper/digester/trunk/project.xml (original)
+++ jakarta/commons/proper/digester/trunk/project.xml Sun Sep 4 13:55:28 2005
@@ -219,6 +219,11 @@
<name>Wendy Smoak</name>
<email>java@wendysmoak.com</email>
</contributor>
+ <contributor>
+ <name>Kevin Ross</name>
+ <email>kevin.ross@iverticalleap.com</email>
+ </contributor>
+
</contributors>
<licenses>
Modified: jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java?rev=278627&r1=278626&r2=278627&view=diff
==============================================================================
--- jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java (original)
+++ jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java Sun Sep 4 13:55:28 2005
@@ -38,6 +38,7 @@
import org.apache.commons.digester.CallParamRule;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.FactoryCreateRule;
+import org.apache.commons.digester.NodeCreateRule;
import org.apache.commons.digester.ObjectCreateRule;
import org.apache.commons.digester.Rule;
import org.apache.commons.digester.RuleSetBase;
@@ -50,6 +51,7 @@
import org.apache.commons.digester.SetTopRule;
import org.apache.commons.digester.ObjectParamRule;
+import org.w3c.dom.Node;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -246,6 +248,10 @@
digester.addRule("*/object-create-rule", new PatternRule("pattern"));
digester.addSetNext("*/object-create-rule", "add", ruleClassName);
+ digester.addFactoryCreate("*/node-create-rule", new NodeCreateRuleFactory());
+ digester.addRule("*/node-create-rule", new PatternRule("pattern"));
+ digester.addSetNext("*/node-create-rule", "add", ruleClassName);
+
digester.addFactoryCreate("*/set-properties-rule", new SetPropertiesRuleFactory());
digester.addRule("*/set-properties-rule", new PatternRule("pattern"));
digester.addSetNext("*/set-properties-rule", "add", ruleClassName);
@@ -660,7 +666,34 @@
return objectParamRule;
}
}
+
+ /**
+ * Factory for creating a NodeCreateRule
+ */
+ protected class NodeCreateRuleFactory extends AbstractObjectCreationFactory {
+
+ public Object createObject(Attributes attributes) throws Exception {
+
+ String nodeType = attributes.getValue("type");
+ if (nodeType == null || "".equals(nodeType)) {
+ // uses Node.ELEMENT_NODE
+ return new NodeCreateRule();
+ } else if ("element".equals(nodeType)) {
+
+ return new NodeCreateRule(Node.ELEMENT_NODE);
+ } else if ("fragment".equals(nodeType)) {
+
+ return new NodeCreateRule(Node.DOCUMENT_FRAGMENT_NODE);
+ } else {
+
+ throw new RuntimeException(
+ "Unrecognized node type: "
+ + nodeType
+ + ". This attribute is optional or can have a value of element|fragment.");
+ }
+ }
+ }
/**
* Factory for creating a FactoryCreateRule
Modified: jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd?rev=278627&r1=278626&r2=278627&view=diff
==============================================================================
--- jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd (original)
+++ jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd Sun Sep 4 13:55:28 2005
@@ -36,7 +36,7 @@
Java objects. See http://jakarta.apache.org/commons/digester.html. -->
<!ENTITY % rule-elements "bean-property-setter-rule | call-method-rule |
- call-param-rule | object-param-rule |
+ call-param-rule | object-param-rule | node-create-rule |
factory-create-rule | object-create-rule |
set-properties-rule | set-nested-properties-rule |
set-property-rule | set-top-rule |
@@ -138,6 +138,20 @@
attrname CDATA #IMPLIED
type CDATA #REQUIRED
value CDATA #IMPLIED>
+
+<!--
+ NodeCreateRule
+ attrname
+ - an arbitrary Object defined programatically, assigned if the
+ element pattern AND specified attribute name are matched
+ type
+ - node type: either 'element' or 'fragment' or 'none'. this is optional, default is 'element'
+ -->
+<!ELEMENT node-create-rule EMPTY>
+<!ATTLIST object-param-rule
+ pattern CDATA #IMPLIED
+ type CDATA #IMPLIED
+>
<!--
FactoryCreateRule
Modified: jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java?rev=278627&r1=278626&r2=278627&view=diff
==============================================================================
--- jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java (original)
+++ jakarta/commons/proper/digester/trunk/src/test/org/apache/commons/digester/xmlrules/DigesterLoaderTest.java Sun Sep 4 13:55:28 2005
@@ -23,6 +23,7 @@
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
+import java.util.List;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -31,6 +32,7 @@
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.TestObjectCreationFactory;
+import org.w3c.dom.Node;
import org.xml.sax.InputSource;
/**
@@ -310,4 +312,30 @@
assertEquals("Incorrect middle value", "short", testObject.getMiddle());
assertEquals("Incorrect right value", "", testObject.getRight());
}
+
+ public void testNodeCreateRule() throws Exception {
+
+ URL rules = ClassLoader.getSystemResource("org/apache/commons/digester/xmlrules/test-node-create-rules.xml");
+ URL input = ClassLoader.getSystemResource("org/apache/commons/digester/xmlrules/test-node-create-rules-input.xml");
+ assertNotNull("The test could not locate test-node-create-rules.xml", rules);
+ assertNotNull("The test could not locate test-node-create-rules-input.xml", input);
+ Digester digester = DigesterLoader.createDigester(rules);
+ digester.push(new ArrayList());
+ Object root = digester.parse(input.openStream());
+
+ assertNotNull("root was null", root);
+ assertTrue("no nodes were captured.", (((List)root).size() > 0));
+ Object[] nodeArray = (Object[])((List)root).toArray();
+ assertNotNull("resulting node array from array list was null", nodeArray);
+
+ // test foo1 structure
+ Node foo1 = (Node)nodeArray[0];
+ assertTrue("foo1 didn't have any children", foo1.hasChildNodes());
+
+ Node foo1Bar1 = foo1.getFirstChild();
+ assertTrue("foo1's child was not named bar1", "bar1".equals(foo1Bar1.getNodeName()));
+ assertTrue("foo1/bar1 value was not bar-1-value", "bar1-value".equals(foo1Bar1.getFirstChild().getNodeValue()));
+ }
+
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org