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