- /*
 - * 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.processor;
 - import org.xml.sax.InputSource;
 - import org.xml.sax.helpers.XMLReaderFactory;
 - import org.xml.sax.XMLReader;
 - import javax.xml.transform.TransformerException;
 - import org.xml.sax.SAXNotRecognizedException;
 - import org.xml.sax.SAXNotSupportedException;
 - import org.xml.sax.XMLFilter;
 - import org.w3c.dom.Node;
 - import org.apache.xml.utils.TreeWalker;
 - import org.apache.xml.utils.SystemIDResolver;
 - import org.apache.xml.utils.DefaultErrorHandler;
 - import org.apache.xalan.transformer.TransformerImpl;
 - import org.apache.xalan.transformer.TransformerIdentityImpl;
 - import org.apache.xalan.transformer.TrAXFilter;
 - import org.apache.xalan.res.XSLMessages;
 - import org.apache.xalan.res.XSLTErrorResources;
 - import javax.xml.transform.Transformer;
 - import javax.xml.transform.TransformerFactory;
 - import javax.xml.transform.TransformerConfigurationException;
 - import javax.xml.transform.Source;
 - import javax.xml.transform.URIResolver;
 - import javax.xml.transform.Templates;
 - import javax.xml.transform.sax.TemplatesHandler;
 - import javax.xml.transform.sax.TransformerHandler;
 - import javax.xml.transform.sax.SAXTransformerFactory;
 - import javax.xml.transform.sax.SAXSource;
 - import javax.xml.transform.sax.SAXResult;
 - import javax.xml.transform.dom.DOMSource;
 - import javax.xml.transform.dom.DOMResult;
 - import javax.xml.transform.stream.StreamSource;
 - import javax.xml.transform.stream.StreamResult;
 - import javax.xml.transform.ErrorListener;
 - import java.io.IOException;
 - import java.io.InputStream;
 - import java.io.BufferedInputStream;
 - import java.io.StringWriter;
 - import java.io.PrintWriter;
 - import java.io.StringReader;
 - import java.util.Properties;
 - import java.util.Enumeration;
 - import org.apache.xalan.transformer.XalanProperties;
 - /**
 - * The TransformerFactoryImpl, which implements the TRaX TransformerFactory
 - * interface, processes XSLT stylesheets into a Templates object
 - * (a StylesheetRoot).
 - */
 - public class TransformerFactoryImpl extends SAXTransformerFactory
 - {
 - /**
 - * The path/filename of the property file: XSLTInfo.properties
 - * Maintenance note: see also org.apache.xpath.functions.FuncSystemProperty.XSLT_PROPERTIES
 - */
 - public static String XSLT_PROPERTIES =
 - "org/apache/xalan/res/XSLTInfo.properties";
 - /**
 - * Constructor TransformerFactoryImpl
 - *
 - */
 - public TransformerFactoryImpl()
 - {
 - }
 - /** a zero length Class array used in loadPropertyFileToSystem() */
 - private static final Class[] NO_CLASSES = new Class[0];
 - /** a zero length Object array used in loadPropertyFileToSystem() */
 - private static final Object[] NO_OBJS = new Object[0];
 - /** Static string to be used for incremental feature */
 - public static final String FEATURE_INCREMENTAL = "http://xml.apache.org/xalan/features/incremental";
 - /** Static string to be used for optimize feature */
 - public static final String FEATURE_OPTIMIZE = "http://xml.apache.org/xalan/features/optimize";
 - /** Static string to be used for source_location feature */
 - public static final String FEATURE_SOURCE_LOCATION = XalanProperties.SOURCE_LOCATION;
 - /**
 - * Retrieve a propery bundle from XSLT_PROPERTIES and load it
 - * int the System properties.
 - */
 - static
 - {
 - try
 - {
 - InputStream is = null;
 - try
 - {
 - Properties props = new Properties();
 - try {
 - java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
 - if (getCCL != null) {
 - ClassLoader contextClassLoader = (ClassLoader) getCCL.invoke(Thread.currentThread(), NO_OBJS);
 - is = contextClassLoader.getResourceAsStream(XSLT_PROPERTIES); // file should be already fully specified
 - }
 - }
 - catch (Exception e) {}
 - if (is == null) {
 - // NOTE! For the below getResourceAsStream in Sun JDK 1.1.8M
 - // we apparently must add the leading slash character - I
 - // don't know why, but if it's not there, we throw an NPE from the below loading
 - is = TransformerFactoryImpl.class.getResourceAsStream("/" + XSLT_PROPERTIES); // file should be already fully specified
 - }
 - // get a buffered version
 - BufferedInputStream bis = new BufferedInputStream(is);
 - props.load(bis); // and load up the property bag from this
 - bis.close(); // close out after reading
 - // OK, now we only want to set system properties that
 - // are not already set.
 - Properties systemProps = System.getProperties();
 - Enumeration propEnum = props.propertyNames();
 - while (propEnum.hasMoreElements())
 - {
 - String prop = (String) propEnum.nextElement();
 - if (!systemProps.containsKey(prop))
 - systemProps.put(prop, props.getProperty(prop));
 - }
 - System.setProperties(systemProps);
 - }
 - catch (Exception ex){}
 - }
 - catch (SecurityException se)
 - {
 - // In this case the caller is required to have
 - // the needed attributes already defined.
 - }
 - }
 - public javax.xml.transform.Templates processFromNode(Node node)
 - throws TransformerConfigurationException
 - {
 - try
 - {
 - TemplatesHandler builder = newTemplatesHandler();
 - TreeWalker walker = new TreeWalker(builder, new org.apache.xpath.DOM2Helper(), builder.getSystemId());
 - walker.traverse(node);
 - return builder.getTemplates();
 - }
 - catch (org.xml.sax.SAXException se)
 - {
 - if (m_errorListener != null)
 - {
 - try
 - {
 - m_errorListener.fatalError(new TransformerException(se));
 - }
 - catch (TransformerException ex)
 - {
 - throw new TransformerConfigurationException(ex);
 - }
 - return null;
 - }
 - else
 - // Should remove this later... but right now diagnostics from
 - // TransformerConfigurationException are not good.
 - // se.printStackTrace();
 - throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_PROCESSFROMNODE_FAILED, null), se); //"processFromNode failed",
 - //se);
 - }
 - catch (TransformerConfigurationException tce)
 - {
 - // Assume it's already been reported to the error listener.
 - throw tce;
 - }
 - /* catch (TransformerException tce)
 - {
 - // Assume it's already been reported to the error listener.
 - throw new TransformerConfigurationException(tce.getMessage(), tce);
 - }*/
 - catch (Exception e)
 - {
 - if (m_errorListener != null)
 - {
 - try
 - {
 - m_errorListener.fatalError(new TransformerException(e));
 - }
 - catch (TransformerException ex)
 - {
 - throw new TransformerConfigurationException(ex);
 - }
 - return null;
 - }
 - else
 - // Should remove this later... but right now diagnostics from
 - // TransformerConfigurationException are not good.
 - // se.printStackTrace();
 - throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_PROCESSFROMNODE_FAILED, null), e); //"processFromNode failed",
 - //e);
 - }
 - }
 - /**
 - * The systemID that was specified in
 - * processFromNode(Node node, String systemID).
 - */
 - private String m_DOMsystemID = null;
 - /**
 - * The systemID that was specified in
 - * processFromNode(Node node, String systemID).
 - *
 - * @return The systemID, or null.
 - */
 - String getDOMsystemID()
 - {
 - return m_DOMsystemID;
 - }
 - /**
 - * Process the stylesheet from a DOM tree, if the
 - * processor supports the "http://xml.org/trax/features/dom/input"
 - * feature.
 - *
 - * @param node A DOM tree which must contain
 - * valid transform instructions that this processor understands.
 - * @param systemID The systemID from where xsl:includes and xsl:imports
 - * should be resolved from.
 - *
 - * @return A Templates object capable of being used for transformation purposes.
 - *
 - * @throws TransformerConfigurationException
 - */
 - javax.xml.transform.Templates processFromNode(Node node, String systemID)
 - throws TransformerConfigurationException
 - {
 - m_DOMsystemID = systemID;
 - return processFromNode(node);
 - }
 - /**
 - * Get InputSource specification(s) that are associated with the
 - * given document specified in the source param,
 - * via the xml-stylesheet processing instruction
 - * (see http://www.w3.org/TR/xml-stylesheet/), and that matches
 - * the given criteria. Note that it is possible to return several stylesheets
 - * that match the criteria, in which case they are applied as if they were
 - * a list of imports or cascades.
 - *
 - * <p>Note that DOM2 has it's own mechanism for discovering stylesheets.
 - * Therefore, there isn't a DOM version of this method.</p>
 - *
 - *
 - * @param source The XML source that is to be searched.
 - * @param media The media attribute to be matched. May be null, in which
 - * case the prefered templates will be used (i.e. alternate = no).
 - * @param title The value of the title attribute to match. May be null.
 - * @param charset The value of the charset attribute to match. May be null.
 - *
 - * @return A Source object capable of being used to create a Templates object.
 - *
 - * @throws TransformerConfigurationException
 - */
 - public Source getAssociatedStylesheet(
 - Source source, String media, String title, String charset)
 - throws TransformerConfigurationException
 - {
 - String baseID;
 - InputSource isource = null;
 - Node node = null;
 - XMLReader reader = null;
 - if (source instanceof DOMSource)
 - {
 - DOMSource dsource = (DOMSource) source;
 - node = dsource.getNode();
 - baseID = dsource.getSystemId();
 - }
 - else
 - {
 - isource = SAXSource.sourceToInputSource(source);
 - baseID = isource.getSystemId();
 - }
 - // What I try to do here is parse until the first startElement
 - // is found, then throw a special exception in order to terminate
 - // the parse.
 - StylesheetPIHandler handler = new StylesheetPIHandler(baseID, media,
 - title, charset);
 - // Use URIResolver. Patch from Dmitri Ilyin
 - if (m_uriResolver != null)
 - {
 - handler.setURIResolver(m_uriResolver);
 - }
 - try
 - {
 - if (null != node)
 - {
 - TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), baseID);
 - walker.traverse(node);
 - }
 - else
 - {
 - // Use JAXP1.1 ( if possible )
 - try
 - {
 - javax.xml.parsers.SAXParserFactory factory =
 - javax.xml.parsers.SAXParserFactory.newInstance();
 - factory.setNamespaceAware(true);
 - javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
 - reader = jaxpParser.getXMLReader();
 - }
 - catch (javax.xml.parsers.ParserConfigurationException ex)
 - {
 - throw new org.xml.sax.SAXException(ex);
 - }
 - catch (javax.xml.parsers.FactoryConfigurationError ex1)
 - {
 - throw new org.xml.sax.SAXException(ex1.toString());
 - }
 - catch (NoSuchMethodError ex2){}
 - catch (AbstractMethodError ame){}
 - if (null == reader)
 - {
 - reader = XMLReaderFactory.createXMLReader();
 - }
 - // Need to set options!
 - reader.setContentHandler(handler);
 - reader.parse(isource);
 - }
 - }
 - catch (StopParseException spe)
 - {
 - // OK, good.
 - }
 - catch (org.xml.sax.SAXException se)
 - {
 - throw new TransformerConfigurationException(
 - "getAssociatedStylesheets failed", se);
 - }
 - catch (IOException ioe)
 - {
 - throw new TransformerConfigurationException(
 - "getAssociatedStylesheets failed", ioe);
 - }
 - return handler.getAssociatedStylesheet();
 - }
 - /**
 - * Create a new Transformer object that performs a copy
 - * of the source to the result.
 - *
 - * @param source An object that holds a URI, input stream, etc.
 - *
 - * @return A Transformer object that may be used to perform a transformation
 - * in a single thread, never null.
 - *
 - * @throws TransformerConfigurationException May throw this during
 - * the parse when it is constructing the
 - * Templates object and fails.
 - */
 - public TemplatesHandler newTemplatesHandler()
 - throws TransformerConfigurationException
 - {
 - return new StylesheetHandler(this);
 - }
 - /**
 - * Look up the value of a feature.
 - *
 - * <p>The feature name is any fully-qualified URI. It is
 - * possible for an TransformerFactory to recognize a feature name but
 - * to be unable to return its value; this is especially true
 - * in the case of an adapter for a SAX1 Parser, which has
 - * no way of knowing whether the underlying parser is
 - * validating, for example.</p>
 - *
 - * @param name The feature name, which is a fully-qualified URI.
 - * @return The current state of the feature (true or false).
 - */
 - public boolean getFeature(String name)
 - {
 - // Try first with identity comparison, which
 - // will be faster.
 - if ((DOMResult.FEATURE == name) || (DOMSource.FEATURE == name)
 - || (SAXResult.FEATURE == name) || (SAXSource.FEATURE == name)
 - || (StreamResult.FEATURE == name)
 - || (StreamSource.FEATURE == name)
 - || (SAXTransformerFactory.FEATURE == name)
 - || (SAXTransformerFactory.FEATURE_XMLFILTER == name))
 - return true;
 - else if ((DOMResult.FEATURE.equals(name))
 - || (DOMSource.FEATURE.equals(name))
 - || (SAXResult.FEATURE.equals(name))
 - || (SAXSource.FEATURE.equals(name))
 - || (StreamResult.FEATURE.equals(name))
 - || (StreamSource.FEATURE.equals(name))
 - || (SAXTransformerFactory.FEATURE.equals(name))
 - || (SAXTransformerFactory.FEATURE_XMLFILTER.equals(name)))
 - return true;
 - else
 - return false;
 - }
 - public static boolean m_optimize = true;
 - /** Flag set by FEATURE_SOURCE_LOCATION.
 - * This feature specifies whether the transformation phase should
 - * keep track of line and column numbers for the input source
 - * document. Note that this works only when that
 - * information is available from the source -- in other words, if you
 - * pass in a DOM, there's little we can do for you.
 - *
 - * The default is false. Setting it true may significantly
 - * increase storage cost per node.
 - *
 - * %REVIEW% SAX2DTM is explicitly reaching up to retrieve this global field.
 - * We should instead have an architected pathway for passing hints of this
 - * sort down from TransformerFactory to Transformer to DTMManager to DTM.
 - * */
 - public static boolean m_source_location = false;
 - /**
 - * Allows the user to set specific attributes on the underlying
 - * implementation.
 - *
 - * @param name The name of the attribute.
 - * @param value The value of the attribute; Boolean or String="true"|"false"
 - *
 - * @throws IllegalArgumentException thrown if the underlying
 - * implementation doesn't recognize the attribute.
 - */
 - public void setAttribute(String name, Object value)
 - throws IllegalArgumentException
 - {
 - if (name.equals(FEATURE_INCREMENTAL))
 - {
 - if(value instanceof Boolean)
 - {
 - // Accept a Boolean object..
 - org.apache.xml.dtm.DTMManager.setIncremental(((Boolean)value).booleanValue());
 - }
 - else if(value instanceof String)
 - {
 - // .. or a String object
 - org.apache.xml.dtm.DTMManager.setIncremental((new Boolean((String)value)).booleanValue());
 - }
 - else
 - {
 - // Give a more meaningful error message
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
 - }
 - }
 - else if (name.equals(FEATURE_OPTIMIZE))
 - {
 - if(value instanceof Boolean)
 - {
 - // Accept a Boolean object..
 - m_optimize = ((Boolean)value).booleanValue();
 - }
 - else if(value instanceof String)
 - {
 - // .. or a String object
 - m_optimize = (new Boolean((String)value)).booleanValue();
 - }
 - else
 - {
 - // Give a more meaningful error message
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
 - }
 - }
 - // Custom Xalan feature: annotate DTM with SAX source locator fields.
 - // This gets used during SAX2DTM instantiation.
 - //
 - // %REVIEW% Should the name of this field really be in XalanProperties?
 - // %REVIEW% I hate that it's a global static, but didn't want to change APIs yet.
 - else if(name.equals(FEATURE_SOURCE_LOCATION))
 - {
 - if(value instanceof Boolean)
 - {
 - // Accept a Boolean object..
 - m_source_location = ((Boolean)value).booleanValue();
 - }
 - else if(value instanceof String)
 - {
 - // .. or a String object
 - m_source_location = (new Boolean((String)value)).booleanValue();
 - }
 - else
 - {
 - // Give a more meaningful error message
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
 - }
 - }
 - else
 - {
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_NOT_SUPPORTED, new Object[]{name})); //name + "not supported");
 - }
 - }
 - /**
 - * Allows the user to retrieve specific attributes on the underlying
 - * implementation.
 - *
 - * @param name The name of the attribute.
 - * @return value The value of the attribute.
 - *
 - * @throws IllegalArgumentException thrown if the underlying
 - * implementation doesn't recognize the attribute.
 - */
 - public Object getAttribute(String name) throws IllegalArgumentException
 - {
 - if (name.equals(FEATURE_INCREMENTAL))
 - {
 - return new Boolean(org.apache.xml.dtm.DTMManager.getIncremental());
 - }
 - else if (name.equals(FEATURE_OPTIMIZE))
 - {
 - return new Boolean(m_optimize);
 - }
 - else if (name.equals(FEATURE_SOURCE_LOCATION))
 - {
 - return new Boolean(m_source_location);
 - }
 - else
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_ATTRIB_VALUE_NOT_RECOGNIZED, new Object[]{name})); //name + " attribute not recognized");
 - }
 - /**
 - * Create an XMLFilter that uses the given source as the
 - * transformation instructions.
 - *
 - * @param src The source of the transformation instructions.
 - *
 - * @return An XMLFilter object, or null if this feature is not supported.
 - *
 - * @throws TransformerConfigurationException
 - */
 - public XMLFilter newXMLFilter(Source src)
 - throws TransformerConfigurationException
 - {
 - Templates templates = newTemplates(src);
 - if( templates==null ) return null;
 - return newXMLFilter(templates);
 - }
 - /**
 - * Create an XMLFilter that uses the given source as the
 - * transformation instructions.
 - *
 - * @param src The source of the transformation instructions.
 - *
 - * @param templates non-null reference to Templates object.
 - *
 - * @return An XMLFilter object, or null if this feature is not supported.
 - *
 - * @throws TransformerConfigurationException
 - */
 - public XMLFilter newXMLFilter(Templates templates)
 - throws TransformerConfigurationException
 - {
 - try {
 - return new TrAXFilter(templates);
 - } catch( TransformerConfigurationException ex ) {
 - if( m_errorListener != null) {
 - try {
 - m_errorListener.fatalError( ex );
 - return null;
 - } catch( TransformerException ex1 ) {
 - new TransformerConfigurationException(ex1);
 - }
 - }
 - throw ex;
 - }
 - }
 - /**
 - * Get a TransformerHandler object that can process SAX
 - * ContentHandler events into a Result, based on the transformation
 - * instructions specified by the argument.
 - *
 - * @param src The source of the transformation instructions.
 - *
 - * @return TransformerHandler ready to transform SAX events.
 - *
 - * @throws TransformerConfigurationException
 - */
 - public TransformerHandler newTransformerHandler(Source src)
 - throws TransformerConfigurationException
 - {
 - Templates templates = newTemplates(src);
 - if( templates==null ) return null;
 - return newTransformerHandler(templates);
 - }
 - /**
 - * Get a TransformerHandler object that can process SAX
 - * ContentHandler events into a Result, based on the Templates argument.
 - *
 - * @param templates The source of the transformation instructions.
 - *
 - * @return TransformerHandler ready to transform SAX events.
 - * @throws TransformerConfigurationException
 - */
 - public TransformerHandler newTransformerHandler(Templates templates)
 - throws TransformerConfigurationException
 - {
 - try {
 - TransformerImpl transformer =
 - (TransformerImpl) templates.newTransformer();
 - transformer.setURIResolver(m_uriResolver);
 - TransformerHandler th =
 - (TransformerHandler) transformer.getInputContentHandler(true);
 - return th;
 - } catch( TransformerConfigurationException ex ) {
 - if( m_errorListener != null ) {
 - try {
 - m_errorListener.fatalError( ex );
 - return null;
 - } catch (TransformerException ex1 ) {
 - ex=new TransformerConfigurationException(ex1);
 - }
 - }
 - throw ex;
 - }
 - }
 - // /** The identity transform string, for support of newTransformerHandler()
 - // * and newTransformer(). */
 - // private static final String identityTransform =
 - // "<xsl:stylesheet " + "xmlns:xsl='http://www.w3.org/1999/XSL/Transform' "
 - // + "version='1.0'>" + "<xsl:template match='/|node()'>"
 - // + "<xsl:copy-of select='.'/>" + "</xsl:template>" + "</xsl:stylesheet>";
 - //
 - // /** The identity transform Templates, built from identityTransform,
 - // * for support of newTransformerHandler() and newTransformer(). */
 - // private static Templates m_identityTemplate = null;
 - /**
 - * Get a TransformerHandler object that can process SAX
 - * ContentHandler events into a Result.
 - *
 - * @param src The source of the transformation instructions.
 - *
 - * @return TransformerHandler ready to transform SAX events.
 - *
 - * @throws TransformerConfigurationException
 - */
 - public TransformerHandler newTransformerHandler()
 - throws TransformerConfigurationException
 - {
 - // if (null == m_identityTemplate)
 - // {
 - // synchronized (identityTransform)
 - // {
 - // if (null == m_identityTemplate)
 - // {
 - // StringReader reader = new StringReader(identityTransform);
 - //
 - // m_identityTemplate = newTemplates(new StreamSource(reader));
 - // }
 - // }
 - // }
 - //
 - // return newTransformerHandler(m_identityTemplate);
 - return new TransformerIdentityImpl();
 - }
 - /**
 - * Process the source into a Transformer object. Care must
 - * be given to know that this object can not be used concurrently
 - * in multiple threads.
 - *
 - * @param source An object that holds a URL, input stream, etc.
 - *
 - * @return A Transformer object capable of
 - * being used for transformation purposes in a single thread.
 - *
 - * @throws TransformerConfigurationException May throw this during the parse when it
 - * is constructing the Templates object and fails.
 - */
 - public Transformer newTransformer(Source source)
 - throws TransformerConfigurationException
 - {
 - try {
 - Templates tmpl=newTemplates( source );
 - /* this can happen if an ErrorListener is present and it doesn't
 - throw any exception in fatalError.
 - The spec says: "a Transformer must use this interface
 - instead of throwing an exception" - the newTemplates() does
 - that, and returns null.
 - */
 - if( tmpl==null ) return null;
 - Transformer transformer = tmpl.newTransformer();
 - transformer.setURIResolver(m_uriResolver);
 - return transformer;
 - } catch( TransformerConfigurationException ex ) {
 - if( m_errorListener != null ) {
 - try {
 - m_errorListener.fatalError( ex );
 - return null;
 - } catch( TransformerException ex1 ) {
 - ex=new TransformerConfigurationException( ex1 );
 - }
 - }
 - throw ex;
 - }
 - }
 - /**
 - * Create a new Transformer object that performs a copy
 - * of the source to the result.
 - *
 - * @param source An object that holds a URL, input stream, etc.
 - *
 - * @return A Transformer object capable of
 - * being used for transformation purposes in a single thread.
 - *
 - * @throws TransformerConfigurationException May throw this during
 - * the parse when it is constructing the
 - * Templates object and it fails.
 - */
 - public Transformer newTransformer() throws TransformerConfigurationException
 - {
 - // if (null == m_identityTemplate)
 - // {
 - // synchronized (identityTransform)
 - // {
 - // if (null == m_identityTemplate)
 - // {
 - // StringReader reader = new StringReader(identityTransform);
 - //
 - // m_identityTemplate = newTemplates(new StreamSource(reader));
 - // }
 - // }
 - // }
 - //
 - // return m_identityTemplate.newTransformer();
 - return new TransformerIdentityImpl();
 - }
 - /**
 - * Process the source into a Templates object, which is likely
 - * a compiled representation of the source. This Templates object
 - * may then be used concurrently across multiple threads. Creating
 - * a Templates object allows the TransformerFactory to do detailed
 - * performance optimization of transformation instructions, without
 - * penalizing runtime transformation.
 - *
 - * @param source An object that holds a URL, input stream, etc.
 - * @return A Templates object capable of being used for transformation purposes.
 - *
 - * @throws TransformerConfigurationException May throw this during the parse when it
 - * is constructing the Templates object and fails.
 - */
 - public Templates newTemplates(Source source)
 - throws TransformerConfigurationException
 - {
 - TemplatesHandler builder = newTemplatesHandler();
 - String baseID = source.getSystemId();
 - if (null == baseID)
 - {
 - try
 - {
 - String currentDir = System.getProperty("user.dir");
 - if (currentDir.startsWith(java.io.File.separator))
 - baseID = "file://" + currentDir + java.io.File.separatorChar
 - + source.getClass().getName();
 - else
 - baseID = "file:///" + currentDir + java.io.File.separatorChar
 - + source.getClass().getName();
 - }
 - catch (SecurityException se)
 - {
 - // For untrusted applet case, user.dir is outside the sandbox
 - // and not accessible: just leave baseID as null (-sb & -sc)
 - }
 - }
 - else
 - {
 - try
 - {
 - baseID = SystemIDResolver.getAbsoluteURI(baseID);
 - }
 - catch (TransformerException te)
 - {
 - throw new TransformerConfigurationException(te);
 - }
 - }
 - builder.setSystemId(baseID);
 - if (source instanceof DOMSource)
 - {
 - DOMSource dsource = (DOMSource) source;
 - Node node = dsource.getNode();
 - if (null != node)
 - return processFromNode(node, baseID);
 - else
 - {
 - String messageStr = XSLMessages.createMessage(
 - XSLTErrorResources.ER_ILLEGAL_DOMSOURCE_INPUT, null);
 - throw new IllegalArgumentException(messageStr);
 - }
 - }
 - try
 - {
 - InputSource isource = SAXSource.sourceToInputSource(source);
 - XMLReader reader = null;
 - if (source instanceof SAXSource)
 - reader = ((SAXSource) source).getXMLReader();
 - boolean isUserReader = (reader != null);
 - if (null == reader)
 - {
 - // Use JAXP1.1 ( if possible )
 - try
 - {
 - javax.xml.parsers.SAXParserFactory factory =
 - javax.xml.parsers.SAXParserFactory.newInstance();
 - factory.setNamespaceAware(true);
 - javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
 - reader = jaxpParser.getXMLReader();
 - }
 - catch (javax.xml.parsers.ParserConfigurationException ex)
 - {
 - throw new org.xml.sax.SAXException(ex);
 - }
 - catch (javax.xml.parsers.FactoryConfigurationError ex1)
 - {
 - throw new org.xml.sax.SAXException(ex1.toString());
 - }
 - catch (NoSuchMethodError ex2){}
 - catch (AbstractMethodError ame){}
 - }
 - if (null == reader)
 - reader = XMLReaderFactory.createXMLReader();
 - // If you set the namespaces to true, we'll end up getting double
 - // xmlns attributes. Needs to be fixed. -sb
 - // reader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
 - try
 - {
 - if(!isUserReader)
 - reader.setFeature("http://apache.org/xml/features/validation/dynamic",
 - true);
 - }
 - catch (org.xml.sax.SAXException ex)
 - {
 - // feature not recognized
 - }
 - reader.setContentHandler(builder);
 - reader.parse(isource);
 - }
 - catch (org.xml.sax.SAXException se)
 - {
 - if (m_errorListener != null)
 - {
 - try
 - {
 - m_errorListener.fatalError(new TransformerException(se));
 - }
 - catch (TransformerException ex1)
 - {
 - throw new TransformerConfigurationException(ex1);
 - }
 - }
 - else
 - throw new TransformerConfigurationException(se.getMessage(), se);
 - }
 - catch (Exception e)
 - {
 - if (m_errorListener != null)
 - {
 - try
 - {
 - m_errorListener.fatalError(new TransformerException(e));
 - return null;
 - }
 - catch (TransformerException ex1)
 - {
 - throw new TransformerConfigurationException(ex1);
 - }
 - }
 - else
 - throw new TransformerConfigurationException(e.getMessage(), e);
 - }
 - return builder.getTemplates();
 - }
 - /**
 - * The object that implements the URIResolver interface,
 - * or null.
 - */
 - URIResolver m_uriResolver;
 - /**
 - * Set an object that will be used to resolve URIs used in
 - * xsl:import, etc. This will be used as the default for the
 - * transformation.
 - * @param resolver An object that implements the URIResolver interface,
 - * or null.
 - */
 - public void setURIResolver(URIResolver resolver)
 - {
 - m_uriResolver = resolver;
 - }
 - /**
 - * Get the object that will be used to resolve URIs used in
 - * xsl:import, etc. This will be used as the default for the
 - * transformation.
 - *
 - * @return The URIResolver that was set with setURIResolver.
 - */
 - public URIResolver getURIResolver()
 - {
 - return m_uriResolver;
 - }
 - /** The error listener. */
 - private ErrorListener m_errorListener = new DefaultErrorHandler();
 - /**
 - * Get the error listener in effect for the TransformerFactory.
 - *
 - * @return A non-null reference to an error listener.
 - */
 - public ErrorListener getErrorListener()
 - {
 - return m_errorListener;
 - }
 - /**
 - * Set an error listener for the TransformerFactory.
 - *
 - * @param listener Must be a non-null reference to an ErrorListener.
 - *
 - * @throws IllegalArgumentException if the listener argument is null.
 - */
 - public void setErrorListener(ErrorListener listener)
 - throws IllegalArgumentException
 - {
 - if (null == listener)
 - throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_ERRORLISTENER, null));
 - // "ErrorListener");
 - m_errorListener = listener;
 - }
 - }