zongaro 2002/09/27 09:48:56
Modified: java/src/org/apache/xalan/xsltc/dom Tag: XSLTC_DTM
XSLTCDTMManager.java
Log:
XSLTCDTMManager checks whether any XMLReader associated with a SAXSource
object
has a DTDHandler or ErrorHandler before substituting a DTM implementation to
listen for those events. That avoids disrupting any user-supplied handlers.
However, the XSLTC TransformerFactoryImpl now re-uses instances of SAXParser.
This means that when the XSLTCDTMManager checks whether the XMLReader has an
associated DTDHandler or ErrorHandler, it might find the DTM from a previous
transformation, and functionality might be limited.
To distinguish the cases, I've added a boolean flag to the
XSLTCDTMManager.getDTM methods that indicates whether any XMLReader was
supplied
by the user. If it's false, the XSLTCDTMManager ignores any previously set
DTDHandler or ErrorHandler.
Also, eliminated redundant code in getDTM methods by use routing all cases
through most general version of method.
Revision Changes Path
No revision
No revision
1.1.2.4 +89 -234
xml-xalan/java/src/org/apache/xalan/xsltc/dom/Attic/XSLTCDTMManager.java
Index: XSLTCDTMManager.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/Attic/XSLTCDTMManager.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- XSLTCDTMManager.java 24 Aug 2002 11:33:42 -0000 1.1.2.3
+++ XSLTCDTMManager.java 27 Sep 2002 16:48:56 -0000 1.1.2.4
@@ -204,8 +204,8 @@
* always be returned. Otherwise it is up to the DTMManager to return a
* new instance or an instance that it already created and may be being
used
* by someone else.
- * (I think more parameters will need to be added for error handling, and
entity
- * resolution).
+ * (I think more parameters will need to be added for error handling, and
+ * entity resolution).
*
* @param source the specification of the source object.
* @param unique true if the returned DTM must be unique, probably because
it
@@ -223,232 +223,72 @@
DTMWSFilter whiteSpaceFilter, boolean incremental,
boolean doIndexing)
{
-
- if(DEBUG && null != source)
- System.out.println("Starting "+
- (unique ? "UNIQUE" : "shared")+
- " source: "+source.getSystemId()
- );
-
- XMLStringFactory xstringFactory = m_xsf;
- int dtmPos = getFirstFreeDTMID();
- int documentID = dtmPos << IDENT_DTM_NODE_BITS;
-
- if ((null != source) && source instanceof DOMSource)
- {
- DOMImpl dtm = new DOMImpl(this, (DOMSource) source, documentID,
- whiteSpaceFilter, xstringFactory,
doIndexing);
-
- addDTM(dtm, dtmPos);
-
- // %HZ% %REVISIT%: I hate calling this here!
- dtm.createMappings();
-
-// if (DUMPTREE)
-// {
-// dtm.dumpDTM();
-// }
-
- return dtm;
- }
- else
- {
- boolean isSAXSource = (null != source)
- ? (source instanceof SAXSource) : true;
- 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);
-
- 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);
- }
- }
-
- // Create the basic SAX2DTM.
- SAXImpl dtm = new SAXImpl(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.
- addDTM(dtm, dtmPos);
-
- boolean haveXercesParser =
- (null != reader)
- &&
(reader.getClass().getName().equals("org.apache.xerces.parsers.SAXParser") );
-
- 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 (this.m_incremental && incremental /* || ((null == reader) &&
incremental) */)
- {
- IncrementalSAXSource coParser=null;
-
- if (haveXercesParser)
- {
- // IncrementalSAXSource_Xerces to avoid threading.
- // System.out.println("Using IncrementalSAXSource_Xerces to
avoid threading");
- try {
- // should be ok, it's in the same package - no need for thread
class loader,
- // AND theoretically no need for reflection...
- // Class c=Class.forName(
"org.apache.xml.dtm.ref.IncrementalSAXSource_Xerces" );
- coParser=org.apache.xml.dtm.ref.IncrementalSAXSource_Xerces
- .createIncrementalSAXSource();
- } 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;
- }
-
- }
-
- // Have the DTM set itself up as the IncrementalSAXSource's
listener.
- dtm.setIncrementalSAXSource(coParser);
-
- if (null == xmlSource)
- {
-
- // Then the user will construct it themselves.
- return dtm;
- }
-
- if(null == reader.getDTDHandler())
- reader.setDTDHandler(dtm);
- if(null == reader.getErrorHandler())
- reader.setErrorHandler(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.getBuilder());
- if (null == reader.getDTDHandler())
- 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)
- {
- while(e instanceof SAXException)
- {
- e = ((SAXException)e).getException();
- e.printStackTrace();
- }
- e.printStackTrace();
- dtm.clearCoRoutine();
-
- throw new org.apache.xml.utils.WrappedRuntimeException(e);
- }
- }
-
- if (DUMPTREE)
- {
- System.out.println("Dumping SAX2DOM");
- dtm.dumpDTM(System.err);
- }
-
- return dtm;
- }
- else
- {
-
- // It should have been handled by a derived class or the caller
- // made a mistake.
- throw new
DTMException(XSLMessages.createMessage(XSLTErrorResources.ER_NOT_SUPPORTED, new
Object[]{source})); //"Not supported: " + source);
- }
- }
+ return getDTM(source, unique, whiteSpaceFilter, incremental, doIndexing,
+ false, 0);
}
+ /**
+ * Get an instance of a DTM, loaded with the content from the
+ * specified source. If the unique flag is true, a new instance will
+ * always be returned. Otherwise it is up to the DTMManager to return a
+ * new instance or an instance that it already created and may be being
used
+ * by someone else.
+ * (I think more parameters will need to be added for error handling, and
+ * entity resolution).
+ *
+ * @param source the specification of the source object.
+ * @param unique true if the returned DTM must be unique, probably because
it
+ * is going to be mutated.
+ * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may
+ * be null.
+ * @param incremental true if the DTM should be built incrementally, if
+ * possible.
+ * @param doIndexing true if the caller considers it worth it to use
+ * indexing schemes.
+ * @param hasUserReader true if <code>source</code> is a
+ * <code>SAXSource</code> object that has an
+ * <code>XMLReader</code>, that was specified by the
+ * user.
+ *
+ * @return a non-null DTM reference.
+ */
+ public DTM getDTM(Source source, boolean unique,
+ DTMWSFilter whiteSpaceFilter, boolean incremental,
+ boolean doIndexing, boolean hasUserReader)
+ {
+ return getDTM(source, unique, whiteSpaceFilter, incremental, doIndexing,
+ hasUserReader, 0);
+ }
+
+ /**
+ * Get an instance of a DTM, loaded with the content from the
+ * specified source. If the unique flag is true, a new instance will
+ * always be returned. Otherwise it is up to the DTMManager to return a
+ * new instance or an instance that it already created and may be being
used
+ * by someone else.
+ * (I think more parameters will need to be added for error handling, and
+ * entity resolution).
+ *
+ * @param source the specification of the source object.
+ * @param unique true if the returned DTM must be unique, probably because
it
+ * is going to be mutated.
+ * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may
+ * be null.
+ * @param incremental true if the DTM should be built incrementally, if
+ * possible.
+ * @param doIndexing true if the caller considers it worth it to use
+ * indexing schemes.
+ * @param hasUserReader true if <code>source</code> is a
+ * <code>SAXSource</code> object that has an
+ * <code>XMLReader</code>, that was specified by the
+ * user.
+ * @param size Specifies initial size of tables that represent the DTM
+ *
+ * @return a non-null DTM reference.
+ */
public DTM getDTM(Source source, boolean unique,
DTMWSFilter whiteSpaceFilter, boolean incremental,
- boolean doIndexing, int size)
+ boolean doIndexing, boolean hasUserReader, int size)
{
if(DEBUG && null != source)
@@ -463,12 +303,18 @@
if ((null != source) && source instanceof DOMSource)
{
- DOMImpl dtm = new DOMImpl(this, (DOMSource) source, documentID,
- whiteSpaceFilter, xstringFactory,
doIndexing, size);
+ DOMImpl dtm;
+
+ if (size <= 0) {
+ dtm = new DOMImpl(this, (DOMSource) source, documentID,
+ whiteSpaceFilter, xstringFactory, doIndexing);
+ } else {
+ dtm = new DOMImpl(this, (DOMSource) source, documentID,
+ whiteSpaceFilter, xstringFactory, doIndexing,
size);
+ }
addDTM(dtm, dtmPos);
- // %HZ% %REVISIT%: I hate calling this here!
dtm.createMappings();
// if (DUMPTREE)
@@ -494,6 +340,7 @@
{
xmlSource = null;
reader = null;
+ hasUserReader = false; // Make sure the user didn't lie
}
else
{
@@ -520,8 +367,14 @@
}
// Create the basic SAX2DTM.
- SAXImpl dtm = new SAXImpl(this, source, documentID, whiteSpaceFilter,
- xstringFactory, doIndexing, size);
+ SAXImpl dtm;
+ if (size <= 0) {
+ dtm = new SAXImpl(this, source, documentID, whiteSpaceFilter,
+ xstringFactory, doIndexing);
+ } else {
+ dtm = new SAXImpl(this, source, documentID, whiteSpaceFilter,
+ xstringFactory, doIndexing, size);
+ }
// 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
@@ -581,10 +434,12 @@
return dtm;
}
- if(null == reader.getDTDHandler())
+ if(!hasUserReader || null == reader.getDTDHandler()) {
reader.setDTDHandler(dtm);
- if(null == reader.getErrorHandler())
- reader.setErrorHandler(dtm);
+ }
+ if(!hasUserReader || null == reader.getErrorHandler()) {
+ reader.setErrorHandler(dtm);
+ }
try
{
@@ -619,9 +474,9 @@
// not incremental
reader.setContentHandler(dtm.getBuilder());
- if(null == reader.getDTDHandler())
+ if(!hasUserReader || null == reader.getDTDHandler())
reader.setDTDHandler(dtm);
- if(null == reader.getErrorHandler())
+ if(!hasUserReader || null == reader.getErrorHandler())
reader.setErrorHandler(dtm);
try
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]