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