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