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