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: SerializerBase.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.util.HashMap;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Set;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.OutputKeys;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.MsgKey;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.Utils;
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 Wilsonimport org.xml.sax.SAXParseException;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class acts as a base class for the XML "serializers"
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and the stream serializers.
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * It contains a number of common fields and methods.
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic abstract class SerializerBase
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    implements SerializationHandler, SerializerConstants
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SerializerBase() {
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The name of the package that this class is in.
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Not a public API.
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final String PKG_NAME;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The same as the name of the package that this class is in
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * except that '.' are replaced with '/'.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Not a public API.
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final String PKG_PATH;
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static {
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String fullyQualifiedName = SerializerBase.class.getName();
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int lastDot = fullyQualifiedName.lastIndexOf('.');
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (lastDot < 0) {
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            PKG_NAME = "";
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            PKG_NAME = fullyQualifiedName.substring(0, lastDot);
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        StringBuffer sb = new StringBuffer();
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < PKG_NAME.length(); i++) {
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            char ch = PKG_NAME.charAt(i);
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (ch == '.')
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                sb.append('/');
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                sb.append(ch);
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        PKG_PATH = sb.toString();
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off the end element trace event
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of element
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireEndElem(String name)
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENDELEMENT,name, (Attributes)null);
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the characters trace event
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param chars  content of characters
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param start  starting index of characters to output
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param length  number of characters to output
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireCharEvent(char[] chars, int start, int length)
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CHARACTERS, chars, start,length);
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * true if we still need to call startDocumentInternal()
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_needToCallStartDocument = true;
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** True if a trailing "]]>" still needs to be written to be
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * written out. Used to merge adjacent CDATA sections
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_cdataTagOpen = false;
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * All the attributes of the current element, collected from
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startPrefixMapping() calls, or addAddtribute() calls, or
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * from the SAX attributes in a startElement() call.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected AttributesImplSerializer m_attributes = new AttributesImplSerializer();
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Tells if we're in an EntityRef event.
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_inEntityRef = false;
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** This flag is set while receiving events from the external DTD */
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_inExternalDTD = false;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The System ID for the doc type.
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String m_doctypeSystem;
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The public ID for the doc type.
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String m_doctypePublic;
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Flag to tell that we need to add the doctype decl, which we can't do
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * until the first element is encountered.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean m_needToOutputDocTypeDecl = true;
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Tells if we should write the XML declaration.
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_shouldNotWriteXMLHeader = false;
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The standalone value for the doctype.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_standalone;
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * True if standalone was specified.
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_standaloneWasSpecified = false;
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Flag to tell if indenting (pretty-printing) is on.
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean m_doIndent = false;
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Amount to indent.
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int m_indentAmount = 0;
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Tells the XML version, for writing out to the XML decl.
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String m_version = null;
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The mediatype.  Not used right now.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String m_mediatype;
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The transformer that was around when this output handler was created (if
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * any).
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Transformer m_transformer;
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Namespace support, that keeps track of currently defined
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefix/uri mappings. As processed elements come and go, so do
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the associated mappings for that element.
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected NamespaceMappings m_prefixMap;
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Handle for firing generate events.  This interface may be implemented
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * by the referenced transformer object.
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected SerializerTrace m_tracer;
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected SourceLocator m_sourceLocator;
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The writer to send output to. This field is only used in the ToStream
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serializers, but exists here just so that the fireStartDoc() and
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * other fire... methods can flush this writer when tracing.
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected java.io.Writer m_writer = null;
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A reference to "stack frame" corresponding to
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the current element. Such a frame is pushed at a startElement()
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * and popped at an endElement(). This frame contains information about
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the element, such as its namespace URI.
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected ElemContext m_elemContext = new ElemContext();
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A utility buffer for converting Strings passed to
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character() methods to character arrays.
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reusing this buffer means not creating a new character array
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * everytime and it runs faster.
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected char[] m_charsBuff = new char[60];
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A utility buffer for converting Strings passed to
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * attribute methods to character arrays.
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reusing this buffer means not creating a new character array
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * everytime and it runs faster.
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected char[] m_attrBuff = new char[30];
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notification of a comment.
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedLexicalHandler#comment(String)
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void comment(String data) throws SAXException
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_docIsEmpty = false;
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int length = data.length();
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length > m_charsBuff.length)
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_charsBuff = new char[length * 2 + 1];
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        data.getChars(0, length, m_charsBuff, 0);
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        comment(m_charsBuff, 0, length);
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If at runtime, when the qname of the attribute is
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * known, another prefix is specified for the attribute, then we can
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * patch or hack the name with this method. For
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * a qname of the form "ns?:otherprefix:name", this function patches the
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * qname by simply ignoring "otherprefix".
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * TODO: This method is a HACK! We do not have access to the
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * XML file, it sometimes generates a NS prefix of the form "ns?" for
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * an attribute.
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String patchName(String qname)
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int lastColon = qname.lastIndexOf(':');
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (lastColon > 0) {
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final int firstColon = qname.indexOf(':');
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String prefix = qname.substring(0, firstColon);
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String localName = qname.substring(lastColon + 1);
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If uri is "" then ignore prefix
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String uri = m_prefixMap.lookupNamespace(prefix);
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (uri != null && uri.length() == 0) {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return localName;
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if (firstColon != lastColon) {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return prefix + ':' + localName;
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return qname;
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the local name of a qualified name. If the name has no prefix,
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * then it works as the identity (SAX2).
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param qname the qualified name
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the name, but excluding any prefix and colon.
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected static String getLocalName(String qname)
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int col = qname.lastIndexOf(':');
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (col > 0) ? qname.substring(col + 1) : qname;
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive an object for locating the origin of SAX document events.
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param locator An object that can return the location of any SAX document
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * event.
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive an object for locating the origin of SAX document events.
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>SAX parsers are strongly encouraged (though not absolutely
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * required) to supply a locator: if it does so, it must supply
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the locator to the application by invoking this method before
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * invoking any of the other methods in the DocumentHandler
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * interface.</p>
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>The locator allows the application to determine the end
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * position of any document-related event, even if the parser is
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * not reporting an error.  Typically, the application will
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * use this information for reporting its own errors (such as
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character content that does not match an application's
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * business rules).  The information returned by the locator
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is probably not sufficient for use with a search engine.</p>
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Note that the locator will return correct information only
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * during the invocation of the events in this interface.  The
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * application should not attempt to use it at any other time.</p>
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDocumentLocator(Locator locator)
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // I don't do anything with this yet.
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds the given attribute to the set of collected attributes , but only if
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * there is a currently open element.
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * An element is currently open if a startElement() notification has
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * occured but the start of the element has not yet been written to the
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * output.  In the stream case this means that we have not yet been forced
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * to close the elements opening tag by another notification, such as a
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character notification.
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI of the attribute
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param localName the local name of the attribute
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param rawName    the qualified name of the attribute
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type the type of the attribute (probably CDATA)
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param XSLAttribute true if this attribute is coming from an xsl:attriute element
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri,
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName,
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String rawName,
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String type,
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String value,
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean XSLAttribute)
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(uri, localName, rawName, type, value, XSLAttribute);
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds the given attribute to the set of attributes, even if there is
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * no currently open element. This is useful if a SAX startPrefixMapping()
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * should need to add an attribute before the element name is seen.
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI of the attribute
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param localName the local name of the attribute
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param rawName   the qualified name of the attribute
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param type the type of the attribute (probably CDATA)
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param XSLAttribute true if this attribute is coming from an xsl:attribute element
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the attribute was added,
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * false if an existing value was replaced.
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean addAttributeAlways(
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri,
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName,
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String rawName,
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String type,
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String value,
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean XSLAttribute)
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean was_added;
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            final int index =
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                (localName == null || uri == null) ?
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                m_attributes.getIndex(rawName):m_attributes.getIndex(uri, localName);
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int index;
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            if (localName == null || uri == null){
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                index = m_attributes.getIndex(rawName);
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            else {
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                index = m_attributes.getIndex(uri, localName);
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            }
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (localName == null || uri == null || uri.length() == 0)
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                index = m_attributes.getIndex(rawName);
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else {
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                index = m_attributes.getIndex(uri,localName);
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (index >= 0)
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                /* We've seen the attribute before.
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * We may have a null uri or localName, but all
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 * we really want to re-set is the value anyway.
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 */
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_attributes.setValue(index,value);
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                was_added = false;
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // the attribute doesn't exist yet, create it
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_attributes.addAttribute(uri, localName, rawName, type, value);
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                was_added = true;
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return was_added;
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  Adds  the given attribute to the set of collected attributes,
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but only if there is a currently open element.
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name the attribute's qualified name
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(String name, final String value)
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String patchedName = patchName(name);
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String localName = getLocalName(patchedName);
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String uri = getNamespaceURI(patchedName, false);
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(uri,localName, patchedName, "CDATA", value, false);
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Adds the given xsl:attribute to the set of collected attributes,
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but only if there is a currently open element.
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name the attribute's qualified name (prefix:localName)
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value the value of the attribute
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI that the prefix of the name points to
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addXSLAttribute(String name, final String value, final String uri)
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String patchedName = patchName(name);
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final String localName = getLocalName(patchedName);
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(uri,localName, patchedName, "CDATA", value, true);
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Add the given attributes to the currently collected ones. These
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * attributes are always added, regardless of whether on not an element
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is currently open.
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param atts List of attributes to add to this list
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttributes(Attributes atts) throws SAXException
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int nAtts = atts.getLength();
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < nAtts; i++)
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String uri = atts.getURI(i);
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == uri)
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uri = "";
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uri,
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                atts.getLocalName(i),
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                atts.getQName(i),
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                atts.getType(i),
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                atts.getValue(i),
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                false);
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return a {@link ContentHandler} interface into this serializer.
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If the serializer does not support the {@link ContentHandler}
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * interface, it should return null.
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A {@link ContentHandler} interface into this serializer,
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  or null if the serializer is not SAX 2 capable
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws IOException An I/O exception occured
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public ContentHandler asContentHandler() throws IOException
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return this;
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the end of an entity.
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name The name of the entity that is ending.
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException The application may raise an exception.
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #startEntity
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void endEntity(String name) throws org.xml.sax.SAXException
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (name.equals("[dtd]"))
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_inExternalDTD = false;
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_inEntityRef = false;
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this.fireEndEntity(name);
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Flush and close the underlying java.io.Writer. This method applies to
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * ToStream serializers, not ToSAXHandler serializers.
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ToStream
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void close()
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // do nothing (base behavior)
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Initialize global variables
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void initCDATA()
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // CDATA stack
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //        _cdataStack = new Stack();
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //        _cdataStack.push(new Integer(-1)); // push dummy value
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the character encoding to be used in the output document.
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the character encoding to be used in the output document.
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getEncoding()
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return getOutputProperty(OutputKeys.ENCODING);
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /**
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the character encoding coming from the xsl:output encoding stylesheet attribute.
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param m_encoding the character encoding
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setEncoding(String encoding)
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.ENCODING,encoding);
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the value coming from the xsl:output omit-xml-declaration stylesheet attribute
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param b true if the XML declaration is to be omitted from the output
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * document.
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setOmitXMLDeclaration(boolean b)
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String val = b ? "yes":"no";
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,val);
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the XML declaration is to be omitted from the output
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * document.
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getOmitXMLDeclaration()
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_shouldNotWriteXMLHeader;
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the previously set value of the value to be used as the public
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * identifier in the document type declaration (DTD).
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *@return the public identifier to be used in the DOCTYPE declaration in the
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * output document.
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getDoctypePublic()
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_doctypePublic;
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** Set the value coming from the xsl:output doctype-public stylesheet attribute.
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @param doctypePublic the public identifier to be used in the DOCTYPE
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * declaration in the output document.
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      */
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctypePublic(String doctypePublic)
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctypePublic);
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the previously set value of the value to be used
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * as the system identifier in the document type declaration (DTD).
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @return the system identifier to be used in the DOCTYPE declaration in
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * the output document.
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getDoctypeSystem()
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_doctypeSystem;
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** Set the value coming from the xsl:output doctype-system stylesheet attribute.
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * @param doctypeSystem the system identifier to be used in the DOCTYPE
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      * declaration in the output document.
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      */
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctypeSystem(String doctypeSystem)
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctypeSystem);
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** Set the value coming from the xsl:output doctype-public and doctype-system stylesheet properties
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param doctypeSystem the system identifier to be used in the DOCTYPE
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * declaration in the output document.
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param doctypePublic the public identifier to be used in the DOCTYPE
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * declaration in the output document.
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDoctype(String doctypeSystem, String doctypePublic)
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctypeSystem);
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctypePublic);
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the value coming from the xsl:output standalone stylesheet attribute.
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param standalone a value of "yes" indicates that the
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <code>standalone</code> delaration is to be included in the output
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * document. This method remembers if the value was explicitly set using
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * this method, verses if the value is the default value.
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setStandalone(String standalone)
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.STANDALONE, standalone);
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the XSL standalone attribute, but does not remember if this is a
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * default or explicite setting.
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param standalone "yes" | "no"
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void setStandaloneInternal(String standalone)
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ("yes".equals(standalone))
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_standalone = "yes";
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_standalone = "no";
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Gets the XSL standalone attribute
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return a value of "yes" if the <code>standalone</code> delaration is to
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * be included in the output document.
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  @see XSLOutputAttributes#getStandalone()
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getStandalone()
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_standalone;
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the output document should be indented to visually
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * indicate its structure.
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getIndent()
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_doIndent;
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Gets the mediatype the media-type or MIME type associated with the output
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * document.
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the mediatype the media-type or MIME type associated with the
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * output document.
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getMediaType()
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_mediatype;
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Gets the version of the output format.
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the version of the output format.
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getVersion()
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_version;
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the value coming from the xsl:output version attribute.
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param version the version of the output format.
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setVersion(String)
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setVersion(String version)
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.VERSION, version);
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the value coming from the xsl:output media-type stylesheet attribute.
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param mediaType the non-null media-type or MIME type associated with the
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * output document.
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see javax.xml.transform.OutputKeys#MEDIA_TYPE
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setMediaType(String)
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setMediaType(String mediaType)
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.MEDIA_TYPE,mediaType);
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the number of spaces to indent for each indentation level.
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int getIndentAmount()
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_indentAmount;
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the indentation amount.
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param m_indentAmount The m_indentAmount to set
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setIndentAmount(int m_indentAmount)
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_indentAmount = m_indentAmount;
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the value coming from the xsl:output indent stylesheet
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * attribute.
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param doIndent true if the output document should be indented to
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * visually indicate its structure.
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see XSLOutputAttributes#setIndent(boolean)
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setIndent(boolean doIndent)
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String val = doIndent ? "yes":"no";
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setOutputProperty(OutputKeys.INDENT,val);
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used when a prefix/uri namespace mapping
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is indicated after the element was started with a
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startElement() and before and endElement().
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startPrefixMapping(prefix,uri) would be used before the
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startElement() call.
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri the URI of the namespace
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix the prefix associated with the given URI.
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#namespaceAfterStartElement(String, String)
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void namespaceAfterStartElement(String uri, String prefix)
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // default behavior is to do nothing
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return a {@link DOMSerializer} interface into this serializer. If the
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serializer does not support the {@link DOMSerializer} interface, it should
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * return null.
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A {@link DOMSerializer} interface into this serializer,  or null
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * if the serializer is not DOM capable
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws IOException An I/O exception occured
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see Serializer#asDOMSerializer()
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DOMSerializer asDOMSerializer() throws IOException
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return this;
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Tell if two strings are equal, without worry if the first string is null.
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param p String reference, which may be null.
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param t String reference, which may be null.
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if strings are equal.
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static final boolean subPartMatch(String p, String t)
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (p == t) || ((null != p) && (p.equals(t)));
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the local name of a qualified name.
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If the name has no prefix,
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * then it works as the identity (SAX2).
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param qname a qualified name
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return returns the prefix of the qualified name,
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * or null if there is no prefix.
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected static final String getPrefixPart(String qname)
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int col = qname.indexOf(':');
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (col > 0) ? qname.substring(0, col) : null;
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //return (col > 0) ? qname.substring(0,col) : "";
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Some users of the serializer may need the current namespace mappings
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the current namespace mappings (prefix/uri)
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#getNamespaceMappings()
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceMappings getNamespaceMappings()
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_prefixMap;
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the prefix currently pointing to the given URI (if any).
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param namespaceURI the uri of the namespace in question
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return a prefix pointing to the given URI (if any).
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#getPrefix(String)
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getPrefix(String namespaceURI)
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String prefix = m_prefixMap.lookupPrefix(namespaceURI);
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return prefix;
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the URI of an element or attribute. Note that default namespaces
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * do not apply directly to attributes.
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param qname a qualified name
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param isElement true if the qualified name is the name of
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * an element.
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return returns the namespace URI associated with the qualified name.
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getNamespaceURI(String qname, boolean isElement)
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri = EMPTYSTRING;
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int col = qname.lastIndexOf(':');
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final String prefix = (col > 0) ? qname.substring(0, col) : EMPTYSTRING;
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!EMPTYSTRING.equals(prefix) || isElement)
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_prefixMap != null)
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uri = m_prefixMap.lookupNamespace(prefix);
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (uri == null && !prefix.equals(XMLNS_PREFIX))
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new RuntimeException(
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        Utils.messages.createMessage(
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_NAMESPACE_PREFIX,
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            new Object[] { qname.substring(0, col) }  ));
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return uri;
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the URI of prefix (if any)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @param prefix the prefix whose URI is searched for
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return the namespace URI currently associated with the
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefix, null if the prefix is undefined.
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getNamespaceURIFromPrefix(String prefix)
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri = null;
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_prefixMap != null)
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uri = m_prefixMap.lookupNamespace(prefix);
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return uri;
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Entity reference event.
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of entity
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void entityReference(String name) throws org.xml.sax.SAXException
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flushPending();
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startEntity(name);
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        endEntity(name);
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		    fireEntityReference(name);
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the transformer associated with this serializer
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param t the transformer associated with this serializer.
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#setTransformer(Transformer)
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setTransformer(Transformer t)
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_transformer = t;
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If this transformer object implements the SerializerTrace interface
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // then assign m_tracer to the transformer object so it can be used
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // to fire trace events.
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((m_transformer instanceof SerializerTrace) &&
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            (((SerializerTrace) m_transformer).hasTraceListeners())) {
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           m_tracer = (SerializerTrace) m_transformer;
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           m_tracer = null;
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Gets the transformer associated with this serializer
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return returns the transformer associated with this serializer.
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see SerializationHandler#getTransformer()
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Transformer getTransformer()
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_transformer;
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method gets the nodes value as a String and uses that String as if
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * it were an input character notification.
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param node the Node to serialize
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void characters(org.w3c.dom.Node node)
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        flushPending();
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String data = node.getNodeValue();
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (data != null)
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            final int length = data.length();
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (length > m_charsBuff.length)
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_charsBuff = new char[length * 2 + 1];
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            data.getChars(0, length, m_charsBuff, 0);
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            characters(m_charsBuff, 0, length);
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ErrorHandler#error(SAXParseException)
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void error(SAXParseException exc) throws SAXException {
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ErrorHandler#fatalError(SAXParseException)
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void fatalError(SAXParseException exc) throws SAXException {
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elemContext.m_startTagOpen = false;
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.ErrorHandler#warning(SAXParseException)
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void warning(SAXParseException exc) throws SAXException
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off start entity trace event
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of entity
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireStartEntity(String name)
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENTITYREF, name);
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the characters event
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param chars  content of characters
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param start  starting index of characters to output
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param length  number of characters to output
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    protected void fireCharEvent(char[] chars, int start, int length)
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        throws org.xml.sax.SAXException
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        if (m_tracer != null)
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CHARACTERS, chars, start,length);
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is only used internally when flushing the writer from the
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * various fire...() trace events.  Due to the writer being wrapped with
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * SerializerTraceWriter it may cause the flush of these trace events:
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * EVENTTYPE_OUTPUT_PSEUDO_CHARACTERS
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * EVENTTYPE_OUTPUT_CHARACTERS
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * which trace the output written to the output stream.
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void flushMyWriter()
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_writer != null)
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_writer.flush();
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch(IOException ioe)
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the CDATA trace event
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param chars  content of CDATA
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param start  starting index of characters to output
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param length  number of characters to output
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireCDATAEvent(char[] chars, int start, int length)
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (m_tracer != null)
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CDATA, chars, start,length);
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the comment trace event
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param chars  content of comment
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param start  starting index of comment to output
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param length  number of characters to output
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireCommentEvent(char[] chars, int start, int length)
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (m_tracer != null)
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_COMMENT, new String(chars, start, length));
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off end entity trace event
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of entity
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void fireEndEntity(String name)
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	// we do not need to handle this.
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off start document trace  event
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     protected void fireStartDoc()
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_STARTDOCUMENT);
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off end document trace event
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireEndDoc()
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENDDOCUMENT);
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Report the start element trace event. This trace method needs to be
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * called just before the attributes are cleared.
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param elemName the qualified name of the element
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireStartElem(String elemName)
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_STARTELEMENT,
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                elemName, m_attributes);
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off the end element event
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of element
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    protected void fireEndElem(String name)
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        throws org.xml.sax.SAXException
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        if (m_tracer != null)
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENDELEMENT,name, (Attributes)null);
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off the PI trace event
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of PI
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireEscapingEvent(String name, String data)
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_PI,name, data);
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * To fire off the entity reference trace event
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Name of entity reference
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void fireEntityReference(String name)
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws org.xml.sax.SAXException
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            flushMyWriter();
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENTITYREF,name, (Attributes)null);
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Receive notification of the beginning of a document.
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is never a self generated call,
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but only called externally.
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>The SAX parser will invoke this method only once, before any
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * other methods in this interface or in DTDHandler (except for
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * setDocumentLocator).</p>
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException Any SAX exception, possibly
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *            wrapping another exception.
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.xml.sax.SAXException
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void startDocument() throws org.xml.sax.SAXException
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // if we do get called with startDocument(), handle it right away
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startDocumentInternal();
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_needToCallStartDocument = false;
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return;
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method handles what needs to be done at a startDocument() call,
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * whether from an external caller, or internally called in the
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serializer.  For historical reasons the serializer is flexible to
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startDocument() not always being called.
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Even if no external call is
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * made into startDocument() this method will always be called as a self
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * generated internal startDocument, it handles what needs to be done at a
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * startDocument() call.
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method exists just to make sure that startDocument() is only ever
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * called from an external caller, which in principle is just a matter of
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * style.
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws SAXException
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected void startDocumentInternal() throws org.xml.sax.SAXException
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_tracer != null)
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this.fireStartDoc();
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is used to set the source locator, which might be used to
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * generated an error message.
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param locator the source locator
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#setSourceLocator(javax.xml.transform.SourceLocator)
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setSourceLocator(SourceLocator locator)
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_sourceLocator = locator;
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Used only by TransformerSnapshotImpl to restore the serialization
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * to a previous state.
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param mappings NamespaceMappings
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setNamespaceMappings(NamespaceMappings mappings) {
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_prefixMap = mappings;
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean reset()
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	resetSerializerBase();
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return true;
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reset all of the fields owned by SerializerBase
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void resetSerializerBase()
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_attributes.clear();
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_CdataElems = null;
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_cdataTagOpen = false;
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_docIsEmpty = true;
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_doctypePublic = null;
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_doctypeSystem = null;
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_doIndent = false;
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_elemContext = new ElemContext();
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_indentAmount = 0;
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_inEntityRef = false;
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_inExternalDTD = false;
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_mediatype = null;
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_needToCallStartDocument = true;
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_needToOutputDocTypeDecl = false;
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_OutputProps != null)
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this.m_OutputProps.clear();
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_OutputPropsDefault != null)
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this.m_OutputPropsDefault.clear();
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (this.m_prefixMap != null)
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	    this.m_prefixMap.reset();
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_shouldNotWriteXMLHeader = false;
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_sourceLocator = null;
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_standalone = null;
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_standaloneWasSpecified = false;
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_StringOfCDATASections = null;
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_tracer = null;
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_transformer = null;
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	this.m_version = null;
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	// don't set writer to null, so that it might be re-used
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	//this.m_writer = null;
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the serializer is used for temporary output rather than
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * final output.
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This concept is made clear in the XSLT 2.0 draft.
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    final boolean inTemporaryOutputState()
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /* This is a hack. We should really be letting the serializer know
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * that it is in temporary output state with an explicit call, but
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * from a pragmatic point of view (for now anyways) having no output
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * encoding at all, not even the default UTF-8 indicates that the serializer
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * is being used for temporary RTF.
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (getEncoding() == null);
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method adds an attribute the the current element,
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but should not be used for an xsl:attribute child.
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void addAttribute(String uri, String localName, String rawName, String type, String value) throws SAXException
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_elemContext.m_startTagOpen)
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addAttributeAlways(uri, localName, rawName, type, value, false);
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.DTDHandler#notationDecl(java.lang.String, java.lang.String, java.lang.String)
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void notationDecl(String arg0, String arg1, String arg2)
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException {
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This method just provides a definition to satisfy the interface
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // A particular sub-class of SerializerBase provides the implementation (if desired)
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.DTDHandler#unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void unparsedEntityDecl(
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg0,
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg1,
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg2,
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String arg3)
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throws SAXException {
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This method just provides a definition to satisfy the interface
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // A particular sub-class of SerializerBase provides the implementation (if desired)
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If set to false the serializer does not expand DTD entities,
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but leaves them as is, the default value is true.
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setDTDEntityExpansion(boolean expand) {
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This method just provides a definition to satisfy the interface
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // A particular sub-class of SerializerBase provides the implementation (if desired)
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The CDATA section names stored in a whitespace separateed list with
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * each element being a word of the form "{uri}localName" This list
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * comes from the cdata-section-elements attribute.
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This field replaces m_cdataSectionElements Vector.
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String m_StringOfCDATASections = null;
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean m_docIsEmpty = true;
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void initCdataElems(String s)
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (s != null)
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int max = s.length();
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // true if we are in the middle of a pair of curly braces that delimit a URI
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean inCurly = false;
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // true if we found a URI but haven't yet processed the local name
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean foundURI = false;
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            StringBuffer buf = new StringBuffer();
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String uri = null;
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String localName = null;
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // parse through string, breaking on whitespaces.  I do this instead
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // of a tokenizer so I can track whitespace inside of curly brackets,
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // which theoretically shouldn't happen if they contain legal URLs.
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (int i = 0; i < max; i++)
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                char c = s.charAt(i);
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (Character.isWhitespace(c))
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (!inCurly)
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        if (buf.length() > 0)
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        {
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            localName = buf.toString();
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            if (!foundURI)
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                uri = "";
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            addCDATAElement(uri,localName);
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            buf.setLength(0);
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            foundURI = false;
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        }
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        continue;
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    else
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        buf.append(c); // add whitespace to the URI
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if ('{' == c) // starting a URI
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    inCurly = true;
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if ('}' == c)
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // we just ended a URI, add the URI to the vector
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    foundURI = true;
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    uri = buf.toString();
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    buf.setLength(0);
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    inCurly = false;
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // append non-whitespace, non-curly to current URI or localName being gathered.
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    buf.append(c);
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (buf.length() > 0)
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // We have one last localName to process.
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                localName = buf.toString();
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (!foundURI)
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    uri = "";
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                addCDATAElement(uri,localName);
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected java.util.Hashtable m_CdataElems = null;
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void addCDATAElement(String uri, String localName)
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_CdataElems == null) {
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_CdataElems = new java.util.Hashtable();
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        java.util.Hashtable h = (java.util.Hashtable) m_CdataElems.get(localName);
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (h == null) {
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            h = new java.util.Hashtable();
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_CdataElems.put(localName,h);
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        h.put(uri,uri);
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return true if nothing has been sent to this result tree yet.
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This is not a public API.
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @xsl.usage internal
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean documentIsEmpty() {
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If we haven't called startDocument() yet, then this document is empty
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_docIsEmpty && (m_elemContext.m_currentElemDepth == 0);
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return true if the current element in m_elemContext
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is a CDATA section.
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * CDATA sections are specified in the <xsl:output> attribute
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * cdata-section-names or in the JAXP equivalent property.
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * In any case the format of the value of such a property is:
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <pre>
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * "{uri1}localName1 {uri2}localName2 . . . "
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * </pre>
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method is not a public API, but is only used internally by the serializer.
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected boolean isCdataSection()
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean b = false;
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != m_StringOfCDATASections)
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (m_elemContext.m_elementLocalName == null)
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String localName =  getLocalName(m_elemContext.m_elementName);
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_elemContext.m_elementLocalName = localName;
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( m_elemContext.m_elementURI == null) {
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_elemContext.m_elementURI = getElementURI();
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if ( m_elemContext.m_elementURI.length() == 0) {
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( m_elemContext.m_elementName == null) {
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_elemContext.m_elementName = m_elemContext.m_elementLocalName;
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // leave URI as "", meaning in no namespace
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if (m_elemContext.m_elementLocalName.length() < m_elemContext.m_elementName.length()){
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // We were told the URI was "", yet the name has a prefix since the name is longer than the localname.
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // So we will fix that incorrect information here.
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    m_elemContext.m_elementURI = getElementURI();
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            java.util.Hashtable h = (java.util.Hashtable) m_CdataElems.get(m_elemContext.m_elementLocalName);
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (h != null)
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                Object obj = h.get(m_elemContext.m_elementURI);
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (obj != null)
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    b = true;
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return b;
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Before this call m_elementContext.m_elementURI is null,
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * which means it is not yet known. After this call it
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is non-null, but possibly "" meaning that it is in the
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * default namespace.
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The URI of the element, never null, but possibly "".
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String getElementURI() {
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String uri = null;
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // At this point in processing we have received all the
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // namespace mappings
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // As we still don't know the elements namespace,
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // we now figure it out.
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String prefix = getPrefixPart(m_elemContext.m_elementName);
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefix == null) {
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // no prefix so lookup the URI of the default namespace
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uri = m_prefixMap.lookupNamespace("");
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uri = m_prefixMap.lookupNamespace(prefix);
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (uri == null) {
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // We didn't find the namespace for the
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // prefix ... ouch, that shouldn't happen.
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // This is a hack, we really don't know
15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // the namespace
15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uri = EMPTYSTRING;
15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return uri;
15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the value of an output property,
15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the explicit value, if any, otherwise the
15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * default value, if any, otherwise null.
15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getOutputProperty(String name) {
15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String val = getOutputPropertyNonDefault(name);
15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If no explicit value, try to get the default value
15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (val == null)
15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            val = getOutputPropertyDefault(name);
15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return val;
15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the value of an output property,
15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * not the default value. If there is a default
15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * value, but no non-default value this method
15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * will return null.
15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getOutputPropertyNonDefault(String name )
15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return getProp(name,false);
15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return a {@link DOM3Serializer} interface into this serializer. If the
15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serializer does not support the {@link DOM3Serializer} interface, it should
15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * return null.
15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A {@link DOM3Serializer} interface into this serializer,  or null
15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * if the serializer is not DOM capable
15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws IOException An I/O exception occured
15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.apache.xml.serializer.Serializer#asDOM3Serializer()
15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Object asDOM3Serializer() throws IOException
15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return new org.apache.xml.serializer.dom3.DOM3SerializerImpl(this);
15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the default value of an xsl:output property,
15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * which would be null only if no default value exists
15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * for the property.
15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getOutputPropertyDefault(String name) {
15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return getProp(name, true);
15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the value for the output property, typically from
15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * an xsl:output element, but this does not change what
15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the default value is.
15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void   setOutputProperty(String name, String val) {
16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setProp(name,val,false);
16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set the default value for an output property, but this does
16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * not impact any explicitly set value.
16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void   setOutputPropertyDefault(String name, String val) {
16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setProp(name,val,true);
16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A mapping of keys to explicitly set values, for example if
16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * and <xsl:output/> has an "encoding" attribute, this
16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * map will have what that attribute maps to.
16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private HashMap m_OutputProps;
16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * A mapping of keys to default values, for example if
16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the default value of the encoding is "UTF-8" then this
16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * map will have that "encoding" maps to "UTF-8".
16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private HashMap m_OutputPropsDefault;
16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Set getOutputPropDefaultKeys() {
16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_OutputPropsDefault.keySet();
16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Set getOutputPropKeys() {
16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_OutputProps.keySet();
16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String getProp(String name, boolean defaultVal) {
16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_OutputProps == null) {
16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_OutputProps = new HashMap();
16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_OutputPropsDefault = new HashMap();
16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String val;
16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (defaultVal)
16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            val = (String) m_OutputPropsDefault.get(name);
16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            val = (String) m_OutputProps.get(name);
16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return val;
16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name The name of the property, e.g. "{http://myprop}indent-tabs" or "indent".
16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param val The value of the property, e.g. "4"
16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param defaultVal true if this is a default value being set for the property as
16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * opposed to a user define on, set say explicitly in the stylesheet or via JAXP
16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void setProp(String name, String val, boolean defaultVal) {
16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_OutputProps == null) {
16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_OutputProps = new HashMap();
16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_OutputPropsDefault = new HashMap();
16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
16619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (defaultVal)
16639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_OutputPropsDefault.put(name,val);
16649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else {
16659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (OutputKeys.CDATA_SECTION_ELEMENTS.equals(name) && val != null) {
16669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                initCdataElems(val);
16679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String oldVal = (String) m_OutputProps.get(name);
16689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String newVal;
16699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (oldVal == null)
16709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    newVal = oldVal + ' ' + val;
16719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
16729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    newVal = val;
16739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_OutputProps.put(name,newVal);
16749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
16759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else {
16769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                m_OutputProps.put(name,val);
16779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
16789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
16799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
16849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Get the first char of the local name
16859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name Either a local name, or a local name
16869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * preceeded by a uri enclosed in curly braces.
16879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
16889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static char getFirstCharLocName(String name) {
16899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final char first;
16909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int i = name.indexOf('}');
16919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (i < 0)
16929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            first = name.charAt(0);
16939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
16949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            first = name.charAt(i+1);
16959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return first;
16969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
16989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1700