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: TransformerImpl.java 475979 2006-11-16 23:32:48Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.transformer;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.StringWriter;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Stack;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.StringTokenizer;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.parsers.DocumentBuilder;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.parsers.DocumentBuilderFactory;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.parsers.ParserConfigurationException;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.OutputKeys;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Result;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.URIResolver;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.dom.DOMResult;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.dom.DOMSource;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXResult;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXSource;
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamResult;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamSource;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.extensions.ExtensionsTable;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.Method;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.Serializer;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializerFactory;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.AVT;
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.Constants;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemAttributeSet;
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemForEach;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemSort;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemTemplate;
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemTemplateElement;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemTextLiteral;
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.ElemVariable;
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.OutputProperties;
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.Stylesheet;
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.StylesheetComposed;
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.StylesheetRoot;
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.XUnresolvedVariable;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMManager;
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMWSFilter;
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.ToSAXHandler;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.ToTextStream;
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.ToXMLSAXHandler;
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializationHandler;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.BoolStack;
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.DOMBuilder;
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.NodeVector;
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.ObjectPool;
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.ObjectStack;
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SAXSourceLocator;
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.ThreadControllerWrapper;
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Arg;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExtensionsProvider;
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.VariableStack;
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.functions.FuncExtFunction;
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Attributes;
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ContentHandler;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXNotRecognizedException;
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXNotSupportedException;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ext.LexicalHandler;
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class implements the
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link javax.xml.transform.Transformer} interface, and is the core
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * representation of the transformation execution.</p>
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class TransformerImpl extends Transformer
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        implements Runnable, DTMWSFilter, ExtensionsProvider, org.apache.xml.serializer.SerializerTrace
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Synch object to gaurd against setting values from the TrAX interface
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // or reentry while the transform is going on.
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** NEEDSDOC Field m_reentryGuard          */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Boolean m_reentryGuard = new Boolean(true);
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is null unless we own the stream.
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private java.io.FileOutputStream m_outputStream = null;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The thread that the transformer is running on. */
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Thread m_transformThread;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The base URL of the source tree. */
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_urlOfSource = null;
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The Result object at the start of the transform, if any. */
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Result m_outputTarget = null;
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The output format object set by the user.  May be null.
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private OutputProperties m_outputFormat;
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The content handler for the source input tree.
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ContentHandler m_inputContentHandler;
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The content handler for the result tree.
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ContentHandler m_outputContentHandler = null;
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  /*
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * Use member variable to store param variables as they're
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * being created, use member variable so we don't
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * have to create a new vector every time.
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   */
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  private Vector m_newVars = new Vector();
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A pool of ResultTreeHandlers, for serialization of a subtree to text.
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Please note that each of these also holds onto a Text Serializer.
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ObjectPool m_textResultHandlerObjectPool =
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new ObjectPool(ToTextStream.class);
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Related to m_textResultHandlerObjectPool, this is a pool of
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * StringWriters, which are passed to the Text Serializers.
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (I'm not sure if this is really needed any more.  -sb)
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ObjectPool m_stringWriterObjectPool =
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new ObjectPool(StringWriter.class);
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A static text format object, which can be used over and
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * over to create the text serializers.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private OutputProperties m_textformat = new OutputProperties(Method.TEXT);
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Commenteded out in response to problem reported by
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Nicola Brown <Nicola.Brown@jacobsrimell.com>
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  /**
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * Flag to let us know if an exception should be reported inside the
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * postExceptionFromThread method.  This is needed if the transform is
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * being generated from SAX events, and thus there is no central place
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * to report the exception from.  (An exception is usually picked up in
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * the main thread from the transform thread in {@link #transform(Source source)}
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * from {@link #getExceptionThrown()}. )
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   */
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  private boolean m_reportInPostExceptionFromThread = false;
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A node vector used as a stack to track the current
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ElemTemplateElement.  Needed for the
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * org.apache.xalan.transformer.TransformState interface,
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * so a tool can discover the calling template. Note the use of an array
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for this limits the recursion depth to 4K.
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ObjectStack m_currentTemplateElements
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      = new ObjectStack(XPathContext.RECURSIONLIMIT);
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The top of the currentTemplateElements stack. */
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //int m_currentTemplateElementsTop = 0;
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A node vector used as a stack to track the current
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ElemTemplate that was matched.
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Needed for the
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * org.apache.xalan.transformer.TransformState interface,
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * so a tool can discover the matched template
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Stack m_currentMatchTemplates = new Stack();
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A node vector used as a stack to track the current
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node that was matched.
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Needed for the
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * org.apache.xalan.transformer.TransformState interface,
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * so a tool can discover the matched
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node.
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  NodeVector m_currentMatchedNodes = new NodeVector();
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The root of a linked set of stylesheets.
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private StylesheetRoot m_stylesheetRoot = null;
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If this is set to true, do not warn about pattern
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * match conflicts.
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_quietConflictWarnings = true;
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The liason to the XML parser, so the XSL processor
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * can handle included files, and the like, and do the
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * initial parse of the XSL document.
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private XPathContext m_xcontext;
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Output handler to bottleneck SAX events.
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private SerializationHandler m_serializationHandler;
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The key manager, which manages xsl:keys. */
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private KeyManager m_keyManager = new KeyManager();
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Stack for the purposes of flagging infinite recursion with
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute sets.
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Stack m_attrSetStack = null;
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The table of counters for xsl:number support.
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  CountersTable m_countersTable = null;
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Is > 0 when we're processing a for-each.
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  BoolStack m_currentTemplateRuleIsNull = new BoolStack();
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Keeps track of the result delivered by any EXSLT <code>func:result</code>
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instruction that has been executed for the currently active EXSLT
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>func:function</code>
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ObjectStack m_currentFuncResult = new ObjectStack();
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The message manager, which manages error messages, warning
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * messages, and other types of message events.
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private MsgMgr m_msgMgr;
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The flag for the setting of the optimize feature;
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This flag should have the same value as the FEATURE_OPTIMIZE feature
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * which is set by the TransformerFactory.setAttribut() method before a
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Transformer is created
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_optimizer = true;
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The flag for the setting of the incremental feature;
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This flag should have the same value as the FEATURE_INCREMENTAL feature
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * which is set by the TransformerFactory.setAttribut() method before a
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Transformer is created
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_incremental = false;
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The flag for the setting of the source_location feature;
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This flag should have the same value as the FEATURE_SOURCE_LOCATION feature
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * which is set by the TransformerFactory.setAttribut() method before a
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Transformer is created
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_source_location = false;
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The SAX error handler, where errors and warnings are sent.
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ErrorListener m_errorHandler =
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new org.apache.xml.utils.DefaultErrorHandler(false);
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the transform thread throws an exception, the exception needs to
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be stashed away so that the main thread can pass it on to the
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * client.
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Exception m_exceptionThrown = null;
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is needed for support of setSourceTreeDocForThread(Node doc),
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * which must be called in order for the transform thread's run
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method to obtain the root of the source tree to be transformed.
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_doc;
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Flag to to tell if the tranformer needs to be reset. */
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_hasBeenReset = false;
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** NEEDSDOC Field m_shouldReset          */
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_shouldReset = true;
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A stack of current template modes.
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Stack m_modes = new Stack();
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // SECTION: Constructor
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a TransformerImpl.
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param stylesheet The root of the stylesheet tree.
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TransformerImpl(StylesheetRoot stylesheet)
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   // throws javax.xml.transform.TransformerException
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_optimizer = stylesheet.getOptimizer();
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_incremental = stylesheet.getIncremental();
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_source_location = stylesheet.getSource_location();
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setStylesheet(stylesheet);
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xPath = new XPathContext(this);
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xPath.setIncremental(m_incremental);
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xPath.getDTMManager().setIncremental(m_incremental);
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xPath.setSource_location(m_source_location);
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xPath.getDTMManager().setSource_location(m_source_location);
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (stylesheet.isSecureProcessing())
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xPath.setSecureProcessing(true);
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setXPathContext(xPath);
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    getXPathContext().setNamespaceContext(stylesheet);
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ================ ExtensionsTable ===================
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The table of ExtensionHandlers.
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ExtensionsTable m_extensionsTable = null;
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the extensions table object.
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The extensions table.
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ExtensionsTable getExtensionsTable()
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_extensionsTable;
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the stylesheet contains extensions, set the extensions table object.
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sroot The stylesheet.
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void setExtensionsTable(StylesheetRoot sroot)
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       throws javax.xml.transform.TransformerException
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (sroot.getExtensions() != null)
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_extensionsTable = new ExtensionsTable(sroot);
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (javax.xml.transform.TransformerException te)
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {te.printStackTrace();}
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //== Implementation of the XPath ExtensionsProvider interface.
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean functionAvailable(String ns, String funcName)
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getExtensionsTable().functionAvailable(ns, funcName);
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean elementAvailable(String ns, String elemName)
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getExtensionsTable().elementAvailable(ns, elemName);
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object extFunction(String ns, String funcName,
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            Vector argVec, Object methodKey)
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {//System.out.println("TransImpl.extFunction() " + ns + " " + funcName +" " + getExtensionsTable());
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getExtensionsTable().extFunction(ns, funcName,
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                        argVec, methodKey,
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                        getXPathContext().getExpressionContext());
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object extFunction(FuncExtFunction extFunction, Vector argVec)
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getExtensionsTable().extFunction(extFunction, argVec,
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                            getXPathContext().getExpressionContext());
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //=========================
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset the state.  This needs to be called after a process() call
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is invoked, if the processor is to be used again.
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void reset()
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_hasBeenReset && m_shouldReset)
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_hasBeenReset = true;
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (this.m_outputStream != null)
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_outputStream.close();
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (java.io.IOException ioe){}
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_outputStream = null;
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // I need to look more carefully at which of these really
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // needs to be reset.
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_countersTable = null;
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.reset();
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.getVarStack().reset();
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      resetUserParameters();
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentTemplateElements.removeAllElements();
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentMatchTemplates.removeAllElements();
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentMatchedNodes.removeAllElements();
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_serializationHandler = null;
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_outputTarget = null;
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_keyManager = new KeyManager();
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_attrSetStack = null;
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_countersTable = null;
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentTemplateRuleIsNull = new BoolStack();
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // m_xmlSource = null; // android-removed
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_doc = DTM.NULL;
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // m_isTransformDone = false; // android-removed
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_transformThread = null;
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // m_inputContentHandler = null;
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // For now, reset the document cache each time.
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.getSourceTreeManager().reset();
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    m_reportInPostExceptionFromThread = false;
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ========= Transformer Interface Implementation ==========
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the thread that the transform process is on.
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The thread that the transform process is on, or null.
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Thread getTransformThread()
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_transformThread;
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the thread that the transform process is on.
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param t The transform thread, may be null.
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setTransformThread(Thread t)
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_transformThread = t;
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** NEEDSDOC Field m_hasTransformThreadErrorCatcher          */
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_hasTransformThreadErrorCatcher = false;
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return true if the transform was initiated from the transform method,
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * otherwise it was probably done from a pure parse events.
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC ($objectName$) @return
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean hasTransformThreadErrorCatcher()
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_hasTransformThreadErrorCatcher;
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /**
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source tree to SAX parse events.
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source  The input for the source tree.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transform(Source source) throws TransformerException
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                transform(source, true);
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source tree to SAX parse events.
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source  The input for the source tree.
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldRelease  Flag indicating whether to release DTMManager.
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transform(Source source, boolean shouldRelease) throws TransformerException
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Patch for bugzilla #13863.  If we don't reset the namespaceContext
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // then we will get a NullPointerException if transformer is reused
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // (for stylesheets that use xsl:key).  Not sure if this should go
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // here or in reset(). -is
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(getXPathContext().getNamespaceContext() == null){
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         getXPathContext().setNamespaceContext(getStylesheet());
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String base = source.getSystemId();
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If no systemID of the source, use the base of the stylesheet.
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == base)
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        base = m_stylesheetRoot.getBaseIdentifier();
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // As a last resort, use the current user dir.
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == base)
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String currentDir = "";
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          currentDir = System.getProperty("user.dir");
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (SecurityException se) {}// user.dir not accessible from applet
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (currentDir.startsWith(java.io.File.separator))
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          base = "file://" + currentDir;
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          base = "file:///" + currentDir;
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        base = base + java.io.File.separatorChar
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               + source.getClass().getName();
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      setBaseURLOfSource(base);
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMManager mgr = m_xcontext.getDTMManager();
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /*
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * According to JAXP1.2, new SAXSource()/StreamSource()
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * should create an empty input tree, with a default root node.
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * new DOMSource()creates an empty document using DocumentBuilder.
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * newDocument(); Use DocumentBuilder.newDocument() for all 3 situations,
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * since there is no clear spec. how to create an empty tree when
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * both SAXSource() and StreamSource() are used.
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((source instanceof StreamSource && source.getSystemId()==null &&
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         ((StreamSource)source).getInputStream()==null &&
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         ((StreamSource)source).getReader()==null)||
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (source instanceof SAXSource &&
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         ((SAXSource)source).getInputSource()==null &&
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         ((SAXSource)source).getXMLReader()==null )||
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (source instanceof DOMSource && ((DOMSource)source).getNode()==null)){
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          DocumentBuilderFactory builderF =
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   DocumentBuilderFactory.newInstance();
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          DocumentBuilder builder = builderF.newDocumentBuilder();
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String systemID = source.getSystemId();
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          source = new DOMSource(builder.newDocument());
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Copy system ID from original, empty Source to new Source
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (systemID != null) {
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            source.setSystemId(systemID);
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (ParserConfigurationException e) {
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          fatalError(e);
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM dtm = mgr.getDTM(source, false, this, true, true);
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      dtm.setDocumentBaseURI(base);
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean hardDelete = true;  // %REVIEW% I have to think about this. -sb
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	// NOTE: This will work because this is _NOT_ a shared DTM, and thus has
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	// only a single Document node. If it could ever be an RTF or other
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	// shared DTM, look at dtm.getDocumentRoot(nodeHandle).
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.transformNode(dtm.getDocument());
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (shouldRelease)
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          mgr.release(dtm, hardDelete);
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Kick off the parse.  When the ContentHandler gets
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the startDocument event, it will call transformNode( node ).
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // reader.parse( xmlSource );
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // This has to be done to catch exceptions thrown from
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the transform thread spawned by the STree handler.
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Exception e = getExceptionThrown();
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != e)
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (e instanceof javax.xml.transform.TransformerException)
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw (javax.xml.transform.TransformerException) e;
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (e instanceof org.apache.xml.utils.WrappedRuntimeException)
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          fatalError(
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              ((org.apache.xml.utils.WrappedRuntimeException) e).getException());
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new javax.xml.transform.TransformerException(e);
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (null != m_serializationHandler)
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler.endDocument();
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.apache.xml.utils.WrappedRuntimeException wre)
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Throwable throwable = wre.getException();
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (throwable
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             instanceof org.apache.xml.utils.WrappedRuntimeException)
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throwable =
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ((org.apache.xml.utils.WrappedRuntimeException) throwable).getException();
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      fatalError(throwable);
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Patch attributed to David Eisenberg <david@catcode.com>
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXParseException spe)
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      fatalError(spe);
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_errorHandler.fatalError(new TransformerException(se));
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_hasTransformThreadErrorCatcher = false;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // This looks to be redundent to the one done in TransformNode.
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      reset();
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void fatalError(Throwable throwable) throws TransformerException
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (throwable instanceof org.xml.sax.SAXParseException)
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_errorHandler.fatalError(new TransformerException(throwable.getMessage(),new SAXSourceLocator((org.xml.sax.SAXParseException)throwable)));
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_errorHandler.fatalError(new TransformerException(throwable));
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the base URL of the source.
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param base
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The base URL of the source tree, or null.
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setBaseURLOfSource(String base)
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_urlOfSource = base;
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an output property that is in effect for the
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation.  The property specified may be a property
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that was set with setOutputProperty, or it may be a
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * property specified in the stylesheet.
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param qnameString
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The string value of the output property, or null
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * if no property was found.
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException If the property is not supported.
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see javax.xml.transform.OutputKeys
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getOutputProperty(String qnameString)
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String value = null;
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    OutputProperties props = getOutputFormat();
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    value = props.getProperty(qnameString);
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == value)
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!OutputProperties.isLegalPropertyKey(qnameString))
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_OUTPUT_PROPERTY_NOT_RECOGNIZED, new Object[]{qnameString})); //"output property not recognized: "
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                           //+ qnameString);
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return value;
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the value of a property, without using the default properties.  This
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * can be used to test if a property has been explicitly set by the stylesheet
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or user.
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param qnameString
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The value of the property, or null if not found.
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException If the property is not supported,
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and is not namespaced.
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getOutputPropertyNoDefault(String qnameString)
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String value = null;
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    OutputProperties props = getOutputFormat();
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    value = (String) props.getProperties().get(qnameString);
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == value)
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!OutputProperties.isLegalPropertyKey(qnameString))
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_OUTPUT_PROPERTY_NOT_RECOGNIZED, new Object[]{qnameString})); //"output property not recognized: "
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          // + qnameString);
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return value;
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method is used to set or override the value
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the effective xsl:output attribute values
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * specified in the stylesheet.
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The recognized standard output properties are:
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <ul>
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>cdata-section-elements
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>doctype-system
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>doctype-public
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>indent
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>media-type
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>method
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>omit-xml-declaration
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>standalone
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>version
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </ul>
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For example:
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <pre>
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   tran.setOutputProperty("standalone", "yes");
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </pre>
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * In the case of the cdata-section-elements property,
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the value should be a whitespace separated list of
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * element names.  The element name is the local name
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the element, if it is in no namespace, or, the URI
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in braces followed immediately by the local name
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * if the element is in that namespace. For example:
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <pre>
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tran.setOutputProperty(
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   "cdata-section-elements",
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   "elem1 {http://example.uri}elem2 elem3");
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </pre>
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The recognized Xalan extension elements are:
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <ul>
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>content-handler
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>entities
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>indent-amount
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>line-separator
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>omit-meta-tag
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <li>use-url-escaping
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </ul>
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * These must be in the extension namespace of
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "http://xml.apache.org/xalan".  This is accomplished
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * by putting the namespace URI in braces before the
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * property name, for example:
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <pre>
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   tran.setOutputProperty(
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     "{http://xml.apache.org/xalan}line-separator" ,
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     "\n");
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </pre>
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The property name.
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value The requested value for the property.
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException if the property name is not legal.
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setOutputProperty(String name, String value)
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Get the output format that was set by the user, otherwise get the
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // output format from the stylesheet.
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_outputFormat)
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_outputFormat =
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          (OutputProperties) getStylesheet().getOutputComposed().clone();
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!OutputProperties.isLegalPropertyKey(name))
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_OUTPUT_PROPERTY_NOT_RECOGNIZED, new Object[]{name})); //"output property not recognized: "
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                           //+ name);
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_outputFormat.setProperty(name, value);
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the output properties for the transformation.  These
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties will override properties set in the templates
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with xsl:output.
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>If argument to this function is null, any properties
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * previously set will be removed.</p>
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param oformat A set of output properties that will be
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * used to override any of the same properties in effect
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the transformation.
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see javax.xml.transform.OutputKeys
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see java.util.Properties
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException if any of the argument keys are not
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * recognized and are not namespace qualified.
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setOutputProperties(Properties oformat)
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		throws IllegalArgumentException
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != oformat)
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // See if an *explicit* method was set.
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String method = (String) oformat.get(OutputKeys.METHOD);
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != method)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_outputFormat = new OutputProperties(method);
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if(m_outputFormat==null)
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_outputFormat = new OutputProperties();
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_outputFormat.copyFrom(oformat);
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // copyFrom does not set properties that have been already set, so
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // this must be called after, which is a bit in the reverse from
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // what one might think.
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_outputFormat.copyFrom(m_stylesheetRoot.getOutputProperties());
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else {
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // if oformat is null JAXP says that any props previously set are removed
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // and we are to revert back to those in the templates object (i.e. Stylesheet).
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_outputFormat = null;
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a copy of the output properties for the transformation.  These
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties will override properties set in the templates
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with xsl:output.
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Note that mutation of the Properties object returned will not
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * effect the properties that the transformation contains.</p>
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  A copy of the set of output properties in effect
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the next transformation.
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC ($objectName$) @return
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Properties getOutputProperties()
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (Properties) getOutputFormat().getProperties().clone();
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Create a result ContentHandler from a Result object, based
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * on the current OutputProperties.
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param outputTarget Where the transform result should go,
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * should not be null.
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A valid ContentHandler that will create the
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * result tree when it is fed SAX events.
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws TransformerException
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public SerializationHandler createSerializationHandler(Result outputTarget)
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       SerializationHandler xoh =
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        createSerializationHandler(outputTarget, getOutputFormat());
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       return xoh;
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Create a ContentHandler from a Result object and an OutputProperties.
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param outputTarget Where the transform result should go,
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * should not be null.
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param format The OutputProperties object that will contain
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * instructions on how to serialize the output.
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A valid ContentHandler that will create the
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * result tree when it is fed SAX events.
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws TransformerException
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public SerializationHandler createSerializationHandler(
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Result outputTarget, OutputProperties format)
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              throws TransformerException
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SerializationHandler xoh;
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If the Result object contains a Node, then create
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // a ContentHandler that will add nodes to the input node.
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      org.w3c.dom.Node outputNode = null;
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (outputTarget instanceof DOMResult)
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        outputNode = ((DOMResult) outputTarget).getNode();
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        org.w3c.dom.Node nextSibling = ((DOMResult)outputTarget).getNextSibling();
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        org.w3c.dom.Document doc;
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        short type;
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != outputNode)
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          type = outputNode.getNodeType();
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          doc = (org.w3c.dom.Node.DOCUMENT_NODE == type)
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ? (org.w3c.dom.Document) outputNode
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                : outputNode.getOwnerDocument();
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          boolean isSecureProcessing = m_stylesheetRoot.isSecureProcessing();
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          doc = org.apache.xml.utils.DOMHelper.createDocument(isSecureProcessing);
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          outputNode = doc;
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          type = outputNode.getNodeType();
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ((DOMResult) outputTarget).setNode(outputNode);
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        DOMBuilder handler =
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          (org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE == type)
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ? new DOMBuilder(doc, (org.w3c.dom.DocumentFragment) outputNode)
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          : new DOMBuilder(doc, outputNode);
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nextSibling != null)
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          handler.setNextSibling(nextSibling);
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String encoding = format.getProperty(OutputKeys.ENCODING);
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xoh = new ToXMLSAXHandler(handler, (LexicalHandler)handler, encoding);
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (outputTarget instanceof SAXResult)
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ContentHandler handler = ((SAXResult) outputTarget).getHandler();
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == handler)
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           throw new IllegalArgumentException(
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             "handler can not be null for a SAXResult");
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        LexicalHandler lexHandler;
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (handler instanceof LexicalHandler)
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            lexHandler = (LexicalHandler)  handler;
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            lexHandler = null;
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String encoding = format.getProperty(OutputKeys.ENCODING);
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String method = format.getProperty(OutputKeys.METHOD);
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ToXMLSAXHandler toXMLSAXHandler = new ToXMLSAXHandler(handler, lexHandler, encoding);
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        toXMLSAXHandler.setShouldOutputNSAttr(false);
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xoh = toXMLSAXHandler;
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String publicID = format.getProperty(OutputKeys.DOCTYPE_PUBLIC);
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String systemID = format.getProperty(OutputKeys.DOCTYPE_SYSTEM);
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (systemID != null)
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xoh.setDoctypeSystem(systemID);
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (publicID != null)
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xoh.setDoctypePublic(publicID);
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (handler instanceof TransformerClient) {
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XalanTransformState state = new XalanTransformState();
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ((TransformerClient)handler).setTransformState(state);
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ((ToSAXHandler)xoh).setTransformState(state);
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Otherwise, create a ContentHandler that will serialize the
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // result tree to either a stream or a writer.
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (outputTarget instanceof StreamResult)
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        StreamResult sresult = (StreamResult) outputTarget;
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          SerializationHandler serializer =
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            (SerializationHandler) SerializerFactory.getSerializer(format.getProperties());
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (null != sresult.getWriter())
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.setWriter(sresult.getWriter());
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else if (null != sresult.getOutputStream())
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.setOutputStream(sresult.getOutputStream());
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else if (null != sresult.getSystemId())
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String fileURL = sresult.getSystemId();
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fileURL.startsWith("file:///"))
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (fileURL.substring(8).indexOf(":") >0)
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fileURL = fileURL.substring(8);
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              else
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fileURL = fileURL.substring(7);
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if (fileURL.startsWith("file:/"))
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (fileURL.substring(6).indexOf(":") >0)
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fileURL = fileURL.substring(6);
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  else
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fileURL = fileURL.substring(5);
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_outputStream = new java.io.FileOutputStream(fileURL);
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.setOutputStream(m_outputStream);
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xoh = serializer;
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_OUTPUT_SPECIFIED, null)); //"No output specified!");
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // handler = serializer.asContentHandler();
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //  this.setSerializer(serializer);
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xoh = serializer;
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        catch (UnsupportedEncodingException uee)
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        {
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          throw new TransformerException(uee);
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        }
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (IOException ioe)
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new TransformerException(ioe);
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_CANNOT_TRANSFORM_TO_RESULT_TYPE, new Object[]{outputTarget.getClass().getName()})); //"Can't transform to a Result of type "
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       //+ outputTarget.getClass().getName()
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       //+ "!");
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // before we forget, lets make the created handler hold a reference
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // to the current TransformImpl object
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xoh.setTransformer(this);
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SourceLocator srcLocator = getStylesheet();
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xoh.setSourceLocator(srcLocator);
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return xoh;
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /**
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source tree to the output result.
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xmlSource  The input for the source tree.
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param outputTarget The output source target.
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transform(Source xmlSource, Result outputTarget)
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                transform(xmlSource, outputTarget, true);
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source tree to the output result.
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xmlSource  The input for the source tree.
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param outputTarget The output source target.
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldRelease  Flag indicating whether to release DTMManager.
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transform(Source xmlSource, Result outputTarget, boolean shouldRelease)
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SerializationHandler xoh = createSerializationHandler(outputTarget);
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.setSerializationHandler(xoh);
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_outputTarget = outputTarget;
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transform(xmlSource, shouldRelease);
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source node to the output result, if the
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processor supports the "http://xml.org/trax/features/dom/input"
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * feature.
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Do we need a Node version of this?
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node  The input source node, which can be any valid DTM node.
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param outputTarget The output source target.
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transformNode(int node, Result outputTarget)
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SerializationHandler xoh = createSerializationHandler(outputTarget);
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.setSerializationHandler(xoh);
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputTarget = outputTarget;
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    transformNode(node);
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Process the source node to the output result, if the
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processor supports the "http://xml.org/trax/features/dom/input"
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * feature.
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Do we need a Node version of this?
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node  The input source node, which can be any valid DTM node.
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transformNode(int node) throws TransformerException
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //dml
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setExtensionsTable(getStylesheet());
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Make sure we're not writing to the same output content handler.
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_serializationHandler)
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_hasBeenReset = false;
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XPathContext xctxt = getXPathContext();
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM dtm = xctxt.getDTM(node);
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        pushGlobalVars(node);
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // ==========
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Give the top-level templates a chance to pass information into
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // the context (this is mainly for setting up tables for extensions).
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        StylesheetRoot stylesheet = this.getStylesheet();
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int n = stylesheet.getGlobalImportCount();
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < n; i++)
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          StylesheetComposed imported = stylesheet.getGlobalImport(i);
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int includedCount = imported.getIncludeCountComposed();
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          for (int j = -1; j < includedCount; j++)
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Stylesheet included = imported.getIncludeComposed(j);
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            included.runtimeInit(this);
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (ElemTemplateElement child = included.getFirstChildElem();
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    child != null; child = child.getNextSiblingElem())
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              child.runtimeInit(this);
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // ===========
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("Calling applyTemplateToNode - "+Thread.currentThread().getName());
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        DTMIterator dtmIter = new org.apache.xpath.axes.SelfIteratorNoPredicate();
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dtmIter.setRoot(node, xctxt);
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xctxt.pushContextNodeList(dtmIter);
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          this.applyTemplateToNode(null, null, node);
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finally
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popContextNodeList();
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // m_stylesheetRoot.getStartRule().execute(this);
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("Done with applyTemplateToNode - "+Thread.currentThread().getName());
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != m_serializationHandler)
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_serializationHandler.endDocument();
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (Exception se)
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println(Thread.currentThread().getName()+" threw an exception! "
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //                   +se.getMessage());
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If an exception was thrown, we need to make sure that any waiting
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // handlers can terminate, which I guess is best done by sending
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // an endDocument.
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // SAXSourceLocator
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while(se instanceof org.apache.xml.utils.WrappedRuntimeException)
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          Exception e = ((org.apache.xml.utils.WrappedRuntimeException)se).getException();
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(null != e)
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            se = e;
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != m_serializationHandler)
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          try
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(se instanceof org.xml.sax.SAXParseException)
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_serializationHandler.fatalError((org.xml.sax.SAXParseException)se);
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if(se instanceof TransformerException)
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              TransformerException te = ((TransformerException)se);
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              SAXSourceLocator sl = new SAXSourceLocator( te.getLocator() );
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_serializationHandler.fatalError(new org.xml.sax.SAXParseException(te.getMessage(), sl, te));
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_serializationHandler.fatalError(new org.xml.sax.SAXParseException(se.getMessage(), new SAXSourceLocator(), se));
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          catch (Exception e){}
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(se instanceof TransformerException)
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorHandler.fatalError((TransformerException)se);
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if(se instanceof org.xml.sax.SAXParseException)
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorHandler.fatalError(new TransformerException(se.getMessage(),
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      new SAXSourceLocator((org.xml.sax.SAXParseException)se),
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      se));
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_errorHandler.fatalError(new TransformerException(se));
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.reset();
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a SAX2 ContentHandler for the input.
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A valid ContentHandler, which should never be null, as
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * long as getFeature("http://xml.org/trax/features/sax/input")
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * returns true.
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ContentHandler getInputContentHandler()
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getInputContentHandler(false);
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a SAX2 ContentHandler for the input.
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doDocFrag true if a DocumentFragment should be created as
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the root, rather than a Document.
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A valid ContentHandler, which should never be null, as
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * long as getFeature("http://xml.org/trax/features/sax/input")
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * returns true.
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ContentHandler getInputContentHandler(boolean doDocFrag)
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_inputContentHandler)
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      if(null == m_urlOfSource && null != m_stylesheetRoot)
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //        m_urlOfSource = m_stylesheetRoot.getBaseIdentifier();
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_inputContentHandler = new TransformerHandlerImpl(this, doDocFrag,
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              m_urlOfSource);
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_inputContentHandler;
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the output properties for the transformation.  These
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties will override properties set in the templates
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with xsl:output.
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param oformat A valid OutputProperties object (which will
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * not be mutated), or null.
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setOutputFormat(OutputProperties oformat)
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputFormat = oformat;
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the output properties used for the transformation.
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the output format that was set by the user,
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * otherwise the output format from the stylesheet.
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public OutputProperties getOutputFormat()
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Get the output format that was set by the user, otherwise get the
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // output format from the stylesheet.
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    OutputProperties format = (null == m_outputFormat)
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              ? getStylesheet().getOutputComposed()
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              : m_outputFormat;
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return format;
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set a parameter for the templates.
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the parameter.
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace The namespace of the parameter.
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value The value object.  This can be any valid Java object
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * -- it's up to the processor to provide the proper
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * coersion to the object, or simply pass it on for use
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in extensions.
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setParameter(String name, String namespace, Object value)
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    VariableStack varstack = getXPathContext().getVarStack();
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    QName qname = new QName(namespace, name);
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XObject xobject = XObject.create(value, getXPathContext());
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StylesheetRoot sroot = m_stylesheetRoot;
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Vector vars = sroot.getVariablesAndParamsComposed();
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int i = vars.size();
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (--i >= 0)
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ElemVariable variable = (ElemVariable)vars.elementAt(i);
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(variable.getXSLToken() == Constants.ELEMNAME_PARAMVARIABLE &&
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         variable.getName().equals(qname))
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          varstack.setGlobalVariable(i, xobject);
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** NEEDSDOC Field m_userParams          */
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Vector m_userParams;
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set a parameter for the transformation.
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the parameter,
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *             which may have a namespace URI.
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value The value object.  This can be any valid Java object
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * -- it's up to the processor to provide the proper
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * coersion to the object, or simply pass it on for use
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in extensions.
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setParameter(String name, Object value)
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (value == null) {
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_INVALID_SET_PARAM_VALUE, new Object[]{name}));
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StringTokenizer tokenizer = new StringTokenizer(name, "{}", false);
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // The first string might be the namespace, or it might be
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the local name, if the namespace is null.
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String s1 = tokenizer.nextToken();
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String s2 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_userParams)
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_userParams = new Vector();
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == s2)
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        replaceOrPushUserParam(new QName(s1), XObject.create(value, getXPathContext()));
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setParameter(s1, null, value);
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        replaceOrPushUserParam(new QName(s1, s2), XObject.create(value, getXPathContext()));
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setParameter(s2, s1, value);
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (java.util.NoSuchElementException nsee)
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Should throw some sort of an error.
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method replaceOrPushUserParam
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param qname
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param xval
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void replaceOrPushUserParam(QName qname, XObject xval)
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_userParams.size();
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = n - 1; i >= 0; i--)
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Arg arg = (Arg) m_userParams.elementAt(i);
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (arg.getQName().equals(qname))
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_userParams.setElementAt(new Arg(qname, xval, true), i);
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_userParams.addElement(new Arg(qname, xval, true));
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a parameter that was explicitly set with setParameter
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or setParameters.
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param name
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A parameter that has been set with setParameter
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or setParameters,
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * *not* all the xsl:params on the stylesheet (which require
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a transformation Source to be evaluated).
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object getParameter(String name)
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // VariableStack varstack = getXPathContext().getVarStack();
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // The first string might be the namespace, or it might be
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the local name, if the namespace is null.
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      QName qname = QName.getQNameFromString(name);
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_userParams)
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int n = m_userParams.size();
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = n - 1; i >= 0; i--)
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arg arg = (Arg) m_userParams.elementAt(i);
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (arg.getQName().equals(qname))
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return arg.getVal().object();
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (java.util.NoSuchElementException nsee)
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Should throw some sort of an error.
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset parameters that the user specified for the transformation.
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Called during transformer.reset() after we have cleared the
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * variable stack. We need to make sure that user params are
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reset so that the transformer object can be reused.
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void resetUserParameters()
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_userParams)
15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int n = m_userParams.size();
15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = n - 1; i >= 0; i--)
15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arg arg = (Arg) m_userParams.elementAt(i);
15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        QName name = arg.getQName();
15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The first string might be the namespace, or it might be
15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // the local name, if the namespace is null.
15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String s1 = name.getNamespace();
15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String s2 = name.getLocalPart();
15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setParameter(s2, s1, arg.getVal().object());
15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (java.util.NoSuchElementException nsee)
15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Should throw some sort of an error.
15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set a bag of parameters for the transformation. Note that
15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * these will not be additive, they will replace the existing
15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * set of parameters.
15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param params
15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setParameters(Properties params)
15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clearParameters();
15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Enumeration names = params.propertyNames();
15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (names.hasMoreElements())
15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String name = params.getProperty((String) names.nextElement());
15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      StringTokenizer tokenizer = new StringTokenizer(name, "{}", false);
15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The first string might be the namespace, or it might be
15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // the local name, if the namespace is null.
15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String s1 = tokenizer.nextToken();
15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String s2 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == s2)
15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          setParameter(s1, null, params.getProperty(name));
15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          setParameter(s2, s1, params.getProperty(name));
15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (java.util.NoSuchElementException nsee)
15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should throw some sort of an error.
15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset the parameters to a null list.
16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void clearParameters()
16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      VariableStack varstack = new VariableStack();
16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.setVarStack(varstack);
16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_userParams = null;
16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Internal -- push the global variables from the Stylesheet onto
16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the context's runtime variable stack.
16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>If we encounter a variable
16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that is already defined in the variable stack, we ignore it.  This
16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is because the second variable definition will be at a lower import
16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * precedence.  Presumably, global"variables at the same import precedence
16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with the same name will have been caught during the recompose process.
16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>However, if we encounter a parameter that is already defined in the
16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * variable stack, we need to see if this is a parameter whose value was
16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * supplied by a setParameter call.  If so, we need to "receive" the one
16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * already in the stack, ignoring this one.  If it is just an earlier
16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * xsl:param or xsl:variable definition, we ignore it using the same
16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reasoning as explained above for the variable.
16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contextNode The root of the source tree, can't be null.
16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void pushGlobalVars(int contextNode) throws TransformerException
16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = m_xcontext;
16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    VariableStack vs = xctxt.getVarStack();
16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StylesheetRoot sr = getStylesheet();
16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Vector vars = sr.getVariablesAndParamsComposed();
16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int i = vars.size();
16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    vs.link(i);
16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (--i >= 0)
16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ElemVariable v = (ElemVariable) vars.elementAt(i);
16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // XObject xobj = v.getValue(this, contextNode);
16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XObject xobj = new XUnresolvedVariable(v, contextNode, this,
16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                     vs.getStackFrame(), 0, true);
16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == vs.elementAt(i))
16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        vs.setGlobalVariable(i, xobj);
16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set an object that will be used to resolve URIs used in
16669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document(), etc.
16679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param resolver An object that implements the URIResolver interface,
16689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null.
16699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setURIResolver(URIResolver resolver)
16719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
16749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.getSourceTreeManager().setURIResolver(resolver);
16769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an object that will be used to resolve URIs used in
16819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document(), etc.
16829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An object that implements the URIResolver interface,
16849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null.
16859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public URIResolver getURIResolver()
16879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_xcontext.getSourceTreeManager().getURIResolver();
16899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ======== End Transformer Implementation ========
16929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the content event handler.
16959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param handler
16979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws java.lang.NullPointerException If the handler
16989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            is null.
16999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.XMLReader#setContentHandler
17009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setContentHandler(ContentHandler handler)
17029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (handler == null)
17059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new NullPointerException(XSLMessages.createMessage(XSLTErrorResources.ER_NULL_CONTENT_HANDLER, null)); //"Null content handler");
17079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
17099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_outputContentHandler = handler;
17119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_serializationHandler)
17139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
17149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ToXMLSAXHandler h = new ToXMLSAXHandler();
17159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        h.setContentHandler(handler);
17169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        h.setTransformer(this);
17179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler = h;
17199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
17209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
17219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler.setContentHandler(handler);
17229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the content event handler.
17279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current content handler, or null if none was set.
17299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.XMLReader#getContentHandler
17309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ContentHandler getContentHandler()
17329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_outputContentHandler;
17349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a stylesheet element, create a result tree fragment from it's
17389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contents. The fragment will be built within the shared RTF DTM system
17399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * used as a variable stack.
17409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templateParent The template element that holds the fragment.
17419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the NodeHandle for the root node of the resulting RTF.
17429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
17449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
17459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int transformToRTF(ElemTemplateElement templateParent)
17479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
17489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Retrieve a DTM to contain the RTF. At this writing, this may be a
17509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // multi-document DTM (SAX2RTFDTM).
17519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtmFrag = m_xcontext.getRTFDTM();
17529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return transformToRTF(templateParent,dtmFrag);
17539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a stylesheet element, create a result tree fragment from it's
17579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contents. The fragment will also use the shared DTM system, but will
17589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * obtain its space from the global variable pool rather than the dynamic
17599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * variable stack. This allows late binding of XUnresolvedVariables without
17609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the risk that their content will be discarded when the variable stack
17619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is popped.
17629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templateParent The template element that holds the fragment.
17649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the NodeHandle for the root node of the resulting RTF.
17659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
17679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
17689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int transformToGlobalRTF(ElemTemplateElement templateParent)
17709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
17719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Retrieve a DTM to contain the RTF. At this writing, this may be a
17739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // multi-document DTM (SAX2RTFDTM).
17749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtmFrag = m_xcontext.getGlobalRTFDTM();
17759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return transformToRTF(templateParent,dtmFrag);
17769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a stylesheet element, create a result tree fragment from it's
17809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contents.
17819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templateParent The template element that holds the fragment.
17829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmFrag The DTM to write the RTF into
17839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the NodeHandle for the root node of the resulting RTF.
17849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
17869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
17879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int transformToRTF(ElemTemplateElement templateParent,DTM dtmFrag)
17899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
17909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = m_xcontext;
17939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ContentHandler rtfHandler = dtmFrag.getContentHandler();
17959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Obtain the ResultTreeFrag's root node.
17979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // NOTE: In SAX2RTFDTM, this value isn't available until after
17989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the startDocument has been issued, so assignment has been moved
17999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // down a bit in the code.
18009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int resultFragment; // not yet reliably = dtmFrag.getDocument();
18019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Save the current result tree handler.
18039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SerializationHandler savedRTreeHandler = this.m_serializationHandler;
18049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // And make a new handler for the RTF.
18079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ToSAXHandler h = new ToXMLSAXHandler();
18089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    h.setContentHandler(rtfHandler);
18099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    h.setTransformer(this);
18109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Replace the old handler (which was already saved)
18129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_serializationHandler = h;
18139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // use local variable for the current handler
18159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SerializationHandler rth = m_serializationHandler;
18169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
18189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      rth.startDocument();
18209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // startDocument is "bottlenecked" in RTH. We need it acted upon immediately,
18229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // to set the DTM's state as in-progress, so that if the xsl:variable's body causes
18239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // further RTF activity we can keep that from bashing this DTM.
18249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      rth.flushPending();
18259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
18279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
18289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Do the transformation of the child elements.
18309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        executeChildTemplates(templateParent, true);
18319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Make sure everything is flushed!
18339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        rth.flushPending();
18349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Get the document ID. May not exist until the RTH has not only
18369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // received, but flushed, the startDocument, and may be invalid
18379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // again after the document has been closed (still debating that)
18389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // ... so waiting until just before the end seems simplest/safest.
18399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	resultFragment = dtmFrag.getDocument();
18409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
18419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
18429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
18439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        rth.endDocument();
18449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
18459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
18479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(se);
18499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
18519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Restore the previous result tree handler.
18549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.m_serializationHandler = savedRTreeHandler;
18559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return resultFragment;
18589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Take the contents of a template element, process it, and
18629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * convert it to a string.
18639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem The parent element whose children will be output
18659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as a string.
18669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The stringized result of executing the elements children.
18689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
18709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
18719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String transformToString(ElemTemplateElement elem)
18739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
18749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ElemTemplateElement firstChild = elem.getFirstChildElem();
18769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == firstChild)
18779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return "";
18789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(elem.hasTextLitOnly() && m_optimizer)
18799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return ((ElemTextLiteral)firstChild).getNodeValue();
18819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Save the current result tree handler.
18849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SerializationHandler savedRTreeHandler = this.m_serializationHandler;
18859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Create a Serializer object that will handle the SAX events
18879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // and build the ResultTreeFrag nodes.
18889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StringWriter sw = (StringWriter) m_stringWriterObjectPool.getInstance();
18899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_serializationHandler =
18919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (ToTextStream) m_textResultHandlerObjectPool.getInstance();
18929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_serializationHandler)
18949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
18959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // if we didn't get one from the pool, go make a new one
18969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Serializer serializer = org.apache.xml.serializer.SerializerFactory.getSerializer(
18999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_textformat.getProperties());
19009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler = (SerializationHandler) serializer;
19019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler.setTransformer(this);
19049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler.setWriter(sw);
19059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String result;
19089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
19109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /* Don't call startDocument, the SerializationHandler  will
19129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * generate its own internal startDocument call anyways
19139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
19149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // this.m_serializationHandler.startDocument();
19159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Do the transformation of the child elements.
19179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      executeChildTemplates(elem, true);
19189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_serializationHandler.endDocument();
19199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = sw.toString();
19219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
19239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(se);
19259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
19279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      sw.getBuffer().setLength(0);
19299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
19319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        sw.close();
19339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (Exception ioe){}
19359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_stringWriterObjectPool.freeInstance(sw);
19379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_serializationHandler.reset();
19389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_textResultHandlerObjectPool.freeInstance(m_serializationHandler);
19399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Restore the previous result tree handler.
19419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_serializationHandler = savedRTreeHandler;
19429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return result;
19459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an element and mode, find the corresponding
19499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * template and process the contents.
19509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xslInstruction The calling element.
19529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param template The template to use if xsl:for-each, current template for apply-imports, or null.
19539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param child The source context node.
19549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
19559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if applied a template, false if not.
19569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
19579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean applyTemplateToNode(ElemTemplateElement xslInstruction,  // xsl:apply-templates or xsl:for-each
19599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                     ElemTemplate template, int child)
19609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                             throws TransformerException
19619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtm = m_xcontext.getDTM(child);
19649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    short nodeType = dtm.getNodeType(child);
19659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isDefaultTextRule = false;
19669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isApplyImports = false;
19679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    isApplyImports = ((xslInstruction == null)
19699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                ? false
19709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                : xslInstruction.getXSLToken()
19719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                  == Constants.ELEMNAME_APPLY_IMPORTS);
19729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == template || isApplyImports)
19749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int maxImportLevel, endImportLevel=0;
19769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (isApplyImports)
19789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        maxImportLevel =
19809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          template.getStylesheetComposed().getImportCountComposed() - 1;
19819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        endImportLevel =
19829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          template.getStylesheetComposed().getEndImportCountComposed();
19839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
19859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        maxImportLevel = -1;
19879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If we're trying an xsl:apply-imports at the top level (ie there are no
19909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // imported stylesheets), we need to indicate that there is no matching template.
19919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // The above logic will calculate a maxImportLevel of -1 which indicates
19929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // that we should find any template.  This is because a value of -1 for
19939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // maxImportLevel has a special meaning.  But we don't want that.
19949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // We want to match -no- templates. See bugzilla bug 1170.
19959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (isApplyImports && (maxImportLevel == -1))
19969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        template = null;
19989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
20009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Find the XSL template that is the best match for the
20039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // element.
20049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XPathContext xctxt = m_xcontext;
20059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
20079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
20089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.pushNamespaceContext(xslInstruction);
20099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          QName mode = this.getMode();
20119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (isApplyImports)
20139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            template = m_stylesheetRoot.getTemplateComposed(xctxt, child, mode,
20149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  maxImportLevel, endImportLevel, m_quietConflictWarnings, dtm);
20159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
20169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            template = m_stylesheetRoot.getTemplateComposed(xctxt, child, mode,
20179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  m_quietConflictWarnings, dtm);
20189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
20209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finally
20219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
20229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popNamespaceContext();
20239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
20249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If that didn't locate a node, fall back to a default template rule.
20279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // See http://www.w3.org/TR/xslt#built-in-rule.
20289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == template)
20299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        switch (nodeType)
20319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
20329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_FRAGMENT_NODE :
20339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ELEMENT_NODE :
20349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          template = m_stylesheetRoot.getDefaultRule();
20359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
20369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.CDATA_SECTION_NODE :
20379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.TEXT_NODE :
20389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ATTRIBUTE_NODE :
20399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          template = m_stylesheetRoot.getDefaultTextRule();
20409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isDefaultTextRule = true;
20419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
20429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_NODE :
20439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          template = m_stylesheetRoot.getDefaultRootRule();
20449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
20459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        default :
20469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // No default rules for processing instructions and the like.
20489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return false;
20499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
20509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If we are processing the default text rule, then just clone
20549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the value directly to the result tree.
20559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
20569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pushElemTemplateElement(template);
20589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.pushCurrentNode(child);
20599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pushPairCurrentMatched(template, child);
20609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Fix copy copy29 test.
20629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isApplyImports) {
20639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          DTMIterator cnl = new org.apache.xpath.NodeSetDTM(child, m_xcontext.getDTMManager());
20649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_xcontext.pushContextNodeList(cnl);
20659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (isDefaultTextRule)
20689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        switch (nodeType)
20709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
20719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.CDATA_SECTION_NODE :
20729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.TEXT_NODE :
20739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ClonerToResultTree.cloneToResultTree(child, nodeType,
20749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                        dtm, getResultTreeHandler(), false);
20759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
20769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ATTRIBUTE_NODE :
20779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dtm.dispatchCharactersEvents(child, getResultTreeHandler(), false);
20789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
20799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
20809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
20829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
20839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // And execute the child templates.
20859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // 9/11/00: If template has been compiled, hand off to it
20869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // since much (most? all?) of the processing has been inlined.
20879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // (It would be nice if there was a single entry point that
20889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // worked for both... but the interpretive system works by
20899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // having the Tranformer execute the children, while the
20909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // compiled obviously has to run its own code. It's
20919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // also unclear that "execute" is really the right name for
20929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // that entry point.)
20939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_xcontext.setSAXLocator(template);
20949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // m_xcontext.getVarStack().link();
20959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_xcontext.getVarStack().link(template.m_frameSize);
20969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        executeChildTemplates(template, true);
20979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
20989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (org.xml.sax.SAXException se)
21009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(se);
21029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
21049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isDefaultTextRule)
21069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_xcontext.getVarStack().unlink();
21079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_xcontext.popCurrentNode();
21089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isApplyImports) {
21099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_xcontext.popContextNodeList();
21109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      popCurrentMatched();
21129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      popElemTemplateElement();
21149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
21179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute each of the children of a template element.  This method
21229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is only for extension use.
21239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem The ElemTemplateElement that contains the children
21259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that should execute.
21269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param context
21279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mode The current mode.
21289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param handler The ContentHandler to where the result events
21299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be fed.
21309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
21329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
21339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void executeChildTemplates(
21359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ElemTemplateElement elem, org.w3c.dom.Node context, QName mode, ContentHandler handler)
21369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
21379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = m_xcontext;
21409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
21429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != mode)
21449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        pushMode(mode);
21459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.pushCurrentNode(xctxt.getDTMHandleFromNode(context));
21469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      executeChildTemplates(elem, handler);
21479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
21499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNode();
21519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // I'm not sure where or why this was here.  It is clearly in
21539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // error though, without a corresponding pushMode().
21549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != mode)
21559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        popMode();
21569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute each of the children of a template element.
21619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem The ElemTemplateElement that contains the children
21639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that should execute.
21649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldAddAttrs true if xsl:attributes should be executed.
21659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
21679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
21689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void executeChildTemplates(
21709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ElemTemplateElement elem, boolean shouldAddAttrs)
21719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
21729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Does this element have any children?
21759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ElemTemplateElement t = elem.getFirstChildElem();
21769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == t)
21789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
21799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(elem.hasTextLitOnly() && m_optimizer)
21819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
21829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      char[] chars = ((ElemTextLiteral)t).getChars();
21839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
21849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
21859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Have to push stuff on for tooling...
21869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.pushElemTemplateElement(t);
21879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_serializationHandler.characters(chars, 0, chars.length);
21889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch(SAXException se)
21909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
21919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerException(se);
21929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
21949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
21959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.popElemTemplateElement();
21969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
21979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
21989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
21999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    // Check for infinite loops if we have to.
22019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    boolean check = (m_stackGuard.m_recursionLimit > -1);
22029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
22039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    if (check)
22049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      getStackGuard().push(elem, xctxt.getCurrentNode());
22059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = m_xcontext;
22079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushSAXLocatorNull();
22089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int currentTemplateElementsTop = m_currentTemplateElements.size();
22099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateElements.push(null);
22109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
22129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
22139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Loop through the children of the template, calling execute on
22149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // each of them.
22159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (; t != null; t = t.getNextSiblingElem())
22169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
22179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!shouldAddAttrs
22189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                && t.getXSLToken() == Constants.ELEMNAME_ATTRIBUTE)
22199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          continue;
22209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xctxt.setSAXLocator(t);
22229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_currentTemplateElements.setElementAt(t,currentTemplateElementsTop);
22239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        t.execute(this);
22249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
22259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
22269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch(RuntimeException re)
22279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
22289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	TransformerException te = new TransformerException(re);
22299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	te.setLocator(t);
22309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	throw te;
22319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
22329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
22339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
22349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_currentTemplateElements.pop();
22359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popSAXLocator();
22369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
22379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check for infinite loops if we have to
22399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    if (check)
22409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      getStackGuard().pop();
22419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
22439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * Execute each of the children of a template element.
22449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      *
22459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @param elem The ElemTemplateElement that contains the children
22469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * that should execute.
22479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @param handler The ContentHandler to where the result events
22489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * should be fed.
22499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      *
22509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @throws TransformerException
22519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @xsl.usage advanced
22529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      */
22539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     public void executeChildTemplates(
22549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             ElemTemplateElement elem, ContentHandler handler)
22559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               throws TransformerException
22569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     {
22579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       SerializationHandler xoh = this.getSerializationHandler();
22599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       // These may well not be the same!  In this case when calling
22619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       // the Redirect extension, it has already set the ContentHandler
22629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       // in the Transformer.
22639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       SerializationHandler savedHandler = xoh;
22649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       try
22669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       {
22679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         xoh.flushPending();
22689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         // %REVIEW% Make sure current node is being pushed.
22709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         LexicalHandler lex = null;
22719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         if (handler instanceof LexicalHandler) {
22729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            lex = (LexicalHandler) handler;
22739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
22749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         m_serializationHandler = new ToXMLSAXHandler(handler, lex, savedHandler.getEncoding());
22759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         m_serializationHandler.setTransformer(this);
22769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         executeChildTemplates(elem, true);
22779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       }
22789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       catch (TransformerException e)
22799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       {
22809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         throw e;
22819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       }
22829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       catch (SAXException se) {
22839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       	 throw new TransformerException(se);
22849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       }
22859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       finally
22869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       {
22879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         m_serializationHandler = savedHandler;
22889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
22899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the keys for the xsl:sort elements.
22939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note: Should this go into ElemForEach?
22949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param foreach Valid ElemForEach element, not null.
22969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sourceNodeContext The current node context in the source tree,
22979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * needed to evaluate the Attribute Value Templates.
22989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Vector of NodeSortKeys, or null.
23009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
23029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
23039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Vector processSortKeys(ElemForEach foreach, int sourceNodeContext)
23059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws TransformerException
23069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Vector keys = null;
23099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = m_xcontext;
23109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nElems = foreach.getSortElemCount();
23119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (nElems > 0)
23139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      keys = new Vector();
23149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // March backwards, collecting the sort keys.
23169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < nElems; i++)
23179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
23189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ElemSort sort = foreach.getSortElem(i);
23199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String langString =
23219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (null != sort.getLang())
23229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ? sort.getLang().evaluate(xctxt, sourceNodeContext, foreach) : null;
23239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String dataTypeString = sort.getDataType().evaluate(xctxt,
23249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                sourceNodeContext, foreach);
23259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (dataTypeString.indexOf(":") >= 0)
23279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println(
23289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          "TODO: Need to write the hooks for QNAME sort data type");
23299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (!(dataTypeString.equalsIgnoreCase(Constants.ATTRVAL_DATATYPE_TEXT))
23309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               &&!(dataTypeString.equalsIgnoreCase(
23319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 Constants.ATTRVAL_DATATYPE_NUMBER)))
23329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        foreach.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE,
23339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      new Object[]{ Constants.ATTRNAME_DATATYPE,
23349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    dataTypeString });
23359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean treatAsNumbers =
23379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ((null != dataTypeString) && dataTypeString.equals(
23389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Constants.ATTRVAL_DATATYPE_NUMBER)) ? true : false;
23399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String orderString = sort.getOrder().evaluate(xctxt, sourceNodeContext,
23409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             foreach);
23419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!(orderString.equalsIgnoreCase(Constants.ATTRVAL_ORDER_ASCENDING))
23439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              &&!(orderString.equalsIgnoreCase(
23449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Constants.ATTRVAL_ORDER_DESCENDING)))
23459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        foreach.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE,
23469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      new Object[]{ Constants.ATTRNAME_ORDER,
23479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    orderString });
23489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean descending =
23509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ((null != orderString) && orderString.equals(
23519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Constants.ATTRVAL_ORDER_DESCENDING)) ? true : false;
23529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      AVT caseOrder = sort.getCaseOrder();
23539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean caseOrderUpper;
23549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != caseOrder)
23569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
23579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String caseOrderString = caseOrder.evaluate(xctxt, sourceNodeContext,
23589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                    foreach);
23599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!(caseOrderString.equalsIgnoreCase(Constants.ATTRVAL_CASEORDER_UPPER))
23619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                &&!(caseOrderString.equalsIgnoreCase(
23629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  Constants.ATTRVAL_CASEORDER_LOWER)))
23639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          foreach.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE,
23649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        new Object[]{ Constants.ATTRNAME_CASEORDER,
23659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      caseOrderString });
23669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        caseOrderUpper =
23689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ((null != caseOrderString) && caseOrderString.equals(
23699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          Constants.ATTRVAL_CASEORDER_UPPER)) ? true : false;
23709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
23719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
23729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
23739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        caseOrderUpper = false;
23749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
23759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      keys.addElement(new NodeSortKey(this, sort.getSelect(), treatAsNumbers,
23779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      descending, langString, caseOrderUpper,
23789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      foreach));
23799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     }
23809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return keys;
23829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
23859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // SECTION: TransformState implementation
23869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
23879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the count of how many elements are
23909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * active.
23919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The number of active elements on
23929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the currentTemplateElements stack.
23939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getCurrentTemplateElementsCount()
23959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return m_currentTemplateElements.size();
23979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the count of how many elements are
24029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * active.
24039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The number of active elements on
24049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the currentTemplateElements stack.
24059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ObjectStack getCurrentTemplateElements()
24079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return m_currentTemplateElements;
24099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push the current template element.
24139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem The current ElemTemplateElement (may be null, and then
24159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * set via setCurrentElement).
24169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushElemTemplateElement(ElemTemplateElement elem)
24189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateElements.push(elem);
24209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop the current template element.
24249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void popElemTemplateElement()
24269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateElements.pop();
24289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the top of the current template elements
24329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * stack.
24339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The current ElemTemplateElement about to
24359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be executed.
24369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setCurrentElement(ElemTemplateElement e)
24389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateElements.setTop(e);
24409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Retrieves the current ElemTemplateElement that is
24449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * being executed.
24459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current ElemTemplateElement that is executing,
24479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should not normally be null.
24489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplateElement getCurrentElement()
24509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (m_currentTemplateElements.size() > 0) ?
24529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (ElemTemplateElement) m_currentTemplateElements.peek() : null;
24539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method retrieves the current context node
24579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the source tree.
24589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current context node (should never be null?).
24609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getCurrentNode()
24629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_xcontext.getCurrentNode();
24649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method retrieves the xsl:template
24689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that is in effect, which may be a matched template
24699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or a named template.
24709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Please note that the ElemTemplate returned may
24729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be a default template, and thus may not have a template
24739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * defined in the stylesheet.</p>
24749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current xsl:template, should not be null.
24769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplate getCurrentTemplate()
24789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ElemTemplateElement elem = getCurrentElement();
24819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while ((null != elem)
24839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           && (elem.getXSLToken() != Constants.ELEMNAME_TEMPLATE))
24849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
24859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elem = elem.getParentElem();
24869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
24879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (ElemTemplate) elem;
24899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push both the current xsl:template or xsl:for-each onto the
24939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * stack, along with the child node that was matched.
24949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (Note: should this only be used for xsl:templates?? -sb)
24959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param template xsl:template or xsl:for-each.
24979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param child The child that was matched.
24989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushPairCurrentMatched(ElemTemplateElement template, int child)
25009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentMatchTemplates.push(template);
25029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentMatchedNodes.push(child);
25039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop the elements that were pushed via pushPairCurrentMatched.
25079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void popCurrentMatched()
25099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentMatchTemplates.pop();
25119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentMatchedNodes.pop();
25129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method retrieves the xsl:template
25169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that was matched.  Note that this may not be
25179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the same thing as the current template (which
25189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * may be from getCurrentElement()), since a named
25199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * template may be in effect.
25209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The pushed template that was pushed via pushPairCurrentMatched.
25229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplate getMatchedTemplate()
25249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (ElemTemplate) m_currentMatchTemplates.peek();
25269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Retrieves the node in the source tree that matched
25309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the template obtained via getMatchedTemplate().
25319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The matched node that corresponds to the
25339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * match attribute of the current xsl:template.
25349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getMatchedNode()
25369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_currentMatchedNodes.peepTail();
25389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the current context node list.
25429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A reset clone of the context node list.
25449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator getContextNodeList()
25469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
25499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
25509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator cnl = m_xcontext.getContextNodeList();
25519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (cnl == null) ? null : (DTMIterator) cnl.cloneWithReset();
25539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
25549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (CloneNotSupportedException cnse)
25559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
25569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // should never happen.
25589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
25599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
25609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the TrAX Transformer object in effect.
25649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return This object.
25669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Transformer getTransformer()
25689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
25709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
25739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // SECTION: Accessor Functions
25749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //==========================================================
25759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the stylesheet for this processor.  If this is set, then the
25789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * process calls that take only the input .xml will use
25799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this instead of looking for a stylesheet PI.  Also,
25809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * setting the stylesheet is needed if you are going
25819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to use the processor as a SAX ContentHandler.
25829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param stylesheetRoot A non-null StylesheetRoot object,
25849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or null if you wish to clear the stylesheet reference.
25859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setStylesheet(StylesheetRoot stylesheetRoot)
25879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_stylesheetRoot = stylesheetRoot;
25899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
25929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the current stylesheet for this processor.
25939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
25949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The stylesheet that is associated with this
25959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformer.
25969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
25979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final StylesheetRoot getStylesheet()
25989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
25999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_stylesheetRoot;
26009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get quietConflictWarnings property. If the quietConflictWarnings
26049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * property is set to true, warnings about pattern conflicts won't be
26059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * printed to the diagnostics stream.
26069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this transformer should not report
26089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * template match conflicts.
26099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getQuietConflictWarnings()
26119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_quietConflictWarnings;
26139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the execution context for XPath.
26179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xcontext A non-null reference to the XPathContext
26199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * associated with this transformer.
26209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
26219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setXPathContext(XPathContext xcontext)
26239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_xcontext = xcontext;
26259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the XPath context associated with this transformer.
26299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The XPathContext reference, never null.
26319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final XPathContext getXPathContext()
26339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_xcontext;
26359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the SerializationHandler object.
26399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current SerializationHandler, which may not
26419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be the main result tree manager.
26429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SerializationHandler getResultTreeHandler()
26449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_serializationHandler;
26469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the SerializationHandler object.
26509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current SerializationHandler, which may not
26529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be the main result tree manager.
26539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SerializationHandler getSerializationHandler()
26559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_serializationHandler;
26579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the KeyManager object.
26619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A reference to the KeyManager object, which should
26639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * never be null.
26649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public KeyManager getKeyManager()
26669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_keyManager;
26689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Check to see if this is a recursive attribute definition.
26729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attrSet A non-null ElemAttributeSet reference.
26749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
26759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the attribute set is recursive.
26769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
26779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isRecursiveAttrSet(ElemAttributeSet attrSet)
26789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
26799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_attrSetStack)
26819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
26829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_attrSetStack = new Stack();
26839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
26849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!m_attrSetStack.empty())
26869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
26879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int loc = m_attrSetStack.search(attrSet);
26889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (loc > -1)
26909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
26919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
26929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
26939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
26949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
26969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
26979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
26989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
26999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push an executing attribute set, so we can check for
27009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * recursive attribute definitions.
27019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attrSet A non-null ElemAttributeSet reference.
27039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushElemAttributeSet(ElemAttributeSet attrSet)
27059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_attrSetStack.push(attrSet);
27079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pop the current executing attribute set.
27119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void popElemAttributeSet()
27139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_attrSetStack.pop();
27159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the table of counters, for optimized xsl:number support.
27199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The CountersTable, never null.
27219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public CountersTable getCountersTable()
27239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_countersTable)
27269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_countersTable = new CountersTable();
27279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_countersTable;
27299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if the current template rule is null, i.e. if we are
27339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * directly within an apply-templates.  Used for xsl:apply-imports.
27349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if the current template rule is null.
27369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean currentTemplateRuleIsNull()
27389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return ((!m_currentTemplateRuleIsNull.isEmpty())
27409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            && (m_currentTemplateRuleIsNull.peek() == true));
27419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push true if the current template rule is null, false
27459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * otherwise.
27469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b True if the we are executing an xsl:for-each
27489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (or xsl:call-template?).
27499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushCurrentTemplateRuleIsNull(boolean b)
27519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateRuleIsNull.push(b);
27539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push true if the current template rule is null, false
27579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * otherwise.
27589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void popCurrentTemplateRuleIsNull()
27609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
27619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentTemplateRuleIsNull.pop();
27629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Push a funcion result for the currently active EXSLT
27669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>func:function</code>.
27679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val the result of executing an EXSLT
27699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>func:result</code> instruction for the current
27709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>func:function</code>.
27719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushCurrentFuncResult(Object val) {
27739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_currentFuncResult.push(val);
27749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Pops the result of the currently active EXSLT <code>func:function</code>.
27789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the value of the <code>func:function</code>
27809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object popCurrentFuncResult() {
27829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_currentFuncResult.pop();
27839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Determines whether an EXSLT <code>func:result</code> instruction has been
27879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * executed for the currently active EXSLT <code>func:function</code>.
27889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
27899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if and only if a <code>func:result</code>
27909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instruction has been executed
27919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
27929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean currentFuncResultSeen() {
27939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return !m_currentFuncResult.empty()
27949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               && m_currentFuncResult.peek() != null;
27959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
27969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
27979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
27989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the message manager.
27999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The message manager, never null.
28019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
28029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public MsgMgr getMsgMgr()
28039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
28049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_msgMgr)
28069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_msgMgr = new MsgMgr(this);
28079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_msgMgr;
28099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
28109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
28129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the error event listener.
28139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param listener The new error listener.
28159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws IllegalArgumentException if
28169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
28179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setErrorListener(ErrorListener listener)
28189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws IllegalArgumentException
28199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
28209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (m_reentryGuard)
28229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
28239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (listener == null)
28249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new IllegalArgumentException(XSLMessages.createMessage(XSLTErrorResources.ER_NULL_ERROR_HANDLER, null)); //"Null error handler");
28259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_errorHandler = listener;
28279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
28289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
28299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
28319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the current error event handler.
28329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current error handler, which should never be null.
28349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
28359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ErrorListener getErrorListener()
28369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
28379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_errorHandler;
28389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
28399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
28419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Look up the value of a feature.
28429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The feature name is any fully-qualified URI.  It is
28449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * possible for an TransformerFactory to recognize a feature name but
28459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be unable to return its value; this is especially true
28469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the case of an adapter for a SAX1 Parser, which has
28479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * no way of knowing whether the underlying parser is
28489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * validating, for example.</p>
28499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <h3>Open issues:</h3>
28519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <dl>
28529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *    <dt><h4>Should getFeature be changed to hasFeature?</h4></dt>
28539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *    <dd>Keith Visco writes: Should getFeature be changed to hasFeature?
28549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        It returns a boolean which indicated whether the "state"
28559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        of feature is "true or false". I assume this means whether
28569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        or not a feature is supported? I know SAX is using "getFeature",
28579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        but to me "hasFeature" is cleaner.</dd>
28589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * </dl>
28599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The feature name, which is a fully-qualified
28619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        URI.
28629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The current state of the feature (true or false).
28639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXNotRecognizedException When the
28649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            TransformerFactory does not recognize the feature name.
28659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXNotSupportedException When the
28669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            TransformerFactory recognizes the feature name but
28679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            cannot determine its value at this time.
28689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXNotRecognizedException
28709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXNotSupportedException
28719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
28729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getFeature(String name)
28739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXNotRecognizedException, SAXNotSupportedException
28749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
28759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ("http://xml.org/trax/features/sax/input".equals(name))
28779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
28789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if ("http://xml.org/trax/features/dom/input".equals(name))
28799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return true;
28809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throw new SAXNotRecognizedException(name);
28829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
28839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // %TODO% Doc
28859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
28879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method getMode
28889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
28909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (getMode) @return
28919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
28929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public QName getMode()
28939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
28949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_modes.isEmpty() ? null : (QName) m_modes.peek();
28959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
28969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // %TODO% Doc
28989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
28999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method pushMode
29019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param mode
29049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void pushMode(QName mode)
29069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_modes.push(mode);
29089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // %TODO% Doc
29119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method popMode
29149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void popMode()
29179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_modes.pop();
29199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Called by SourceTreeHandler to start the transformation
29239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  in a separate thread
29249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param priority
29269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runTransformThread(int priority)
29289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // used in SourceTreeHandler
29319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Thread t = ThreadControllerWrapper.runThread(this, priority);
29329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.setTransformThread(t);
29339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Called by this.transform() if isParserEventsOnMain()==false.
29379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Similar with runTransformThread(), but no priority is set
29389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  and setTransformThread is not set.
29399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runTransformThread()
29419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ThreadControllerWrapper.runThread(this, -1);
29439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Called by CoRoutineSAXParser. Launches the CoroutineSAXParser
29479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in a thread, and prepares it to invoke the parser from that thread
29489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * upon request.
29499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static void runTransformThread(Runnable runnable)
29529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ThreadControllerWrapper.runThread(runnable, -1);
29549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Used by SourceTreeHandler to wait until the transform
29589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   completes
29599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException
29619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
29629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void waitTransformThread() throws SAXException
29639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
29649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // This is called to make sure the task is done.
29669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // It is possible that the thread has been reused -
29679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // but for a different transformation. ( what if we
29689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // recycle the transformer ? Not a problem since this is
29699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // still in use. )
29709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Thread transformThread = this.getTransformThread();
29719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != transformThread)
29739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
29749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
29759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
29769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ThreadControllerWrapper.waitThread(transformThread, this);
29779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!this.hasTransformThreadErrorCatcher())
29799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
29809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          Exception e = this.getExceptionThrown();
29819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (null != e)
29839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
29849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            e.printStackTrace();
29859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new org.xml.sax.SAXException(e);
29869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
29879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
29889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.setTransformThread(null);
29909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
29919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (InterruptedException ie){}
29929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
29939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
29949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
29959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
29969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the exception thrown by the secondary thread (normally
29979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the transform thread).
29989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
29999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The thrown exception, or null if no exception was
30009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * thrown.
30019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
30029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Exception getExceptionThrown()
30039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
30049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_exceptionThrown;
30059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
30069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
30089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the exception thrown by the secondary thread (normally
30099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the transform thread).
30109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
30119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The thrown exception, or null if no exception was
30129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * thrown.
30139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
30149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setExceptionThrown(Exception e)
30159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
30169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_exceptionThrown = e;
30179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
30189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
30209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is just a way to set the document for run().
30219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
30229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doc A non-null reference to the root of the
30239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tree to be transformed.
30249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
30259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setSourceTreeDocForThread(int doc)
30269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
30279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_doc = doc;
30289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
30299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
30319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * From a secondary thread, post the exception, so that
30329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it can be picked up from the main thread.
30339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
30349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The exception that was thrown.
30359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
30369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void postExceptionFromThread(Exception e)
30379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
30389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Commented out in response to problem reported by Nicola Brown <Nicola.Brown@jacobsrimell.com>
30409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    if(m_reportInPostExceptionFromThread)
30419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    {
30429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      // Consider re-throwing the exception if this flag is set.
30439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      e.printStackTrace();
30449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    }
30459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW Need DTM equivelent?
30469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    if (m_inputContentHandler instanceof SourceTreeHandler)
30479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    {
30489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      SourceTreeHandler sth = (SourceTreeHandler) m_inputContentHandler;
30499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
30509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      sth.setExceptionThrown(e);
30519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    }
30529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //   ContentHandler ch = getContentHandler();
30539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    if(ch instanceof SourceTreeHandler)
30559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    {
30569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      SourceTreeHandler sth = (SourceTreeHandler) ch;
30579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      ((TransformerImpl)(sth.getTransformer())).postExceptionFromThread(e);
30589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    }
30599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // m_isTransformDone = true; // android-removed
30609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_exceptionThrown = e;
30619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ;  // should have already been reported via the error handler?
30629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    synchronized (this)
30649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
30659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // See message from me on 3/27/2001 to Patrick Moore.
30679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      String msg = e.getMessage();
30689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println(e.getMessage());
30699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Is this really needed?  -sb
30709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      notifyAll();
30719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      if (null == msg)
30739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      {
30749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //
30759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //        // m_throwNewError = false;
30769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //        e.printStackTrace();
30779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      }
30789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // throw new org.apache.xml.utils.WrappedRuntimeException(e);
30799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
30809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
30819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
30839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Run the transform thread.
30849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
30859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void run()
30869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
30879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_hasBeenReset = false;
30899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
30919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
30929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // int n = ((SourceTreeHandler)getInputContentHandler()).getDTMRoot();
30949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // transformNode(n);
30959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
30969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
30979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // m_isTransformDone = false; // android-removed
30989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
30999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should no longer be needed...
31009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          if(m_inputContentHandler instanceof TransformerHandlerImpl)
31019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          {
31029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            TransformerHandlerImpl thi = (TransformerHandlerImpl)m_inputContentHandler;
31039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            thi.waitForInitialEvents();
31049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          }
31059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        transformNode(m_doc);
31079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
31099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (Exception e)
31109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
31119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // e.printStackTrace();
31129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Strange that the other catch won't catch this...
31149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != m_transformThread)
31159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          postExceptionFromThread(e);   // Assume we're on the main thread
31169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
31179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throw new RuntimeException(e.getMessage());
31189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
31199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
31209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
31219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // m_isTransformDone = true; // android-removed
31229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_inputContentHandler instanceof TransformerHandlerImpl)
31249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
31259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ((TransformerHandlerImpl) m_inputContentHandler).clearCoRoutine();
31269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
31279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //        synchronized (this)
31299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //        {
31309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //          notifyAll();
31319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //        }
31329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
31339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
31349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
31359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
31369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // e.printStackTrace();
31389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != m_transformThread)
31399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        postExceptionFromThread(e);
31409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
31419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new RuntimeException(e.getMessage());         // Assume we're on the main thread.
31429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
31439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
31449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Fragment re-execution interfaces for a tool.
31469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
31489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Test whether whitespace-only text nodes are visible in the logical
31499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * view of <code>DTM</code>. Normally, this function
31509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will be called by the implementation of <code>DTM</code>;
31519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it is not normally called directly from
31529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * user code.
31539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
31549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elementHandle int Handle of the element.
31559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return one of NOTSTRIP, STRIP, or INHERIT.
31569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
31579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public short getShouldStripSpace(int elementHandle, DTM dtm)
31589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
31599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
31619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
31629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      org.apache.xalan.templates.WhiteSpaceInfo info =
31639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_stylesheetRoot.getWhiteSpaceInfo(m_xcontext, elementHandle, dtm);
31649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == info)
31669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
31679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return DTMWSFilter.INHERIT;
31689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
31699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
31709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
31719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("getShouldStripSpace: "+info.getShouldStripSpace());
31739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return info.getShouldStripSpace()
31749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               ? DTMWSFilter.STRIP : DTMWSFilter.NOTSTRIP;
31759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
31769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
31779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (TransformerException se)
31789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
31799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTMWSFilter.INHERIT;
31809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
31819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
31829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
31839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Initializer method.
31849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
31859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null transformer instance
31869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param realHandler Content Handler instance
31879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
31889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public void init(ToXMLSAXHandler h,Transformer transformer, ContentHandler realHandler)
31899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
31909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      h.setTransformer(transformer);
31919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      h.setContentHandler(realHandler);
31929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
31939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public void setSerializationHandler(SerializationHandler xoh)
31959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
31969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_serializationHandler = xoh;
31979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
31989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
31999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
32029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Fire off characters, cdate events.
32039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xml.serializer.SerializerTrace#fireGenerateEvent(int, char[], int, int)
32049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
32059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void fireGenerateEvent(
32069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		int eventType,
32079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		char[] ch,
32089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		int start,
32099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		int length) {
32109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
32119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
32139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Fire off startElement, endElement events.
32149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xml.serializer.SerializerTrace#fireGenerateEvent(int, String, Attributes)
32159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
32169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void fireGenerateEvent(
32179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		int eventType,
32189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		String name,
32199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		Attributes atts) {
32209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
32219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
32239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Fire off processingInstruction events.
32249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
32259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void fireGenerateEvent(int eventType, String name, String data) {
32269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
32279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
32299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Fire off comment and entity ref events.
32309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xml.serializer.SerializerTrace#fireGenerateEvent(int, String)
32319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
32329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void fireGenerateEvent(int eventType, String data) {
32339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
32349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
32369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Fire off startDocument, endDocument events.
32379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xml.serializer.SerializerTrace#fireGenerateEvent(int)
32389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
32399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void fireGenerateEvent(int eventType) {
32409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
32419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
32439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.apache.xml.serializer.SerializerTrace#hasTraceListeners()
32449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
32459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean hasTraceListeners() {
32469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
32479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
32489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
32509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Incremental flag
32519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
32529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getIncremental() {
32539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_incremental;
32549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
32559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
32579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Optimization flag
32589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
32599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getOptimize() {
32609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_optimizer;
32619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
32629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
32649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Source location flag
32659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
32669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getSource_location() {
32679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_source_location;
32689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
32699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
32709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}  // end TransformerImpl class
32719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3272