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 2006/09/13 22:43:26 UTC
svn commit: r443115 -
/xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
Author: mrglavas
Date: Wed Sep 13 13:43:26 2006
New Revision: 443115
URL: http://svn.apache.org/viewvc?view=rev&rev=443115
Log:
Reduce the overhead of creating a ScannedEntity by reusing byte buffers.
This is similar to the improvement introduced in Rev 320110.
See: http://svn.apache.org/viewvc?view=rev&revision=320110
Modified:
xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java?view=diff&rev=443115&r1=443114&r2=443115
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java Wed Sep 13 13:43:26 2006
@@ -356,6 +356,9 @@
/** Pool of byte buffers. */
private final ByteBufferPool fByteBufferPool = new ByteBufferPool(fBufferSize);
+ /** Temporary storage for the current entity's byte buffer. */
+ private byte[] fTempByteBuffer = null;
+
/** Pool of character buffers. */
private final CharacterBufferPool fCharacterBufferPool = new CharacterBufferPool(fBufferSize, DEFAULT_INTERNAL_BUFFER_SIZE);
@@ -378,7 +381,6 @@
*/
public XMLEntityManager(XMLEntityManager entityManager) {
-
// save shared entity declarations
fDeclaredEntities = entityManager != null
? entityManager.getDeclaredEntities() : null;
@@ -923,6 +925,7 @@
String encoding = xmlInputSource.getEncoding();
final boolean encodingExternallySpecified = (encoding != null);
Boolean isBigEndian = null;
+ fTempByteBuffer = null;
// create reader
InputStream stream = null;
@@ -1463,6 +1466,7 @@
bufferSize.intValue() > DEFAULT_XMLDECL_BUFFER_SIZE) {
fBufferSize = bufferSize.intValue();
fEntityScanner.setBufferSize(fBufferSize);
+ fByteBufferPool.setBufferSize(fBufferSize);
fCharacterBufferPool.setExternalBufferSize(fBufferSize);
}
}
@@ -1884,8 +1888,13 @@
fReaderStack.pop();
}
- //Release the character buffer back to the pool for reuse
- fCharacterBufferPool.returnToPool(fCurrentEntity.fBuffer);
+ // Release the character buffer back to the pool for reuse
+ fCharacterBufferPool.returnBuffer(fCurrentEntity.fCharacterBuffer);
+
+ // Release the byte buffer back to the pool for reuse
+ if (fCurrentEntity.fByteBuffer != null) {
+ fByteBufferPool.returnBuffer(fCurrentEntity.fByteBuffer);
+ }
// Pop entity stack.
fCurrentEntity = fEntityStack.size() > 0
@@ -2011,7 +2020,10 @@
if (DEBUG_ENCODINGS) {
System.out.println("$$$ creating UTF8Reader");
}
- return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+ if (fTempByteBuffer == null) {
+ fTempByteBuffer = fByteBufferPool.getBuffer();
+ }
+ return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
}
// try to use an optimized reader
@@ -2020,7 +2032,10 @@
if (DEBUG_ENCODINGS) {
System.out.println("$$$ creating UTF8Reader");
}
- return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+ if (fTempByteBuffer == null) {
+ fTempByteBuffer = fByteBufferPool.getBuffer();
+ }
+ return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
}
if(ENCODING.equals("ISO-10646-UCS-4")) {
if(isBigEndian != null) {
@@ -2078,9 +2093,10 @@
// try to use a Java reader
String javaEncoding = EncodingMap.getIANA2JavaMapping(ENCODING);
if (javaEncoding == null) {
- if(fAllowJavaEncodings) {
- javaEncoding = encoding;
- } else {
+ if (fAllowJavaEncodings) {
+ javaEncoding = encoding;
+ }
+ else {
fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,
"EncodingDeclInvalid",
new Object[] { encoding },
@@ -2089,20 +2105,29 @@
if (DEBUG_ENCODINGS) {
System.out.println("$$$ creating Latin1Reader");
}
- return new Latin1Reader(inputStream, fBufferSize);
+ if (fTempByteBuffer == null) {
+ fTempByteBuffer = fByteBufferPool.getBuffer();
+ }
+ return new Latin1Reader(inputStream, fTempByteBuffer);
}
}
else if (javaEncoding.equals("ASCII")) {
if (DEBUG_ENCODINGS) {
System.out.println("$$$ creating ASCIIReader");
}
- return new ASCIIReader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+ if (fTempByteBuffer == null) {
+ fTempByteBuffer = fByteBufferPool.getBuffer();
+ }
+ return new ASCIIReader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
}
else if (javaEncoding.equals("ISO8859_1")) {
if (DEBUG_ENCODINGS) {
System.out.println("$$$ creating Latin1Reader");
}
- return new Latin1Reader(inputStream, fBufferSize);
+ if (fTempByteBuffer == null) {
+ fTempByteBuffer = fByteBufferPool.getBuffer();
+ }
+ return new Latin1Reader(inputStream, fTempByteBuffer);
}
if (DEBUG_ENCODINGS) {
System.out.print("$$$ creating Java InputStreamReader: encoding="+javaEncoding);
@@ -2542,9 +2567,11 @@
public boolean mayReadChunks;
/** Character buffer container. */
- private CharacterBuffer fBuffer;
+ private CharacterBuffer fCharacterBuffer;
+
+ /** Byte buffer. */
+ private byte [] fByteBuffer;
-
//
// Constructors
//
@@ -2562,8 +2589,9 @@
this.literal = literal;
this.mayReadChunks = mayReadChunks;
this.isExternal = isExternal;
- this.fBuffer = fCharacterBufferPool.getBuffer(isExternal);
- this.ch = fBuffer.ch;
+ this.fCharacterBuffer = fCharacterBufferPool.getBuffer(isExternal);
+ this.ch = fCharacterBuffer.ch;
+ this.fByteBuffer = fTempByteBuffer;
} // <init>(StringXMLResourceIdentifier,InputStream,Reader,String,boolean, boolean)
//
@@ -2581,7 +2609,9 @@
} // isUnparsed():boolean
public void setReader(InputStream stream, String encoding, Boolean isBigEndian) throws IOException {
+ fTempByteBuffer = fByteBuffer;
reader = createReader(stream, encoding, isBigEndian);
+ fByteBuffer = fTempByteBuffer;
}
// return the expanded system ID of the
@@ -2850,7 +2880,7 @@
}
/** Returns buffer to pool. **/
- public void returnToPool(CharacterBuffer buffer) {
+ public void returnBuffer(CharacterBuffer buffer) {
if (buffer.isExternal) {
if (fExternalTop < fExternalBufferPool.length - 1) {
fExternalBufferPool[++fExternalTop] = buffer;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org