annotate NGSrich_0.5.5/src/org/jdom/output/XMLOutputter.java @ 0:89ad0a9cca52 default tip

Uploaded
author pfrommolt
date Mon, 21 Nov 2011 08:12:19 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1 /*--
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
2
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
3 $Id: XMLOutputter.java,v 1.117 2009/07/23 05:54:23 jhunter Exp $
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
4
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
5 Copyright (C) 2000-2007 Jason Hunter & Brett McLaughlin.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
6 All rights reserved.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
7
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
8 Redistribution and use in source and binary forms, with or without
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
9 modification, are permitted provided that the following conditions
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
10 are met:
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
11
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
12 1. Redistributions of source code must retain the above copyright
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
13 notice, this list of conditions, and the following disclaimer.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
14
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
15 2. Redistributions in binary form must reproduce the above copyright
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
16 notice, this list of conditions, and the disclaimer that follows
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
17 these conditions in the documentation and/or other materials
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
18 provided with the distribution.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
19
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
20 3. The name "JDOM" must not be used to endorse or promote products
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
21 derived from this software without prior written permission. For
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
22 written permission, please contact <request_AT_jdom_DOT_org>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
23
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
24 4. Products derived from this software may not be called "JDOM", nor
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
25 may "JDOM" appear in their name, without prior written permission
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
26 from the JDOM Project Management <request_AT_jdom_DOT_org>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
27
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
28 In addition, we request (but do not require) that you include in the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
29 end-user documentation provided with the redistribution and/or in the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
30 software itself an acknowledgement equivalent to the following:
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
31 "This product includes software developed by the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
32 JDOM Project (http://www.jdom.org/)."
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
33 Alternatively, the acknowledgment may be graphical using the logos
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
34 available at http://www.jdom.org/images/logos.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
35
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
36 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
37 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
38 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
39 DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
40 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
41 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
42 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
43 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
44 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
45 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
46 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
47 SUCH DAMAGE.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
48
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
49 This software consists of voluntary contributions made by many
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
50 individuals on behalf of the JDOM Project and was originally
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
51 created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
52 Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
53 on the JDOM Project, please see <http://www.jdom.org/>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
54
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
55 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
56
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
57 package org.jdom.output;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
58
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
59 import java.io.*;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
60 import java.util.*;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
61
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
62 import javax.xml.transform.Result;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
63
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
64 import org.jdom.*;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
65
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
66 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
67 * Outputs a JDOM document as a stream of bytes. The outputter can manage many
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
68 * styles of document formatting, from untouched to pretty printed. The default
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
69 * is to output the document content exactly as created, but this can be changed
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
70 * by setting a new Format object. For pretty-print output, use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
71 * <code>{@link Format#getPrettyFormat()}</code>. For whitespace-normalized
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
72 * output, use <code>{@link Format#getCompactFormat()}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
73 * <p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
74 * There are <code>{@link #output output(...)}</code> methods to print any of
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
75 * the standard JDOM classes, including Document and Element, to either a Writer
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
76 * or an OutputStream. <b>Warning</b>: When outputting to a Writer, make sure
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
77 * the writer's encoding matches the encoding setting in the Format object. This
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
78 * ensures the encoding in which the content is written (controlled by the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
79 * Writer configuration) matches the encoding placed in the document's XML
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
80 * declaration (controlled by the XMLOutputter). Because a Writer cannot be
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
81 * queried for its encoding, the information must be passed to the Format
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
82 * manually in its constructor or via the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
83 * <code>{@link Format#setEncoding}</code> method. The default encoding is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
84 * UTF-8.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
85 * <p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
86 * The methods <code>{@link #outputString outputString(...)}</code> are for
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
87 * convenience only; for top performance you should call one of the <code>{@link
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
88 * #output output(...)}</code> methods and pass in your own Writer or
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
89 * OutputStream if possible.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
90 * <p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
91 * XML declarations are always printed on their own line followed by a line
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
92 * seperator (this doesn't change the semantics of the document). To omit
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
93 * printing of the declaration use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
94 * <code>{@link Format#setOmitDeclaration}</code>. To omit printing of the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
95 * encoding in the declaration use <code>{@link Format#setOmitEncoding}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
96 * Unfortunatly there is currently no way to know the original encoding of the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
97 * document.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
98 * <p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
99 * Empty elements are by default printed as &lt;empty/&gt;, but this can be
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
100 * configured with <code>{@link Format#setExpandEmptyElements}</code> to cause
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
101 * them to be expanded to &lt;empty&gt;&lt;/empty&gt;.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
102 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
103 * @version $Revision: 1.117 $, $Date: 2009/07/23 05:54:23 $
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
104 * @author Brett McLaughlin
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
105 * @author Jason Hunter
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
106 * @author Jason Reid
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
107 * @author Wolfgang Werner
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
108 * @author Elliotte Rusty Harold
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
109 * @author David &amp; Will (from Post Tool Design)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
110 * @author Dan Schaffer
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
111 * @author Alex Chaffee
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
112 * @author Bradley S. Huffman
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
113 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
114
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
115 public class XMLOutputter implements Cloneable {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
116
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
117 private static final String CVS_ID =
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
118 "@(#) $RCSfile: XMLOutputter.java,v $ $Revision: 1.117 $ $Date: 2009/07/23 05:54:23 $ $Name: jdom_1_1_1 $";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
119
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
120 // For normal output
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
121 private Format userFormat = Format.getRawFormat();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
122
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
123 // For xml:space="preserve"
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
124 protected static final Format preserveFormat = Format.getRawFormat();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
125
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
126 // What's currently in use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
127 protected Format currentFormat = userFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
128
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
129 /** Whether output escaping is enabled for the being processed
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
130 * Element - default is <code>true</code> */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
131 private boolean escapeOutput = true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
132
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
133 // * * * * * * * * * * Constructors * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
134 // * * * * * * * * * * Constructors * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
135
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
136 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
137 * This will create an <code>XMLOutputter</code> with the default
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
138 * {@link Format} matching {@link Format#getRawFormat}.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
139 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
140 public XMLOutputter() {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
141 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
142
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
143 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
144 * This will create an <code>XMLOutputter</code> with the specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
145 * format characteristics. Note the format object is cloned internally
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
146 * before use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
147 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
148 public XMLOutputter(Format format) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
149 userFormat = (Format) format.clone();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
150 currentFormat = userFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
151 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
152
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
153 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
154 * This will create an <code>XMLOutputter</code> with all the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
155 * options as set in the given <code>XMLOutputter</code>. Note
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
156 * that <code>XMLOutputter two = (XMLOutputter)one.clone();</code>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
157 * would work equally well.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
158 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
159 * @param that the XMLOutputter to clone
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
160 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
161 public XMLOutputter(XMLOutputter that) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
162 this.userFormat = (Format) that.userFormat.clone();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
163 currentFormat = userFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
164 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
165
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
166 // * * * * * * * * * * Set parameters methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
167 // * * * * * * * * * * Set parameters methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
168
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
169 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
170 * Sets the new format logic for the outputter. Note the Format
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
171 * object is cloned internally before use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
172 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
173 * @param newFormat the format to use for output
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
174 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
175 public void setFormat(Format newFormat) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
176 this.userFormat = (Format) newFormat.clone();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
177 this.currentFormat = userFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
178 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
179
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
180 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
181 * Returns the current format in use by the outputter. Note the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
182 * Format object returned is a clone of the one used internally.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
183 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
184 public Format getFormat() {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
185 return (Format) userFormat.clone();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
186 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
187
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
188 // * * * * * * * * * * Output to a OutputStream * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
189 // * * * * * * * * * * Output to a OutputStream * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
190
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
191 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
192 * This will print the <code>Document</code> to the given output stream.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
193 * The characters are printed using the encoding specified in the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
194 * constructor, or a default of UTF-8.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
195 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
196 * @param doc <code>Document</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
197 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
198 * @throws IOException - if there's any problem writing.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
199 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
200 public void output(Document doc, OutputStream out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
201 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
202 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
203 output(doc, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
204 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
205
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
206 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
207 * Print out the <code>{@link DocType}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
208 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
209 * @param doctype <code>DocType</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
210 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
211 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
212 public void output(DocType doctype, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
213 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
214 output(doctype, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
215 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
216
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
217 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
218 * Print out an <code>{@link Element}</code>, including
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
219 * its <code>{@link Attribute}</code>s, and all
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
220 * contained (child) elements, etc.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
221 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
222 * @param element <code>Element</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
223 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
224 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
225 public void output(Element element, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
226 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
227 output(element, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
228 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
229
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
230 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
231 * This will handle printing out an <code>{@link
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
232 * Element}</code>'s content only, not including its tag, and
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
233 * attributes. This can be useful for printing the content of an
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
234 * element that contains HTML, like "&lt;description&gt;JDOM is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
235 * &lt;b&gt;fun&gt;!&lt;/description&gt;".
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
236 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
237 * @param element <code>Element</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
238 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
239 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
240 public void outputElementContent(Element element, OutputStream out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
241 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
242 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
243 outputElementContent(element, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
244 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
245
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
246 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
247 * This will handle printing out a list of nodes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
248 * This can be useful for printing the content of an element that
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
249 * contains HTML, like "&lt;description&gt;JDOM is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
250 * &lt;b&gt;fun&gt;!&lt;/description&gt;".
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
251 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
252 * @param list <code>List</code> of nodes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
253 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
254 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
255 public void output(List list, OutputStream out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
256 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
257 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
258 output(list, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
259 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
260
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
261 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
262 * Print out a <code>{@link CDATA}</code> node.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
263 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
264 * @param cdata <code>CDATA</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
265 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
266 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
267 public void output(CDATA cdata, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
268 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
269 output(cdata, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
270 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
271
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
272 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
273 * Print out a <code>{@link Text}</code> node. Perfoms
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
274 * the necessary entity escaping and whitespace stripping.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
275 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
276 * @param text <code>Text</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
277 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
278 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
279 public void output(Text text, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
280 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
281 output(text, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
282 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
283
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
284 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
285 * Print out a <code>{@link Comment}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
286 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
287 * @param comment <code>Comment</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
288 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
289 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
290 public void output(Comment comment, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
291 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
292 output(comment, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
293 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
294
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
295 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
296 * Print out a <code>{@link ProcessingInstruction}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
297 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
298 * @param pi <code>ProcessingInstruction</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
299 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
300 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
301 public void output(ProcessingInstruction pi, OutputStream out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
302 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
303 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
304 output(pi, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
305 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
306
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
307 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
308 * Print out a <code>{@link EntityRef}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
309 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
310 * @param entity <code>EntityRef</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
311 * @param out <code>OutputStream</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
312 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
313 public void output(EntityRef entity, OutputStream out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
314 Writer writer = makeWriter(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
315 output(entity, writer); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
316 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
317
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
318 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
319 * Get an OutputStreamWriter, using prefered encoding
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
320 * (see {@link Format#setEncoding}).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
321 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
322 private Writer makeWriter(OutputStream out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
323 throws java.io.UnsupportedEncodingException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
324 return makeWriter(out, userFormat.encoding);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
325 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
326
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
327 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
328 * Get an OutputStreamWriter, use specified encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
329 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
330 private static Writer makeWriter(OutputStream out, String enc)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
331 throws java.io.UnsupportedEncodingException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
332 // "UTF-8" is not recognized before JDK 1.1.6, so we'll translate
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
333 // into "UTF8" which works with all JDKs.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
334 if ("UTF-8".equals(enc)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
335 enc = "UTF8";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
336 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
337
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
338 Writer writer = new BufferedWriter(
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
339 (new OutputStreamWriter(
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
340 new BufferedOutputStream(out), enc)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
341 ));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
342 return writer;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
343 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
344
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
345 // * * * * * * * * * * Output to a Writer * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
346 // * * * * * * * * * * Output to a Writer * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
347
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
348 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
349 * This will print the <code>Document</code> to the given Writer.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
350 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
351 * <p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
352 * Warning: using your own Writer may cause the outputter's
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
353 * preferred character encoding to be ignored. If you use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
354 * encodings other than UTF-8, we recommend using the method that
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
355 * takes an OutputStream instead.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
356 * </p>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
357 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
358 * @param doc <code>Document</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
359 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
360 * @throws IOException - if there's any problem writing.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
361 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
362 public void output(Document doc, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
363
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
364 printDeclaration(out, doc, userFormat.encoding);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
365
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
366 // Print out root element, as well as any root level
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
367 // comments and processing instructions,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
368 // starting with no indentation
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
369 List content = doc.getContent();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
370 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
371 for (int i = 0; i < size; i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
372 Object obj = content.get(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
373
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
374 if (obj instanceof Element) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
375 printElement(out, doc.getRootElement(), 0,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
376 createNamespaceStack());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
377 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
378 else if (obj instanceof Comment) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
379 printComment(out, (Comment) obj);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
380 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
381 else if (obj instanceof ProcessingInstruction) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
382 printProcessingInstruction(out, (ProcessingInstruction) obj);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
383 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
384 else if (obj instanceof DocType) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
385 printDocType(out, doc.getDocType());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
386 // Always print line separator after declaration, helps the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
387 // output look better and is semantically inconsequential
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
388 out.write(currentFormat.lineSeparator);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
389 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
390 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
391 // XXX if we get here then we have a illegal content, for
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
392 // now we'll just ignore it
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
393 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
394
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
395 newline(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
396 indent(out, 0);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
397 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
398
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
399 // Output final line separator
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
400 // We output this no matter what the newline flags say
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
401 out.write(currentFormat.lineSeparator);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
402
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
403 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
404 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
405
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
406 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
407 * Print out the <code>{@link DocType}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
408 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
409 * @param doctype <code>DocType</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
410 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
411 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
412 public void output(DocType doctype, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
413 printDocType(out, doctype);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
414 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
415 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
416
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
417 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
418 * Print out an <code>{@link Element}</code>, including
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
419 * its <code>{@link Attribute}</code>s, and all
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
420 * contained (child) elements, etc.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
421 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
422 * @param element <code>Element</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
423 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
424 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
425 public void output(Element element, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
426 // If this is the root element we could pre-initialize the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
427 // namespace stack with the namespaces
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
428 printElement(out, element, 0, createNamespaceStack());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
429 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
430 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
431
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
432 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
433 * This will handle printing out an <code>{@link
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
434 * Element}</code>'s content only, not including its tag, and
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
435 * attributes. This can be useful for printing the content of an
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
436 * element that contains HTML, like "&lt;description&gt;JDOM is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
437 * &lt;b&gt;fun&gt;!&lt;/description&gt;".
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
438 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
439 * @param element <code>Element</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
440 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
441 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
442 public void outputElementContent(Element element, Writer out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
443 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
444 List content = element.getContent();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
445 printContentRange(out, content, 0, content.size(),
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
446 0, createNamespaceStack());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
447 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
448 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
449
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
450 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
451 * This will handle printing out a list of nodes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
452 * This can be useful for printing the content of an element that
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
453 * contains HTML, like "&lt;description&gt;JDOM is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
454 * &lt;b&gt;fun&gt;!&lt;/description&gt;".
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
455 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
456 * @param list <code>List</code> of nodes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
457 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
458 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
459 public void output(List list, Writer out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
460 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
461 printContentRange(out, list, 0, list.size(),
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
462 0, createNamespaceStack());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
463 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
464 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
465
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
466 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
467 * Print out a <code>{@link CDATA}</code> node.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
468 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
469 * @param cdata <code>CDATA</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
470 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
471 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
472 public void output(CDATA cdata, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
473 printCDATA(out, cdata);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
474 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
475 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
476
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
477 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
478 * Print out a <code>{@link Text}</code> node. Perfoms
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
479 * the necessary entity escaping and whitespace stripping.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
480 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
481 * @param text <code>Text</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
482 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
483 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
484 public void output(Text text, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
485 printText(out, text);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
486 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
487 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
488
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
489 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
490 * Print out a <code>{@link Comment}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
491 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
492 * @param comment <code>Comment</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
493 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
494 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
495 public void output(Comment comment, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
496 printComment(out, comment);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
497 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
498 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
499
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
500 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
501 * Print out a <code>{@link ProcessingInstruction}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
502 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
503 * @param pi <code>ProcessingInstruction</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
504 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
505 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
506 public void output(ProcessingInstruction pi, Writer out)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
507 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
508 boolean currentEscapingPolicy = currentFormat.ignoreTrAXEscapingPIs;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
509
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
510 // Output PI verbatim, disregarding TrAX escaping PIs.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
511 currentFormat.setIgnoreTrAXEscapingPIs(true);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
512 printProcessingInstruction(out, pi);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
513 currentFormat.setIgnoreTrAXEscapingPIs(currentEscapingPolicy);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
514
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
515 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
516 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
517
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
518 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
519 * Print out a <code>{@link EntityRef}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
520 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
521 * @param entity <code>EntityRef</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
522 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
523 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
524 public void output(EntityRef entity, Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
525 printEntityRef(out, entity);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
526 out.flush();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
527 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
528
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
529 // * * * * * * * * * * Output to a String * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
530 // * * * * * * * * * * Output to a String * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
531
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
532 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
533 * Return a string representing a document. Uses an internal
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
534 * StringWriter. Warning: a String is Unicode, which may not match
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
535 * the outputter's specified encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
536 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
537 * @param doc <code>Document</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
538 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
539 public String outputString(Document doc) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
540 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
541 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
542 output(doc, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
543 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
544 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
545 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
546
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
547 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
548 * Return a string representing a DocType. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
549 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
550 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
551 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
552 * @param doctype <code>DocType</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
553 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
554 public String outputString(DocType doctype) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
555 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
556 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
557 output(doctype, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
558 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
559 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
560 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
561
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
562 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
563 * Return a string representing an element. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
564 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
565 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
566 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
567 * @param element <code>Element</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
568 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
569 public String outputString(Element element) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
570 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
571 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
572 output(element, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
573 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
574 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
575 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
576
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
577 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
578 * Return a string representing a list of nodes. The list is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
579 * assumed to contain legal JDOM nodes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
580 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
581 * @param list <code>List</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
582 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
583 public String outputString(List list) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
584 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
585 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
586 output(list, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
587 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
588 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
589 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
590
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
591 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
592 * Return a string representing a CDATA node. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
593 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
594 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
595 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
596 * @param cdata <code>CDATA</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
597 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
598 public String outputString(CDATA cdata) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
599 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
600 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
601 output(cdata, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
602 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
603 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
604 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
605
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
606 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
607 * Return a string representing a Text node. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
608 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
609 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
610 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
611 * @param text <code>Text</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
612 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
613 public String outputString(Text text) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
614 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
615 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
616 output(text, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
617 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
618 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
619 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
620
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
621
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
622 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
623 * Return a string representing a comment. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
624 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
625 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
626 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
627 * @param comment <code>Comment</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
628 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
629 public String outputString(Comment comment) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
630 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
631 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
632 output(comment, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
633 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
634 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
635 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
636
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
637 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
638 * Return a string representing a PI. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
639 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
640 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
641 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
642 * @param pi <code>ProcessingInstruction</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
643 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
644 public String outputString(ProcessingInstruction pi) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
645 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
646 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
647 output(pi, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
648 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
649 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
650 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
651
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
652 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
653 * Return a string representing an entity. Warning: a String is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
654 * Unicode, which may not match the outputter's specified
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
655 * encoding.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
656 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
657 * @param entity <code>EntityRef</code> to format.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
658 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
659 public String outputString(EntityRef entity) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
660 StringWriter out = new StringWriter();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
661 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
662 output(entity, out); // output() flushes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
663 } catch (IOException e) { }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
664 return out.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
665 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
666
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
667 // * * * * * * * * * * Internal printing methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
668 // * * * * * * * * * * Internal printing methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
669
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
670 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
671 * This will handle printing of the declaration.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
672 * Assumes XML version 1.0 since we don't directly know.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
673 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
674 * @param doc <code>Document</code> whose declaration to write.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
675 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
676 * @param encoding The encoding to add to the declaration
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
677 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
678 protected void printDeclaration(Writer out, Document doc,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
679 String encoding) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
680
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
681 // Only print the declaration if it's not being omitted
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
682 if (!userFormat.omitDeclaration) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
683 // Assume 1.0 version
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
684 out.write("<?xml version=\"1.0\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
685 if (!userFormat.omitEncoding) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
686 out.write(" encoding=\"" + encoding + "\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
687 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
688 out.write("?>");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
689
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
690 // Print new line after decl always, even if no other new lines
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
691 // Helps the output look better and is semantically
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
692 // inconsequential
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
693 out.write(currentFormat.lineSeparator);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
694 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
695 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
696
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
697 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
698 * This handle printing the DOCTYPE declaration if one exists.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
699 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
700 * @param docType <code>Document</code> whose declaration to write.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
701 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
702 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
703 protected void printDocType(Writer out, DocType docType)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
704 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
705
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
706 String publicID = docType.getPublicID();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
707 String systemID = docType.getSystemID();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
708 String internalSubset = docType.getInternalSubset();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
709 boolean hasPublic = false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
710
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
711 out.write("<!DOCTYPE ");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
712 out.write(docType.getElementName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
713 if (publicID != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
714 out.write(" PUBLIC \"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
715 out.write(publicID);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
716 out.write("\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
717 hasPublic = true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
718 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
719 if (systemID != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
720 if (!hasPublic) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
721 out.write(" SYSTEM");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
722 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
723 out.write(" \"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
724 out.write(systemID);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
725 out.write("\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
726 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
727 if ((internalSubset != null) && (!internalSubset.equals(""))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
728 out.write(" [");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
729 out.write(currentFormat.lineSeparator);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
730 out.write(docType.getInternalSubset());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
731 out.write("]");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
732 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
733 out.write(">");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
734 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
735
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
736 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
737 * This will handle printing of comments.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
738 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
739 * @param comment <code>Comment</code> to write.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
740 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
741 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
742 protected void printComment(Writer out, Comment comment)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
743 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
744 out.write("<!--");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
745 out.write(comment.getText());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
746 out.write("-->");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
747 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
748
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
749 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
750 * This will handle printing of processing instructions.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
751 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
752 * @param pi <code>ProcessingInstruction</code> to write.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
753 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
754 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
755 protected void printProcessingInstruction(Writer out, ProcessingInstruction pi
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
756 ) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
757 String target = pi.getTarget();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
758 boolean piProcessed = false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
759
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
760 if (currentFormat.ignoreTrAXEscapingPIs == false) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
761 if (target.equals(Result.PI_DISABLE_OUTPUT_ESCAPING)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
762 escapeOutput = false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
763 piProcessed = true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
764 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
765 else if (target.equals(Result.PI_ENABLE_OUTPUT_ESCAPING)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
766 escapeOutput = true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
767 piProcessed = true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
768 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
769 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
770 if (piProcessed == false) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
771 String rawData = pi.getData();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
772
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
773 // Write <?target data?> or if no data then just <?target?>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
774 if (!"".equals(rawData)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
775 out.write("<?");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
776 out.write(target);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
777 out.write(" ");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
778 out.write(rawData);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
779 out.write("?>");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
780 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
781 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
782 out.write("<?");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
783 out.write(target);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
784 out.write("?>");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
785 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
786 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
787 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
788
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
789 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
790 * This will handle printing a <code>{@link EntityRef}</code>.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
791 * Only the entity reference such as <code>&amp;entity;</code>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
792 * will be printed. However, subclasses are free to override
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
793 * this method to print the contents of the entity instead.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
794 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
795 * @param entity <code>EntityRef</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
796 * @param out <code>Writer</code> to use. */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
797 protected void printEntityRef(Writer out, EntityRef entity)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
798 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
799 out.write("&");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
800 out.write(entity.getName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
801 out.write(";");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
802 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
803
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
804 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
805 * This will handle printing of <code>{@link CDATA}</code> text.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
806 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
807 * @param cdata <code>CDATA</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
808 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
809 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
810 protected void printCDATA(Writer out, CDATA cdata) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
811 String str = (currentFormat.mode == Format.TextMode.NORMALIZE)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
812 ? cdata.getTextNormalize()
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
813 : ((currentFormat.mode == Format.TextMode.TRIM) ?
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
814 cdata.getText().trim() : cdata.getText());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
815 out.write("<![CDATA[");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
816 out.write(str);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
817 out.write("]]>");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
818 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
819
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
820 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
821 * This will handle printing of <code>{@link Text}</code> strings.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
822 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
823 * @param text <code>Text</code> to write.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
824 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
825 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
826 protected void printText(Writer out, Text text) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
827 String str = (currentFormat.mode == Format.TextMode.NORMALIZE)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
828 ? text.getTextNormalize()
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
829 : ((currentFormat.mode == Format.TextMode.TRIM) ?
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
830 text.getText().trim() : text.getText());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
831 out.write(escapeElementEntities(str));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
832 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
833
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
834 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
835 * This will handle printing a string. Escapes the element entities,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
836 * trims interior whitespace, etc. if necessary.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
837 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
838 private void printString(Writer out, String str) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
839 if (currentFormat.mode == Format.TextMode.NORMALIZE) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
840 str = Text.normalizeString(str);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
841 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
842 else if (currentFormat.mode == Format.TextMode.TRIM) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
843 str = str.trim();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
844 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
845 out.write(escapeElementEntities(str));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
846 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
847
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
848 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
849 * This will handle printing of a <code>{@link Element}</code>,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
850 * its <code>{@link Attribute}</code>s, and all contained (child)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
851 * elements, etc.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
852 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
853 * @param element <code>Element</code> to output.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
854 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
855 * @param level <code>int</code> level of indention.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
856 * @param namespaces <code>List</code> stack of Namespaces in scope.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
857 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
858 protected void printElement(Writer out, Element element,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
859 int level, NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
860 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
861
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
862 List attributes = element.getAttributes();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
863 List content = element.getContent();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
864
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
865 // Check for xml:space and adjust format settings
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
866 String space = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
867 if (attributes != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
868 space = element.getAttributeValue("space",
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
869 Namespace.XML_NAMESPACE);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
870 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
871
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
872 Format previousFormat = currentFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
873
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
874 if ("default".equals(space)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
875 currentFormat = userFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
876 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
877 else if ("preserve".equals(space)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
878 currentFormat = preserveFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
879 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
880
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
881 // Print the beginning of the tag plus attributes and any
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
882 // necessary namespace declarations
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
883 out.write("<");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
884 printQualifiedName(out, element);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
885
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
886 // Mark our namespace starting point
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
887 int previouslyDeclaredNamespaces = namespaces.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
888
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
889 // Print the element's namespace, if appropriate
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
890 printElementNamespace(out, element, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
891
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
892 // Print out additional namespace declarations
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
893 printAdditionalNamespaces(out, element, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
894
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
895 // Print out attributes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
896 if (attributes != null)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
897 printAttributes(out, attributes, element, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
898
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
899 // Depending on the settings (newlines, textNormalize, etc), we may
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
900 // or may not want to print all of the content, so determine the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
901 // index of the start of the content we're interested
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
902 // in based on the current settings.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
903
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
904 int start = skipLeadingWhite(content, 0);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
905 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
906 if (start >= size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
907 // Case content is empty or all insignificant whitespace
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
908 if (currentFormat.expandEmptyElements) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
909 out.write("></");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
910 printQualifiedName(out, element);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
911 out.write(">");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
912 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
913 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
914 out.write(" />");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
915 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
916 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
917 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
918 out.write(">");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
919
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
920 // For a special case where the content is only CDATA
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
921 // or Text we don't want to indent after the start or
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
922 // before the end tag.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
923
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
924 if (nextNonText(content, start) < size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
925 // Case Mixed Content - normal indentation
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
926 newline(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
927 printContentRange(out, content, start, size,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
928 level + 1, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
929 newline(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
930 indent(out, level);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
931 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
932 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
933 // Case all CDATA or Text - no indentation
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
934 printTextRange(out, content, start, size);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
935 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
936 out.write("</");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
937 printQualifiedName(out, element);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
938 out.write(">");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
939 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
940
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
941 // remove declared namespaces from stack
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
942 while (namespaces.size() > previouslyDeclaredNamespaces) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
943 namespaces.pop();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
944 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
945
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
946 // Restore our format settings
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
947 currentFormat = previousFormat;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
948 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
949
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
950 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
951 * This will handle printing of content within a given range.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
952 * The range to print is specified in typical Java fashion; the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
953 * starting index is inclusive, while the ending index is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
954 * exclusive.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
955 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
956 * @param content <code>List</code> of content to output
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
957 * @param start index of first content node (inclusive.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
958 * @param end index of last content node (exclusive).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
959 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
960 * @param level <code>int</code> level of indentation.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
961 * @param namespaces <code>List</code> stack of Namespaces in scope.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
962 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
963 private void printContentRange(Writer out, List content,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
964 int start, int end, int level,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
965 NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
966 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
967 boolean firstNode; // Flag for 1st node in content
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
968 Object next; // Node we're about to print
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
969 int first, index; // Indexes into the list of content
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
970
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
971 index = start;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
972 while (index < end) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
973 firstNode = (index == start) ? true : false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
974 next = content.get(index);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
975
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
976 //
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
977 // Handle consecutive CDATA, Text, and EntityRef nodes all at once
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
978 //
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
979 if ((next instanceof Text) || (next instanceof EntityRef)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
980 first = skipLeadingWhite(content, index);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
981 // Set index to next node for loop
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
982 index = nextNonText(content, first);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
983
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
984 // If it's not all whitespace - print it!
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
985 if (first < index) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
986 if (!firstNode)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
987 newline(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
988 indent(out, level);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
989 printTextRange(out, content, first, index);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
990 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
991 continue;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
992 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
993
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
994 //
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
995 // Handle other nodes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
996 //
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
997 if (!firstNode) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
998 newline(out);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
999 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1000
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1001 indent(out, level);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1002
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1003 if (next instanceof Comment) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1004 printComment(out, (Comment)next);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1005 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1006 else if (next instanceof Element) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1007 printElement(out, (Element)next, level, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1008 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1009 else if (next instanceof ProcessingInstruction) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1010 printProcessingInstruction(out, (ProcessingInstruction)next);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1011 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1012 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1013 // XXX if we get here then we have a illegal content, for
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1014 // now we'll just ignore it (probably should throw
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1015 // a exception)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1016 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1017
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1018 index++;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1019 } /* while */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1020 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1021
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1022 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1023 * This will handle printing of a sequence of <code>{@link CDATA}</code>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1024 * or <code>{@link Text}</code> nodes. It is an error to have any other
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1025 * pass this method any other type of node.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1026 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1027 * @param content <code>List</code> of content to output
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1028 * @param start index of first content node (inclusive).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1029 * @param end index of last content node (exclusive).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1030 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1031 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1032 private void printTextRange(Writer out, List content, int start, int end
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1033 ) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1034 String previous; // Previous text printed
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1035 Object node; // Next node to print
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1036 String next; // Next text to print
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1037
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1038 previous = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1039
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1040 // Remove leading whitespace-only nodes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1041 start = skipLeadingWhite(content, start);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1042
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1043 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1044 if (start < size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1045 // And remove trialing whitespace-only nodes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1046 end = skipTrailingWhite(content, end);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1047
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1048 for (int i = start; i < end; i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1049 node = content.get(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1050
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1051 // Get the unmangled version of the text
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1052 // we are about to print
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1053 if (node instanceof Text) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1054 next = ((Text) node).getText();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1055 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1056 else if (node instanceof EntityRef) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1057 next = "&" + ((EntityRef) node).getValue() + ";";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1058 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1059 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1060 throw new IllegalStateException("Should see only " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1061 "CDATA, Text, or EntityRef");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1062 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1063
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1064 // This may save a little time
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1065 if (next == null || "".equals(next)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1066 continue;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1067 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1068
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1069 // Determine if we need to pad the output (padding is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1070 // only need in trim or normalizing mode)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1071 if (previous != null) { // Not 1st node
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1072 if (currentFormat.mode == Format.TextMode.NORMALIZE ||
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1073 currentFormat.mode == Format.TextMode.TRIM) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1074 if ((endsWithWhite(previous)) ||
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1075 (startsWithWhite(next))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1076 out.write(" ");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1077 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1078 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1079 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1080
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1081 // Print the node
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1082 if (node instanceof CDATA) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1083 printCDATA(out, (CDATA) node);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1084 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1085 else if (node instanceof EntityRef) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1086 printEntityRef(out, (EntityRef) node);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1087 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1088 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1089 printString(out, next);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1090 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1091
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1092 previous = next;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1093 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1094 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1095 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1096
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1097 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1098 * This will handle printing of any needed <code>{@link Namespace}</code>
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1099 * declarations.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1100 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1101 * @param ns <code>Namespace</code> to print definition of
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1102 * @param out <code>Writer</code> to use.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1103 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1104 private void printNamespace(Writer out, Namespace ns,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1105 NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1106 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1107 String prefix = ns.getPrefix();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1108 String uri = ns.getURI();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1109
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1110 // Already printed namespace decl?
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1111 if (uri.equals(namespaces.getURI(prefix))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1112 return;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1113 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1114
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1115 out.write(" xmlns");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1116 if (!prefix.equals("")) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1117 out.write(":");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1118 out.write(prefix);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1119 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1120 out.write("=\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1121 out.write(escapeAttributeEntities(uri));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1122 out.write("\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1123 namespaces.push(ns);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1124 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1125
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1126 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1127 * This will handle printing of a <code>{@link Attribute}</code> list.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1128 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1129 * @param attributes <code>List</code> of Attribute objcts
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1130 * @param out <code>Writer</code> to use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1131 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1132 protected void printAttributes(Writer out, List attributes, Element parent,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1133 NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1134 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1135
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1136 // I do not yet handle the case where the same prefix maps to
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1137 // two different URIs. For attributes on the same element
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1138 // this is illegal; but as yet we don't throw an exception
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1139 // if someone tries to do this
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1140 // Set prefixes = new HashSet();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1141 for (int i = 0; i < attributes.size(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1142 Attribute attribute = (Attribute) attributes.get(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1143 Namespace ns = attribute.getNamespace();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1144 if ((ns != Namespace.NO_NAMESPACE) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1145 (ns != Namespace.XML_NAMESPACE)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1146 printNamespace(out, ns, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1147 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1148
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1149 out.write(" ");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1150 printQualifiedName(out, attribute);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1151 out.write("=");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1152
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1153 out.write("\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1154 out.write(escapeAttributeEntities(attribute.getValue()));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1155 out.write("\"");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1156 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1157 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1158
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1159 private void printElementNamespace(Writer out, Element element,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1160 NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1161 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1162 // Add namespace decl only if it's not the XML namespace and it's
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1163 // not the NO_NAMESPACE with the prefix "" not yet mapped
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1164 // (we do output xmlns="" if the "" prefix was already used and we
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1165 // need to reclaim it for the NO_NAMESPACE)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1166 Namespace ns = element.getNamespace();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1167 if (ns == Namespace.XML_NAMESPACE) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1168 return;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1169 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1170 if ( !((ns == Namespace.NO_NAMESPACE) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1171 (namespaces.getURI("") == null))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1172 printNamespace(out, ns, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1173 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1174 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1175
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1176 private void printAdditionalNamespaces(Writer out, Element element,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1177 NamespaceStack namespaces)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1178 throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1179 List list = element.getAdditionalNamespaces();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1180 if (list != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1181 for (int i = 0; i < list.size(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1182 Namespace additional = (Namespace)list.get(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1183 printNamespace(out, additional, namespaces);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1184 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1185 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1186 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1187
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1188 // * * * * * * * * * * Support methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1189 // * * * * * * * * * * Support methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1190
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1191 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1192 * This will print a newline only if indent is not null.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1193 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1194 * @param out <code>Writer</code> to use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1195 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1196 private void newline(Writer out) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1197 if (currentFormat.indent != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1198 out.write(currentFormat.lineSeparator);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1199 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1200 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1201
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1202 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1203 * This will print indents only if indent is not null or the empty string.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1204 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1205 * @param out <code>Writer</code> to use
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1206 * @param level current indent level
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1207 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1208 private void indent(Writer out, int level) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1209 if (currentFormat.indent == null ||
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1210 currentFormat.indent.equals("")) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1211 return;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1212 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1213
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1214 for (int i = 0; i < level; i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1215 out.write(currentFormat.indent);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1216 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1217 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1218
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1219 // Returns the index of the first non-all-whitespace CDATA or Text,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1220 // index = content.size() is returned if content contains
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1221 // all whitespace.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1222 // @param start index to begin search (inclusive)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1223 private int skipLeadingWhite(List content, int start) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1224 if (start < 0) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1225 start = 0;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1226 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1227
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1228 int index = start;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1229 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1230 if (currentFormat.mode == Format.TextMode.TRIM_FULL_WHITE
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1231 || currentFormat.mode == Format.TextMode.NORMALIZE
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1232 || currentFormat.mode == Format.TextMode.TRIM) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1233 while (index < size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1234 if (!isAllWhitespace(content.get(index))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1235 return index;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1236 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1237 index++;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1238 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1239 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1240 return index;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1241 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1242
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1243 // Return the index + 1 of the last non-all-whitespace CDATA or
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1244 // Text node, index < 0 is returned
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1245 // if content contains all whitespace.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1246 // @param start index to begin search (exclusive)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1247 private int skipTrailingWhite(List content, int start) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1248 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1249 if (start > size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1250 start = size;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1251 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1252
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1253 int index = start;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1254 if (currentFormat.mode == Format.TextMode.TRIM_FULL_WHITE
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1255 || currentFormat.mode == Format.TextMode.NORMALIZE
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1256 || currentFormat.mode == Format.TextMode.TRIM) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1257 while (index >= 0) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1258 if (!isAllWhitespace(content.get(index - 1)))
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1259 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1260 --index;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1261 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1262 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1263 return index;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1264 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1265
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1266 // Return the next non-CDATA, non-Text, or non-EntityRef node,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1267 // index = content.size() is returned if there is no more non-CDATA,
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1268 // non-Text, or non-EntiryRef nodes
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1269 // @param start index to begin search (inclusive)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1270 private static int nextNonText(List content, int start) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1271 if (start < 0) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1272 start = 0;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1273 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1274
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1275 int index = start;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1276 int size = content.size();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1277 while (index < size) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1278 Object node = content.get(index);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1279 if (!((node instanceof Text) || (node instanceof EntityRef))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1280 return index;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1281 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1282 index++;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1283 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1284 return size;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1285 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1286
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1287 // Determine if a Object is all whitespace
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1288 private boolean isAllWhitespace(Object obj) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1289 String str = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1290
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1291 if (obj instanceof String) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1292 str = (String) obj;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1293 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1294 else if (obj instanceof Text) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1295 str = ((Text) obj).getText();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1296 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1297 else if (obj instanceof EntityRef) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1298 return false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1299 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1300 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1301 return false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1302 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1303
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1304 for (int i = 0; i < str.length(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1305 if (!Verifier.isXMLWhitespace(str.charAt(i)))
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1306 return false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1307 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1308 return true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1309 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1310
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1311 // Determine if a string starts with a XML whitespace.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1312 private boolean startsWithWhite(String str) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1313 if ((str != null) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1314 (str.length() > 0) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1315 Verifier.isXMLWhitespace(str.charAt(0))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1316 return true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1317 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1318 return false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1319 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1320
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1321 // Determine if a string ends with a XML whitespace.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1322 private boolean endsWithWhite(String str) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1323 if ((str != null) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1324 (str.length() > 0) &&
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1325 Verifier.isXMLWhitespace(str.charAt(str.length() - 1))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1326 return true;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1327 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1328 return false;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1329 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1330
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1331 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1332 * This will take the pre-defined entities in XML 1.0 and
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1333 * convert their character representation to the appropriate
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1334 * entity reference, suitable for XML attributes. It does not convert
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1335 * the single quote (') because it's not necessary as the outputter
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1336 * writes attributes surrounded by double-quotes.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1337 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1338 * @param str <code>String</code> input to escape.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1339 * @return <code>String</code> with escaped content.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1340 * @throws IllegalArgumentException if an entity can not be escaped
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1341 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1342 public String escapeAttributeEntities(String str) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1343 StringBuffer buffer;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1344 int ch, pos;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1345 String entity;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1346 EscapeStrategy strategy = currentFormat.escapeStrategy;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1347
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1348 buffer = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1349 for (int i = 0; i < str.length(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1350 ch = str.charAt(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1351 pos = i;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1352 switch(ch) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1353 case '<' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1354 entity = "&lt;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1355 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1356 case '>' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1357 entity = "&gt;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1358 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1359 /*
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1360 case '\'' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1361 entity = "&apos;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1362 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1363 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1364 case '\"' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1365 entity = "&quot;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1366 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1367 case '&' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1368 entity = "&amp;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1369 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1370 case '\r' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1371 entity = "&#xD;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1372 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1373 case '\t' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1374 entity = "&#x9;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1375 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1376 case '\n' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1377 entity = "&#xA;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1378 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1379 default :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1380
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1381 if (strategy.shouldEscape((char) ch)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1382 // Make sure what we are escaping is not the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1383 // Beginning of a multi-byte character.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1384 if (Verifier.isHighSurrogate((char) ch)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1385 // This is a the high of a surrogate pair
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1386 i++;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1387 if (i < str.length()) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1388 char low = str.charAt(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1389 if(!Verifier.isLowSurrogate(low)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1390 throw new IllegalDataException("Could not decode surrogate pair 0x" +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1391 Integer.toHexString(ch) + " / 0x" + Integer.toHexString(low));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1392 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1393 ch = Verifier.decodeSurrogatePair((char) ch, low);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1394 } else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1395 throw new IllegalDataException("Surrogate pair 0x" +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1396 Integer.toHexString(ch) + " truncated");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1397 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1398 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1399 entity = "&#x" + Integer.toHexString(ch) + ";";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1400 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1401 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1402 entity = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1403 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1404 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1405 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1406 if (buffer == null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1407 if (entity != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1408 // An entity occurred, so we'll have to use StringBuffer
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1409 // (allocate room for it plus a few more entities).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1410 buffer = new StringBuffer(str.length() + 20);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1411 // Copy previous skipped characters and fall through
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1412 // to pickup current character
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1413 buffer.append(str.substring(0, pos));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1414 buffer.append(entity);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1415 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1416 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1417 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1418 if (entity == null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1419 buffer.append((char) ch);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1420 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1421 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1422 buffer.append(entity);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1423 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1424 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1425 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1426
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1427 // If there were any entities, return the escaped characters
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1428 // that we put in the StringBuffer. Otherwise, just return
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1429 // the unmodified input string.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1430 return (buffer == null) ? str : buffer.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1431 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1432
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1433
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1434 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1435 * This will take the three pre-defined entities in XML 1.0
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1436 * (used specifically in XML elements) and convert their character
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1437 * representation to the appropriate entity reference, suitable for
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1438 * XML element content.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1439 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1440 * @param str <code>String</code> input to escape.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1441 * @return <code>String</code> with escaped content.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1442 * @throws IllegalArgumentException if an entity can not be escaped
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1443 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1444 public String escapeElementEntities(String str) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1445 if (escapeOutput == false) return str;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1446
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1447 StringBuffer buffer;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1448 int ch, pos;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1449 String entity;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1450 EscapeStrategy strategy = currentFormat.escapeStrategy;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1451
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1452 buffer = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1453 for (int i = 0; i < str.length(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1454 ch = str.charAt(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1455 pos = i;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1456 switch(ch) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1457 case '<' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1458 entity = "&lt;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1459 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1460 case '>' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1461 entity = "&gt;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1462 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1463 case '&' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1464 entity = "&amp;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1465 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1466 case '\r' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1467 entity = "&#xD;";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1468 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1469 case '\n' :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1470 entity = currentFormat.lineSeparator;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1471 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1472 default :
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1473
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1474 if (strategy.shouldEscape((char) ch)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1475
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1476 //make sure what we are escaping is not the
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1477 //beginning of a multi-byte character.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1478 if(Verifier.isHighSurrogate((char) ch)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1479 //this is a the high of a surrogate pair
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1480 i++;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1481 if (i < str.length()) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1482 char low = str.charAt(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1483 if(!Verifier.isLowSurrogate(low)) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1484 throw new IllegalDataException("Could not decode surrogate pair 0x" +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1485 Integer.toHexString(ch) + " / 0x" + Integer.toHexString(low));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1486 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1487 ch = Verifier.decodeSurrogatePair((char) ch, low);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1488 } else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1489 throw new IllegalDataException("Surrogate pair 0x" +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1490 Integer.toHexString(ch) + " truncated");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1491 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1492 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1493 entity = "&#x" + Integer.toHexString(ch) + ";";
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1494 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1495 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1496 entity = null;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1497 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1498 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1499 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1500 if (buffer == null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1501 if (entity != null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1502 // An entity occurred, so we'll have to use StringBuffer
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1503 // (allocate room for it plus a few more entities).
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1504 buffer = new StringBuffer(str.length() + 20);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1505 // Copy previous skipped characters and fall through
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1506 // to pickup current character
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1507 buffer.append(str.substring(0, pos));
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1508 buffer.append(entity);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1509 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1510 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1511 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1512 if (entity == null) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1513 buffer.append((char) ch);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1514 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1515 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1516 buffer.append(entity);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1517 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1518 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1519 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1520
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1521 // If there were any entities, return the escaped characters
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1522 // that we put in the StringBuffer. Otherwise, just return
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1523 // the unmodified input string.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1524 return (buffer == null) ? str : buffer.toString();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1525 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1526
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1527 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1528 * Returns a copy of this XMLOutputter.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1529 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1530 public Object clone() {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1531 // Implementation notes: Since all state of an XMLOutputter is
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1532 // embodied in simple private instance variables, Object.clone
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1533 // can be used. Note that since Object.clone is totally
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1534 // broken, we must catch an exception that will never be
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1535 // thrown.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1536 try {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1537 return super.clone();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1538 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1539 catch (java.lang.CloneNotSupportedException e) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1540 // even though this should never ever happen, it's still
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1541 // possible to fool Java into throwing a
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1542 // CloneNotSupportedException. If that happens, we
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1543 // shouldn't swallow it.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1544 throw new RuntimeException(e.toString());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1545 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1546 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1547
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1548 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1549 * Return a string listing of the settings for this
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1550 * XMLOutputter instance.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1551 *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1552 * @return a string listing the settings for this XMLOutputter instance
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1553 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1554 public String toString() {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1555 StringBuffer buffer = new StringBuffer();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1556 for (int i = 0; i < userFormat.lineSeparator.length(); i++) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1557 char ch = userFormat.lineSeparator.charAt(i);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1558 switch (ch) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1559 case '\r': buffer.append("\\r");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1560 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1561 case '\n': buffer.append("\\n");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1562 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1563 case '\t': buffer.append("\\t");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1564 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1565 default: buffer.append("[" + ((int)ch) + "]");
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1566 break;
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1567 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1568 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1569
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1570 return (
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1571 "XMLOutputter[omitDeclaration = " + userFormat.omitDeclaration + ", " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1572 "encoding = " + userFormat.encoding + ", " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1573 "omitEncoding = " + userFormat.omitEncoding + ", " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1574 "indent = '" + userFormat.indent + "'" + ", " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1575 "expandEmptyElements = " + userFormat.expandEmptyElements + ", " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1576 "lineSeparator = '" + buffer.toString() + "', " +
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1577 "textMode = " + userFormat.mode + "]"
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1578 );
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1579 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1580
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1581 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1582 * Factory for making new NamespaceStack objects. The NamespaceStack
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1583 * created is actually an inner class extending the package protected
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1584 * NamespaceStack, as a way to make NamespaceStack "friendly" toward
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1585 * subclassers.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1586 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1587 private NamespaceStack createNamespaceStack() {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1588 // actually returns a XMLOutputter.NamespaceStack (see below)
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1589 return new NamespaceStack();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1590 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1591
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1592 /**
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1593 * Our own null subclass of NamespaceStack. This plays a little
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1594 * trick with Java access protection. We want subclasses of
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1595 * XMLOutputter to be able to override protected methods that
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1596 * declare a NamespaceStack parameter, but we don't want to
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1597 * declare the parent NamespaceStack class as public.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1598 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1599 protected class NamespaceStack
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1600 extends org.jdom.output.NamespaceStack
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1601 {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1602 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1603
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1604 // Support method to print a name without using elt.getQualifiedName()
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1605 // and thus avoiding a StringBuffer creation and memory churn
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1606 private void printQualifiedName(Writer out, Element e) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1607 if (e.getNamespace().getPrefix().length() == 0) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1608 out.write(e.getName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1609 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1610 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1611 out.write(e.getNamespace().getPrefix());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1612 out.write(':');
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1613 out.write(e.getName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1614 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1615 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1616
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1617 // Support method to print a name without using att.getQualifiedName()
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1618 // and thus avoiding a StringBuffer creation and memory churn
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1619 private void printQualifiedName(Writer out, Attribute a) throws IOException {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1620 String prefix = a.getNamespace().getPrefix();
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1621 if ((prefix != null) && (!prefix.equals(""))) {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1622 out.write(prefix);
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1623 out.write(':');
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1624 out.write(a.getName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1625 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1626 else {
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1627 out.write(a.getName());
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1628 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1629 }
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1630
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1631 // * * * * * * * * * * Deprecated methods * * * * * * * * * *
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1632
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1633 /* The methods below here are deprecations of protected methods. We
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1634 * don't usually deprecate protected methods, so they're commented out.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1635 * They're left here in case this mass deprecation causes people trouble.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1636 * Since we're getting close to 1.0 it's actually better for people to
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1637 * raise issues early though.
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1638 */
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1639
89ad0a9cca52 Uploaded
pfrommolt
parents:
diff changeset
1640 }