19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: TransformerFactoryImpl.java 468640 2006-10-28 06:53:53Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.processor;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.BufferedInputStream;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.InputStream;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.XMLConstants;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Templates;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerConfigurationException;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.URIResolver;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.dom.DOMResult;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.dom.DOMSource;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXResult;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXSource;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXTransformerFactory;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.TemplatesHandler;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.TransformerHandler;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamResult;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamSource;
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TrAXFilter;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerIdentityImpl;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.XalanProperties;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.sax2dtm.SAX2DTM;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.DefaultErrorHandler;
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SystemIDResolver;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.TreeWalker;
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.StylesheetPIHandler;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.StopParseException;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.InputSource;
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.XMLFilter;
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.XMLReader;
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.XMLReaderFactory;
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The TransformerFactoryImpl, which implements the TRaX TransformerFactory
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * interface, processes XSLT stylesheets into a Templates object
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (a StylesheetRoot).
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class TransformerFactoryImpl extends SAXTransformerFactory
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The path/filename of the property file: XSLTInfo.properties
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Maintenance note: see also
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>org.apache.xpath.functions.FuncSystemProperty.XSLT_PROPERTIES</code>
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String XSLT_PROPERTIES =
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    "org/apache/xalan/res/XSLTInfo.properties";
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>State of secure processing feature.</p>
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_isSecureProcessing = false;
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor TransformerFactoryImpl
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TransformerFactoryImpl()
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Static string to be used for incremental feature */
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String FEATURE_INCREMENTAL =
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             "http://xml.apache.org/xalan/features/incremental";
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Static string to be used for optimize feature */
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String FEATURE_OPTIMIZE =
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             "http://xml.apache.org/xalan/features/optimize";
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Static string to be used for source_location feature */
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String FEATURE_SOURCE_LOCATION =
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             XalanProperties.SOURCE_LOCATION;
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public javax.xml.transform.Templates processFromNode(Node node)
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TemplatesHandler builder = newTemplatesHandler();
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TreeWalker walker = new TreeWalker(builder,
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         new org.apache.xml.utils.DOM2Helper(),
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         builder.getSystemId());
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      walker.traverse(node);
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return builder.getTemplates();
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_errorListener != null)
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError(new TransformerException(se));
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerConfigurationException ex)
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex;
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerException ex)
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex);
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should remove this later... but right now diagnostics from
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TransformerConfigurationException are not good.
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // se.printStackTrace();
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_PROCESSFROMNODE_FAILED, null), se);
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //"processFromNode failed", se);
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (TransformerConfigurationException tce)
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Assume it's already been reported to the error listener.
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw tce;
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /* catch (TransformerException tce)
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Assume it's already been reported to the error listener.
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerConfigurationException(tce.getMessage(), tce);
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }*/
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_errorListener != null)
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError(new TransformerException(e));
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerConfigurationException ex)
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex;
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerException ex)
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex);
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should remove this later... but right now diagnostics from
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // TransformerConfigurationException are not good.
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // se.printStackTrace();
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_PROCESSFROMNODE_FAILED, null), e); //"processFromNode failed",
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                    //e);
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The systemID that was specified in
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processFromNode(Node node, String systemID).
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_DOMsystemID = null;
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The systemID that was specified in
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processFromNode(Node node, String systemID).
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The systemID, or null.
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String getDOMsystemID()
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_DOMsystemID;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the stylesheet from a DOM tree, if the
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processor supports the "http://xml.org/trax/features/dom/input"
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * feature.
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node A DOM tree which must contain
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * valid transform instructions that this processor understands.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemID The systemID from where xsl:includes and xsl:imports
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be resolved from.
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Templates object capable of being used for transformation purposes.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  javax.xml.transform.Templates processFromNode(Node node, String systemID)
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_DOMsystemID = systemID;
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return processFromNode(node);
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get InputSource specification(s) that are associated with the
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given document specified in the source param,
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * via the xml-stylesheet processing instruction
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (see http://www.w3.org/TR/xml-stylesheet/), and that matches
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the given criteria.  Note that it is possible to return several stylesheets
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that match the criteria, in which case they are applied as if they were
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a list of imports or cascades.
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Note that DOM2 has it's own mechanism for discovering stylesheets.
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Therefore, there isn't a DOM version of this method.</p>
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source The XML source that is to be searched.
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param media The media attribute to be matched.  May be null, in which
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *              case the prefered templates will be used (i.e. alternate = no).
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param title The value of the title attribute to match.  May be null.
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param charset The value of the charset attribute to match.  May be null.
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Source object capable of being used to create a Templates object.
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Source getAssociatedStylesheet(
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          Source source, String media, String title, String charset)
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerConfigurationException
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String baseID;
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    InputSource isource = null;
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node node = null;
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XMLReader reader = null;
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (source instanceof DOMSource)
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DOMSource dsource = (DOMSource) source;
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      node = dsource.getNode();
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      baseID = dsource.getSystemId();
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isource = SAXSource.sourceToInputSource(source);
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      baseID = isource.getSystemId();
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // What I try to do here is parse until the first startElement
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is found, then throw a special exception in order to terminate
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the parse.
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StylesheetPIHandler handler = new StylesheetPIHandler(baseID, media,
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    title, charset);
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Use URIResolver. Patch from Dmitri Ilyin
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_uriResolver != null)
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      handler.setURIResolver(m_uriResolver);
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != node)
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        TreeWalker walker = new TreeWalker(handler, new org.apache.xml.utils.DOM2Helper(), baseID);
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        walker.traverse(node);
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Use JAXP1.1 ( if possible )
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          javax.xml.parsers.SAXParserFactory factory =
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            javax.xml.parsers.SAXParserFactory.newInstance();
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          factory.setNamespaceAware(true);
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (m_isSecureProcessing)
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (org.xml.sax.SAXException e) {}
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          reader = jaxpParser.getXMLReader();
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (javax.xml.parsers.ParserConfigurationException ex)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new org.xml.sax.SAXException(ex);
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (javax.xml.parsers.FactoryConfigurationError ex1)
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new org.xml.sax.SAXException(ex1.toString());
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (NoSuchMethodError ex2){}
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (AbstractMethodError ame){}
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == reader)
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          reader = XMLReaderFactory.createXMLReader();
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Need to set options!
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reader.setContentHandler(handler);
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reader.parse(isource);
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (StopParseException spe)
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // OK, good.
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerConfigurationException(
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        "getAssociatedStylesheets failed", se);
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (IOException ioe)
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerConfigurationException(
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        "getAssociatedStylesheets failed", ioe);
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return handler.getAssociatedStylesheet();
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a new Transformer object that performs a copy
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the source to the result.
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Transformer object that may be used to perform a transformation
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in a single thread, never null.
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException May throw this during
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            the parse when it is constructing the
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            Templates object and fails.
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TemplatesHandler newTemplatesHandler()
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return new StylesheetHandler(this);
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Set a feature for this <code>TransformerFactory</code> and <code>Transformer</code>s
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or <code>Template</code>s created by this factory.</p>
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Feature names are fully qualified {@link java.net.URI}s.
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Implementations may define their own features.
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * An {@link TransformerConfigurationException} is thrown if this <code>TransformerFactory</code> or the
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>Transformer</code>s or <code>Template</code>s it creates cannot support the feature.
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is possible for an <code>TransformerFactory</code> to expose a feature value but be unable to change its state.
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </p>
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>See {@link javax.xml.transform.TransformerFactory} for full documentation of specific features.</p>
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name Feature name.
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value Is feature state <code>true</code> or <code>false</code>.
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException if this <code>TransformerFactory</code>
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   or the <code>Transformer</code>s or <code>Template</code>s it creates cannot support this feature.
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws NullPointerException If the <code>name</code> parameter is null.
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setFeature(String name, boolean value)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  throws TransformerConfigurationException {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// feature name cannot be null
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (name == null) {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	    throw new NullPointerException(
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  XSLMessages.createMessage(
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      XSLTErrorResources.ER_SET_FEATURE_NULL_NAME, null));
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// secure processing?
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) {
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	    m_isSecureProcessing = value;
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// This implementation does not support the setting of a feature other than
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// the secure processing feature.
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	else
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerConfigurationException(
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XSLMessages.createMessage(
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XSLTErrorResources.ER_UNSUPPORTED_FEATURE,
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[] {name}));
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Look up the value of a feature.
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The feature name is any fully-qualified URI.  It is
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * possible for an TransformerFactory to recognize a feature name but
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be unable to return its value; this is especially true
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the case of an adapter for a SAX1 Parser, which has
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * no way of knowing whether the underlying parser is
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * validating, for example.</p>
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The feature name, which is a fully-qualified URI.
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current state of the feature (true or false).
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getFeature(String name) {
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // feature name cannot be null
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (name == null)
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	throw new NullPointerException(
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XSLMessages.createMessage(
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XSLTErrorResources.ER_GET_FEATURE_NULL_NAME, null));
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Try first with identity comparison, which
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // will be faster.
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((DOMResult.FEATURE == name) || (DOMSource.FEATURE == name)
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (SAXResult.FEATURE == name) || (SAXSource.FEATURE == name)
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (StreamResult.FEATURE == name)
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (StreamSource.FEATURE == name)
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (SAXTransformerFactory.FEATURE == name)
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (SAXTransformerFactory.FEATURE_XMLFILTER == name))
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if ((DOMResult.FEATURE.equals(name))
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (DOMSource.FEATURE.equals(name))
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (SAXResult.FEATURE.equals(name))
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (SAXSource.FEATURE.equals(name))
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (StreamResult.FEATURE.equals(name))
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (StreamSource.FEATURE.equals(name))
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (SAXTransformerFactory.FEATURE.equals(name))
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || (SAXTransformerFactory.FEATURE_XMLFILTER.equals(name)))
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // secure processing?
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING))
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_isSecureProcessing;
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // unknown feature
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Flag set by FEATURE_OPTIMIZE.
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This feature specifies whether to Optimize stylesheet processing. By
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * default it is set to true.
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_optimize = true;
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Flag set by FEATURE_SOURCE_LOCATION.
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This feature specifies whether the transformation phase should
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * keep track of line and column numbers for the input source
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document. Note that this works only when that
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * information is available from the source -- in other words, if you
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * pass in a DOM, there's little we can do for you.
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default is false. Setting it true may significantly
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * increase storage cost per node.
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_source_location = false;
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Flag set by FEATURE_INCREMENTAL.
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This feature specifies whether to produce output incrementally, rather than
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * waiting to finish parsing the input before generating any output. By
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * default this attribute is set to false.
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_incremental = false;
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Allows the user to set specific attributes on the underlying
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implementation.
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the attribute.
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value The value of the attribute; Boolean or String="true"|"false"
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException thrown if the underlying
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implementation doesn't recognize the attribute.
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setAttribute(String name, Object value)
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (name.equals(FEATURE_INCREMENTAL))
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(value instanceof Boolean)
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Accept a Boolean object..
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_incremental = ((Boolean)value).booleanValue();
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(value instanceof String)
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // .. or a String object
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_incremental = (new Boolean((String)value)).booleanValue();
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Give a more meaningful error message
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (name.equals(FEATURE_OPTIMIZE))
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(value instanceof Boolean)
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Accept a Boolean object..
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_optimize = ((Boolean)value).booleanValue();
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(value instanceof String)
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // .. or a String object
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_optimize = (new Boolean((String)value)).booleanValue();
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Give a more meaningful error message
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Custom Xalan feature: annotate DTM with SAX source locator fields.
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // This gets used during SAX2DTM instantiation.
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% Should the name of this field really be in XalanProperties?
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% I hate that it's a global static, but didn't want to change APIs yet.
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if(name.equals(FEATURE_SOURCE_LOCATION))
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(value instanceof Boolean)
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Accept a Boolean object..
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_source_location = ((Boolean)value).booleanValue();
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(value instanceof String)
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // .. or a String object
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_source_location = (new Boolean((String)value)).booleanValue();
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Give a more meaningful error message
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_BAD_VALUE, new Object[]{name, value})); //name + " bad value " + value);
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_NOT_SUPPORTED, new Object[]{name})); //name + "not supported");
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Allows the user to retrieve specific attributes on the underlying
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implementation.
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the attribute.
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return value The value of the attribute.
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException thrown if the underlying
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implementation doesn't recognize the attribute.
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object getAttribute(String name) throws IllegalArgumentException
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (name.equals(FEATURE_INCREMENTAL))
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new Boolean(m_incremental);
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (name.equals(FEATURE_OPTIMIZE))
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new Boolean(m_optimize);
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (name.equals(FEATURE_SOURCE_LOCATION))
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new Boolean(m_source_location);
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_ATTRIB_VALUE_NOT_RECOGNIZED, new Object[]{name})); //name + " attribute not recognized");
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an XMLFilter that uses the given source as the
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation instructions.
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param src The source of the transformation instructions.
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An XMLFilter object, or null if this feature is not supported.
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLFilter newXMLFilter(Source src)
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Templates templates = newTemplates(src);
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if( templates==null ) return null;
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return newXMLFilter(templates);
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an XMLFilter that uses the given source as the
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation instructions.
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templates non-null reference to Templates object.
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An XMLFilter object, or null if this feature is not supported.
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLFilter newXMLFilter(Templates templates)
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new TrAXFilter(templates);
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch( TransformerConfigurationException ex )
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if( m_errorListener != null)
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError( ex );
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return null;
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch( TransformerConfigurationException ex1 )
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex1;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch( TransformerException ex1 )
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex1);
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw ex;
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a TransformerHandler object that can process SAX
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler events into a Result, based on the transformation
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instructions specified by the argument.
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param src The source of the transformation instructions.
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return TransformerHandler ready to transform SAX events.
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TransformerHandler newTransformerHandler(Source src)
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Templates templates = newTemplates(src);
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if( templates==null ) return null;
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return newTransformerHandler(templates);
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a TransformerHandler object that can process SAX
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler events into a Result, based on the Templates argument.
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templates The source of the transformation instructions.
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return TransformerHandler ready to transform SAX events.
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TransformerHandler newTransformerHandler(Templates templates)
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try {
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TransformerImpl transformer =
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (TransformerImpl) templates.newTransformer();
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.setURIResolver(m_uriResolver);
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TransformerHandler th =
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (TransformerHandler) transformer.getInputContentHandler(true);
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return th;
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch( TransformerConfigurationException ex )
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if( m_errorListener != null )
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError( ex );
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return null;
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerConfigurationException ex1 )
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex1;
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerException ex1 )
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex1);
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw ex;
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /** The identity transform string, for support of newTransformerHandler()
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *  and newTransformer().  */
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  private static final String identityTransform =
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    "<xsl:stylesheet " + "xmlns:xsl='http://www.w3.org/1999/XSL/Transform' "
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    + "version='1.0'>" + "<xsl:template match='/|node()'>"
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    + "<xsl:copy-of select='.'/>" + "</xsl:template>" + "</xsl:stylesheet>";
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /** The identity transform Templates, built from identityTransform,
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *  for support of newTransformerHandler() and newTransformer().  */
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  private static Templates m_identityTemplate = null;
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a TransformerHandler object that can process SAX
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler events into a Result.
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return TransformerHandler ready to transform SAX events.
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TransformerHandler newTransformerHandler()
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return new TransformerIdentityImpl(m_isSecureProcessing);
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source into a Transformer object.  Care must
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be given to know that this object can not be used concurrently
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in multiple threads.
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source An object that holds a URL, input stream, etc.
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Transformer object capable of
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * being used for transformation purposes in a single thread.
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException May throw this during the parse when it
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            is constructing the Templates object and fails.
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Transformer newTransformer(Source source)
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Templates tmpl=newTemplates( source );
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /* this can happen if an ErrorListener is present and it doesn't
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         throw any exception in fatalError.
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         The spec says: "a Transformer must use this interface
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         instead of throwing an exception" - the newTemplates() does
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         that, and returns null.
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      */
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if( tmpl==null ) return null;
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Transformer transformer = tmpl.newTransformer();
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.setURIResolver(m_uriResolver);
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return transformer;
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch( TransformerConfigurationException ex )
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if( m_errorListener != null )
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError( ex );
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return null; // TODO: but the API promises to never return null...
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch( TransformerConfigurationException ex1 )
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex1;
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch( TransformerException ex1 )
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException( ex1 );
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw ex;
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a new Transformer object that performs a copy
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the source to the result.
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Transformer object capable of
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * being used for transformation purposes in a single thread.
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException May throw this during
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            the parse when it is constructing the
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            Templates object and it fails.
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Transformer newTransformer() throws TransformerConfigurationException
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new TransformerIdentityImpl(m_isSecureProcessing);
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source into a Templates object, which is likely
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a compiled representation of the source. This Templates object
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * may then be used concurrently across multiple threads.  Creating
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a Templates object allows the TransformerFactory to do detailed
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * performance optimization of transformation instructions, without
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * penalizing runtime transformation.
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source An object that holds a URL, input stream, etc.
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Templates object capable of being used for transformation purposes.
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException May throw this during the parse when it
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            is constructing the Templates object and fails.
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Templates newTemplates(Source source)
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerConfigurationException
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String baseID = source.getSystemId();
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != baseID) {
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       baseID = SystemIDResolver.getAbsoluteURI(baseID);
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (source instanceof DOMSource)
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DOMSource dsource = (DOMSource) source;
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node node = dsource.getNode();
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != node)
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return processFromNode(node, baseID);
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String messageStr = XSLMessages.createMessage(
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XSLTErrorResources.ER_ILLEGAL_DOMSOURCE_INPUT, null);
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(messageStr);
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    TemplatesHandler builder = newTemplatesHandler();
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    builder.setSystemId(baseID);
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      InputSource isource = SAXSource.sourceToInputSource(source);
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isource.setSystemId(baseID);
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XMLReader reader = null;
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (source instanceof SAXSource)
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reader = ((SAXSource) source).getXMLReader();
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == reader)
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Use JAXP1.1 ( if possible )
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          javax.xml.parsers.SAXParserFactory factory =
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            javax.xml.parsers.SAXParserFactory.newInstance();
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          factory.setNamespaceAware(true);
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (m_isSecureProcessing)
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (org.xml.sax.SAXException se) {}
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          reader = jaxpParser.getXMLReader();
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (javax.xml.parsers.ParserConfigurationException ex)
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new org.xml.sax.SAXException(ex);
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (javax.xml.parsers.FactoryConfigurationError ex1)
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new org.xml.sax.SAXException(ex1.toString());
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (NoSuchMethodError ex2){}
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (AbstractMethodError ame){}
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == reader)
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reader = XMLReaderFactory.createXMLReader();
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If you set the namespaces to true, we'll end up getting double
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // xmlns attributes.  Needs to be fixed.  -sb
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // reader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      reader.setContentHandler(builder);
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      reader.parse(isource);
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_errorListener != null)
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError(new TransformerException(se));
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerConfigurationException ex1)
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex1;
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerException ex1)
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex1);
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerConfigurationException(se.getMessage(), se);
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_errorListener != null)
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorListener.fatalError(new TransformerException(e));
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return null;
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerConfigurationException ex1)
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw ex1;
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (TransformerException ex1)
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerConfigurationException(ex1);
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerConfigurationException(e.getMessage(), e);
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return builder.getTemplates();
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The object that implements the URIResolver interface,
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null.
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  URIResolver m_uriResolver;
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set an object that will be used to resolve URIs used in
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * xsl:import, etc.  This will be used as the default for the
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation.
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param resolver An object that implements the URIResolver interface,
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null.
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setURIResolver(URIResolver resolver)
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_uriResolver = resolver;
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the object that will be used to resolve URIs used in
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * xsl:import, etc.  This will be used as the default for the
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation.
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The URIResolver that was set with setURIResolver.
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public URIResolver getURIResolver()
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_uriResolver;
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The error listener.   */
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ErrorListener m_errorListener = new org.apache.xml.utils.DefaultErrorHandler(false);
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the error listener in effect for the TransformerFactory.
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A non-null reference to an error listener.
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ErrorListener getErrorListener()
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_errorListener;
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set an error listener for the TransformerFactory.
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param listener Must be a non-null reference to an ErrorListener.
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException if the listener argument is null.
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setErrorListener(ErrorListener listener)
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == listener)
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_ERRORLISTENER, null));
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // "ErrorListener");
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_errorListener = listener;
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the state of the secure processing feature.
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return state of the secure processing feature.
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isSecureProcessing()
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_isSecureProcessing;
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1044