You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2002/03/12 22:32:48 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl XMLEntityManager.java XMLDocumentFragmentScannerImpl.java XMLDocumentScannerImpl.java XMLDTDScannerImpl.java
neilg 02/03/12 13:32:48
Modified: java/src/org/apache/xerces/impl XMLEntityManager.java
XMLDocumentFragmentScannerImpl.java
XMLDocumentScannerImpl.java XMLDTDScannerImpl.java
Log:
Fix for some performance problems relating to the way in which encodings are detected. Two parts to the fix:
1. We now read only a small number (64 bytes) one at a time at the beginning of external entities in order to correctly process their encoding declarations. Formerly, in certain cases we would end up reading at least 2K bytes one at a time, particularly when using default Java Reader classes.
2. Previously, there were cases in which we did not turn off this one-byte-at-a-time behaviour. Now it is turned off for all kinds of external entity once the encoding is finally determined.
Revision Changes Path
1.26 +9 -4 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.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- XMLEntityManager.java 31 Jan 2002 15:17:56 -0000 1.25
+++ XMLEntityManager.java 12 Mar 2002 21:32:48 -0000 1.26
@@ -115,7 +115,7 @@
* @author Andy Clark, IBM
* @author Arnaud Le Hors, IBM
*
- * @version $Id: XMLEntityManager.java,v 1.25 2002/01/31 15:17:56 sandygao Exp $
+ * @version $Id: XMLEntityManager.java,v 1.26 2002/03/12 21:32:48 neilg Exp $
*/
public class XMLEntityManager
implements XMLComponent, XMLEntityResolver {
@@ -127,6 +127,9 @@
/** Default buffer size (2048). */
public static final int DEFAULT_BUFFER_SIZE = 2048;
+ /** Default buffer size before we've finished with the XMLDecl: */
+ public static final int DEFAULT_XMLDECL_BUFFER_SIZE = 64;
+
// feature identifiers
/** Feature identifier: validation. */
@@ -1727,7 +1730,7 @@
/** Count of characters in buffer. */
public int count;
- // to allow the reader/nputStream to behave efficiently:
+ // to allow the reader/inputStream to behave efficiently:
public boolean mayReadChunks;
//
@@ -3181,7 +3184,9 @@
}
// read characters
- int length = fCurrentEntity.ch.length - offset;
+ int length = fCurrentEntity.mayReadChunks?
+ (fCurrentEntity.ch.length - offset):
+ (DEFAULT_XMLDECL_BUFFER_SIZE);
if (DEBUG_BUFFER) System.out.println(" length to try to read: "+length);
int count = fCurrentEntity.reader.read(fCurrentEntity.ch, offset, length);
if (DEBUG_BUFFER) System.out.println(" length actually read: "+count);
@@ -3219,7 +3224,7 @@
return entityChanged;
- } // load(int):boolean
+ } // load(int, boolean):boolean
} // class EntityScanner
1.11 +3 -1 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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XMLDocumentFragmentScannerImpl.java 29 Jan 2002 03:44:36 -0000 1.10
+++ XMLDocumentFragmentScannerImpl.java 12 Mar 2002 21:32:48 -0000 1.11
@@ -108,7 +108,7 @@
* @author Arnaud Le Hors, IBM
* @author Eric Ye, IBM
*
- * @version $Id: XMLDocumentFragmentScannerImpl.java,v 1.10 2002/01/29 03:44:36 lehors Exp $
+ * @version $Id: XMLDocumentFragmentScannerImpl.java,v 1.11 2002/03/12 21:32:48 neilg Exp $
*/
public class XMLDocumentFragmentScannerImpl
extends XMLScanner
@@ -1512,6 +1512,8 @@
scanXMLDeclOrTextDecl(true);
}
}
+ // now that we've straightened out the readers, we can read in chunks:
+ fEntityManager.fCurrentEntity.mayReadChunks = true;
setScannerState(SCANNER_STATE_CONTENT);
break;
}
1.16 +8 -9 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.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- XMLDocumentScannerImpl.java 28 Jan 2002 19:33:34 -0000 1.15
+++ XMLDocumentScannerImpl.java 12 Mar 2002 21:32:48 -0000 1.16
@@ -109,7 +109,7 @@
* @author Arnaud Le Hors, IBM
* @author Eric Ye, IBM
*
- * @version $Id: XMLDocumentScannerImpl.java,v 1.15 2002/01/28 19:33:34 lehors Exp $
+ * @version $Id: XMLDocumentScannerImpl.java,v 1.16 2002/03/12 21:32:48 neilg Exp $
*/
public class XMLDocumentScannerImpl
extends XMLDocumentFragmentScannerImpl {
@@ -410,7 +410,7 @@
// prepare to look for a TextDecl if external general entity
if (!name.equals("[xml]") && fEntityScanner.isExternal()) {
setScannerState(SCANNER_STATE_TEXT_DECL);
- }
+ }
// call handler
if (fDocumentHandler != null && name.equals("[xml]")) {
@@ -578,8 +578,11 @@
else {
scanXMLDeclOrTextDecl(false);
}
- return true;
}
+ fEntityManager.fCurrentEntity.mayReadChunks = true;
+
+ // if no XMLDecl, then scan piece of prolog
+ return true;
}
// premature end of file
@@ -588,8 +591,6 @@
throw e;
}
- // if no XMLDecl, then scan piece of prolog
- return true;
} // dispatch(boolean):boolean
@@ -628,8 +629,6 @@
again = false;
switch (fScannerState) {
case SCANNER_STATE_PROLOG: {
- // if we're here then we're past the prolog decl!
- fEntityManager.fCurrentEntity.mayReadChunks = true;
fEntityScanner.skipSpaces();
if (fEntityScanner.skipChar('<')) {
setScannerState(SCANNER_STATE_START_OF_MARKUP);
@@ -768,7 +767,7 @@
fEntityManager.setEntityHandler(null);
try {
boolean again;
- XMLResourceIdentifierImpl resourceIdentifier = new XMLResourceIdentifierImpl();
+ XMLResourceIdentifierImpl resourceIdentifier = new XMLResourceIdentifierImpl();
do {
again = false;
switch (fScannerState) {
@@ -805,7 +804,7 @@
break;
}
case SCANNER_STATE_DTD_EXTERNAL: {
- resourceIdentifier.setValues(fDoctypePublicId, fDoctypeSystemId, null, null);
+ resourceIdentifier.setValues(fDoctypePublicId, fDoctypeSystemId, null, null);
XMLInputSource xmlInputSource =
fEntityManager.resolveEntity(resourceIdentifier);
fDTDScanner.setInputSource(xmlInputSource);
1.19 +2 -1 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.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- XMLDTDScannerImpl.java 29 Jan 2002 20:44:02 -0000 1.18
+++ XMLDTDScannerImpl.java 12 Mar 2002 21:32:48 -0000 1.19
@@ -103,7 +103,7 @@
* @author Glenn Marcy, IBM
* @author Eric Ye, IBM
*
- * @version $Id: XMLDTDScannerImpl.java,v 1.18 2002/01/29 20:44:02 neilg Exp $
+ * @version $Id: XMLDTDScannerImpl.java,v 1.19 2002/03/12 21:32:48 neilg Exp $
*/
public class XMLDTDScannerImpl
extends XMLScanner
@@ -655,6 +655,7 @@
}
}
}
+ fEntityManager.fCurrentEntity.mayReadChunks = true;
return textDecl;
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org