Author: mrglavas
Date: Wed Dec 7 21:20:56 2005
New Revision: 354991
URL: http://svn.apache.org/viewcvs?rev=354991&view=rev
Log:
Creating a pool of DTD loaders for the DOM normalizer.
Modified:
xerces/java/trunk/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java
Modified:
xerces/java/trunk/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java
URL:
http://svn.apache.org/viewcvs/xerces/java/trunk/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java?rev=354991&r1=354990&r2=354991&view=diff
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java
(original)
+++ xerces/java/trunk/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java
Wed Dec 7 21:20:56 2005
@@ -18,6 +18,8 @@
import java.lang.ref.SoftReference;
import org.apache.xerces.impl.RevalidationHandler;
+import org.apache.xerces.impl.dtd.XML11DTDProcessor;
+import org.apache.xerces.impl.dtd.XMLDTDLoader;
import org.apache.xerces.parsers.DOMParserImpl;
import org.apache.xerces.util.XMLChar;
import org.apache.xerces.xni.grammars.XMLGrammarDescription;
@@ -72,6 +74,15 @@
private int schemaValidatorsCurrentSize = SIZE;
private int xml10DTDValidatorsCurrentSize = SIZE;
private int xml11DTDValidatorsCurrentSize = SIZE;
+
+ private SoftReference xml10DTDLoaders[] = new SoftReference[SIZE];
+ private SoftReference xml11DTDLoaders[] = new SoftReference[SIZE];
+
+ private int freeXML10DTDLoaderIndex = -1;
+ private int freeXML11DTDLoaderIndex = -1;
+
+ private int xml10DTDLoaderCurrentSize = SIZE;
+ private int xml11DTDLoaderCurrentSize = SIZE;
// Document and doctype counter. Used to assign order to documents and
// doctypes without owners, on an demand basis. Used for
@@ -544,6 +555,86 @@
}
}
+ /** NON-DOM: retrieve DTD loader */
+ synchronized final XMLDTDLoader getDTDLoader(String xmlVersion) {
+ // return an instance of XML11DTDProcessor
+ if ("1.1".equals(xmlVersion)) {
+ while (freeXML11DTDLoaderIndex >= 0) {
+ // return first available DTD loader
+ SoftReference ref = xml11DTDLoaders[freeXML11DTDLoaderIndex];
+ XMLDTDLoaderHolder holder = (XMLDTDLoaderHolder) ref.get();
+ if (holder != null && holder.loader != null) {
+ XMLDTDLoader val = holder.loader;
+ holder.loader = null;
+ --freeXML11DTDLoaderIndex;
+ return val;
+ }
+ xml11DTDLoaders[freeXML11DTDLoaderIndex--] = null;
+ }
+ return new XML11DTDProcessor();
+ }
+ // return an instance of XMLDTDLoader
+ else {
+ while (freeXML10DTDLoaderIndex >= 0) {
+ // return first available DTD loader
+ SoftReference ref = xml10DTDLoaders[freeXML10DTDLoaderIndex];
+ XMLDTDLoaderHolder holder = (XMLDTDLoaderHolder) ref.get();
+ if (holder != null && holder.loader != null) {
+ XMLDTDLoader val = holder.loader;
+ holder.loader = null;
+ --freeXML10DTDLoaderIndex;
+ return val;
+ }
+ xml10DTDLoaders[freeXML10DTDLoaderIndex--] = null;
+ }
+ return new XMLDTDLoader();
+ }
+ }
+
+ /** NON-DOM: release DTD loader */
+ synchronized final void releaseDTDLoader(String xmlVersion, XMLDTDLoader
loader) {
+ // release an instance of XMLDTDLoader
+ if ("1.1".equals(xmlVersion)) {
+ ++freeXML11DTDLoaderIndex;
+ if (xml11DTDLoaders.length == freeXML11DTDLoaderIndex) {
+ // resize size of the DTD loaders
+ xml11DTDLoaderCurrentSize += SIZE;
+ SoftReference [] newarray = new
SoftReference[xml11DTDLoaderCurrentSize];
+ System.arraycopy(xml11DTDLoaders, 0, newarray, 0,
xml11DTDLoaders.length);
+ xml11DTDLoaders = newarray;
+ }
+ SoftReference ref = xml11DTDLoaders[freeXML11DTDLoaderIndex];
+ if (ref != null) {
+ XMLDTDLoaderHolder holder = (XMLDTDLoaderHolder) ref.get();
+ if (holder != null) {
+ holder.loader = loader;
+ return;
+ }
+ }
+ xml11DTDLoaders[freeXML11DTDLoaderIndex] = new SoftReference(new
XMLDTDLoaderHolder(loader));
+ }
+ // release an instance of XMLDTDLoader
+ else {
+ ++freeXML10DTDLoaderIndex;
+ if (xml10DTDLoaders.length == freeXML10DTDLoaderIndex) {
+ // resize size of the DTD loaders
+ xml10DTDLoaderCurrentSize += SIZE;
+ SoftReference [] newarray = new
SoftReference[xml10DTDLoaderCurrentSize];
+ System.arraycopy(xml10DTDLoaders, 0, newarray, 0,
xml10DTDLoaders.length);
+ xml10DTDLoaders = newarray;
+ }
+ SoftReference ref = xml10DTDLoaders[freeXML10DTDLoaderIndex];
+ if (ref != null) {
+ XMLDTDLoaderHolder holder = (XMLDTDLoaderHolder) ref.get();
+ if (holder != null) {
+ holder.loader = loader;
+ return;
+ }
+ }
+ xml10DTDLoaders[freeXML10DTDLoaderIndex] = new SoftReference(new
XMLDTDLoaderHolder(loader));
+ }
+ }
+
/** NON-DOM: increment document/doctype counter */
protected synchronized int assignDocumentNumber() {
return ++docAndDoctypeCounter;
@@ -577,6 +668,17 @@
this.handler = handler;
}
RevalidationHandler handler;
+ }
+
+ /**
+ * A holder for XMLDTDLoaders. This allows us to reuse SoftReferences
+ * which haven't yet been cleared by the garbage collector.
+ */
+ static class XMLDTDLoaderHolder {
+ XMLDTDLoaderHolder(XMLDTDLoader loader) {
+ this.loader = loader;
+ }
+ XMLDTDLoader loader;
}
} // class DOMImplementationImpl
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]