141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// XMLWriter.java - serialize an XML document.
241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Written by David Megginson, david@megginson.com
341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// and placed by him into the public domain.
441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Extensively modified by John Cowan for TagSoup.
541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is licensed under the Apache License,
641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Version 2.0.  You may obtain a copy of this license at
741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 .  You may also have
841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// additional legal rights not granted by this license.
941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
1041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is distributed in the hope that it will be useful, but
1141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// unless required by applicable law or agreed to in writing, TagSoup
1241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
1341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// OF ANY KIND, either express or implied; not even the implied warranty
1441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
1641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpackage org.ccil.cowan.tagsoup;
1741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
1841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.IOException;
1941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.OutputStreamWriter;
2041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.Writer;
2141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Enumeration;
2241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Hashtable;
2341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Properties;
2441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.Attributes;
2641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.SAXException;
2741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.XMLReader;
2841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.AttributesImpl;
2941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.NamespaceSupport;
3041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.XMLFilterImpl;
3141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.ext.LexicalHandler;
3241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project/**
3541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Filter to write an XML document from a SAX event stream.
3641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
3741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This class can be used by itself or as part of a SAX event
3841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * stream: it takes as input a series of SAX2 ContentHandler
3941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * events and uses the information in those events to write
4041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * an XML document.  Since this class is a filter, it can also
4141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * pass the events on down a filter chain for further processing
4241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * (you can use the XMLWriter to take a snapshot of the current
4341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * state at any point in a filter chain), and it can be
4441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * used directly as a ContentHandler for a SAX2 XMLReader.</p>
4541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
4641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The client creates a document by invoking the methods for
4741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * standard SAX2 events, always beginning with the
4841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startDocument startDocument} method and ending with
4941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the {@link #endDocument endDocument} method.  There are convenience
5041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * methods provided so that clients to not have to create empty
5141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * attribute lists or provide empty strings as parameters; for
5241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * example, the method invocation</p>
5341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
5441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
5541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("foo");
5641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
5741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
5841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>is equivalent to the regular SAX2 ContentHandler method</p>
5941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
6041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
6141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("", "foo", "", new AttributesImpl());
6241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
6341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
6441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Except that it is more efficient because it does not allocate
6541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a new empty attribute list each time.  The following code will send
6641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a simple XML document to standard output:</p>
6741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
6841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
6941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XMLWriter w = new XMLWriter();
7041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
7141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument();
7241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("greeting");
7341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.characters("Hello, world!");
7441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endElement("greeting");
7541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument();
7641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
7741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
7841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p>
7941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
8041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
8141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;?xml version="1.0" standalone="yes"?>
8241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
8341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;greeting>Hello, world!&lt;/greeting>
8441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
8541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
8641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>In fact, there is an even simpler convenience method,
8741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <var>dataElement</var>, designed for writing elements that
8841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * contain only character data, so the code to generate the
8941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * document could be shortened to</p>
9041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
9141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
9241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XMLWriter w = new XMLWriter();
9341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
9441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument();
9541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("greeting", "Hello, world!");
9641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument();
9741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
9841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
9941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <h2>Whitespace</h2>
10041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
10141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>According to the XML Recommendation, <em>all</em> whitespace
10241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * in an XML document is potentially significant to an application,
10341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * so this class never adds newlines or indentation.  If you
10441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * insert three elements in a row, as in</p>
10541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
10641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
10741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "1");
10841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "2");
10941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "3");
11041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
11141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
11241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>you will end up with</p>
11341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
11441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
11541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;item>1&lt;/item>&lt;item>3&lt;/item>&lt;item>3&lt;/item>
11641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
11741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
11841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>You need to invoke one of the <var>characters</var> methods
11941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * explicitly to add newlines or indentation.  Alternatively, you
12041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * can use {@link com.megginson.sax.DataWriter DataWriter}, which
12141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is derived from this class -- it is optimized for writing
12241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * purely data-oriented (or field-oriented) XML, and does automatic
12341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * linebreaks and indentation (but does not support mixed content
12441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * properly).</p>
12541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
12641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
12741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <h2>Namespace Support</h2>
12841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
12941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The writer contains extensive support for XML Namespaces, so that
13041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a client application does not have to keep track of prefixes and
13141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * supply <var>xmlns</var> attributes.  By default, the XML writer will
13241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * generate Namespace declarations in the form _NS1, _NS2, etc., wherever
13341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * they are needed, as in the following example:</p>
13441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
13541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
13641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument();
13741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo");
13841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument();
13941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
14041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
14141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p>
14241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
14341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
14441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;?xml version="1.0" standalone="yes"?>
14541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
14641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;_NS1:foo xmlns:_NS1="http://www.foo.com/ns/"/>
14741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
14841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
14941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>In many cases, document authors will prefer to choose their
15041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * own prefixes rather than using the (ugly) default names.  The
15141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XML writer allows two methods for selecting prefixes:</p>
15241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
15341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <ol>
15441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <li>the qualified name</li>
15541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <li>the {@link #setPrefix setPrefix} method.</li>
15641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </ol>
15741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
15841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Whenever the XML writer finds a new Namespace URI, it checks
15941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to see if a qualified (prefixed) name is also available; if so
16041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * it attempts to use the name's prefix (as long as the prefix is
16141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * not already in use for another Namespace URI).</p>
16241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
16341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Before writing a document, the client can also pre-map a prefix
16441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to a Namespace URI with the setPrefix method:</p>
16541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
16641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
16741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.setPrefix("http://www.foo.com/ns/", "foo");
16841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument();
16941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo");
17041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument();
17141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
17241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
17341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p>
17441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
17541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
17641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;?xml version="1.0" standalone="yes"?>
17741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
17841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;foo:foo xmlns:foo="http://www.foo.com/ns/"/>
17941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
18041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
18141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The default Namespace simply uses an empty string as the prefix:</p>
18241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
18341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
18441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.setPrefix("http://www.foo.com/ns/", "");
18541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument();
18641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo");
18741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument();
18841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
18941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
19041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p>
19141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
19241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
19341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;?xml version="1.0" standalone="yes"?>
19441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
19541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;foo xmlns="http://www.foo.com/ns/"/>
19641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
19741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
19841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>By default, the XML writer will not declare a Namespace until
19941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * it is actually used.  Sometimes, this approach will create
20041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a large number of Namespace declarations, as in the following
20141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * example:</p>
20241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
20341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
20441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;xml version="1.0" standalone="yes"?>
20541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
20641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
20741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *  &lt;rdf:Description about="http://www.foo.com/ids/books/12345">
20841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:title xmlns:dc="http://www.purl.org/dc/">A Dark Night&lt;/dc:title>
20941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:creator xmlns:dc="http://www.purl.org/dc/">Jane Smith&lt;/dc:title>
21041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:date xmlns:dc="http://www.purl.org/dc/">2000-09-09&lt;/dc:title>
21141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *  &lt;/rdf:Description>
21241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;/rdf:RDF>
21341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
21441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
21541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The "rdf" prefix is declared only once, because the RDF Namespace
21641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is used by the root element and can be inherited by all of its
21741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * descendants; the "dc" prefix, on the other hand, is declared three
21841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * times, because no higher element uses the Namespace.  To solve this
21941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * problem, you can instruct the XML writer to predeclare Namespaces
22041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * on the root element even if they are not used there:</p>
22141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
22241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
22341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.forceNSDecl("http://www.purl.org/dc/");
22441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
22541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
22641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Now, the "dc" prefix will be declared on the root element even
22741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * though it's not needed there, and can be inherited by its
22841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * descendants:</p>
22941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
23041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre>
23141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;xml version="1.0" standalone="yes"?>
23241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
23341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
23441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *             xmlns:dc="http://www.purl.org/dc/">
23541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *  &lt;rdf:Description about="http://www.foo.com/ids/books/12345">
23641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:title>A Dark Night&lt;/dc:title>
23741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:creator>Jane Smith&lt;/dc:title>
23841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *   &lt;dc:date>2000-09-09&lt;/dc:title>
23941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *  &lt;/rdf:Description>
24041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * &lt;/rdf:RDF>
24141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre>
24241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
24341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This approach is also useful for declaring Namespace prefixes
24441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * that be used by qualified names appearing in attribute values or
24541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * character data.</p>
24641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
24741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @author David Megginson, david@megginson.com
24841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @version 0.2
24941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.XMLFilter
25041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler
25141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */
25241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpublic class XMLWriter extends XMLFilterImpl implements LexicalHandler
25341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project{
25441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
25541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
25641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
25741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Constructors.
25841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
25941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
26041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
26141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
26241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Create a new XML writer.
26341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
26441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>Write to standard output.</p>
26541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
26641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public XMLWriter ()
26741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
26841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        init(null);
26941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
27041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
27141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
27241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
27341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Create a new XML writer.
27441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
27541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>Write to the writer provided.</p>
27641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
27741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param writer The output destination, or null to use standard
27841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        output.
27941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
28041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public XMLWriter (Writer writer)
28141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
28241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        init(writer);
28341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
28441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
28541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
28641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
28741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Create a new XML writer.
28841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
28941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>Use the specified XML reader as the parent.</p>
29041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
29141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param xmlreader The parent in the filter chain, or null
29241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        for no parent.
29341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
29441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public XMLWriter (XMLReader xmlreader)
29541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
29641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super(xmlreader);
29741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        init(null);
29841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
29941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
30041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
30141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
30241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Create a new XML writer.
30341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
30441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>Use the specified XML reader as the parent, and write
30541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * to the specified writer.</p>
30641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
30741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param xmlreader The parent in the filter chain, or null
30841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        for no parent.
30941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param writer The output destination, or null to use standard
31041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        output.
31141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
31241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public XMLWriter (XMLReader xmlreader, Writer writer)
31341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
31441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super(xmlreader);
31541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        init(writer);
31641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
31741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
31841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
31941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
32041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Internal initialization method.
32141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
32241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>All of the public constructors invoke this method.
32341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
32441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param writer The output destination, or null to use
32541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        standard output.
32641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
32741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void init (Writer writer)
32841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
32941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        setOutput(writer);
33041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport = new NamespaceSupport();
33141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        prefixTable = new Hashtable();
33241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        forcedDeclTable = new Hashtable();
33341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        doneDeclTable = new Hashtable();
33441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        outputProperties = new Properties();
33541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
33641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
33741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
33841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
33941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
34041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Public methods.
34141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
34241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
34341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
34441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
34541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Reset the writer.
34641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
34741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method is especially useful if the writer throws an
34841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * exception before it is finished, and you want to reuse the
34941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * writer for a new document.  It is usually a good idea to
35041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * invoke {@link #flush flush} before resetting the writer,
35141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * to make sure that no output is lost.</p>
35241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
35341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method is invoked automatically by the
35441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #startDocument startDocument} method before writing
35541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * a new document.</p>
35641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
35741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p><strong>Note:</strong> this method will <em>not</em>
35841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * clear the prefix or URI information in the writer or
35941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * the selected output writer.</p>
36041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
36141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #flush
36241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
36341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void reset ()
36441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
36541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        elementLevel = 0;
36641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        prefixCounter = 0;
36741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport.reset();
36841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
36941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
37041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
37141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
37241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Flush the output.
37341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
37441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method flushes the output stream.  It is especially useful
37541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * when you need to make certain that the entire document has
37641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * been written to output but do not want to close the output
37741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * stream.</p>
37841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
37941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method is invoked automatically by the
38041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #endDocument endDocument} method after writing a
38141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * document.</p>
38241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
38341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #reset
38441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
38541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void flush ()
38641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws IOException
38741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
38841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        output.flush();
38941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
39041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
39141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
39241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
39341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Set a new output destination for the document.
39441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
39541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param writer The output destination, or null to use
39641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        standard output.
39741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @return The current output writer.
39841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #flush
39941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
40041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void setOutput (Writer writer)
40141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
40241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (writer == null) {
40341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            output = new OutputStreamWriter(System.out);
40441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } else {
40541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            output = writer;
40641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
40741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
40841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
40941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
41041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
41141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Specify a preferred prefix for a Namespace URI.
41241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
41341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>Note that this method does not actually force the Namespace
41441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * to be declared; to do that, use the {@link
41541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * #forceNSDecl(java.lang.String) forceNSDecl} method as well.</p>
41641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
41741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI.
41841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param prefix The preferred prefix, or "" to select
41941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        the default Namespace.
42041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #getPrefix
42141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #forceNSDecl(java.lang.String)
42241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #forceNSDecl(java.lang.String,java.lang.String)
42341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
42441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void setPrefix (String uri, String prefix)
42541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
42641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        prefixTable.put(uri, prefix);
42741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
42841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
42941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
43041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
43141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Get the current or preferred prefix for a Namespace URI.
43241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
43341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI.
43441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @return The preferred prefix, or "" for the default Namespace.
43541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #setPrefix
43641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
43741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public String getPrefix (String uri)
43841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
43941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return (String)prefixTable.get(uri);
44041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
44141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
44241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
44341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
44441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Force a Namespace to be declared on the root element.
44541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
44641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>By default, the XMLWriter will declare only the Namespaces
44741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * needed for an element; as a result, a Namespace may be
44841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * declared many places in a document if it is not used on the
44941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * root element.</p>
45041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
45141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method forces a Namespace to be declared on the root
45241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * element even if it is not used there, and reduces the number
45341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * of xmlns attributes in the document.</p>
45441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
45541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI to declare.
45641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #forceNSDecl(java.lang.String,java.lang.String)
45741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #setPrefix
45841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
45941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void forceNSDecl (String uri)
46041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
46141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        forcedDeclTable.put(uri, Boolean.TRUE);
46241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
46341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
46441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
46541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
46641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Force a Namespace declaration with a preferred prefix.
46741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
46841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This is a convenience method that invokes {@link
46941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * #setPrefix setPrefix} then {@link #forceNSDecl(java.lang.String)
47041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * forceNSDecl}.</p>
47141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
47241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI to declare on the root element.
47341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param prefix The preferred prefix for the Namespace, or ""
47441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        for the default Namespace.
47541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #setPrefix
47641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #forceNSDecl(java.lang.String)
47741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
47841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void forceNSDecl (String uri, String prefix)
47941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
48041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        setPrefix(uri, prefix);
48141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        forceNSDecl(uri);
48241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
48341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
48441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
48541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
48641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
48741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Methods from org.xml.sax.ContentHandler.
48841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
48941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
49041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
49141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
49241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write the XML declaration at the beginning of the document.
49341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
49441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
49541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
49641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
49741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the XML declaration, or if a handler further down
49841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
49941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#startDocument
50041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
50141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startDocument ()
50241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
50341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
50441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        reset();
50541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (!("yes".equals(outputProperties.getProperty(OMIT_XML_DECLARATION, "no")))) {
50641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write("<?xml");
50741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (version == null) {
50841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" version=\"1.0\"");
50941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            } else {
51041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" version=\"");
51141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(version);
51241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("\"");
51341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
51441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (outputEncoding != null && outputEncoding != "") {
51541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" encoding=\"");
51641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(outputEncoding);
51741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("\"");
51841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
51941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (standalone == null) {
52041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" standalone=\"yes\"?>\n");
52141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            } else {
52241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" standalone=\"");
52341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(standalone);
52441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("\"");
52541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
52641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
52741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.startDocument();
52841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
52941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
53041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
53141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
53241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a newline at the end of the document.
53341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
53441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
53541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
53641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
53741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the newline, or if a handler further down
53841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
53941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#endDocument
54041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
54141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endDocument ()
54241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
54341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
54441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write('\n');
54541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.endDocument();
54641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        try {
54741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            flush();
54841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } catch (IOException e) {
54941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            throw new SAXException(e);
55041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
55141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
55241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
55341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
55441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
55541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a start tag.
55641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
55741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
55841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
55941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI, or the empty string if none
56041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        is available.
56141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local (unprefixed) name (required).
56241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The element's qualified (prefixed) name, or the
56341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        empty string is none is available.  This method will
56441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        use the qName as a template for generating a prefix
56541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        if necessary, but it is not guaranteed to use the
56641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        same qName.
56741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param atts The element's attribute list (must not be null).
56841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
56941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the start tag, or if a handler further down
57041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
57141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#startElement
57241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
57341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startElement (String uri, String localName,
57441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                              String qName, Attributes atts)
57541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
57641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
57741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        elementLevel++;
57841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport.pushContext();
57941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (forceDTD && !hasOutputDTD) startDTD(localName == null ? qName : localName, "", "");
58041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write('<');
58141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeName(uri, localName, qName, true);
58241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeAttributes(atts);
58341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (elementLevel == 1) {
58441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            forceNSDecls();
58541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
58641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeNSDecls();
58741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write('>');
58841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//	System.out.println("%%%% startElement [" + qName + "] htmlMode = " + htmlMode);
58941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (htmlMode && (qName.equals("script") || qName.equals("style"))) {
59041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                cdataElement = true;
59141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//		System.out.println("%%%% CDATA element");
59241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
59341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.startElement(uri, localName, qName, atts);
59441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
59541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
59641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
59741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
59841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an end tag.
59941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
60041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
60141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
60241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI, or the empty string if none
60341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        is available.
60441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local (unprefixed) name (required).
60541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The element's qualified (prefixed) name, or the
60641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        empty string is none is available.  This method will
60741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        use the qName as a template for generating a prefix
60841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        if necessary, but it is not guaranteed to use the
60941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        same qName.
61041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
61141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the end tag, or if a handler further down
61241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
61341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#endElement
61441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
61541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endElement (String uri, String localName, String qName)
61641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
61741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
61841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (!(htmlMode &&
61941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            (uri.equals("http://www.w3.org/1999/xhtml") ||
62041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		uri.equals("")) &&
62141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            (qName.equals("area") || qName.equals("base") ||
62241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("basefont") || qName.equals("br") ||
62341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("col") || qName.equals("frame") ||
62441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("hr") || qName.equals("img") ||
62541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("input") || qName.equals("isindex") ||
62641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("link") || qName.equals("meta") ||
62741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            qName.equals("param")))) {
62841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("</");
62941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                writeName(uri, localName, qName, true);
63041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write('>');
63141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
63241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (elementLevel == 1) {
63341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write('\n');
63441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
63541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        cdataElement = false;
63641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.endElement(uri, localName, qName);
63741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport.popContext();
63841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        elementLevel--;
63941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
64041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
64141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
64241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
64341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write character data.
64441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
64541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
64641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
64741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param ch The array of characters to write.
64841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param start The starting position in the array.
64941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param length The number of characters to write.
65041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
65141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the characters, or if a handler further down
65241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
65341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#characters
65441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
65541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void characters (char ch[], int start, int len)
65641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
65741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
65841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (!cdataElement) {
65941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project          writeEsc(ch, start, len, false);
66041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project          }
66141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        else {
66241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project          for (int i = start; i < start + len; i++) {
66341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(ch[i]);
66441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
66541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project          }
66641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.characters(ch, start, len);
66741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
66841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
66941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
67041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
67141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write ignorable whitespace.
67241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
67341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
67441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
67541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param ch The array of characters to write.
67641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param start The starting position in the array.
67741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param length The number of characters to write.
67841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
67941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the whitespace, or if a handler further down
68041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
68141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#ignorableWhitespace
68241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
68341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void ignorableWhitespace (char ch[], int start, int length)
68441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
68541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
68641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeEsc(ch, start, length, false);
68741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.ignorableWhitespace(ch, start, length);
68841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
68941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
69041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
69141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
69241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
69341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a processing instruction.
69441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
69541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Pass the event on down the filter chain for further processing.
69641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
69741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param target The PI target.
69841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param data The PI data.
69941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
70041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the PI, or if a handler further down
70141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
70241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see org.xml.sax.ContentHandler#processingInstruction
70341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
70441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void processingInstruction (String target, String data)
70541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
70641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
70741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("<?");
70841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(target);
70941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(' ');
71041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(data);
71141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("?>");
71241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (elementLevel < 1) {
71341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write('\n');
71441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
71541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.processingInstruction(target, data);
71641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
71741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
71841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
71941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
72041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
72141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Additional markup.
72241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
72341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
72441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
72541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an empty element.
72641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
72741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * This method writes an empty element tag rather than a start tag
72841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * followed by an end tag.  Both a {@link #startElement
72941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * startElement} and an {@link #endElement endElement} event will
73041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * be passed on down the filter chain.
73141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
73241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI, or the empty string
73341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        if the element has no Namespace or if Namespace
73441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        processing is not being performed.
73541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name (without prefix).  This
73641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        parameter must be provided.
73741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The element's qualified name (with prefix), or
73841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        the empty string if none is available.  This parameter
73941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        is strictly advisory: the writer may or may not use
74041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        the prefix attached.
74141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param atts The element's attribute list.
74241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
74341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
74441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
74541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement
74641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement
74741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
74841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void emptyElement (String uri, String localName,
74941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                              String qName, Attributes atts)
75041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
75141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
75241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport.pushContext();
75341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write('<');
75441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeName(uri, localName, qName, true);
75541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeAttributes(atts);
75641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (elementLevel == 1) {
75741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            forceNSDecls();
75841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
75941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        writeNSDecls();
76041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("/>");
76141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.startElement(uri, localName, qName, atts);
76241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super.endElement(uri, localName, qName);
76341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
76441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
76541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
76641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
76741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
76841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Convenience methods.
76941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
77041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
77141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
77241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
77341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
77441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Start a new element without a qname or attributes.
77541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
77641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will provide a default empty attribute
77741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * list and an empty string for the qualified name.
77841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * It invokes {@link
77941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * #startElement(String, String, String, Attributes)}
78041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
78141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
78241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI.
78341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
78441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
78541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the start tag, or if a handler further down
78641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
78741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement(String, String, String, Attributes)
78841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
78941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startElement (String uri, String localName)
79041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
79141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
79241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        startElement(uri, localName, "", EMPTY_ATTS);
79341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
79441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
79541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
79641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
79741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Start a new element without a qname, attributes or a Namespace URI.
79841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
79941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will provide an empty string for the
80041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Namespace URI, and empty string for the qualified name,
80141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and a default empty attribute list. It invokes
80241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * #startElement(String, String, String, Attributes)}
80341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
80441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
80541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
80641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
80741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the start tag, or if a handler further down
80841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
80941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement(String, String, String, Attributes)
81041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
81141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startElement (String localName)
81241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
81341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
81441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        startElement("", localName, "", EMPTY_ATTS);
81541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
81641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
81741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
81841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
81941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * End an element without a qname.
82041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
82141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will supply an empty string for the qName.
82241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * It invokes {@link #endElement(String, String, String)}
82341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
82441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
82541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI.
82641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
82741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
82841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the end tag, or if a handler further down
82941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
83041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement(String, String, String)
83141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
83241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endElement (String uri, String localName)
83341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
83441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
83541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        endElement(uri, localName, "");
83641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
83741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
83841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
83941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
84041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * End an element without a Namespace URI or qname.
84141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
84241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will supply an empty string for the qName
84341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and an empty string for the Namespace URI.
84441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * It invokes {@link #endElement(String, String, String)}
84541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
84641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
84741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
84841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
84941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the end tag, or if a handler further down
85041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
85141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement(String, String, String)
85241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
85341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endElement (String localName)
85441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
85541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
85641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        endElement("", localName, "");
85741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
85841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
85941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
86041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
86141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Add an empty element without a qname or attributes.
86241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
86341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will supply an empty string for the qname
86441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and an empty attribute list.  It invokes
86541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #emptyElement(String, String, String, Attributes)}
86641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
86741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
86841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI.
86941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
87041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
87141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
87241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
87341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #emptyElement(String, String, String, Attributes)
87441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
87541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void emptyElement (String uri, String localName)
87641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
87741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
87841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        emptyElement(uri, localName, "", EMPTY_ATTS);
87941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
88041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
88141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
88241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
88341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Add an empty element without a Namespace URI, qname or attributes.
88441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
88541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method will supply an empty string for the qname,
88641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and empty string for the Namespace URI, and an empty
88741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * attribute list.  It invokes
88841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #emptyElement(String, String, String, Attributes)}
88941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * directly.</p>
89041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
89141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
89241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
89341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
89441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
89541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #emptyElement(String, String, String, Attributes)
89641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
89741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void emptyElement (String localName)
89841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
89941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
90041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        emptyElement("", localName, "", EMPTY_ATTS);
90141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
90241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
90341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
90441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
90541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an element with character data content.
90641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
90741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This is a convenience method to write a complete element
90841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * with character data content, including the start tag
90941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and end tag.</p>
91041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
91141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method invokes
91241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #startElement(String, String, String, Attributes)},
91341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * followed by
91441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #characters(String)}, followed by
91541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #endElement(String, String, String)}.</p>
91641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
91741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI.
91841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
91941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The element's default qualified name.
92041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param atts The element's attributes.
92141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param content The character data content.
92241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
92341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
92441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
92541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement(String, String, String, Attributes)
92641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #characters(String)
92741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement(String, String, String)
92841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
92941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void dataElement (String uri, String localName,
93041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                             String qName, Attributes atts,
93141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                             String content)
93241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
93341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
93441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        startElement(uri, localName, qName, atts);
93541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        characters(content);
93641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        endElement(uri, localName, qName);
93741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
93841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
93941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
94041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
94141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an element with character data content but no attributes.
94241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
94341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This is a convenience method to write a complete element
94441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * with character data content, including the start tag
94541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and end tag.  This method provides an empty string
94641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * for the qname and an empty attribute list.</p>
94741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
94841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method invokes
94941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #startElement(String, String, String, Attributes)},
95041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * followed by
95141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #characters(String)}, followed by
95241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #endElement(String, String, String)}.</p>
95341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
95441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The element's Namespace URI.
95541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
95641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param content The character data content.
95741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
95841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
95941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
96041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement(String, String, String, Attributes)
96141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #characters(String)
96241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement(String, String, String)
96341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
96441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void dataElement (String uri, String localName, String content)
96541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
96641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
96741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        dataElement(uri, localName, "", EMPTY_ATTS, content);
96841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
96941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
97041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
97141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
97241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an element with character data content but no attributes or Namespace URI.
97341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
97441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This is a convenience method to write a complete element
97541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * with character data content, including the start tag
97641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and end tag.  The method provides an empty string for the
97741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Namespace URI, and empty string for the qualified name,
97841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * and an empty attribute list.</p>
97941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
98041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This method invokes
98141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #startElement(String, String, String, Attributes)},
98241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * followed by
98341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #characters(String)}, followed by
98441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #endElement(String, String, String)}.</p>
98541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
98641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The element's local name.
98741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param content The character data content.
98841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
98941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the empty tag, or if a handler further down
99041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
99141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #startElement(String, String, String, Attributes)
99241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #characters(String)
99341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #endElement(String, String, String)
99441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
99541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void dataElement (String localName, String content)
99641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
99741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
99841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        dataElement("", localName, "", EMPTY_ATTS, content);
99941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
100041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
100141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
100241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
100341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a string of character data, with XML escaping.
100441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
100541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * <p>This is a convenience method that takes an XML
100641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * String, converts it to a character array, then invokes
100741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * {@link #characters(char[], int, int)}.</p>
100841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
100941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param data The character data.
101041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error
101141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            writing the string, or if a handler further down
101241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the filter chain raises an exception.
101341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @see #characters(char[], int, int)
101441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
101541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void characters (String data)
101641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
101741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
101841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        char ch[] = data.toCharArray();
101941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        characters(ch, 0, ch.length);
102041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
102141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
102241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
102341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
102441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
102541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Internal methods.
102641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
102741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
102841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
102941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
103041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Force all Namespaces to be declared.
103141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
103241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * This method is used on the root element to ensure that
103341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * the predeclared Namespaces all appear.
103441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
103541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void forceNSDecls ()
103641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
103741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        Enumeration prefixes = forcedDeclTable.keys();
103841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        while (prefixes.hasMoreElements()) {
103941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            String prefix = (String)prefixes.nextElement();
104041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            doPrefix(prefix, null, true);
104141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
104241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
104341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
104441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
104541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
104641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Determine the prefix for an element or attribute name.
104741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
104841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * TODO: this method probably needs some cleanup.
104941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
105041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI.
105141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The qualified name (optional); this will be used
105241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        to indicate the preferred prefix if none is currently
105341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        bound.
105441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param isElement true if this is an element name, false
105541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        if it is an attribute name (which cannot use the
105641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        default Namespace).
105741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
105841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String doPrefix (String uri, String qName, boolean isElement)
105941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
106041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        String defaultNS = nsSupport.getURI("");
106141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if ("".equals(uri)) {
106241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (isElement && defaultNS != null)
106341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                nsSupport.declarePrefix("", "");
106441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            return null;
106541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
106641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        String prefix;
106741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (isElement && defaultNS != null && uri.equals(defaultNS)) {
106841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            prefix = "";
106941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } else {
107041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            prefix = nsSupport.getPrefix(uri);
107141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
107241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (prefix != null) {
107341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            return prefix;
107441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
107541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        prefix = (String) doneDeclTable.get(uri);
107641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (prefix != null &&
107741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            ((!isElement || defaultNS != null) &&
107841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project             "".equals(prefix) || nsSupport.getURI(prefix) != null)) {
107941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            prefix = null;
108041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
108141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (prefix == null) {
108241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            prefix = (String) prefixTable.get(uri);
108341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (prefix != null &&
108441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                ((!isElement || defaultNS != null) &&
108541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                 "".equals(prefix) || nsSupport.getURI(prefix) != null)) {
108641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                prefix = null;
108741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
108841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
108941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (prefix == null && qName != null && !"".equals(qName)) {
109041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            int i = qName.indexOf(':');
109141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (i == -1) {
109241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                if (isElement && defaultNS == null) {
109341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    prefix = "";
109441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
109541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            } else {
109641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                prefix = qName.substring(0, i);
109741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
109841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
109941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        for (;
110041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project             prefix == null || nsSupport.getURI(prefix) != null;
110141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project             prefix = "__NS" + ++prefixCounter)
110241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            ;
110341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        nsSupport.declarePrefix(prefix, uri);
110441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        doneDeclTable.put(uri, prefix);
110541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return prefix;
110641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
110741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
110841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
110941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
111041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a raw character.
111141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
111241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param c The character to write.
111341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error writing
111441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the character, this method will throw an IOException
111541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            wrapped in a SAXException.
111641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
111741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void write (char c)
111841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
111941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
112041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        try {
112141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            output.write(c);
112241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } catch (IOException e) {
112341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            throw new SAXException(e);
112441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
112541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
112641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
112741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
112841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
112941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write a raw string.
113041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
113141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param s
113241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException If there is an error writing
113341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the string, this method will throw an IOException
113441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            wrapped in a SAXException
113541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
113641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void write (String s)
113741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    throws SAXException
113841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
113941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        try {
114041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            output.write(s);
114141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } catch (IOException e) {
114241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            throw new SAXException(e);
114341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
114441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
114541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
114641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
114741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
114841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write out an attribute list, escaping values.
114941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
115041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * The names will have prefixes added to them.
115141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
115241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param atts The attribute list to write.
115341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.SAXException If there is an error writing
115441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the attribute list, this method will throw an
115541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            IOException wrapped in a SAXException.
115641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
115741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void writeAttributes (Attributes atts)
115841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
115941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
116041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        int len = atts.getLength();
116141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        for (int i = 0; i < len; i++) {
116241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            char ch[] = atts.getValue(i).toCharArray();
116341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(' ');
116441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            writeName(atts.getURI(i), atts.getLocalName(i),
116541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                      atts.getQName(i), false);
116641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (htmlMode &&
116741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                booleanAttribute(atts.getLocalName(i), atts.getQName(i), atts.getValue(i))) break;
116841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write("=\"");
116941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            writeEsc(ch, 0, ch.length, true);
117041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write('"');
117141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
117241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
117341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
117441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
117541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String[] booleans = {"checked", "compact", "declare", "defer",
117641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                                 "disabled", "ismap", "multiple",
117741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                                 "nohref", "noresize", "noshade",
117841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                                 "nowrap", "readonly", "selected"};
117941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
118041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Return true if the attribute is an HTML boolean from the above list.
118141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean booleanAttribute (String localName, String qName, String value)
118241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
118341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        String name = localName;
118441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (name == null) {
118541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            int i = qName.indexOf(':');
118641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (i != -1) name = qName.substring(i + 1, qName.length());
118741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
118841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (!name.equals(value)) return false;
118941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        for (int j = 0; j < booleans.length; j++) {
119041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (name.equals(booleans[j])) return true;
119141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
119241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return false;
119341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
119441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
119541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
119641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an array of data characters with escaping.
119741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
119841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param ch The array of characters.
119941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param start The starting position.
120041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param length The number of characters to use.
120141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param isAttVal true if this is an attribute value literal.
120241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.SAXException If there is an error writing
120341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            the characters, this method will throw an
120441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            IOException wrapped in a SAXException.
120541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
120641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void writeEsc (char ch[], int start,
120741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                             int length, boolean isAttVal)
120841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
120941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
121041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        for (int i = start; i < start + length; i++) {
121141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            switch (ch[i]) {
121241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            case '&':
121341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("&amp;");
121441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                break;
121541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            case '<':
121641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("&lt;");
121741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                break;
121841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            case '>':
121941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("&gt;");
122041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                break;
122141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            case '\"':
122241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                if (isAttVal) {
122341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write("&quot;");
122441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                } else {
122541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write('\"');
122641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
122741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                break;
122841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            default:
122941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                if (!unicodeMode && ch[i] > '\u007f') {
123041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write("&#");
123141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write(Integer.toString(ch[i]));
123241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write(';');
123341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                } else {
123441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                    write(ch[i]);
123541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
123641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
123741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
123841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
123941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
124041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
124141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
124241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write out the list of Namespace declarations.
124341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
124441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException This method will throw
124541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            an IOException wrapped in a SAXException if
124641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            there is an error writing the Namespace
124741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            declarations.
124841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
124941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void writeNSDecls ()
125041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
125141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
125241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        Enumeration prefixes = nsSupport.getDeclaredPrefixes();
125341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        while (prefixes.hasMoreElements()) {
125441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            String prefix = (String) prefixes.nextElement();
125541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            String uri = nsSupport.getURI(prefix);
125641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if (uri == null) {
125741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                uri = "";
125841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
125941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            char ch[] = uri.toCharArray();
126041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(' ');
126141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            if ("".equals(prefix)) {
126241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("xmlns=\"");
126341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            } else {
126441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("xmlns:");
126541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(prefix);
126641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write("=\"");
126741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
126841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            writeEsc(ch, 0, ch.length, true);
126941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write('\"');
127041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
127141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
127241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
127341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
127441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
127541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * Write an element or attribute name.
127641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *
127741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param uri The Namespace URI.
127841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param localName The local name.
127941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param qName The prefixed name, if available, or the empty string.
128041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @param isElement true if this is an element name, false if it
128141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *        is an attribute name.
128241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @exception org.xml.sax.SAXException This method will throw an
128341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            IOException wrapped in a SAXException if there is
128441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     *            an error writing the name.
128541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
128641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private void writeName (String uri, String localName,
128741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                              String qName, boolean isElement)
128841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
128941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
129041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        String prefix = doPrefix(uri, qName, isElement);
129141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (prefix != null && !"".equals(prefix)) {
129241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(prefix);
129341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(':');
129441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
129541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (localName != null && !"".equals(localName)) {
129641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(localName);
129741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } else {
129841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            int i = qName.indexOf(':');
129941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            write(qName.substring(i + 1, qName.length()));
130041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
130141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
130241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
130341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
130441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
130541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
130641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Default LexicalHandler implementation
130741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
130841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
130941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void comment(char[] ch, int start, int length) throws SAXException
131041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
131141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("<!--");
131241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        for (int i = start; i < start + length; i++) {
131341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(ch[i]);
131441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                if (ch[i] == '-' && i + 1 <= start + length && ch[i+1] == '-')
131541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                        write(' ');
131641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
131741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("-->");
131841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
131941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
132041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endCDATA() throws SAXException { }
132141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endDTD() throws SAXException { }
132241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void endEntity(String name) throws SAXException { }
132341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startCDATA() throws SAXException { }
132441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startDTD(String name, String publicid, String systemid) throws SAXException {
132541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (name == null) return;               // can't cope
132641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (hasOutputDTD) return;		// only one DTD
132741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	hasOutputDTD = true;
132841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write("<!DOCTYPE ");
132941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(name);
133041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (systemid == null) systemid = "";
133141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (overrideSystem != null) systemid = overrideSystem;
133241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        char sysquote = (systemid.indexOf('"') != -1) ? '\'': '"';
133341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	if (overridePublic != null) publicid = overridePublic;
133441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (!(publicid == null || "".equals(publicid))) {
133541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                char pubquote = (publicid.indexOf('"') != -1) ? '\'': '"';
133641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" PUBLIC ");
133741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(pubquote);
133841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(publicid);
133941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(pubquote);
134041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(' ');
134141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
134241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        else {
134341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                write(" SYSTEM ");
134441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                }
134541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(sysquote);
134641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(systemid);
134741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(sysquote);
134841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        write(">\n");
134941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
135041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
135141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void startEntity(String name) throws SAXException { }
135241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
135341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
135441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
135541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Output properties
135641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
135741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
135841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public String getOutputProperty(String key) {
135941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return outputProperties.getProperty(key);
136041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
136141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
136241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void setOutputProperty(String key, String value) {
136341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        outputProperties.setProperty(key, value);
136441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//	System.out.println("%%%% key = [" + key + "] value = [" + value +"]");
136541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (key.equals(ENCODING)) {
136641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            outputEncoding = value;
136741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            unicodeMode = value.substring(0, 3).equalsIgnoreCase("utf");
136841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//                System.out.println("%%%% unicodeMode = " + unicodeMode);
136941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	}
137041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	else if (key.equals(METHOD)) {
137141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		htmlMode = value.equals("html");
137241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	}
137341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	else if (key.equals(DOCTYPE_PUBLIC)) {
137441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		overridePublic = value;
137541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		forceDTD = true;
137641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
137741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	else if (key.equals(DOCTYPE_SYSTEM)) {
137841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		overrideSystem = value;
137941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		forceDTD = true;
138041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
138141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	else if (key.equals(VERSION)) {
138241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		version = value;
138341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
138441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project	else if (key.equals(STANDALONE)) {
138541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		standalone = value;
138641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project		}
138741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//	System.out.println("%%%% htmlMode = " + htmlMode);
138841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
138941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
139041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
139141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
139241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Constants.
139341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
139441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
139541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private final Attributes EMPTY_ATTS = new AttributesImpl();
139641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String CDATA_SECTION_ELEMENTS =
139741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        "cdata-section-elements";
139841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String DOCTYPE_PUBLIC = "doctype-public";
139941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String DOCTYPE_SYSTEM = "doctype-system";
140041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String ENCODING = "encoding";
140141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String INDENT = "indent";  // currently ignored
140241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String MEDIA_TYPE = "media-type";  // currently ignored
140341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String METHOD = "method";  // currently html or xml
140441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String OMIT_XML_DECLARATION = "omit-xml-declaration";
140541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String STANDALONE = "standalone";  // currently ignored
140641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static final String VERSION = "version";
140741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
140841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
140941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
141041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
141141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // Internal state.
141241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    ////////////////////////////////////////////////////////////////////
141341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
141441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private Hashtable prefixTable;
141541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private Hashtable forcedDeclTable;
141641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private Hashtable doneDeclTable;
141741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private int elementLevel = 0;
141841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private Writer output;
141941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private NamespaceSupport nsSupport;
142041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private int prefixCounter = 0;
142141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private Properties outputProperties;
142241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean unicodeMode = false;
142341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String outputEncoding = "";
142441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean htmlMode = false;
142541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean forceDTD = false;
142641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean hasOutputDTD = false;
142741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String overridePublic = null;
142841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String overrideSystem = null;
142941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String version = null;
143041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private String standalone = null;
143141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    private boolean cdataElement = false;
143241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
143341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project}
143441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
143541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// end of XMLWriter.java
1436