View Javadoc

1   /* ============================================================
2    * JRobin : Pure java implementation of RRDTool's functionality
3    * ============================================================
4    *
5    * Project Info:  http://www.jrobin.org
6    * Project Lead:  Sasa Markovic (saxon@jrobin.org);
7    *
8    * (C) Copyright 2003-2005, by Sasa Markovic.
9    *
10   * Developers:    Sasa Markovic (saxon@jrobin.org)
11   *
12   *
13   * This library is free software; you can redistribute it and/or modify it under the terms
14   * of the GNU Lesser General Public License as published by the Free Software Foundation;
15   * either version 2.1 of the License, or (at your option) any later version.
16   *
17   * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18   * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19   * See the GNU Lesser General Public License for more details.
20   *
21   * You should have received a copy of the GNU Lesser General Public License along with this
22   * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
23   * Boston, MA 02111-1307, USA.
24   */
25  
26  package org.jrobin.core;
27  
28  import java.awt.*;
29  import java.io.File;
30  import java.io.OutputStream;
31  import java.io.PrintWriter;
32  import java.util.Stack;
33  
34  /**
35   * Extremely simple utility class used to create XML documents.
36   */
37  public class XmlWriter {
38  	static final String INDENT_STR = "   ";
39  
40  	private PrintWriter writer;
41  	private StringBuffer indent = new StringBuffer("");
42  	private Stack<String> openTags = new Stack<String>();
43  
44  	/**
45  	 * Creates XmlWriter with the specified output stream to send XML code to.
46  	 *
47  	 * @param stream Output stream which receives XML code
48  	 */
49  	public XmlWriter(OutputStream stream) {
50  		writer = new PrintWriter(stream, true);
51  	}
52  
53  	/**
54  	 * Opens XML tag
55  	 *
56  	 * @param tag XML tag name
57  	 */
58  	public void startTag(String tag) {
59  		writer.println(indent + "<" + tag + ">");
60  		openTags.push(tag);
61  		indent.append(INDENT_STR);
62  	}
63  
64  	/**
65  	 * Closes the corresponding XML tag
66  	 */
67  	public void closeTag() {
68  		String tag = openTags.pop();
69  		indent.setLength(indent.length() - INDENT_STR.length());
70  		writer.println(indent + "</" + tag + ">");
71  	}
72  
73  	/**
74  	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
75  	 *
76  	 * @param tag   XML tag name
77  	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
78  	 */
79  	public void writeTag(String tag, Object value) {
80  		if (value != null) {
81  			writer.println(indent + "<" + tag + ">" +
82  					escape(value.toString()) + "</" + tag + ">");
83  		}
84  		else {
85  			writer.println(indent + "<" + tag + "></" + tag + ">");
86  		}
87  	}
88  
89  	/**
90  	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
91  	 *
92  	 * @param tag   XML tag name
93  	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
94  	 */
95  	public void writeTag(String tag, int value) {
96  		writeTag(tag, "" + value);
97  	}
98  
99  	/**
100 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
101 	 *
102 	 * @param tag   XML tag name
103 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
104 	 */
105 	public void writeTag(String tag, long value) {
106 		writeTag(tag, "" + value);
107 	}
108 
109 	/**
110 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
111 	 *
112 	 * @param tag   XML tag name
113 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
114 	 */
115 	public void writeTag(String tag, double value, String nanString) {
116 		writeTag(tag, Util.formatDouble(value, nanString, true));
117 	}
118 
119 	/**
120 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
121 	 *
122 	 * @param tag   XML tag name
123 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
124 	 */
125 	public void writeTag(String tag, double value) {
126 		writeTag(tag, Util.formatDouble(value, true));
127 	}
128 
129 	/**
130 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
131 	 *
132 	 * @param tag   XML tag name
133 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
134 	 */
135 	public void writeTag(String tag, boolean value) {
136 		writeTag(tag, "" + value);
137 	}
138 
139 	/**
140 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
141 	 *
142 	 * @param tag   XML tag name
143 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
144 	 */
145 	public void writeTag(String tag, Color value) {
146 		int rgb = value.getRGB() & 0xFFFFFF;
147 		writeTag(tag, "#" + Integer.toHexString(rgb).toUpperCase());
148 	}
149 
150 	/**
151 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
152 	 *
153 	 * @param tag   XML tag name
154 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
155 	 */
156 	public void writeTag(String tag, Font value) {
157 		startTag(tag);
158 		writeTag("name", value.getName());
159 		int style = value.getStyle();
160 		if ((style & Font.BOLD) != 0 && (style & Font.ITALIC) != 0) {
161 			writeTag("style", "BOLDITALIC");
162 		}
163 		else if ((style & Font.BOLD) != 0) {
164 			writeTag("style", "BOLD");
165 		}
166 		else if ((style & Font.ITALIC) != 0) {
167 			writeTag("style", "ITALIC");
168 		}
169 		else {
170 			writeTag("style", "PLAIN");
171 		}
172 		writeTag("size", value.getSize());
173 		closeTag();
174 	}
175 
176 	/**
177 	 * Writes &lt;tag&gt;value&lt;/tag&gt; to output stream
178 	 *
179 	 * @param tag   XML tag name
180 	 * @param value value to be placed between <code>&lt;tag&gt</code> and <code>&lt;/tag&gt;</code>
181 	 */
182 	public void writeTag(String tag, File value) {
183 		writeTag(tag, value.getPath());
184 	}
185 
186 	/**
187 	 * Flushes the output stream
188 	 */
189 	public void flush() {
190 		writer.flush();
191 	}
192 
193 	protected void finalize() throws Throwable {
194 		super.finalize();
195 		writer.close();
196 	}
197 
198 	/**
199 	 * Writes XML comment to output stream
200 	 *
201 	 * @param comment comment string
202 	 */
203 	public void writeComment(Object comment) {
204 		writer.println(indent + "<!-- " + escape(comment.toString()) + " -->");
205 	}
206 
207 	private static String escape(String s) {
208 		return s.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
209 	}
210 }