elena       2004/01/16 09:50:01

  Modified:    java/src/org/apache/xerces/parsers AbstractDOMParser.java
  Log:
  Update LSParser filter  impl according to the latest spec:
  1. "The document element is never passed to the LSParserFilter methods, i.e. it is 
not possible to filter out the document element"
  2. "The child nodes of an EntityReference node are passed to the filter if the 
parameter "entities" is set to false"
  
  Revision  Changes    Path
  1.101     +38 -31    
xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java
  
  Index: AbstractDOMParser.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java,v
  retrieving revision 1.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- AbstractDOMParser.java    18 Nov 2003 20:45:11 -0000      1.100
  +++ AbstractDOMParser.java    16 Jan 2004 17:50:01 -0000      1.101
  @@ -269,8 +269,8 @@
       /** True if inside DTD external subset. */
       protected boolean fInDTDExternalSubset;
       
  -    /** True if inside document. */
  -    protected boolean fInDocument;
  +    /** Root element name */
  +    protected QName fRoot = new QName();
       
       /** True if inside CDATA section. */
       protected boolean fInCDATASection;
  @@ -295,6 +295,9 @@
       /** LSParserFilter: store qnames of skipped elements*/
       protected Stack fSkippedElemStack = null;
       
  +    /** LSParserFilter: true if inside entity reference */
  +    protected boolean fInEntityRef = false;
  +    
       /** Attribute QName. */
       private QName fAttrQName = new QName ();
       
  @@ -443,7 +446,7 @@
           fStringBuffer.setLength (0);
           
           // reset state information
  -        fInDocument = false;
  +        fRoot.clear();
           fInDTD = false;
           fInDTDExternalSubset = false;
           fInCDATASection = false;
  @@ -530,7 +533,7 @@
                   // expanded anyway. Synch only needed when user creates entityRef 
node
                   erImpl.needsSyncChildren (false);
               }
  -            
  +            fInEntityRef = true;
               fCurrentNode.appendChild (er);
               fCurrentNode = er;
           }
  @@ -621,7 +624,7 @@
               
               setCharacterData (false);
               fCurrentNode.appendChild (comment);
  -            if (fDOMFilter !=null &&
  +            if (fDOMFilter !=null && !fInEntityRef &&
               (fDOMFilter.getWhatToShow () & NodeFilter.SHOW_COMMENT)!= 0) {
                   short code = fDOMFilter.acceptNode (comment);
                   switch (code) {
  @@ -703,7 +706,7 @@
               
               setCharacterData (false);
               fCurrentNode.appendChild (pi);
  -            if (fDOMFilter !=null &&
  +            if (fDOMFilter !=null && !fInEntityRef &&
               (fDOMFilter.getWhatToShow () & 
NodeFilter.SHOW_PROCESSING_INSTRUCTION)!= 0) {
                   short code = fDOMFilter.acceptNode (pi);
                   switch (code) {
  @@ -760,7 +763,6 @@
       NamespaceContext namespaceContext, Augmentations augs)
       throws XNIException {
           
  -        fInDocument = true;
           if (!fDeferNodeExpansion) {
               if (fDocumentClassName.equals (DEFAULT_DOCUMENT_CLASS_NAME)) {
                   fDocument = new DocumentImpl ();
  @@ -1001,26 +1003,32 @@
               
               
               // filter nodes
  -            if (fDOMFilter != null) {
  -                short code = fDOMFilter.startElement (el);
  -                switch (code) {
  -                    case LSParserFilter.FILTER_INTERRUPT:{
  -                        throw new RuntimeException ("The normal processing of the 
document was interrupted.");
  -                    }
  -                    case LSParserFilter.FILTER_REJECT:{
  -                        fFilterReject = true;
  -                        fRejectedElement.setValues (element);
  -                        return;
  -                    }
  -                    case LSParserFilter.FILTER_SKIP: {
  -                        fSkippedElemStack.push (element);
  -                        return;
  -                    }
  -                    default: {
  +            if (fDOMFilter != null && !fInEntityRef) {
  +                if (fRoot.rawname == null) {
  +                    // fill value of the root element
  +                    fRoot.setValues(element);
  +                } else {
  +                    short code = fDOMFilter.startElement(el);
  +                    switch (code) {
  +                        case LSParserFilter.FILTER_INTERRUPT :
  +                            {
  +                                throw new RuntimeException("The normal processing 
of the document was interrupted.");
  +                            }
  +                        case LSParserFilter.FILTER_REJECT :
  +                            {
  +                                fFilterReject = true;
  +                                fRejectedElement.setValues(element);
  +                                return;
  +                            }
  +                        case LSParserFilter.FILTER_SKIP :
  +                            {
  +                                fSkippedElemStack.push(element);
  +                                return;
  +                            }
  +                        default : {}
                       }
                   }
  -            }
  -            
  +            }            
               fCurrentNode.appendChild (el);
               fCurrentNode = el;
           }
  @@ -1283,7 +1291,7 @@
                       }
                   }
                   setCharacterData (false);
  -                if ((fDOMFilter.getWhatToShow () & NodeFilter.SHOW_ELEMENT)!=0) {
  +                if (!fRoot.equals(element) && !fInEntityRef && 
(fDOMFilter.getWhatToShow () & NodeFilter.SHOW_ELEMENT)!=0) {
                       short code = fDOMFilter.acceptNode (fCurrentNode);
                       switch (code) {
                           case LSParserFilter.FILTER_INTERRUPT:{
  @@ -1372,7 +1380,7 @@
               
               if (fCurrentCDATASection !=null) {
                   
  -                if (fDOMFilter !=null &&
  +                if (fDOMFilter !=null && !fInEntityRef &&
                   (fDOMFilter.getWhatToShow () & NodeFilter.SHOW_CDATA_SECTION)!= 0) {
                       short code = fDOMFilter.acceptNode (fCurrentCDATASection);
                       switch (code) {
  @@ -1417,7 +1425,6 @@
        */
       public void endDocument (Augmentations augs) throws XNIException {
           
  -        fInDocument = false;
           if (!fDeferNodeExpansion) {
               // REVISIT: when DOM Level 3 is REC rely on Document.support
               //          instead of specific class
  @@ -1477,7 +1484,7 @@
                   }
                   
               }
  -            
  +            fInEntityRef = false;
               boolean removeEntityRef = false;
               if (fCreateEntityRefNodes) {
                   if (fDocumentImpl != null) {
  @@ -2533,7 +2540,7 @@
                   fStringBuffer.setLength (0);
               }
               
  -            if (fDOMFilter !=null) {
  +            if (fDOMFilter !=null && !fInEntityRef) {
                   if ( (child.getNodeType () == Node.TEXT_NODE ) &&
                   ((fDOMFilter.getWhatToShow () & NodeFilter.SHOW_TEXT)!= 0) ) {
                       short code = fDOMFilter.acceptNode (child);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to