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 }
211