mrglavas 2004/02/27 12:36:07
Modified: java/src/org/apache/xerces/parsers AbstractSAXParser.java
java/src/org/apache/xerces/impl XMLVersionDetector.java
XMLEntityHandler.java XMLDocumentScannerImpl.java
XMLEntityManager.java XMLDTDScannerImpl.java
Constants.java XMLDocumentFragmentScannerImpl.java
XMLScanner.java
Log:
Fixing Bug #26685:
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26685
SAX requires that when an entity is skipped that it be reported
to ContentHandler.skippedEntity.
From the API spec for ContentHandler:
"The Parser will invoke this method each time the entity is skipped.
Non-validating processors may skip entities if they have not seen
the declarations (because, for example, the entity was declared in
an external DTD subset). All processors may skip external entities,
depending on the values of the
http://xml.org/sax/features/external-general-entities and
the http://xml.org/sax/features/external-parameter-entities
properties."
XNI (which isn't going to change) has no built-in method for
communicating skipped entities. XMLEntityManager needed
some method to communicate that an entity has been
skipped so I've added Augmentations to our internal
interface XMLEntityHandler. This is consistent with
interfaces in XNI.
Revision Changes Path
1.50 +19 -7
xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java
Index: AbstractSAXParser.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractSAXParser.java,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- AbstractSAXParser.java 24 Feb 2004 23:15:56 -0000 1.49
+++ AbstractSAXParser.java 27 Feb 2004 20:36:06 -0000 1.50
@@ -746,9 +746,18 @@
throws XNIException {
try {
- // SAX2 extension
- if (fLexicalHandler != null) {
- fLexicalHandler.startEntity(name);
+ // Only report startEntity if this entity was actually read.
+ if (augs != null &&
Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
+ // report skipped entity to content handler
+ if (fContentHandler != null) {
+ fContentHandler.skippedEntity(name);
+ }
+ }
+ else {
+ // SAX2 extension
+ if (fLexicalHandler != null) {
+ fLexicalHandler.startEntity(name);
+ }
}
}
catch (SAXException e) {
@@ -780,9 +789,12 @@
public void endParameterEntity(String name, Augmentations augs) throws
XNIException {
try {
- // SAX2 extension
- if (fLexicalHandler != null) {
- fLexicalHandler.endEntity(name);
+ // Only report endEntity if this entity was actually read.
+ if (augs == null ||
!Boolean.TRUE.equals(augs.getItem(Constants.ENTITY_SKIPPED))) {
+ // SAX2 extension
+ if (fLexicalHandler != null) {
+ fLexicalHandler.endEntity(name);
+ }
}
}
catch (SAXException e) {
1.12 +2 -2
xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java
Index: XMLVersionDetector.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- XMLVersionDetector.java 24 Feb 2004 23:03:46 -0000 1.11
+++ XMLVersionDetector.java 27 Feb 2004 20:36:07 -0000 1.12
@@ -126,7 +126,7 @@
//
fEntityManager.setEntityHandler(scanner);
- scanner.startEntity(fXMLSymbol,
fEntityManager.getCurrentResourceIdentifier(), fEncoding);
+ scanner.startEntity(fXMLSymbol,
fEntityManager.getCurrentResourceIdentifier(), fEncoding, null);
}
1.9 +8 -5 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityHandler.java
Index: XMLEntityHandler.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityHandler.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XMLEntityHandler.java 24 Feb 2004 23:03:46 -0000 1.8
+++ XMLEntityHandler.java 27 Feb 2004 20:36:07 -0000 1.9
@@ -16,6 +16,7 @@
package org.apache.xerces.impl;
+import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.XMLResourceIdentifier;
import org.apache.xerces.xni.XNIException;
@@ -47,12 +48,13 @@
* where the entity encoding is not auto-detected (e.g.
* internal entities or a document entity that is
* parsed from a java.io.Reader).
- *
+ * @param augs Additional information that may include infoset augmentations
+ *
* @throws XNIException Thrown by handler to signal an error.
*/
public void startEntity(String name,
XMLResourceIdentifier identifier,
- String encoding) throws XNIException;
+ String encoding, Augmentations augs) throws
XNIException;
/**
* This method notifies the end of an entity. The DTD has the pseudo-name
@@ -60,9 +62,10 @@
* are just specified by their name.
*
* @param name The name of the entity.
- *
+ * @param augs Additional information that may include infoset augmentations
+ *
* @throws XNIException Thrown by handler to signal an error.
*/
- public void endEntity(String name) throws XNIException;
+ public void endEntity(String name, Augmentations augs) throws XNIException;
} // interface XMLEntityHandler
1.40 +6 -5
xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java
Index: XMLDocumentScannerImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentScannerImpl.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- XMLDocumentScannerImpl.java 24 Feb 2004 23:03:46 -0000 1.39
+++ XMLDocumentScannerImpl.java 27 Feb 2004 20:36:07 -0000 1.40
@@ -24,6 +24,7 @@
import org.apache.xerces.util.XMLChar;
import org.apache.xerces.util.XMLResourceIdentifierImpl;
import org.apache.xerces.util.XMLStringBuffer;
+import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.NamespaceContext;
import org.apache.xerces.xni.XMLResourceIdentifier;
import org.apache.xerces.xni.XMLString;
@@ -478,9 +479,9 @@
*/
public void startEntity(String name,
XMLResourceIdentifier identifier,
- String encoding) throws XNIException {
+ String encoding, Augmentations augs) throws
XNIException {
- super.startEntity(name, identifier, encoding);
+ super.startEntity(name, identifier, encoding, augs);
// prepare to look for a TextDecl if external general entity
if (!name.equals("[xml]") && fEntityScanner.isExternal()) {
@@ -503,9 +504,9 @@
*
* @throws XNIException Thrown by handler to signal an error.
*/
- public void endEntity(String name) throws XNIException {
+ public void endEntity(String name, Augmentations augs) throws XNIException {
- super.endEntity(name);
+ super.endEntity(name, augs);
// call handler
if (fDocumentHandler != null && name.equals("[xml]")) {
1.76 +26 -9 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityManager.java
Index: XMLEntityManager.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityManager.java,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -r1.75 -r1.76
--- XMLEntityManager.java 24 Feb 2004 23:03:46 -0000 1.75
+++ XMLEntityManager.java 27 Feb 2004 20:36:07 -0000 1.76
@@ -33,12 +33,14 @@
import org.apache.xerces.impl.io.UTF8Reader;
import org.apache.xerces.impl.msg.XMLMessageFormatter;
import org.apache.xerces.impl.validation.ValidationManager;
+import org.apache.xerces.util.AugmentationsImpl;
import org.apache.xerces.util.EncodingMap;
import org.apache.xerces.util.SecurityManager;
import org.apache.xerces.util.SymbolTable;
import org.apache.xerces.util.URI;
import org.apache.xerces.util.XMLChar;
import org.apache.xerces.util.XMLResourceIdentifierImpl;
+import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.XMLResourceIdentifier;
import org.apache.xerces.xni.XNIException;
import org.apache.xerces.xni.parser.XMLComponent;
@@ -338,6 +340,9 @@
/** Resource identifer. */
private final XMLResourceIdentifierImpl fResourceIdentifier = new
XMLResourceIdentifierImpl();
+
+ /** Augmentations for entities. */
+ private final Augmentations fEntityAugs = new AugmentationsImpl();
//
// Constructors
@@ -687,8 +692,12 @@
if (fEntityHandler != null) {
String encoding = null;
fResourceIdentifier.clear();
- fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding);
- fEntityHandler.endEntity(entityName);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding, fEntityAugs);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.endEntity(entityName, fEntityAugs);
}
return;
}
@@ -714,8 +723,12 @@
fResourceIdentifier.setValues(
(externalEntity.entityLocation != null ?
externalEntity.entityLocation.getPublicId() : null),
extLitSysId, extBaseSysId, expandedSystemId);
- fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding);
- fEntityHandler.endEntity(entityName);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding, fEntityAugs);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.endEntity(entityName, fEntityAugs);
}
return;
}
@@ -752,8 +765,12 @@
(externalEntity.entityLocation != null ?
externalEntity.entityLocation.getPublicId() : null),
extLitSysId, extBaseSysId, expandedSystemId);
}
- fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding);
- fEntityHandler.endEntity(entityName);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.startEntity(entityName, fResourceIdentifier,
encoding, fEntityAugs);
+ fEntityAugs.removeAllItems();
+ fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
+ fEntityHandler.endEntity(entityName, null);
}
return;
}
@@ -856,7 +873,7 @@
// call handler
if (fEntityHandler != null) {
- fEntityHandler.startEntity(name, fResourceIdentifier, encoding);
+ fEntityHandler.startEntity(name, fResourceIdentifier, encoding, null);
}
} // startEntity(String,XMLInputSource)
@@ -1678,7 +1695,7 @@
System.out.println();
}
if (fEntityHandler != null) {
- fEntityHandler.endEntity(fCurrentEntity.name);
+ fEntityHandler.endEntity(fCurrentEntity.name, null);
}
// Close the reader for the current entity once we're
1.49 +10 -7
xml-xerces/java/src/org/apache/xerces/impl/XMLDTDScannerImpl.java
Index: XMLDTDScannerImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLDTDScannerImpl.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- XMLDTDScannerImpl.java 24 Feb 2004 23:03:46 -0000 1.48
+++ XMLDTDScannerImpl.java 27 Feb 2004 20:36:07 -0000 1.49
@@ -23,6 +23,7 @@
import org.apache.xerces.util.XMLAttributesImpl;
import org.apache.xerces.util.XMLChar;
import org.apache.xerces.util.XMLStringBuffer;
+import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.XMLDTDContentModelHandler;
import org.apache.xerces.xni.XMLDTDHandler;
import org.apache.xerces.xni.XMLResourceIdentifier;
@@ -476,14 +477,15 @@
* where the entity encoding is not auto-detected (e.g.
* internal entities or a document entity that is
* parsed from a java.io.Reader).
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
public void startEntity(String name,
XMLResourceIdentifier identifier,
- String encoding) throws XNIException {
+ String encoding, Augmentations augs) throws
XNIException {
- super.startEntity(name, identifier, encoding);
+ super.startEntity(name, identifier, encoding, augs);
boolean dtdEntity = name.equals("[dtd]");
if (dtdEntity) {
@@ -506,7 +508,7 @@
// call handler
if (fDTDHandler != null && !dtdEntity && fReportEntity) {
- fDTDHandler.startParameterEntity(name, identifier, encoding, null);
+ fDTDHandler.startParameterEntity(name, identifier, encoding, augs);
}
} // startEntity(String,XMLResourceIdentifier,String)
@@ -517,13 +519,14 @@
* are just specified by their name.
*
* @param name The name of the entity.
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
- public void endEntity(String name)
+ public void endEntity(String name, Augmentations augs)
throws XNIException {
- super.endEntity(name);
+ super.endEntity(name, augs);
// if there is no data after the doctype
//
@@ -564,7 +567,7 @@
// call handler
boolean dtdEntity = name.equals("[dtd]");
if (fDTDHandler != null && !dtdEntity && reportEntity) {
- fDTDHandler.endParameterEntity(name, null);
+ fDTDHandler.endParameterEntity(name, augs);
}
// end DTD
1.39 +9 -1 xml-xerces/java/src/org/apache/xerces/impl/Constants.java
Index: Constants.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/Constants.java,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- Constants.java 24 Feb 2004 23:03:46 -0000 1.38
+++ Constants.java 27 Feb 2004 20:36:07 -0000 1.39
@@ -328,6 +328,14 @@
* augmentation indicates that the attribute was not declared in the DTD.
*/
public final static String ATTRIBUTE_DECLARED = "ATTRIBUTE_DECLARED";
+
+ /**
+ * Boolean indicating whether an entity referenced in the document has
+ * not been read is stored in augmentations using string "ENTITY_SKIPPED".
+ * The absence of this augmentation indicates that the entity had a
+ * declaration and was expanded.
+ */
+ public final static String ENTITY_SKIPPED = "ENTITY_SKIPPED";
// XML version constants
public final static short XML_VERSION_1_0 = 1;
1.48 +9 -7
xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java
Index: XMLDocumentFragmentScannerImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLDocumentFragmentScannerImpl.java,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- XMLDocumentFragmentScannerImpl.java 24 Feb 2004 23:03:46 -0000 1.47
+++ XMLDocumentFragmentScannerImpl.java 27 Feb 2004 20:36:07 -0000 1.48
@@ -509,12 +509,13 @@
* where the entity encoding is not auto-detected (e.g.
* internal entities or a document entity that is
* parsed from a java.io.Reader).
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
public void startEntity(String name,
XMLResourceIdentifier identifier,
- String encoding) throws XNIException {
+ String encoding, Augmentations augs) throws
XNIException {
// keep track of this entity before fEntityDepth is increased
if (fEntityDepth == fEntityStack.length) {
@@ -524,7 +525,7 @@
}
fEntityStack[fEntityDepth] = fMarkupDepth;
- super.startEntity(name, identifier, encoding);
+ super.startEntity(name, identifier, encoding, augs);
// WFC: entity declared in external subset in standalone doc
if(fStandalone && fEntityManager.isEntityDeclInExternalSubset(name)) {
@@ -535,7 +536,7 @@
// call handler
if (fDocumentHandler != null && !fScanningAttribute) {
if (!name.equals("[xml]")) {
- fDocumentHandler.startGeneralEntity(name, identifier, encoding,
null);
+ fDocumentHandler.startGeneralEntity(name, identifier, encoding,
augs);
}
}
@@ -547,10 +548,11 @@
* are just specified by their name.
*
* @param name The name of the entity.
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
- public void endEntity(String name) throws XNIException {
+ public void endEntity(String name, Augmentations augs) throws XNIException {
// flush possible pending output buffer - see scanContent
if (fInScanContent && fStringBuffer.length != 0
@@ -559,7 +561,7 @@
fStringBuffer.length = 0; // make sure we know it's been flushed
}
- super.endEntity(name);
+ super.endEntity(name, augs);
// make sure markup is properly balanced
if (fMarkupDepth != fEntityStack[fEntityDepth]) {
@@ -569,7 +571,7 @@
// call handler
if (fDocumentHandler != null && !fScanningAttribute) {
if (!name.equals("[xml]")) {
- fDocumentHandler.endGeneralEntity(name, null);
+ fDocumentHandler.endGeneralEntity(name, augs);
}
}
1.47 +6 -3 xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java
Index: XMLScanner.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLScanner.java,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- XMLScanner.java 24 Feb 2004 23:03:46 -0000 1.46
+++ XMLScanner.java 27 Feb 2004 20:36:07 -0000 1.47
@@ -23,6 +23,7 @@
import org.apache.xerces.util.XMLChar;
import org.apache.xerces.util.XMLResourceIdentifierImpl;
import org.apache.xerces.util.XMLStringBuffer;
+import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.XMLAttributes;
import org.apache.xerces.xni.XMLResourceIdentifier;
import org.apache.xerces.xni.XMLString;
@@ -1129,12 +1130,13 @@
* where the entity encoding is not auto-detected (e.g.
* internal entities or a document entity that is
* parsed from a java.io.Reader).
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
public void startEntity(String name,
XMLResourceIdentifier identifier,
- String encoding) throws XNIException {
+ String encoding, Augmentations augs) throws
XNIException {
// keep track of the entity depth
fEntityDepth++;
@@ -1150,10 +1152,11 @@
* specified by their name.
*
* @param name The name of the entity.
+ * @param augs Additional information that may include infoset augmentations
*
* @throws XNIException Thrown by handler to signal an error.
*/
- public void endEntity(String name) throws XNIException {
+ public void endEntity(String name, Augmentations augs) throws XNIException {
// keep track of the entity depth
fEntityDepth--;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]