You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sk...@apache.org on 2005/02/06 05:36:19 UTC

svn commit: r151539 - jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java

Author: skitching
Date: Sat Feb  5 20:36:18 2005
New Revision: 151539

URL: http://svn.apache.org/viewcvs?view=rev&rev=151539
Log:
* made changes due to original XMLReader object not being accessable
  any more. Instead, use new setContentHandler method on SAXHandler class.
* moved endElement method to more logical location within file.

Modified:
    jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java

Modified: jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java?view=diff&r1=151538&r2=151539
==============================================================================
--- jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java (original)
+++ jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/actions/NodeCreateAction.java Sat Feb  5 20:36:18 2005
@@ -98,7 +98,7 @@
         /**
          * Constructor.
          * 
-         * <p>Stores the content handler currently used by Digester so it can 
+         * <p>Stores the context currently used by Digester so it can 
          * be reset when done, and initializes the DOM objects needed to 
          * build the node.</p>
          * 
@@ -116,39 +116,23 @@
             this.root = root;
             this.top = root;
             
-            oldSaxHandler = context.getSAXHandler();
-            oldContext = context;
-            reader = oldSaxHandler.getXMLReader();
-            // assert oldReader.getContentHandler() == oldSaxHandler
+            this.context = context;
         }
 
 
         // ------------------------------------------------- Instance Variables
 
-
-        /**
-         * The content handler used by Digester before it was set to this 
-         * content handler.
-         */
-        protected SAXHandler oldSaxHandler = null;
-
         /**
          * The parsing context currently in use.
          */
-        protected Context oldContext = null;
+        protected Context context = null;
         
         /**
-         * The XMLReader being used to parse the input xml.
-         */
-        protected XMLReader reader;
-
-        /**
          * Depth of the current node, relative to the element where the content
          * handler was put into action.
          */
         protected int depth = 0;
 
-
         /**
          * A DOM Document used to create the various Node instances.
          */
@@ -194,44 +178,6 @@
 
 
         /**
-         * Checks whether control needs to be returned to Digester.
-         * 
-         * @param namespaceURI the namespace URI
-         * @param localName the local name
-         * @param qName the qualified (prefixed) name
-         * @throws SAXException if the DOM implementation throws an exception
-         */
-        public void endElement(String namespaceURI, String localName,
-                               String qName)
-            throws SAXException {
-            
-            try {
-                if (depth == 0) {
-                    // restore sax event handler
-                    reader.setContentHandler(oldSaxHandler);
-                    
-                    // push built node onto stack so that other rules can
-                    // access it. Note that this node gets popped in the
-                    // end method of the parent NodeCreateAction, so it won't
-                    // be there very long...
-                    oldContext.push(root);
-                    
-                    // and manually fire the rules that would have been fired
-                    // had the normal SAXHandler been receiving parse events
-                    // instead of this temporary handler.
-                    oldSaxHandler.endElement(namespaceURI, localName, qName);
-                }
-    
-                top = top.getParentNode();
-                depth--;
-            } catch (DOMException e) {
-                throw new SAXException(e.getMessage());
-            }
-
-        }
-
-
-        /**
          * Adds a new
          * {@link org.w3c.dom.ProcessingInstruction ProcessingInstruction} to 
          * the current node.
@@ -296,6 +242,46 @@
 
         }
 
+
+        /**
+         * Checks whether control needs to be returned to Digester.
+         * 
+         * @param namespaceURI the namespace URI
+         * @param localName the local name
+         * @param qName the qualified (prefixed) name
+         * @throws SAXException if the DOM implementation throws an exception
+         */
+        public void endElement(String namespaceURI, String localName,
+                               String qName)
+            throws SAXException {
+            
+            try {
+                if (depth == 0) {
+                    SAXHandler saxHandler = context.getSAXHandler();
+                    
+                    // restore sax event handler
+                    saxHandler.setContentHandler(null);
+                   
+                    // push built node onto stack so that other rules can
+                    // access it. Note that this node gets popped in the
+                    // end method of the parent NodeCreateAction, so it won't
+                    // be there very long...
+                    context.push(root);
+                    
+                    // and manually fire the rules that would have been fired
+                    // had the normal SAXHandler been receiving parse events
+                    // instead of this temporary handler.
+                    saxHandler.endElement(namespaceURI, localName, qName);
+                }
+    
+                top = top.getParentNode();
+                depth--;
+            } catch (DOMException e) {
+                throw new SAXException(e.getMessage());
+            }
+
+        }
+
     }
 
 
@@ -427,9 +413,10 @@
             } else {
                 builder = new NodeBuilder(context, doc, doc.createDocumentFragment());
             }
-        
-            XMLReader reader = context.getSAXHandler().getXMLReader();
-            reader.setContentHandler(builder);
+
+            // tell the SAXHandler to forward events from the sax parser to
+            // the builder object
+            context.getSAXHandler().setContentHandler(builder);
         } catch(SAXException ex) {
             throw new ParseException(ex);
         }
@@ -438,6 +425,10 @@
 
     /**
      * Pop the Node off the top of the stack.
+     * <p>
+     * Note that while the begin method sets up a custom contenthandler,
+     * it is not this method that undoes that work; the SAXHandler is unable
+     * to call this method until redirection of sax events has been cancelled!
      */
     public void end(Context context, String namespaceURI, String name) 
     throws ParseException {



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org