You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2008/11/02 22:05:03 UTC

svn commit: r709933 - in /xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers: AbstractDOMParser.java DOMParserImpl.java

Author: mrglavas
Date: Sun Nov  2 13:05:02 2008
New Revision: 709933

URL: http://svn.apache.org/viewvc?rev=709933&view=rev
Log:
Fixing JIRA Issue #1335:
http://issues.apache.org/jira/browse/XERCESJ-1335

With an LSParserFilter, the rejection and skipping of nodes on startElement() malfunctioned 
if an element in the subtree has the same name as the filtered node. This occurred because 
the DOM parser used the name of the element to determine when it had reached the end of the 
subtree. So that recursive structures are processed correctly we now use the element's depth.

Modified:
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/AbstractDOMParser.java
    xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/DOMParserImpl.java

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/AbstractDOMParser.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/AbstractDOMParser.java?rev=709933&r1=709932&r2=709933&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/AbstractDOMParser.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/AbstractDOMParser.java Sun Nov  2 13:05:02 2008
@@ -260,10 +260,10 @@
     /** Base uri stack*/
     protected final Stack fBaseURIStack = new Stack ();
 
-    /** LSParserFilter: the QNAME of rejected element*/
-    protected final QName fRejectedElement = new QName ();
+    /** LSParserFilter: tracks the element depth within a rejected subtree. */
+    protected int fRejectedElementDepth = 0;
 
-    /** LSParserFilter: store qnames of skipped elements*/
+    /** LSParserFilter: store depth of skipped elements */
     protected Stack fSkippedElemStack = null;
 
     /** LSParserFilter: true if inside entity reference */
@@ -927,6 +927,7 @@
         }
         if (!fDeferNodeExpansion) {
             if (fFilterReject) {
+                ++fRejectedElementDepth;
                 return;
             }
             Element el = createElementNode (element);
@@ -1034,15 +1035,20 @@
                         case LSParserFilter.FILTER_REJECT :
                             {
                                 fFilterReject = true;
-                                fRejectedElement.setValues(element);
+                                fRejectedElementDepth = 0;
                                 return;
                             }
                         case LSParserFilter.FILTER_SKIP :
                             {
-                                fSkippedElemStack.push(element.clone());
+                                fSkippedElemStack.push(Boolean.TRUE);
                                 return;
                             }
-                        default : {}
+                        default : 
+                            {
+                                if (!fSkippedElemStack.isEmpty()) {
+                                    fSkippedElemStack.push(Boolean.FALSE);
+                                }
+                            }
                     }
                 }
             }
@@ -1299,14 +1305,13 @@
 
             if (fDOMFilter != null) {
                 if (fFilterReject) {
-                    if (element.equals (fRejectedElement)) {
+                    if (fRejectedElementDepth-- == 0) {
                         fFilterReject = false;
                     }
                     return;
                 }
-                if (!fSkippedElemStack.isEmpty ()) {
-                    if (fSkippedElemStack.peek ().equals (element)) {
-                        fSkippedElemStack.pop ();
+                if (!fSkippedElemStack.isEmpty()) {
+                    if (fSkippedElemStack.pop() == Boolean.TRUE) {
                         return;
                     }
                 }

Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/DOMParserImpl.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/DOMParserImpl.java?rev=709933&r1=709932&r2=709933&view=diff
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/DOMParserImpl.java (original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/parsers/DOMParserImpl.java Sun Nov  2 13:05:02 2008
@@ -291,7 +291,7 @@
         if (fSkippedElemStack != null) {
             fSkippedElemStack.removeAllElements();
         }
-        fRejectedElement.clear();
+        fRejectedElementDepth = 0;
         fFilterReject = false;
         fSchemaType = null;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org