- /*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
- package org.apache.xalan.transformer;
-
- import java.io.IOException;
-
- import org.xml.sax.XMLReader;
- import org.xml.sax.XMLFilter;
- import org.xml.sax.InputSource;
- import org.xml.sax.Locator;
- import org.xml.sax.Attributes;
- import org.xml.sax.EntityResolver;
- import org.xml.sax.DTDHandler;
- import org.xml.sax.ContentHandler;
- import org.xml.sax.ErrorHandler;
- import org.xml.sax.ext.DeclHandler;
- import org.xml.sax.SAXException;
- import org.xml.sax.SAXParseException;
- import org.xml.sax.SAXNotSupportedException;
- import org.xml.sax.SAXNotRecognizedException;
- import org.xml.sax.ext.LexicalHandler;
-
- import org.apache.xpath.objects.XString;
-
- // import org.xml.sax.ext.DeclHandler;
- import javax.xml.transform.sax.TransformerHandler;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.Result;
-
- import org.apache.xpath.XPathContext;
- import org.apache.xml.dtm.DTM;
- import org.apache.xml.dtm.DTMManager;
- import org.apache.xml.dtm.ref.IncrementalSAXSource;
- import org.apache.xml.dtm.ref.IncrementalSAXSource_Filter;
- import org.apache.xml.dtm.ref.sax2dtm.SAX2DTM;
-
- import org.apache.xalan.res.XSLTErrorResources;
- import org.apache.xalan.res.XSLMessages;
-
-
- /**
- * A TransformerHandler
- * listens for SAX ContentHandler parse events and transforms
- * them to a Result.
- */
- public class TransformerHandlerImpl
- implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler,
- LexicalHandler, TransformerHandler, DeclHandler
- {
-
- private boolean m_insideParse = false;
-
- ////////////////////////////////////////////////////////////////////
- // Constructors.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Construct a TransformerHandlerImpl.
- *
- * @param transformer Non-null reference to the Xalan transformer impl.
- * @param doFragment True if the result should be a document fragement.
- * @param baseSystemID The system ID to use as the base for relative URLs.
- */
- public TransformerHandlerImpl(TransformerImpl transformer,
- boolean doFragment, String baseSystemID)
- {
-
- super();
-
- m_transformer = transformer;
- m_baseSystemID = baseSystemID;
-
- XPathContext xctxt = transformer.getXPathContext();
- DTM dtm = xctxt.getDTM(null, true, transformer, true, true);
-
- m_dtm = dtm;
- dtm.setDocumentBaseURI(baseSystemID);
-
- m_contentHandler = dtm.getContentHandler();
- m_dtdHandler = dtm.getDTDHandler();
- m_entityResolver = dtm.getEntityResolver();
- m_errorHandler = dtm.getErrorHandler();
- m_lexicalHandler = dtm.getLexicalHandler();
- }
-
- /**
- * Do what needs to be done to shut down the CoRoutine management.
- */
- protected void clearCoRoutine()
- {
- clearCoRoutine(null);
- }
-
- /**
- * Do what needs to be done to shut down the CoRoutine management.
- */
- protected void clearCoRoutine(SAXException ex)
- {
- if(null != ex)
- m_transformer.setExceptionThrown(ex);
-
- if(m_dtm instanceof SAX2DTM)
- {
- if(DEBUG)
- System.err.println("In clearCoRoutine...");
- try
- {
- SAX2DTM sax2dtm = ((SAX2DTM)m_dtm);
- if(null != m_contentHandler
- && m_contentHandler instanceof IncrementalSAXSource_Filter)
- {
- IncrementalSAXSource_Filter sp =
- (IncrementalSAXSource_Filter)m_contentHandler;
- // This should now be all that's needed.
- sp.deliverMoreNodes(false);
- }
-
- sax2dtm.clearCoRoutine(true);
- m_contentHandler = null;
- m_dtdHandler = null;
- m_entityResolver = null;
- m_errorHandler = null;
- m_lexicalHandler = null;
- }
- catch(Throwable throwable)
- {
- throwable.printStackTrace();
- }
-
- if(DEBUG)
- System.err.println("...exiting clearCoRoutine");
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of javax.xml.transform.sax.TransformerHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Enables the user of the TransformerHandler to set the
- * to set the Result for the transformation.
- *
- * @param result A Result instance, should not be null.
- *
- * @throws IllegalArgumentException if result is invalid for some reason.
- */
- public void setResult(Result result) throws IllegalArgumentException
- {
-
- if (null == result)
- throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_RESULT_NULL, null)); //"result should not be null");
-
- try
- {
- ContentHandler handler =
- m_transformer.createResultContentHandler(result);
-
- m_transformer.setContentHandler(handler);
- }
- catch (javax.xml.transform.TransformerException te)
- {
- throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_RESULT_COULD_NOT_BE_SET, null)); //"result could not be set");
- }
-
- m_result = result;
- }
-
- /**
- * Set the base ID (URI or system ID) from where relative
- * URLs will be resolved.
- * @param systemID Base URI for the source tree.
- */
- public void setSystemId(String systemID)
- {
- m_baseSystemID = systemID;
- m_dtm.setDocumentBaseURI(systemID);
- }
-
- /**
- * Get the base ID (URI or system ID) from where relative
- * URLs will be resolved.
- * @return The systemID that was set with {@link #setSystemId}.
- */
- public String getSystemId()
- {
- return m_baseSystemID;
- }
-
- /**
- * Get the Transformer associated with this handler, which
- * is needed in order to set parameters and output properties.
- *
- * @return The Transformer associated with this handler
- */
- public Transformer getTransformer()
- {
- return m_transformer;
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.EntityResolver.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Filter an external entity resolution.
- *
- * @param publicId The entity's public identifier, or null.
- * @param systemId The entity's system identifier.
- * @return A new InputSource or null for the default.
- *
- * @throws IOException
- * @throws SAXException The client may throw
- * an exception during processing.
- * @throws java.io.IOException The client may throw an
- * I/O-related exception while obtaining the
- * new InputSource.
- * @see org.xml.sax.EntityResolver#resolveEntity
- */
- public InputSource resolveEntity(String publicId, String systemId)
- throws SAXException, IOException
- {
-
- if (m_entityResolver != null)
- {
- return m_entityResolver.resolveEntity(publicId, systemId);
- }
- else
- {
- return null;
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.DTDHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Filter a notation declaration event.
- *
- * @param name The notation name.
- * @param publicId The notation's public identifier, or null.
- * @param systemId The notation's system identifier, or null.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.DTDHandler#notationDecl
- */
- public void notationDecl(String name, String publicId, String systemId)
- throws SAXException
- {
-
- if (m_dtdHandler != null)
- {
- m_dtdHandler.notationDecl(name, publicId, systemId);
- }
- }
-
- /**
- * Filter an unparsed entity declaration event.
- *
- * @param name The entity name.
- * @param publicId The entity's public identifier, or null.
- * @param systemId The entity's system identifier, or null.
- * @param notationName The name of the associated notation.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
- */
- public void unparsedEntityDecl(
- String name, String publicId, String systemId, String notationName)
- throws SAXException
- {
-
- if (m_dtdHandler != null)
- {
- m_dtdHandler.unparsedEntityDecl(name, publicId, systemId, notationName);
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.ContentHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Filter a new document locator event.
- *
- * @param locator The document locator.
- * @see org.xml.sax.ContentHandler#setDocumentLocator
- */
- public void setDocumentLocator(Locator locator)
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#setDocumentLocator: "
- + locator.getSystemId());
-
- this.m_locator = locator;
-
- if(null == m_baseSystemID)
- {
- setSystemId(locator.getSystemId());
- }
-
- if (m_contentHandler != null)
- {
- m_contentHandler.setDocumentLocator(locator);
- }
- }
-
- /**
- * Filter a start document event.
- *
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#startDocument
- */
- public void startDocument() throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startDocument");
-
- m_insideParse = true;
-
- // Thread listener = new Thread(m_transformer);
-
- if (m_contentHandler != null)
- {
- //m_transformer.setTransformThread(listener);
- if(DTMManager.getIncremental())
- {
- m_transformer.setSourceTreeDocForThread(m_dtm.getDocument());
-
- int cpriority = Thread.currentThread().getPriority();
-
- // runTransformThread is equivalent with the 2.0.1 code,
- // except that the Thread may come from a pool.
- m_transformer.runTransformThread( cpriority );
- }
-
- // This is now done _last_, because IncrementalSAXSource_Filter
- // will immediately go into a "wait until events are requested"
- // pause. I believe that will close our timing window.
- // %REVIEW%
- m_contentHandler.startDocument();
- }
-
- //listener.setDaemon(false);
- //listener.start();
-
- }
-
- /**
- * Filter an end document event.
- *
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#endDocument
- */
- public void endDocument() throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endDocument");
-
- m_insideParse = false;
-
- if (m_contentHandler != null)
- {
- m_contentHandler.endDocument();
- }
-
- if(DTMManager.getIncremental())
- {
- m_transformer.waitTransformThread();
- }
- else
- {
- m_transformer.setSourceTreeDocForThread(m_dtm.getDocument());
- m_transformer.run();
- }
- /* Thread transformThread = m_transformer.getTransformThread();
-
- if (null != transformThread)
- {
- try
- {
-
- // This should wait until the transformThread is considered not alive.
- transformThread.join();
-
- if (!m_transformer.hasTransformThreadErrorCatcher())
- {
- Exception e = m_transformer.getExceptionThrown();
-
- if (null != e)
- throw new org.xml.sax.SAXException(e);
- }
-
- m_transformer.setTransformThread(null);
- }
- catch (InterruptedException ie){}
- }*/
- }
-
- /**
- * Filter a start Namespace prefix mapping event.
- *
- * @param prefix The Namespace prefix.
- * @param uri The Namespace URI.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#startPrefixMapping
- */
- public void startPrefixMapping(String prefix, String uri)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startPrefixMapping: "
- + prefix + ", " + uri);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.startPrefixMapping(prefix, uri);
- }
- }
-
- /**
- * Filter an end Namespace prefix mapping event.
- *
- * @param prefix The Namespace prefix.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#endPrefixMapping
- */
- public void endPrefixMapping(String prefix) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endPrefixMapping: "
- + prefix);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.endPrefixMapping(prefix);
- }
- }
-
- /**
- * Filter a start element event.
- *
- * @param uri The element's Namespace URI, or the empty string.
- * @param localName The element's local name, or the empty string.
- * @param qName The element's qualified (prefixed) name, or the empty
- * string.
- * @param atts The element's attributes.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#startElement
- */
- public void startElement(
- String uri, String localName, String qName, Attributes atts)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startElement: " + qName);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.startElement(uri, localName, qName, atts);
- }
- }
-
- /**
- * Filter an end element event.
- *
- * @param uri The element's Namespace URI, or the empty string.
- * @param localName The element's local name, or the empty string.
- * @param qName The element's qualified (prefixed) name, or the empty
- * string.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#endElement
- */
- public void endElement(String uri, String localName, String qName)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endElement: " + qName);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.endElement(uri, localName, qName);
- }
- }
-
- /**
- * Filter a character data event.
- *
- * @param ch An array of characters.
- * @param start The starting position in the array.
- * @param length The number of characters to use from the array.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#characters
- */
- public void characters(char ch[], int start, int length) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#characters: " + start + ", "
- + length);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.characters(ch, start, length);
- }
- }
-
- /**
- * Filter an ignorable whitespace event.
- *
- * @param ch An array of characters.
- * @param start The starting position in the array.
- * @param length The number of characters to use from the array.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#ignorableWhitespace
- */
- public void ignorableWhitespace(char ch[], int start, int length)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#ignorableWhitespace: "
- + start + ", " + length);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.ignorableWhitespace(ch, start, length);
- }
- }
-
- /**
- * Filter a processing instruction event.
- *
- * @param target The processing instruction target.
- * @param data The text following the target.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#processingInstruction
- */
- public void processingInstruction(String target, String data)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#processingInstruction: "
- + target + ", " + data);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.processingInstruction(target, data);
- }
- }
-
- /**
- * Filter a skipped entity event.
- *
- * @param name The name of the skipped entity.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ContentHandler#skippedEntity
- */
- public void skippedEntity(String name) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#skippedEntity: " + name);
-
- if (m_contentHandler != null)
- {
- m_contentHandler.skippedEntity(name);
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.ErrorHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Filter a warning event.
- *
- * @param e The nwarning as an exception.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ErrorHandler#warning
- */
- public void warning(SAXParseException e) throws SAXException
- {
- // This is not great, but we really would rather have the error
- // handler be the error listener if it is a error handler. Coroutine's fatalError
- // can't really be configured, so I think this is the best thing right now
- // for error reporting. Possibly another JAXP 1.1 hole. -sb
- javax.xml.transform.ErrorListener errorListener = m_transformer.getErrorListener();
- if(errorListener instanceof ErrorHandler)
- {
- ((ErrorHandler)errorListener).warning(e);
- }
- else
- {
- try
- {
- errorListener.warning(new javax.xml.transform.TransformerException(e));
- }
- catch(javax.xml.transform.TransformerException te)
- {
- throw e;
- }
- }
- }
-
- /**
- * Filter an error event.
- *
- * @param e The error as an exception.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ErrorHandler#error
- */
- public void error(SAXParseException e) throws SAXException
- {
- // %REVIEW% I don't think this should be called. -sb
- // clearCoRoutine(e);
-
- // This is not great, but we really would rather have the error
- // handler be the error listener if it is a error handler. Coroutine's fatalError
- // can't really be configured, so I think this is the best thing right now
- // for error reporting. Possibly another JAXP 1.1 hole. -sb
- javax.xml.transform.ErrorListener errorListener = m_transformer.getErrorListener();
- if(errorListener instanceof ErrorHandler)
- {
- ((ErrorHandler)errorListener).error(e);
- if(null != m_errorHandler)
- m_errorHandler.error(e); // may not be called.
- }
- else
- {
- try
- {
- errorListener.error(new javax.xml.transform.TransformerException(e));
- if(null != m_errorHandler)
- m_errorHandler.error(e); // may not be called.
- }
- catch(javax.xml.transform.TransformerException te)
- {
- throw e;
- }
- }
- }
-
- /**
- * Filter a fatal error event.
- *
- * @param e The error as an exception.
- * @throws SAXException The client may throw
- * an exception during processing.
- * @see org.xml.sax.ErrorHandler#fatalError
- */
- public void fatalError(SAXParseException e) throws SAXException
- {
- if(null != m_errorHandler)
- {
- try
- {
- m_errorHandler.fatalError(e);
- }
- catch(SAXParseException se)
- {
- // ignore
- }
- // clearCoRoutine(e);
- }
-
- // This is not great, but we really would rather have the error
- // handler be the error listener if it is a error handler. Coroutine's fatalError
- // can't really be configured, so I think this is the best thing right now
- // for error reporting. Possibly another JAXP 1.1 hole. -sb
- javax.xml.transform.ErrorListener errorListener = m_transformer.getErrorListener();
-
- if(errorListener instanceof ErrorHandler)
- {
- ((ErrorHandler)errorListener).fatalError(e);
- if(null != m_errorHandler)
- m_errorHandler.fatalError(e); // may not be called.
- }
- else
- {
- try
- {
- errorListener.fatalError(new javax.xml.transform.TransformerException(e));
- if(null != m_errorHandler)
- m_errorHandler.fatalError(e); // may not be called.
- }
- catch(javax.xml.transform.TransformerException te)
- {
- throw e;
- }
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.ext.LexicalHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Report the start of DTD declarations, if any.
- *
- * <p>Any declarations are assumed to be in the internal subset
- * unless otherwise indicated by a {@link #startEntity startEntity}
- * event.</p>
- *
- * <p>Note that the start/endDTD events will appear within
- * the start/endDocument events from ContentHandler and
- * before the first startElement event.</p>
- *
- * @param name The document type name.
- * @param publicId The declared public identifier for the
- * external DTD subset, or null if none was declared.
- * @param systemId The declared system identifier for the
- * external DTD subset, or null if none was declared.
- * @throws SAXException The application may raise an
- * exception.
- * @see #endDTD
- * @see #startEntity
- */
- public void startDTD(String name, String publicId, String systemId)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startDTD: " + name + ", "
- + publicId + ", " + systemId);
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.startDTD(name, publicId, systemId);
- }
- }
-
- /**
- * Report the end of DTD declarations.
- *
- * @throws SAXException The application may raise an exception.
- * @see #startDTD
- */
- public void endDTD() throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endDTD");
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.endDTD();
- }
- }
-
- /**
- * Report the beginning of an entity in content.
- *
- * <p><strong>NOTE:</entity> entity references in attribute
- * values -- and the start and end of the document entity --
- * are never reported.</p>
- *
- * <p>The start and end of the external DTD subset are reported
- * using the pseudo-name "[dtd]". All other events must be
- * properly nested within start/end entity events.</p>
- *
- * <p>Note that skipped entities will be reported through the
- * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity}
- * event, which is part of the ContentHandler interface.</p>
- *
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%'.
- * @throws SAXException The application may raise an exception.
- * @see #endEntity
- * @see org.xml.sax.ext.DeclHandler#internalEntityDecl
- * @see org.xml.sax.ext.DeclHandler#externalEntityDecl
- */
- public void startEntity(String name) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startEntity: " + name);
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.startEntity(name);
- }
- }
-
- /**
- * Report the end of an entity.
- *
- * @param name The name of the entity that is ending.
- * @throws SAXException The application may raise an exception.
- * @see #startEntity
- */
- public void endEntity(String name) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endEntity: " + name);
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.endEntity(name);
- }
- }
-
- /**
- * Report the start of a CDATA section.
- *
- * <p>The contents of the CDATA section will be reported through
- * the regular {@link org.xml.sax.ContentHandler#characters
- * characters} event.</p>
- *
- * @throws SAXException The application may raise an exception.
- * @see #endCDATA
- */
- public void startCDATA() throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#startCDATA");
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.startCDATA();
- }
- }
-
- /**
- * Report the end of a CDATA section.
- *
- * @throws SAXException The application may raise an exception.
- * @see #startCDATA
- */
- public void endCDATA() throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#endCDATA");
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.endCDATA();
- }
- }
-
- /**
- * Report an XML comment anywhere in the document.
- *
- * <p>This callback will be used for comments inside or outside the
- * document element, including comments in the external DTD
- * subset (if read).</p>
- *
- * @param ch An array holding the characters in the comment.
- * @param start The starting position in the array.
- * @param length The number of characters to use from the array.
- * @throws SAXException The application may raise an exception.
- */
- public void comment(char ch[], int start, int length) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#comment: " + start + ", "
- + length);
-
- if (null != m_lexicalHandler)
- {
- m_lexicalHandler.comment(ch, start, length);
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Implementation of org.xml.sax.ext.DeclHandler.
- ////////////////////////////////////////////////////////////////////
-
- /**
- * Report an element type declaration.
- *
- * <p>The content model will consist of the string "EMPTY", the
- * string "ANY", or a parenthesised group, optionally followed
- * by an occurrence indicator. The model will be normalized so
- * that all whitespace is removed,and will include the enclosing
- * parentheses.</p>
- *
- * @param name The element type name.
- * @param model The content model as a normalized string.
- * @throws SAXException The application may raise an exception.
- */
- public void elementDecl(String name, String model) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#elementDecl: " + name + ", "
- + model);
-
- if (null != m_declHandler)
- {
- m_declHandler.elementDecl(name, model);
- }
- }
-
- /**
- * Report an attribute type declaration.
- *
- * <p>Only the effective (first) declaration for an attribute will
- * be reported. The type will be one of the strings "CDATA",
- * "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY",
- * "ENTITIES", or "NOTATION", or a parenthesized token group with
- * the separator "|" and all whitespace removed.</p>
- *
- * @param eName The name of the associated element.
- * @param aName The name of the attribute.
- * @param type A string representing the attribute type.
- * @param valueDefault A string representing the attribute default
- * ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if
- * none of these applies.
- * @param value A string representing the attribute's default value,
- * or null if there is none.
- * @throws SAXException The application may raise an exception.
- */
- public void attributeDecl(
- String eName, String aName, String type, String valueDefault, String value)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#attributeDecl: " + eName
- + ", " + aName + ", etc...");
-
- if (null != m_declHandler)
- {
- m_declHandler.attributeDecl(eName, aName, type, valueDefault, value);
- }
- }
-
- /**
- * Report an internal entity declaration.
- *
- * <p>Only the effective (first) declaration for each entity
- * will be reported.</p>
- *
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%'.
- * @param value The replacement text of the entity.
- * @throws SAXException The application may raise an exception.
- * @see #externalEntityDecl
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
- */
- public void internalEntityDecl(String name, String value)
- throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#internalEntityDecl: " + name
- + ", " + value);
-
- if (null != m_declHandler)
- {
- m_declHandler.internalEntityDecl(name, value);
- }
- }
-
- /**
- * Report a parsed external entity declaration.
- *
- * <p>Only the effective (first) declaration for each entity
- * will be reported.</p>
- *
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%'.
- * @param publicId The declared public identifier of the entity, or
- * null if none was declared.
- * @param systemId The declared system identifier of the entity.
- * @throws SAXException The application may raise an exception.
- * @see #internalEntityDecl
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
- */
- public void externalEntityDecl(
- String name, String publicId, String systemId) throws SAXException
- {
-
- if (DEBUG)
- System.out.println("TransformerHandlerImpl#externalEntityDecl: " + name
- + ", " + publicId + ", " + systemId);
-
- if (null != m_declHandler)
- {
- m_declHandler.externalEntityDecl(name, publicId, systemId);
- }
- }
-
- ////////////////////////////////////////////////////////////////////
- // Internal state.
- ////////////////////////////////////////////////////////////////////
-
- /** Set to true for diagnostics output. */
- private static boolean DEBUG = false;
-
- /**
- * The transformer this will use to transform a
- * source tree into a result tree.
- */
- private TransformerImpl m_transformer;
-
- /** The system ID to use as a base for relative URLs. */
- private String m_baseSystemID;
-
- /** The result for the transformation. */
- private Result m_result = null;
-
- /** The locator for this TransformerHandler. */
- private Locator m_locator = null;
-
- /** The entity resolver to aggregate to. */
- private EntityResolver m_entityResolver = null;
-
- /** The DTD handler to aggregate to. */
- private DTDHandler m_dtdHandler = null;
-
- /** The content handler to aggregate to. */
- private ContentHandler m_contentHandler = null;
-
- /** The error handler to aggregate to. */
- private ErrorHandler m_errorHandler = null;
-
- /** The lexical handler to aggregate to. */
- private LexicalHandler m_lexicalHandler = null;
-
- /** The decl handler to aggregate to. */
- private DeclHandler m_declHandler = null;
-
- /** The Document Table Instance we are transforming. */
- DTM m_dtm;
- }