zongaro     2003/12/11 20:24:18

  Modified:    java/src/org/apache/xml/dtm/ref DTMManagerDefault.java
  Log:
  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 ([EMAIL PROTECTED]) for catching this bug when she
  reviewed my changes to where caching of XMLReaders was handled, and the DTM
  plugability changes for XSLTC.
  
  Revision  Changes    Path
  1.50      +156 -181  
xml-xalan/java/src/org/apache/xml/dtm/ref/DTMManagerDefault.java
  
  Index: DTMManagerDefault.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMManagerDefault.java,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- DTMManagerDefault.java    4 Dec 2003 16:44:49 -0000       1.49
  +++ DTMManagerDefault.java    12 Dec 2003 04:24:18 -0000      1.50
  @@ -300,220 +300,195 @@
         boolean isStreamSource = (null != source)
           ? (source instanceof StreamSource) : false;
   
  -      if (isSAXSource || isStreamSource)
  -      {
  -        XMLReader reader;
  -        InputSource xmlSource;
  -
  -        if (null == source)
  -        {
  -          xmlSource = null;
  -          reader = null;
  -        }
  -        else
  -        {
  -          reader = getXMLReader(source);
  -          xmlSource = SAXSource.sourceToInputSource(source);
  +      if (isSAXSource || isStreamSource) {
  +        XMLReader reader = null;
   
  -          String urlOfSource = xmlSource.getSystemId();
  +        try {
  +          InputSource xmlSource;
   
  -          if (null != urlOfSource)
  -          {
  -            try
  -            {
  -              urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource);
  -            }
  -            catch (Exception e)
  -            {
  +          if (null == source) {
  +            xmlSource = null;
  +          } else {
  +            reader = getXMLReader(source);
  +            xmlSource = SAXSource.sourceToInputSource(source);
  +
  +            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);
  +              }
   
  -              // %REVIEW% Is there a better way to send a warning?
  -              System.err.println("Can not absolutize URL: " + urlOfSource);
  +              xmlSource.setSystemId(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);
  -        }
  -
  -        // 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") );
  +          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);
  +
  +
  +          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 (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 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 (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);
  -
  -          if (null == xmlSource)
  -          {
  +            // Have the DTM set itself up as IncrementalSAXSource's listener.
  +            dtm.setIncrementalSAXSource(coParser);
   
  -            // Then the user will construct it themselves.
  -            return dtm;
  -          }
  +            if (null == xmlSource) {
   
  -          if(null == reader.getErrorHandler())
  -            reader.setErrorHandler(dtm);
  -          reader.setDTDHandler(dtm);
  +              // Then the user will construct it themselves.
  +              return dtm;
  +            }
   
  -          try
  -          {
  +            if (null == reader.getErrorHandler()) {
  +              reader.setErrorHandler(dtm);
  +            }
  +            reader.setDTDHandler(dtm);
   
  -            // Launch parsing coroutine.  Launches a second thread,
  -            // if we're using IncrementalSAXSource.filter().
  -            coParser.startParse(xmlSource);
  -          }
  -          catch (RuntimeException re)
  -          {
  +            try {
  +              // Launch parsing coroutine.  Launches a second thread,
  +              // if we're using IncrementalSAXSource.filter().
   
  -            dtm.clearCoRoutine();
  +              coParser.startParse(xmlSource);
  +            } catch (RuntimeException re) {
   
  -            throw re;
  -          }
  -          catch (Exception e)
  -          {
  +              dtm.clearCoRoutine();
   
  -            dtm.clearCoRoutine();
  +              throw re;
  +            } catch (Exception e) {
   
  -            throw new org.apache.xml.utils.WrappedRuntimeException(e);
  -          }
  -        }
  -        else
  -        {
  -          if (null == reader)
  -          {
  +              dtm.clearCoRoutine();
   
  -            // Then the user will construct it themselves.
  -            return dtm;
  -          }
  +              throw new org.apache.xml.utils.WrappedRuntimeException(e);
  +            }
  +          } else {
  +            if (null == reader) {
   
  -          // not incremental
  -          reader.setContentHandler(dtm);
  -          reader.setDTDHandler(dtm);
  -          if(null == reader.getErrorHandler())
  -            reader.setErrorHandler(dtm);
  +              // Then the user will construct it themselves.
  +              return dtm;
  +            }
   
  -          try
  -          {
  -            reader.setProperty(
  -                               
"http://xml.org/sax/properties/lexical-handler";, dtm);
  -          }
  -          catch (SAXNotRecognizedException e){}
  -          catch (SAXNotSupportedException e){}
  +            // not incremental
  +            reader.setContentHandler(dtm);
  +            reader.setDTDHandler(dtm);
  +            if (null == reader.getErrorHandler()) {
  +              reader.setErrorHandler(dtm);
  +            }
   
  -          try
  -          {
  -            reader.parse(xmlSource);
  +            try {
  +              reader.setProperty(
  +                               
"http://xml.org/sax/properties/lexical-handler";,
  +                               dtm);
  +            } catch (SAXNotRecognizedException e){}
  +              catch (SAXNotSupportedException e){}
   
  -            releaseXMLReader(reader);
  -          }
  -          catch (RuntimeException re)
  -          {
  -            dtm.clearCoRoutine();
  -            releaseXMLReader(reader);
  +            try {
  +              reader.parse(xmlSource);
  +            } catch (RuntimeException re) {
  +              dtm.clearCoRoutine();
  +
  +              throw re;
  +            } catch (Exception e) {
  +              dtm.clearCoRoutine();
   
  -            throw re;
  +              throw new org.apache.xml.utils.WrappedRuntimeException(e);
  +            }
             }
  -          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);
             }
  -        }
   
  -        if (DUMPTREE)
  -        {
  -          System.out.println("Dumping SAX2DOM");
  -          dtm.dumpDTM(System.err);
  +          return dtm;
  +        } finally {
  +          releaseXMLReader(reader);
           }
  -
  -        return dtm;
  -      }
  -      else
  -      {
  +      } else {
   
           // It should have been handled by a derived class or the caller
           // made a mistake.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to