Added a finally block for SAXSource/StreamSource case in order to ensure that
any XMLReader is released to the XMLReader cache.
Thanks to Joanne Tong (joannet@ca.ibm.com) for catching this bug when she
reviewed my changes to where caching of XMLReaders was handled, and the DTM
plugability changes for XSLTC.
git-svn-id: https://svn.apache.org/repos/asf/xalan/java/trunk@337799 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/xml/dtm/ref/DTMManagerDefault.java b/src/org/apache/xml/dtm/ref/DTMManagerDefault.java
index ba8d1f9..4c96ce9 100644
--- a/src/org/apache/xml/dtm/ref/DTMManagerDefault.java
+++ b/src/org/apache/xml/dtm/ref/DTMManagerDefault.java
@@ -300,220 +300,195 @@
boolean isStreamSource = (null != source)
? (source instanceof StreamSource) : false;
- if (isSAXSource || isStreamSource)
- {
- XMLReader reader;
- InputSource xmlSource;
+ if (isSAXSource || isStreamSource) {
+ XMLReader reader = null;
- if (null == source)
- {
- xmlSource = null;
- reader = null;
- }
- else
- {
- reader = getXMLReader(source);
- xmlSource = SAXSource.sourceToInputSource(source);
+ try {
+ InputSource xmlSource;
- String urlOfSource = xmlSource.getSystemId();
+ if (null == source) {
+ xmlSource = null;
+ } else {
+ reader = getXMLReader(source);
+ xmlSource = SAXSource.sourceToInputSource(source);
- if (null != urlOfSource)
- {
- try
- {
- urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource);
+ String urlOfSource = xmlSource.getSystemId();
+
+ if (null != urlOfSource) {
+ try {
+ urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource);
+ } catch (Exception e) {
+ // %REVIEW% Is there a better way to send a warning?
+ System.err.println("Can not absolutize URL: " + urlOfSource);
+ }
+
+ xmlSource.setSystemId(urlOfSource);
}
- catch (Exception e)
- {
-
- // %REVIEW% Is there a better way to send a warning?
- System.err.println("Can not absolutize URL: " + urlOfSource);
- }
-
- xmlSource.setSystemId(urlOfSource);
}
- }
- SAX2DTM dtm;
- if(source==null && unique && !incremental && !doIndexing)
- {
- // Special case to support RTF construction into shared DTM.
- // It should actually still work for other uses,
- // but may be slightly deoptimized relative to the base
- // to allow it to deal with carrying multiple documents.
- //
- // %REVIEW% This is a sloppy way to request this mode;
- // we need to consider architectural improvements.
- dtm = new SAX2RTFDTM(this, source, documentID, whiteSpaceFilter,
- xstringFactory, doIndexing);
- }
- /**************************************************************
- // EXPERIMENTAL 3/22/02
- else if(JKESS_XNI_EXPERIMENT && m_incremental)
- {
- dtm = new XNI2DTM(this, source, documentID, whiteSpaceFilter,
- xstringFactory, doIndexing);
- }
- **************************************************************/
- else // Create the basic SAX2DTM.
- {
- dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter,
- xstringFactory, doIndexing);
- }
+ SAX2DTM dtm;
+ if (source==null && unique && !incremental && !doIndexing) {
+ // Special case to support RTF construction into shared DTM.
+ // It should actually still work for other uses,
+ // but may be slightly deoptimized relative to the base
+ // to allow it to deal with carrying multiple documents.
+ //
+ // %REVIEW% This is a sloppy way to request this mode;
+ // we need to consider architectural improvements.
+ dtm = new SAX2RTFDTM(this, source, documentID, whiteSpaceFilter,
+ xstringFactory, doIndexing);
+ }
+ /**************************************************************
+ // EXPERIMENTAL 3/22/02
+ else if(JKESS_XNI_EXPERIMENT && m_incremental) {
+ dtm = new XNI2DTM(this, source, documentID, whiteSpaceFilter,
+ xstringFactory, doIndexing);
+ }
+ **************************************************************/
+ // Create the basic SAX2DTM.
+ else {
+ dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter,
+ xstringFactory, doIndexing);
+ }
- // Go ahead and add the DTM to the lookup table. This needs to be
- // done before any parsing occurs. Note offset 0, since we've just
- // created a new DTM.
- addDTM(dtm, dtmPos, 0);
+ // Go ahead and add the DTM to the lookup table. This needs to be
+ // done before any parsing occurs. Note offset 0, since we've just
+ // created a new DTM.
+ addDTM(dtm, dtmPos, 0);
- boolean haveXercesParser =
- (null != reader)
- && (reader.getClass().getName().equals("org.apache.xerces.parsers.SAXParser") );
+ boolean haveXercesParser =
+ (null != reader)
+ && (reader.getClass()
+ .getName()
+ .equals("org.apache.xerces.parsers.SAXParser") );
- if (haveXercesParser)
- incremental = true; // No matter what. %REVIEW%
+ if (haveXercesParser) {
+ incremental = true; // No matter what. %REVIEW%
+ }
- // If the reader is null, but they still requested an incremental build,
- // then we still want to set up the IncrementalSAXSource stuff.
- if (m_incremental && incremental /* || ((null == reader) && incremental) */)
- {
- IncrementalSAXSource coParser=null;
+ // If the reader is null, but they still requested an incremental
+ // build, then we still want to set up the IncrementalSAXSource stuff.
+ if (m_incremental && incremental
+ /* || ((null == reader) && incremental) */) {
+ IncrementalSAXSource coParser=null;
- if (haveXercesParser)
- {
- // IncrementalSAXSource_Xerces to avoid threading.
- try {
- coParser =(IncrementalSAXSource)
- Class.forName("org.apache.xml.dtm.ref.IncrementalSAXSource_Xerces").newInstance();
- } catch( Exception ex ) {
- ex.printStackTrace();
- coParser=null;
- }
- }
-
- if( coParser==null ) {
- // Create a IncrementalSAXSource that will run on the secondary thread.
- if (null == reader)
- coParser = new IncrementalSAXSource_Filter();
- else
- {
- IncrementalSAXSource_Filter filter=new IncrementalSAXSource_Filter();
- filter.setXMLReader(reader);
- coParser=filter;
+ if (haveXercesParser) {
+ // IncrementalSAXSource_Xerces to avoid threading.
+ try {
+ coParser =(IncrementalSAXSource)
+ Class.forName("org.apache.xml.dtm.ref.IncrementalSAXSource_Xerces").newInstance();
+ } catch( Exception ex ) {
+ ex.printStackTrace();
+ coParser=null;
+ }
}
- }
+ if (coParser==null ) {
+ // Create a IncrementalSAXSource to run on the secondary thread.
+ if (null == reader) {
+ coParser = new IncrementalSAXSource_Filter();
+ } else {
+ IncrementalSAXSource_Filter filter =
+ new IncrementalSAXSource_Filter();
+ filter.setXMLReader(reader);
+ coParser=filter;
+ }
+ }
- /**************************************************************
- // EXPERIMENTAL 3/22/02
- if(JKESS_XNI_EXPERIMENT && m_incremental &
- dtm instanceof XNI2DTM &&
- coParser instanceof IncrementalSAXSource_Xerces)
- {
- org.apache.xerces.xni.parser.XMLPullParserConfiguration xpc=
- ((IncrementalSAXSource_Xerces)coParser).getXNIParserConfiguration();
- if(xpc!=null)
- // Bypass SAX; listen to the XNI stream
- ((XNI2DTM)dtm).setIncrementalXNISource(xpc);
- else
- // Listen to the SAX stream (will fail, diagnostically...)
- dtm.setIncrementalSAXSource(coParser);
- } else
- ***************************************************************/
+ /**************************************************************
+ // EXPERIMENTAL 3/22/02
+ if (JKESS_XNI_EXPERIMENT && m_incremental &&
+ dtm instanceof XNI2DTM &&
+ coParser instanceof IncrementalSAXSource_Xerces) {
+ org.apache.xerces.xni.parser.XMLPullParserConfiguration xpc=
+ ((IncrementalSAXSource_Xerces)coParser)
+ .getXNIParserConfiguration();
+ if (xpc!=null) {
+ // Bypass SAX; listen to the XNI stream
+ ((XNI2DTM)dtm).setIncrementalXNISource(xpc);
+ } else {
+ // Listen to the SAX stream (will fail, diagnostically...)
+ dtm.setIncrementalSAXSource(coParser);
+ }
+ } else
+ ***************************************************************/
- // Have the DTM set itself up as the IncrementalSAXSource's listener.
- dtm.setIncrementalSAXSource(coParser);
+ // Have the DTM set itself up as IncrementalSAXSource's listener.
+ dtm.setIncrementalSAXSource(coParser);
- if (null == xmlSource)
- {
+ if (null == xmlSource) {
- // Then the user will construct it themselves.
- return dtm;
+ // Then the user will construct it themselves.
+ return dtm;
+ }
+
+ if (null == reader.getErrorHandler()) {
+ reader.setErrorHandler(dtm);
+ }
+ reader.setDTDHandler(dtm);
+
+ try {
+ // Launch parsing coroutine. Launches a second thread,
+ // if we're using IncrementalSAXSource.filter().
+
+ coParser.startParse(xmlSource);
+ } catch (RuntimeException re) {
+
+ dtm.clearCoRoutine();
+
+ throw re;
+ } catch (Exception e) {
+
+ dtm.clearCoRoutine();
+
+ throw new org.apache.xml.utils.WrappedRuntimeException(e);
+ }
+ } else {
+ if (null == reader) {
+
+ // Then the user will construct it themselves.
+ return dtm;
+ }
+
+ // not incremental
+ reader.setContentHandler(dtm);
+ reader.setDTDHandler(dtm);
+ if (null == reader.getErrorHandler()) {
+ reader.setErrorHandler(dtm);
+ }
+
+ try {
+ reader.setProperty(
+ "http://xml.org/sax/properties/lexical-handler",
+ dtm);
+ } catch (SAXNotRecognizedException e){}
+ catch (SAXNotSupportedException e){}
+
+ try {
+ reader.parse(xmlSource);
+ } catch (RuntimeException re) {
+ dtm.clearCoRoutine();
+
+ throw re;
+ } catch (Exception e) {
+ dtm.clearCoRoutine();
+
+ throw new org.apache.xml.utils.WrappedRuntimeException(e);
+ }
}
- if(null == reader.getErrorHandler())
- reader.setErrorHandler(dtm);
- reader.setDTDHandler(dtm);
-
- try
- {
-
- // Launch parsing coroutine. Launches a second thread,
- // if we're using IncrementalSAXSource.filter().
- coParser.startParse(xmlSource);
+ if (DUMPTREE) {
+ System.out.println("Dumping SAX2DOM");
+ dtm.dumpDTM(System.err);
}
- catch (RuntimeException re)
- {
- dtm.clearCoRoutine();
-
- throw re;
- }
- catch (Exception e)
- {
-
- dtm.clearCoRoutine();
-
- throw new org.apache.xml.utils.WrappedRuntimeException(e);
- }
+ return dtm;
+ } finally {
+ releaseXMLReader(reader);
}
- else
- {
- if (null == reader)
- {
-
- // Then the user will construct it themselves.
- return dtm;
- }
-
- // not incremental
- reader.setContentHandler(dtm);
- reader.setDTDHandler(dtm);
- if(null == reader.getErrorHandler())
- reader.setErrorHandler(dtm);
-
- try
- {
- reader.setProperty(
- "http://xml.org/sax/properties/lexical-handler", dtm);
- }
- catch (SAXNotRecognizedException e){}
- catch (SAXNotSupportedException e){}
-
- try
- {
- reader.parse(xmlSource);
-
- releaseXMLReader(reader);
- }
- catch (RuntimeException re)
- {
- dtm.clearCoRoutine();
- releaseXMLReader(reader);
-
- throw re;
- }
- catch (Exception e)
- {
- dtm.clearCoRoutine();
- releaseXMLReader(reader);
-
- throw new org.apache.xml.utils.WrappedRuntimeException(e);
- }
- }
-
- if (DUMPTREE)
- {
- System.out.println("Dumping SAX2DOM");
- dtm.dumpDTM(System.err);
- }
-
- return dtm;
- }
- else
- {
+ } else {
// It should have been handled by a derived class or the caller
// made a mistake.