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: ToXMLSAXHandler.java 468654 2006-10-28 07:09:23Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson package org.apache.xml.serializer; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.OutputStream; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.Writer; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Result; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Attributes; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ContentHandler; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Locator; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ext.LexicalHandler; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class receives notification of SAX-like events, and with gathered 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * information over these calls it will invoke the equivalent SAX methods 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on a handler, the ultimate xsl:output method is known to be "xml". 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class is not a public API. 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic final class ToXMLSAXHandler extends ToSAXHandler 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Keeps track of whether output escaping is currently enabled 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean m_escapeSetting = true; 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ToXMLSAXHandler() 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // default constructor (need to set content handler ASAP !) 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixMap = new NamespaceMappings(); 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson initCDATA(); 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#getOutputFormat() 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Properties getOutputFormat() 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#getOutputStream() 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public OutputStream getOutputStream() 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#getWriter() 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Writer getWriter() 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Do nothing for SAX. 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void indent(int n) throws SAXException 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see DOMSerializer#serialize(Node) 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void serialize(Node node) throws IOException 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see SerializationHandler#setEscaping(boolean) 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean setEscaping(boolean escape) throws SAXException 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean oldEscapeSetting = m_escapeSetting; 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_escapeSetting = escape; 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (escape) { 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson processingInstruction(Result.PI_ENABLE_OUTPUT_ESCAPING, ""); 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } else { 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson processingInstruction(Result.PI_DISABLE_OUTPUT_ESCAPING, ""); 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return oldEscapeSetting; 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#setOutputFormat(Properties) 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setOutputFormat(Properties format) 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#setOutputStream(OutputStream) 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setOutputStream(OutputStream output) 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#setWriter(Writer) 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setWriter(Writer writer) 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.DeclHandler#attributeDecl(String, String, String, String, String) 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void attributeDecl( 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String arg0, 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String arg1, 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String arg2, 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String arg3, 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String arg4) 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.DeclHandler#elementDecl(String, String) 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void elementDecl(String arg0, String arg1) throws SAXException 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.DeclHandler#externalEntityDecl(String, String, String) 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void externalEntityDecl(String arg0, String arg1, String arg2) 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.DeclHandler#internalEntityDecl(String, String) 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void internalEntityDecl(String arg0, String arg1) 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Receives notification of the end of the document. 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#endDocument() 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endDocument() throws SAXException 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Close output document 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.endDocument(); 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_tracer != null) 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.fireEndDoc(); 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This method is called when all the data needed for a call to the 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * SAX handler's startElement() method has been gathered. 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void closeStartTag() throws SAXException 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_elemContext.m_startTagOpen = false; 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String localName = getLocalName(m_elemContext.m_elementName); 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String uri = getNamespaceURI(m_elemContext.m_elementName, true); 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Now is time to send the startElement event 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_needToCallStartDocument) 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startDocumentInternal(); 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.startElement(uri, localName, m_elemContext.m_elementName, m_attributes); 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // we've sent the official SAX attributes on their way, 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // now we don't need them anymore. 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_attributes.clear(); 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_state != null) 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_state.setCurrentNode(null); 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Closes ane open cdata tag, and 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * unlike the this.endCDATA() method (from the LexicalHandler) interface, 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this "internal" method will send the endCDATA() call to the wrapped 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * handler. 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void closeCDATA() throws SAXException 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Output closing bracket - "]]>" 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_lexHandler != null && m_cdataTagOpen) { 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.endCDATA(); 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // There are no longer any calls made to 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // m_lexHandler.startCDATA() without a balancing call to 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // m_lexHandler.endCDATA() 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // so we set m_cdataTagOpen to false to remember this. 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_cdataTagOpen = false; 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#endElement(String, String, String) 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endElement(String namespaceURI, String localName, String qName) 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Close any open elements etc. 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (namespaceURI == null) 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_elemContext.m_elementURI != null) 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson namespaceURI = m_elemContext.m_elementURI; 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson namespaceURI = getNamespaceURI(qName, true); 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (localName == null) 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_elemContext.m_elementLocalName != null) 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson localName = m_elemContext.m_elementLocalName; 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson localName = getLocalName(qName); 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.endElement(namespaceURI, localName, qName); 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_tracer != null) 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.fireEndElem(qName); 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* Pop all namespaces at the current element depth. 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * We are not waiting for official endPrefixMapping() calls. 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixMap.popNamespaces(m_elemContext.m_currentElemDepth, 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler); 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_elemContext = m_elemContext.m_prev; 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#endPrefixMapping(String) 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endPrefixMapping(String prefix) throws SAXException 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* poping all prefix mappings should have been done 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in endElement() already 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void ignorableWhitespace(char[] arg0, int arg1, int arg2) 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.ignorableWhitespace(arg0,arg1,arg2); 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#setDocumentLocator(Locator) 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setDocumentLocator(Locator arg0) 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.setDocumentLocator(arg0); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#skippedEntity(String) 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void skippedEntity(String arg0) throws SAXException 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.skippedEntity(arg0); 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#startPrefixMapping(String, String) 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix The prefix that maps to the URI 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param uri The URI for the namespace 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startPrefixMapping(String prefix, String uri) 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startPrefixMapping(prefix, uri, true); 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Remember the prefix/uri mapping at the current nested element depth. 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#startPrefixMapping(String, String) 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix The prefix that maps to the URI 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param uri The URI for the namespace 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param shouldFlush a flag indicating if the mapping applies to the 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * current element or an up coming child (not used). 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean startPrefixMapping( 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix, 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String uri, 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean shouldFlush) 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* Remember the mapping, and at what depth it was declared 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This is one greater than the current depth because these 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * mappings will apply to the next depth. This is in 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * consideration that startElement() will soon be called 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean pushed; 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int pushDepth; 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (shouldFlush) 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the prefix mapping applies to the child element (one deeper) 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pushDepth = m_elemContext.m_currentElemDepth + 1; 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the prefix mapping applies to the current element 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pushDepth = m_elemContext.m_currentElemDepth; 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pushed = m_prefixMap.pushNamespace(prefix, uri, pushDepth); 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (pushed) 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.startPrefixMapping(prefix,uri); 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (getShouldOutputNSAttr()) 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* I don't know if we really needto do this. The 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * callers of this object should have injected both 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * startPrefixMapping and the attributes. We are 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * just covering our butt here. 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String name; 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (EMPTYSTRING.equals(prefix)) 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson name = "xmlns"; 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addAttributeAlways(XMLNS_URI, name, name,"CDATA",uri, false); 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!EMPTYSTRING.equals(uri)) // hack for attribset16 test 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { // that maps ns1 prefix to "" URI 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson name = "xmlns:" + prefix; 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* for something like xmlns:abc="w3.pretend.org" 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the uri is the value, that is why we pass it in the 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * value, or 5th slot of addAttributeAlways() 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addAttributeAlways(XMLNS_URI, prefix, name,"CDATA",uri, false ); 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return pushed; 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int) 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void comment(char[] arg0, int arg1, int arg2) throws SAXException 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_lexHandler != null) 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.comment(arg0, arg1, arg2); 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_tracer != null) 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.fireCommentEvent(arg0, arg1, arg2); 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.LexicalHandler#endCDATA() 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endCDATA() throws SAXException 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* Normally we would do somthing with this but we ignore it. 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The neccessary call to m_lexHandler.endCDATA() will be made 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in flushPending(). 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This is so that if we get calls like these: 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.startCDATA(); 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.characters(chars1, off1, len1); 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.endCDATA(); 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.startCDATA(); 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.characters(chars2, off2, len2); 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.endCDATA(); 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that we will only make these calls to the wrapped handlers: 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * m_lexHandler.startCDATA(); 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * m_saxHandler.characters(chars1, off1, len1); 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * m_saxHandler.characters(chars1, off2, len2); 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * m_lexHandler.endCDATA(); 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * We will merge adjacent CDATA blocks. 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.LexicalHandler#endDTD() 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endDTD() throws SAXException 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_lexHandler != null) 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.endDTD(); 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ext.LexicalHandler#startEntity(String) 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startEntity(String arg0) throws SAXException 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_lexHandler != null) 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.startEntity(arg0); 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExtendedContentHandler#characters(String) 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void characters(String chars) throws SAXException 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final int length = chars.length(); 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (length > m_charsBuff.length) 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_charsBuff = new char[length*2 + 1]; 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson chars.getChars(0, length, m_charsBuff, 0); 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.characters(m_charsBuff, 0, length); 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ToXMLSAXHandler(ContentHandler handler, String encoding) 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(handler, encoding); 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson initCDATA(); 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // initNamespaces(); 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixMap = new NamespaceMappings(); 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ToXMLSAXHandler( 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ContentHandler handler, 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson LexicalHandler lex, 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String encoding) 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(handler, lex, encoding); 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson initCDATA(); 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // initNamespaces(); 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixMap = new NamespaceMappings(); 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Start an element in the output document. This might be an XML element 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (<elem>data</elem> type) or a CDATA section. 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startElement( 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String elementNamespaceURI, 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String elementLocalName, 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String elementName) throws SAXException 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startElement( 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elementNamespaceURI,elementLocalName,elementName, null); 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startElement(String elementName) throws SAXException 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startElement(null, null, elementName, null); 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void characters(char[] ch, int off, int len) throws SAXException 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We do the first two things in flushPending() but we don't 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // close any open CDATA calls. 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_needToCallStartDocument) 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startDocumentInternal(); 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_needToCallStartDocument = false; 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_elemContext.m_startTagOpen) 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson closeStartTag(); 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_elemContext.m_startTagOpen = false; 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_elemContext.m_isCdataSection && !m_cdataTagOpen 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && m_lexHandler != null) 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.startCDATA(); 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We have made a call to m_lexHandler.startCDATA() with 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // no balancing call to m_lexHandler.endCDATA() 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // so we set m_cdataTagOpen true to remember this. 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_cdataTagOpen = true; 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* If there are any occurances of "]]>" in the character data 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * let m_saxHandler worry about it, we've already warned them with 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the previous call of m_lexHandler.startCDATA(); 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.characters(ch, off, len); 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // time to generate characters event 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_tracer != null) 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fireCharEvent(ch, off, len); 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExtendedContentHandler#endElement(String) 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endElement(String elemName) throws SAXException 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson endElement(null, null, elemName); 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send a namespace declaration in the output document. The namespace 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * declaration will not be include if the namespace is already in scope 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * with the same prefix. 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void namespaceAfterStartElement( 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String prefix, 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final String uri) 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startPrefixMapping(prefix,uri,false); 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#processingInstruction(String, String) 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send a processing instruction to the output document 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void processingInstruction(String target, String data) 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Pass the processing instruction to the SAX handler 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.processingInstruction(target, data); 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // we don't want to leave serializer to fire off this event, 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // so do it here. 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_tracer != null) 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.fireEscapingEvent(target, data); 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Undeclare the namespace that is currently pointed to by a given 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * prefix. Inform SAX handler if prefix was previously mapped. 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean popNamespace(String prefix) 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_prefixMap.popNamespace(prefix)) 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_saxHandler.endPrefixMapping(prefix); 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SAXException e) 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // falls through 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startCDATA() throws SAXException 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* m_cdataTagOpen can only be true here if we have ignored the 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * previous call to this.endCDATA() and the previous call 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.startCDATA() before that is still "open". In this way 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we merge adjacent CDATA. If anything else happened after the 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ignored call to this.endCDATA() and this call then a call to 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * flushPending() would have been made which would have 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * closed the CDATA and set m_cdataTagOpen to false. 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!m_cdataTagOpen ) 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_lexHandler != null) { 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.startCDATA(); 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We have made a call to m_lexHandler.startCDATA() with 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // no balancing call to m_lexHandler.endCDATA() 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // so we set m_cdataTagOpen true to remember this. 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_cdataTagOpen = true; 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#startElement(String, String, String, Attributes) 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startElement( 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String namespaceURI, 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String localName, 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String name, 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Attributes atts) 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson flushPending(); 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.startElement(namespaceURI, localName, name, atts); 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Handle document type declaration (for first element only) 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_needToOutputDocTypeDecl) 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String doctypeSystem = getDoctypeSystem(); 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (doctypeSystem != null && m_lexHandler != null) 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String doctypePublic = getDoctypePublic(); 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (doctypeSystem != null) 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lexHandler.startDTD( 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson name, 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson doctypePublic, 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson doctypeSystem); 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_needToOutputDocTypeDecl = false; 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_elemContext = m_elemContext.push(namespaceURI, localName, name); 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ensurePrefixIsDeclared depends on the current depth, so 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the previous increment is necessary where it is. 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (namespaceURI != null) 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ensurePrefixIsDeclared(namespaceURI, name); 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // add the attributes to the collected ones 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (atts != null) 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addAttributes(atts); 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // do we really need this CDATA section state? 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_elemContext.m_isCdataSection = isCdataSection(); 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void ensurePrefixIsDeclared(String ns, String rawName) 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (ns != null && ns.length() > 0) 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int index; 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final boolean no_prefix = ((index = rawName.indexOf(":")) < 0); 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix = (no_prefix) ? "" : rawName.substring(0, index); 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != prefix) 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String foundURI = m_prefixMap.lookupNamespace(prefix); 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == foundURI) || !foundURI.equals(ns)) 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.startPrefixMapping(prefix, ns, false); 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (getShouldOutputNSAttr()) { 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Bugzilla1133: Generate attribute as well as namespace event. 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // SAX does expect both. 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.addAttributeAlways( 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "http://www.w3.org/2000/xmlns/", 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson no_prefix ? "xmlns" : prefix, // local name 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson no_prefix ? "xmlns" : ("xmlns:"+ prefix), // qname 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "CDATA", 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ns, 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson false); 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Adds the given attribute to the set of attributes, and also makes sure 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that the needed prefix/uri mapping is declared, but only if there is a 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * currently open element. 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param uri the URI of the attribute 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param localName the local name of the attribute 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param rawName the qualified name of the attribute 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param type the type of the attribute (probably CDATA) 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param value the value of the attribute 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param XSLAttribute true if this attribute is coming from an xsl:attribute element 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExtendedContentHandler#addAttribute(String, String, String, String, String) 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void addAttribute( 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String uri, 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String localName, 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String rawName, 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String type, 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String value, 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean XSLAttribute) 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws SAXException 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_elemContext.m_startTagOpen) 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ensurePrefixIsDeclared(uri, rawName); 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addAttributeAlways(uri, localName, rawName, type, value, false); 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Try's to reset the super class and reset this class for 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * re-use, so that you don't need to create a new serializer 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (mostly for performance reasons). 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the class was successfuly reset. 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Serializer#reset() 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean reset() 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean wasReset = false; 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (super.reset()) 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson resetToXMLSAXHandler(); 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson wasReset = true; 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return wasReset; 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Reset all of the fields owned by ToXMLSAXHandler class 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void resetToXMLSAXHandler() 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_escapeSetting = true; 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 775