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]