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