ToXMLStream.java revision 9f8118474e9513f7a5b7d2a05e4a0fb15d1a6569
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: ToXMLStream.java 469359 2006-10-31 03:43:19Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson package org.apache.xml.serializer;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Result;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.MsgKey;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.Utils;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class converts SAX or SAX-like calls to a
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * serialized xml document.  The xsl:output method is "xml".
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class is used explicitly in code generated by XSLTC,
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * so it is "public", but it should
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be viewed as internal or package private, this is not an API.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ToXMLStream extends ToStream
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Map that tells which XML characters should have special treatment, and it
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  provides character to entity name lookup.
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private CharInfo m_xmlcharInfo =
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        CharInfo.getCharInfo(CharInfo.XML_ENTITIES_RESOURCE, Method.XML);
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Default constructor.
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public ToXMLStream()
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_charInfo = m_xmlcharInfo;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        initCDATA();
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // initialize namespaces
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_prefixMap = new NamespaceMappings();
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Copy properties from another SerializerToXML.
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param xmlListener non-null reference to a SerializerToXML object.
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void CopyFrom(ToXMLStream xmlListener)
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setWriter(xmlListener.m_writer);
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // m_outputStream = xmlListener.m_outputStream;
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String encoding = xmlListener.getEncoding();
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setEncoding(encoding);
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOmitXMLDeclaration(xmlListener.getOmitXMLDeclaration());
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ispreserve = xmlListener.m_ispreserve;
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_preserves = xmlListener.m_preserves;
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_isprevtext = xmlListener.m_isprevtext;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_doIndent = xmlListener.m_doIndent;
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setIndentAmount(xmlListener.getIndentAmount());
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_startNewLine = xmlListener.m_startNewLine;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_needToOutputDocTypeDecl = xmlListener.m_needToOutputDocTypeDecl;
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setDoctypeSystem(xmlListener.getDoctypeSystem());
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setDoctypePublic(xmlListener.getDoctypePublic());
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setStandalone(xmlListener.getStandalone());
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setMediaType(xmlListener.getMediaType());
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_encodingInfo = xmlListener.m_encodingInfo;
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_spaceBeforeClose = xmlListener.m_spaceBeforeClose;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_cdataStartCalled = xmlListener.m_cdataStartCalled;
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notification of the beginning of a document.
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException Any SAX exception, possibly
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *            wrapping another exception.
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startDocumentInternal() throws org.xml.sax.SAXException
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_needToCallStartDocument)
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.startDocumentInternal();
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_needToCallStartDocument = false;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_inEntityRef)
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_needToOutputDocTypeDecl = true;
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_startNewLine = false;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /* The call to getXMLVersion() might emit an error message
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * and we should emit this message regardless of if we are
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * writing out an XML header or not.
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             */
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String version = getXMLVersion();
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (getOmitXMLDeclaration() == false)
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String encoding = Encodings.getMimeEncoding(getEncoding());
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String standalone;
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_standaloneWasSpecified)
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    standalone = " standalone=\"" + getStandalone() + "\"";
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    standalone = "";
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    final java.io.Writer writer = m_writer;
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("<?xml version=\"");
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(version);
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("\" encoding=\"");
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(encoding);
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write('\"');
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(standalone);
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("?>");
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (m_doIndent) {
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        if (m_standaloneWasSpecified
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                || getDoctypePublic() != null
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                || getDoctypeSystem() != null) {
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // We almost never put a newline after the XML
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // header because this XML could be used as
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // an extenal general parsed entity
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // and we don't know the context into which it
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // will be used in the future.  Only when
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // standalone, or a doctype system or public is
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // specified are we free to insert a new line
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // after the header.  Is it even worth bothering
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // in these rare cases?
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            writer.write(m_lineSep, 0, m_lineSepLen);
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        }
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                catch(IOException e)
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new SAXException(e);
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notification of the end of a document.
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException Any SAX exception, possibly
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *            wrapping another exception.
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endDocument() throws org.xml.sax.SAXException
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flushPending();
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_doIndent && !m_isprevtext)
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            outputLineSep();
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch(IOException e)
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new SAXException(e);
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flushWriter();
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.fireEndDoc();
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Starts a whitespace preserving section. All characters printed
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * within a preserving section are printed without indentation and
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * without consolidating multiple spaces. This is equivalent to
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the <tt>xml:space=&quot;preserve&quot;</tt> attribute. Only XML
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * and HTML serializers need to support this method.
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The contents of the whitespace preserving section will be delivered
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * through the regular <tt>characters</tt> event.
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startPreserving() throws org.xml.sax.SAXException
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Not sure this is really what we want.  -sb
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_preserves.push(true);
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ispreserve = true;
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Ends a whitespace preserving section.
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #startPreserving
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endPreserving() throws org.xml.sax.SAXException
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Not sure this is really what we want.  -sb
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_ispreserve = m_preserves.isEmpty() ? false : m_preserves.pop();
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notification of a processing instruction.
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param target The processing instruction target.
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param data The processing instruction data, or null if
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        none was supplied.
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException Any SAX exception, possibly
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *            wrapping another exception.
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void processingInstruction(String target, String data)
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_inEntityRef)
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flushPending();
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (target.equals(Result.PI_DISABLE_OUTPUT_ESCAPING))
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            startNonEscaping();
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (target.equals(Result.PI_ENABLE_OUTPUT_ESCAPING))
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            endNonEscaping();
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_elemContext.m_startTagOpen)
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    closeStartTag();
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_elemContext.m_startTagOpen = false;
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if (m_needToCallStartDocument)
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    startDocumentInternal();
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (shouldIndent())
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    indent();
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final java.io.Writer writer = m_writer;
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                writer.write("<?");
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                writer.write(target);
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (data.length() > 0
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && !Character.isSpaceChar(data.charAt(0)))
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(' ');
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                int indexOfQLT = data.indexOf("?>");
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (indexOfQLT >= 0)
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // See XSLT spec on error recovery of "?>" in PIs.
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (indexOfQLT > 0)
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        writer.write(data.substring(0, indexOfQLT));
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("? >"); // add space between.
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if ((indexOfQLT + 2) < data.length())
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        writer.write(data.substring(indexOfQLT + 2));
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(data);
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                writer.write('?');
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                writer.write('>');
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /*
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * Don't write out any indentation whitespace now,
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * because there may be non-whitespace text after this.
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 *
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * Simply mark that at this point if we do decide
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * to indent that we should
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * add a newline on the end of the current line before
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * the indentation at the start of the next line.
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_startNewLine = true;
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch(IOException e)
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new SAXException(e);
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.fireEscapingEvent(target, data);
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notivication of a entityReference.
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name The name of the entity.
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void entityReference(String name) throws org.xml.sax.SAXException
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            closeStartTag();
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_elemContext.m_startTagOpen = false;
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (shouldIndent())
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                indent();
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final java.io.Writer writer = m_writer;
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            writer.write('&');
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            writer.write(name);
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            writer.write(';');
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch(IOException e)
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new SAXException(e);
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            super.fireEntityReference(name);
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used to add an attribute to the currently open element.
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The caller has guaranted that this attribute is unique, which means that it
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * not been seen before and will not be seen again.
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name the qualified name of the attribute
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute which can contain only
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * ASCII printable characters characters in the range 32 to 127 inclusive.
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param flags the bit values of this integer give optimization information.
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addUniqueAttribute(String name, String value, int flags)
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final String patchedName = patchName(name);
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                final java.io.Writer writer = m_writer;
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ((flags & NO_BAD_CHARS) > 0 && m_xmlcharInfo.onlyQuotAmpLtGt)
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // "flags" has indicated that the characters
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // '>'  '<'   '&'  and '"' are not in the value and
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // m_htmlcharInfo has recorded that there are no other
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // entities in the range 32 to 127 so we write out the
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // value directly
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(' ');
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(patchedName);
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("=\"");
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(value);
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write('"');
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(' ');
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write(patchedName);
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write("=\"");
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writeAttrString(writer, value, this.getEncoding());
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    writer.write('"');
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (IOException e) {
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new SAXException(e);
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Add an attribute to the current element.
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI associated with the element name
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param localName local part of the attribute name
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param rawName   prefix:localName
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param xslAttribute true if this attribute is from an xsl:attribute,
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * false if declared within the elements opening tag.
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws SAXException
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri,
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName,
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String rawName,
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String type,
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String value,
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean xslAttribute)
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean was_added = addAttributeAlways(uri, localName, rawName, type, value, xslAttribute);
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /*
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * We don't run this block of code if:
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * 1. The attribute value was only replaced (was_added is false).
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * 2. The attribute is from an xsl:attribute element (that is handled
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             *    in the addAttributeAlways() call just above.
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * 3. The name starts with "xmlns", i.e. it is a namespace declaration.
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             */
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (was_added && !xslAttribute && !rawName.startsWith("xmlns"))
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String prefixUsed =
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    ensureAttributesNamespaceIsDeclared(
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        uri,
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        localName,
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        rawName);
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (prefixUsed != null
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && rawName != null
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && !rawName.startsWith(prefixUsed))
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // use a different raw name, with the prefix used in the
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // generated namespace declaration
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    rawName = prefixUsed + ":" + localName;
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(uri, localName, rawName, type, value, xslAttribute);
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /*
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * The startTag is closed, yet we are adding an attribute?
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             *
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * Section: 7.1.3 Creating Attributes Adding an attribute to an
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * element after a PI (for example) has been added to it is an
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * error. The attributes can be ignored. The spec doesn't explicitly
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * say this is disallowed, as it does for child elements, but it
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * makes sense to have the same treatment.
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             *
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             * We choose to ignore the attribute which is added too late.
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             */
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Generate a warning of the ignored attributes
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Create the warning message
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages.createMessage(
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    MsgKey.ER_ILLEGAL_ATTRIBUTE_POSITION,new Object[]{ localName });
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Prepare to issue the warning message
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Transformer tran = super.getTransformer();
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ErrorListener errHandler = tran.getErrorListener();
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Issue the warning message
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (null != errHandler && m_sourceLocator != null)
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  errHandler.warning(new TransformerException(msg, m_sourceLocator));
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  System.out.println(msg);
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (TransformerException e){
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // A user defined error handler, errHandler, may throw
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // a TransformerException if it chooses to, and if it does
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // we will wrap it with a SAXException and re-throw.
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Of course if the handler throws another type of
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // exception, like a RuntimeException, then that is OK too.
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                SAXException se = new SAXException(e);
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw se;
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#endElement(String)
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endElement(String elemName) throws SAXException
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        endElement(null, null, elemName);
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used to notify the serializer of a namespace mapping (or node)
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * that applies to the current element whose startElement() call has already been seen.
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The official SAX startPrefixMapping(prefix,uri) is to define a mapping for a child
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * element that is soon to be seen with a startElement() call. The official SAX call
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * does not apply to the current element, hence the reason for this method.
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void namespaceAfterStartElement(
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final String prefix,
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final String uri)
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // hack for XSLTC with finding URI for default namespace
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_elementURI == null)
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String prefix1 = getPrefixPart(m_elemContext.m_elementName);
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (prefix1 == null && EMPTYSTRING.equals(prefix))
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // the elements URI is not known yet, and it
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // doesn't have a prefix, and we are currently
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // setting the uri for prefix "", so we have
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // the uri for the element... lets remember it
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_elemContext.m_elementURI = uri;
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startPrefixMapping(prefix,uri,false);
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * From XSLTC
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Declare a prefix to point to a namespace URI. Inform SAX handler
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * if this is a new prefix mapping.
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean pushNamespace(String prefix, String uri)
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_prefixMap.pushNamespace(
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                prefix, uri, m_elemContext.m_currentElemDepth))
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                startPrefixMapping(prefix, uri);
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return true;
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (SAXException e)
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // falls through
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Try's to reset the super class and reset this class for
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * re-use, so that you don't need to create a new serializer
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * (mostly for performance reasons).
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the class was successfuly reset.
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean reset()
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean wasReset = false;
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (super.reset())
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Make this call when resetToXMLStream does
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // something.
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // resetToXMLStream();
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            wasReset = true;
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return wasReset;
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reset all of the fields owned by ToStream class
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void resetToXMLStream()
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This is an empty method, but is kept for future use
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // as a place holder for a location to reset fields
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // defined within this class
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method checks for the XML version of output document.
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If XML version of output document is not specified, then output
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * document is of version XML 1.0.
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If XML version of output doucment is specified, but it is not either
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * XML 1.0 or XML 1.1, a warning message is generated, the XML Version of
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * output document is set to XML 1.0 and processing continues.
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return string (XML version)
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String getXMLVersion()
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String xmlVersion = getVersion();
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(xmlVersion == null || xmlVersion.equals(XMLVERSION10))
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xmlVersion = XMLVERSION10;
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if(xmlVersion.equals(XMLVERSION11))
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xmlVersion = XMLVERSION11;
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages.createMessage(
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               MsgKey.ER_XML_VERSION_NOT_SUPPORTED,new Object[]{ xmlVersion });
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Prepare to issue the warning message
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Transformer tran = super.getTransformer();
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ErrorListener errHandler = tran.getErrorListener();
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Issue the warning message
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (null != errHandler && m_sourceLocator != null)
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    errHandler.warning(new TransformerException(msg, m_sourceLocator));
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    System.out.println(msg);
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (Exception e){}
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xmlVersion = XMLVERSION10;
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return xmlVersion;
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
647