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: ToUnknownStream.java 471981 2006-11-07 04:28:00Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage 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 Wilsonimport java.util.Vector;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Attributes;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ContentHandler;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Locator;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *This class wraps another SerializationHandler. The wrapped object will either
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * handler XML or HTML, which is not known until a little later when the first XML
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * tag is seen.  If the first tag is <html> then the wrapped object is an HTML
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * handler, otherwise it is an XML handler.
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class effectively caches the first few calls to it then passes them
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on to the wrapped handler (once it exists).  After that subsequent calls a
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * simply passed directly to the wrapped handler.
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The user of this class doesn't know if the output is ultimatley XML or HTML.
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class is not a public API, it is public because it is used within Xalan.
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic final class ToUnknownStream extends SerializerBase
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The wrapped handler, initially XML but possibly switched to HTML
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private SerializationHandler m_handler;
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A String with no characters
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static final String EMPTYSTRING = "";
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if the underlying handler (XML or HTML) is fully initialized
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_wrapped_handler_not_initialized = false;
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the prefix of the very first tag in the document
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_firstElementPrefix;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the element name (including any prefix) of the very first tag in the document
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_firstElementName;
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the namespace URI associated with the first element
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_firstElementURI;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the local name (no prefix) associated with the first element
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_firstElementLocalName = null;
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if the first tag has been emitted to the wrapped handler
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_firstTagNotEmitted = true;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A collection of namespace URI's (only for first element).
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * _namespacePrefix has the matching prefix for these URI's
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Vector m_namespaceURI = null;
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A collection of namespace Prefix (only for first element)
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * _namespaceURI has the matching URIs for these prefix'
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Vector m_namespacePrefix = null;
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if startDocument() was called before the underlying handler
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was initialized
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_needToCallStartDocument = false;
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if setVersion() was called before the underlying handler
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was initialized
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_setVersion_called = false;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if setDoctypeSystem() was called before the underlying handler
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was initialized
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_setDoctypeSystem_called = false;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if setDoctypePublic() was called before the underlying handler
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was initialized
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_setDoctypePublic_called = false;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if setMediaType() was called before the underlying handler
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was initialized
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_setMediaType_called = false;
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Default constructor.
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Initially this object wraps an XML Stream object, so _handler is never null.
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * That may change later to an HTML Stream object.
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public ToUnknownStream()
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler = new ToXMLStream();
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#asContentHandler()
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the wrapped XML or HTML handler
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public ContentHandler asContentHandler() throws IOException
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /* don't return the real handler ( m_handler ) because
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * that would expose the real handler to the outside.
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * Keep m_handler private so it can be internally swapped
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * to an HTML handler.
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return this;
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#close()
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void close()
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.close();
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#getOutputFormat()
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the properties of the underlying handler
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Properties getOutputFormat()
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getOutputFormat();
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#getOutputStream()
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the OutputStream of the underlying XML or HTML handler
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public OutputStream getOutputStream()
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getOutputStream();
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#getWriter()
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the Writer of the underlying XML or HTML handler
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Writer getWriter()
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getWriter();
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * passes the call on to the underlying HTML or XML handler
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#reset()
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return ???
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean reset()
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.reset();
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Converts the DOM node to output
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node the DOM node to transform to output
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see DOMSerializer#serialize(Node)
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void serialize(Node node) throws IOException
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.serialize(node);
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setEscaping(boolean)
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean setEscaping(boolean escape) throws SAXException
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.setEscaping(escape);
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the properties of the handler
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param format the output properties to set
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#setOutputFormat(Properties)
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setOutputFormat(Properties format)
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setOutputFormat(format);
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the output stream to write to
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param output the OutputStream to write to
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#setOutputStream(OutputStream)
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setOutputStream(OutputStream output)
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setOutputStream(output);
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the writer to write to
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param writer the writer to write to
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#setWriter(Writer)
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setWriter(Writer writer)
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setWriter(writer);
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds an attribute to the currenly open tag
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI of a namespace
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param localName the attribute name, without prefix
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param rawName the attribute name, with prefix (if any)
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type the type of the attribute, typically "CDATA"
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the parameter
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param XSLAttribute true if this attribute is coming from an xsl:attribute element
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri,
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName,
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String rawName,
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String type,
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String value,
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean XSLAttribute)
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.addAttribute(uri, localName, rawName, type, value, XSLAttribute);
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds an attribute to the currenly open tag
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param rawName the attribute name, with prefix (if any)
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the parameter
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#addAttribute(String, String)
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(String rawName, String value)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.addAttribute(rawName, value);
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds a unique attribute to the currenly open tag
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addUniqueAttribute(String rawName, String value, int flags)
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.addUniqueAttribute(rawName, value, flags);
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Converts the String to a character array and calls the SAX method
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * characters(char[],int,int);
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#characters(String)
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void characters(String chars) throws SAXException
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int length = chars.length();
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length > m_charsBuff.length)
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_charsBuff = new char[length*2 + 1];
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        chars.getChars(0, length, m_charsBuff, 0);
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.characters(m_charsBuff, 0, length);
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#endElement(String)
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endElement(String elementName) throws SAXException
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endElement(elementName);
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#startPrefixMapping(String, String)
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix The prefix that maps to the URI
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The URI for the namespace
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startPrefixMapping(String prefix, String uri) throws SAXException
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.startPrefixMapping(prefix,uri, true);
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used when a prefix/uri namespace mapping
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is indicated after the element was started with a
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startElement() and before and endElement().
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startPrefixMapping(prefix,uri) would be used before the
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startElement() call.
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI of the namespace
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix the prefix associated with the given URI.
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#namespaceAfterStartElement(String, String)
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void namespaceAfterStartElement(String prefix, String uri)
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // hack for XSLTC with finding URI for default namespace
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted && m_firstElementURI == null && m_firstElementName != null)
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String prefix1 = getPrefixPart(m_firstElementName);
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (prefix1 == null && EMPTYSTRING.equals(prefix))
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // the elements URI is not known yet, and it
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // doesn't have a prefix, and we are currently
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // setting the uri for prefix "", so we have
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // the uri for the element... lets remember it
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_firstElementURI = uri;
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startPrefixMapping(prefix,uri, false);
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean startPrefixMapping(String prefix, String uri, boolean shouldFlush)
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean pushed = false;
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_firstElementName != null && shouldFlush)
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /* we've already seen a startElement, and this is a prefix mapping
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * for the up coming element, so flush the old element
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * then send this event on its way.
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                flush();
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                pushed = m_handler.startPrefixMapping(prefix, uri, shouldFlush);
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_namespacePrefix == null)
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_namespacePrefix = new Vector();
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_namespaceURI = new Vector();
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_namespacePrefix.addElement(prefix);
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_namespaceURI.addElement(uri);
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_firstElementURI == null)
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (prefix.equals(m_firstElementPrefix))
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_firstElementURI = uri;
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           pushed = m_handler.startPrefixMapping(prefix, uri, shouldFlush);
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return pushed;
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * This method cannot be cached because default is different in
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * HTML and XML (we need more than a boolean).
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      */
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setVersion(String version)
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setVersion(version);
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Cache call to setVersion()
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //       super.setVersion(version);
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_setVersion_called = true;
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#startDocument()
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startDocument() throws SAXException
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_needToCallStartDocument = true;
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startElement(String qName) throws SAXException
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.startElement(null, null, qName, null);
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startElement(String namespaceURI, String localName, String qName) throws SAXException
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.startElement(namespaceURI, localName, qName, null);
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startElement(
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String namespaceURI,
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName,
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String elementName,
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Attributes atts) throws SAXException
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /* we are notified of the start of an element */
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /* we have not yet sent the first element on its way */
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_firstElementName != null)
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /* this is not the first element, but a later one.
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * But we have the old element pending, so flush it out,
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * then send this one on its way.
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                flush();
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_handler.startElement(namespaceURI, localName, elementName,  atts);
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /* this is the very first element that we have seen,
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * so save it for flushing later.  We may yet get to know its
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * URI due to added attributes.
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_wrapped_handler_not_initialized = true;
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_firstElementName = elementName;
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // null if not known
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_firstElementPrefix = getPrefixPartUnknown(elementName);
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // null if not known
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_firstElementURI = namespaceURI;
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // null if not known
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_firstElementLocalName = localName;
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_tracer != null)
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    firePseudoElement(elementName);
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /* we don't want to call our own addAttributes, which
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * merely delegates to the wrapped handler, but we want to
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * add these attributes to m_attributes. So me must call super.
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * addAttributes() In this case m_attributes is only used for the
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * first element, after that this class totally delegates to the
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * wrapped handler which is either XML or HTML.
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (atts != null)
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    super.addAttributes(atts);
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // if there are attributes, then lets make the flush()
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // call the startElement on the handler and send the
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // attributes on their way.
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (atts != null)
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    flush();
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // this is not the first element, but a later one, so just
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // send it on its way.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.startElement(namespaceURI, localName, elementName,  atts);
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedLexicalHandler#comment(String)
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void comment(String comment) throws SAXException
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted && m_firstElementName != null)
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            emitFirstTag();
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (m_needToCallStartDocument)
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.startDocument();
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_needToCallStartDocument = false;
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.comment(comment);
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getDoctypePublic()
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getDoctypePublic()
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getDoctypePublic();
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getDoctypeSystem()
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getDoctypeSystem()
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getDoctypeSystem();
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getEncoding()
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getEncoding()
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getEncoding();
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getIndent()
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getIndent()
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getIndent();
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getIndentAmount()
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int getIndentAmount()
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getIndentAmount();
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getMediaType()
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getMediaType()
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getMediaType();
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getOmitXMLDeclaration()
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getOmitXMLDeclaration()
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getOmitXMLDeclaration();
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getStandalone()
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getStandalone()
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getStandalone();
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#getVersion()
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getVersion()
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getVersion();
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setDoctype(String, String)
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctype(String system, String pub)
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setDoctypePublic(pub);
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setDoctypeSystem(system);
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the doctype in the underlying XML handler. Remember that this method
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was called, just in case we need to transfer this doctype to an HTML handler
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param doctype the public doctype to set
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setDoctypePublic(String)
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctypePublic(String doctype)
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setDoctypePublic(doctype);
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_setDoctypePublic_called = true;
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the doctype in the underlying XML handler. Remember that this method
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was called, just in case we need to transfer this doctype to an HTML handler
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param doctype the system doctype to set
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setDoctypeSystem(String)
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctypeSystem(String doctype)
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setDoctypeSystem(doctype);
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_setDoctypeSystem_called = true;
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setEncoding(String)
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setEncoding(String encoding)
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setEncoding(encoding);
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setIndent(boolean)
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setIndent(boolean indent)
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setIndent(indent);
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setIndentAmount(int value)
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setIndentAmount(value);
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setMediaType(String)
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMediaType(String mediaType)
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setMediaType(mediaType);
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_setMediaType_called = true;
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setOmitXMLDeclaration(boolean)
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setOmitXMLDeclaration(boolean b)
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setOmitXMLDeclaration(b);
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setStandalone(String)
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setStandalone(String standalone)
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setStandalone(standalone);
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setVersion(String)
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.DeclHandler#attributeDecl(String, String, String, String, String)
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void attributeDecl(
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg0,
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg1,
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg2,
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg3,
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg4)
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.attributeDecl(arg0, arg1, arg2, arg3, arg4);
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.DeclHandler#elementDecl(String, String)
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void elementDecl(String arg0, String arg1) throws SAXException
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            emitFirstTag();
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.elementDecl(arg0, arg1);
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.DeclHandler#externalEntityDecl(String, String, String)
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void externalEntityDecl(
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String name,
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String publicId,
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String systemId)
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.externalEntityDecl(name, publicId, systemId);
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.DeclHandler#internalEntityDecl(String, String)
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void internalEntityDecl(String arg0, String arg1)
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.internalEntityDecl(arg0, arg1);
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#characters(char[], int, int)
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void characters(char[] characters, int offset, int length)
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.characters(characters, offset, length);
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#endDocument()
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endDocument() throws SAXException
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endDocument();
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#endElement(String, String, String)
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endElement(String namespaceURI, String localName, String qName)
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (namespaceURI == null && m_firstElementURI != null)
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                namespaceURI = m_firstElementURI;
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (localName == null && m_firstElementLocalName != null)
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                localName = m_firstElementLocalName;
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endElement(namespaceURI, localName, qName);
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#endPrefixMapping(String)
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endPrefixMapping(String prefix) throws SAXException
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endPrefixMapping(prefix);
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void ignorableWhitespace(char[] ch, int start, int length)
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.ignorableWhitespace(ch, start, length);
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#processingInstruction(String, String)
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void processingInstruction(String target, String data)
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.processingInstruction(target, data);
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#setDocumentLocator(Locator)
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDocumentLocator(Locator locator)
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setDocumentLocator(locator);
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ContentHandler#skippedEntity(String)
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void skippedEntity(String name) throws SAXException
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.skippedEntity(name);
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int)
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void comment(char[] ch, int start, int length) throws SAXException
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flush();
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.comment(ch, start, length);
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#endCDATA()
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endCDATA() throws SAXException
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endCDATA();
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#endDTD()
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endDTD() throws SAXException
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endDTD();
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#endEntity(String)
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endEntity(String name) throws SAXException
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            emitFirstTag();
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.endEntity(name);
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#startCDATA()
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startCDATA() throws SAXException
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.startCDATA();
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#startDTD(String, String, String)
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startDTD(String name, String publicId, String systemId)
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.startDTD(name, publicId, systemId);
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Pass the call on to the underlying handler
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ext.LexicalHandler#startEntity(String)
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startEntity(String name) throws SAXException
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.startEntity(name);
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Initialize the wrapped output stream (XML or HTML).
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If the stream handler should be HTML, then replace the XML handler with
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * an HTML handler. After than send the starting method calls that were cached
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * to the wrapped handler.
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void initStreamOutput() throws SAXException
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Try to rule out if this is an not to be an HTML document based on prefix
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean firstElementIsHTML = isFirstElemHTML();
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (firstElementIsHTML)
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // create an HTML output handler, and initialize it
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // keep a reference to the old handler, ... it will soon be gone
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            SerializationHandler oldHandler = m_handler;
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /* We have to make sure we get an output properties with the proper
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * defaults for the HTML method.  The easiest way to do this is to
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * have the OutputProperties class do it.
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             */
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Properties htmlProperties =
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                OutputPropertiesFactory.getDefaultMethodProperties(Method.HTML);
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Serializer serializer =
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                SerializerFactory.getSerializer(htmlProperties);
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // The factory should be returning a ToStream
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Don't know what to do if it doesn't
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // i.e. the user has over-ridden the content-handler property
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // for html
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler = (SerializationHandler) serializer;
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //m_handler = new ToHTMLStream();
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Writer writer = oldHandler.getWriter();
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null != writer)
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_handler.setWriter(writer);
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                OutputStream os = oldHandler.getOutputStream();
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (null != os)
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_handler.setOutputStream(os);
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // need to copy things from the old handler to the new one here
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            if (_setVersion_called)
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            {
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.setVersion(oldHandler.getVersion());
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            }
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            if (_setDoctypeSystem_called)
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            {
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.setDoctypeSystem(oldHandler.getDoctypeSystem());
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            }
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            if (_setDoctypePublic_called)
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            {
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.setDoctypePublic(oldHandler.getDoctypePublic());
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            }
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            if (_setMediaType_called)
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            {
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.setMediaType(oldHandler.getMediaType());
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //            }
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.setTransformer(oldHandler.getTransformer());
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /* Now that we have a real wrapped handler (XML or HTML) lets
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * pass any cached calls to it
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Call startDocument() if necessary
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_needToCallStartDocument)
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.startDocument();
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_needToCallStartDocument = false;
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // the wrapped handler is now fully initialized
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_wrapped_handler_not_initialized = false;
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void emitFirstTag() throws SAXException
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstElementName != null)
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_wrapped_handler_not_initialized)
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                initStreamOutput();
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_wrapped_handler_not_initialized = false;
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Output first tag
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.startElement(m_firstElementURI, null, m_firstElementName, m_attributes);
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // don't need the collected attributes of the first element anymore.
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_attributes = null;
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Output namespaces of first tag
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_namespacePrefix != null)
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final int n = m_namespacePrefix.size();
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                for (int i = 0; i < n; i++)
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    final String prefix =
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        (String) m_namespacePrefix.elementAt(i);
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    final String uri = (String) m_namespaceURI.elementAt(i);
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_handler.startPrefixMapping(prefix, uri, false);
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_namespacePrefix = null;
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_namespaceURI = null;
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_firstTagNotEmitted = false;
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Utility function for calls to local-name().
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Don't want to override static function on SerializerBase
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * So added Unknown suffix to method name.
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String getLocalNameUnknown(String value)
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int idx = value.lastIndexOf(':');
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (idx >= 0)
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            value = value.substring(idx + 1);
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        idx = value.lastIndexOf('@');
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (idx >= 0)
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            value = value.substring(idx + 1);
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (value);
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * Utility function to return prefix
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         *
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * Don't want to override static function on SerializerBase
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * So added Unknown suffix to method name.
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String getPrefixPartUnknown(String qname)
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int index = qname.indexOf(':');
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (index > 0) ? qname.substring(0, index) : EMPTYSTRING;
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Determine if the firts element in the document is <html> or <HTML>
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This uses the cached first element name, first element prefix and the
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * cached namespaces from previous method calls
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the first element is an opening <html> tag
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean isFirstElemHTML()
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean isHTML;
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // is the first tag html, not considering the prefix ?
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        isHTML =
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            getLocalNameUnknown(m_firstElementName).equalsIgnoreCase("html");
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Try to rule out if this is not to be an HTML document based on URI
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (isHTML
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            && m_firstElementURI != null
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            && !EMPTYSTRING.equals(m_firstElementURI))
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // the <html> element has a non-trivial namespace
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            isHTML = false;
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Try to rule out if this is an not to be an HTML document based on prefix
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (isHTML && m_namespacePrefix != null)
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /* the first element has a name of "html", but lets check the prefix.
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * If the prefix points to a namespace with a URL that is not ""
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * then the doecument doesn't start with an <html> tag, and isn't html
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             */
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final int max = m_namespacePrefix.size();
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (int i = 0; i < max; i++)
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final String prefix = (String) m_namespacePrefix.elementAt(i);
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final String uri = (String) m_namespaceURI.elementAt(i);
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_firstElementPrefix != null
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && m_firstElementPrefix.equals(prefix)
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && !EMPTYSTRING.equals(uri))
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // The first element has a prefix, so it can't be <html>
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    isHTML = false;
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    break;
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return isHTML;
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#asDOMSerializer()
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DOMSerializer asDOMSerializer() throws IOException
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.asDOMSerializer();
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param URI_and_localNames Vector a list of pairs of URI/localName
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * specified in the cdata-section-elements attribute.
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setCdataSectionElements(java.util.Vector)
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setCdataSectionElements(Vector URI_and_localNames)
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setCdataSectionElements(URI_and_localNames);
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#addAttributes(org.xml.sax.Attributes)
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttributes(Attributes atts) throws SAXException
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.addAttributes(atts);
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the current namespace mappings.
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Simply returns the mappings of the wrapped handler.
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#getNamespaceMappings()
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceMappings getNamespaceMappings()
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        NamespaceMappings mappings = null;
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_handler != null)
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            mappings = m_handler.getNamespaceMappings();
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return mappings;
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#flushPending()
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void flushPending() throws SAXException
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flush();
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.flushPending();
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void flush()
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_firstTagNotEmitted)
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            emitFirstTag();
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_needToCallStartDocument)
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_handler.startDocument();
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_needToCallStartDocument = false;
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch(SAXException e)
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new RuntimeException(e.toString());
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#getPrefix
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getPrefix(String namespaceURI)
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getPrefix(namespaceURI);
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#entityReference(java.lang.String)
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void entityReference(String entityName) throws SAXException
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.entityReference(entityName);
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#getNamespaceURI(java.lang.String, boolean)
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getNamespaceURI(String qname, boolean isElement)
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getNamespaceURI(qname, isElement);
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getNamespaceURIFromPrefix(String prefix)
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getNamespaceURIFromPrefix(prefix);
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setTransformer(Transformer t)
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setTransformer(t);
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((t instanceof SerializerTrace) &&
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            (((SerializerTrace) t).hasTraceListeners())) {
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           m_tracer = (SerializerTrace) t;
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           m_tracer = null;
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Transformer getTransformer()
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.getTransformer();
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setContentHandler(org.xml.sax.ContentHandler)
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setContentHandler(ContentHandler ch)
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setContentHandler(ch);
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used to set the source locator, which might be used to
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * generated an error message.
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param locator the source locator
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#setSourceLocator(javax.xml.transform.SourceLocator)
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setSourceLocator(SourceLocator locator)
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_handler.setSourceLocator(locator);
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void firePseudoElement(String elementName)
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null) {
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            StringBuffer sb = new StringBuffer();
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            sb.append('<');
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            sb.append(elementName);
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // convert the StringBuffer to a char array and
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // emit the trace event that these characters "might"
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // be written
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            char ch[] = sb.toString().toCharArray();
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                SerializerTrace.EVENTTYPE_OUTPUT_PSEUDO_CHARACTERS,
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ch,
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                0,
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ch.length);
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.apache.xml.serializer.Serializer#asDOM3Serializer()
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Object asDOM3Serializer() throws IOException
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_handler.asDOM3Serializer();
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1317