1 package net.sourceforge.pmd;
2
3 import java.io.OutputStream;
4 import java.io.PrintStream;
5 import java.util.Enumeration;
6 import java.util.Iterator;
7
8 /***
9 * Writes an XML file containing information about rule set and each rule within the rule set.
10 *
11 * @author Donald A. Leckie
12 * @since August 30, 2002
13 * @version $Revision: 1.9 $, $Date: 2003/03/14 19:03:45 $
14 */
15 public class RuleSetWriter {
16
17 private PrintStream m_outputStream;
18 private StringBuffer m_line = new StringBuffer(500);
19 private int m_indent;
20
21 /***
22 *******************************************************************************
23 *
24 * @param outputStream
25 */
26 public RuleSetWriter(OutputStream outputStream) {
27 m_outputStream = new PrintStream(outputStream);
28
29 m_line.append("<?xml version=\"1.0\" ?>");
30 outputLine();
31 }
32
33 /***
34 *******************************************************************************
35 *
36 * @param ruleSet
37 */
38 public void write(RuleSet ruleSet) {
39 // <ruleset name="xxxxxx"
40 indent();
41 setupNewLine();
42 m_line.append("<ruleset name=\"");
43 m_line.append(ruleSet.getName());
44 m_line.append('"');
45
46 //
47 // include="true">
48 //
49 m_line.append(" include=\"");
50 m_line.append(ruleSet.include() ? "true" : "false");
51 m_line.append("\">");
52 outputLine();
53
54 // <description>
55 // xxxxxxxxx
56 // </description>
57 indent();
58 writeDescription(ruleSet.getDescription());
59 outdent();
60
61 //
62 // Write each rule.
63 //
64 Iterator rules = ruleSet.getRules().iterator();
65
66 while (rules.hasNext()) {
67 write((Rule) rules.next());
68 }
69
70 // </ruleset>
71 setupNewLine();
72 m_line.append("</ruleset>");
73 outputLine();
74 outdent();
75 }
76
77 /***
78 *******************************************************************************
79 *
80 * @param rule
81 */
82 private void write(Rule rule) {
83 // Write a blank line to separate rules for easier reading.
84 m_outputStream.println("");
85
86 // <rule name="xxxxxx"
87 indent();
88 setupNewLine();
89 m_line.append("<rule name=\"");
90 m_line.append(rule.getName());
91 m_line.append('"');
92 outputLine();
93
94 // message="xxxxxx"
95 m_indent += 6;
96 setupNewLine();
97 m_line.append("message=\"");
98 m_line.append(rule.getMessage());
99 m_line.append('"');
100 outputLine();
101
102 // class="xxxx"
103 setupNewLine();
104 m_line.append("class=\"");
105 m_line.append(rule.getClass().getName());
106 m_line.append('"');
107 outputLine();
108
109 // include="true">
110 setupNewLine();
111 m_line.append("include=\"");
112 m_line.append(rule.include() ? "true" : "false");
113 m_line.append("\">");
114 outputLine();
115 m_indent -= 6;
116
117 // <description>
118 // xxxxxxxxx
119 // </description>
120 indent();
121 writeDescription(rule.getDescription());
122 outdent();
123
124 // <example>
125 // xxxxxxxxxxx
126 // </example>
127 indent();
128 writeExample(rule.getExample());
129 outdent();
130
131 // <priority>
132 // xxx
133 // </priority>
134 indent();
135 writePriority(rule.getPriority());
136 outdent();
137
138 // <properties>
139 // <property name="xxxx" value="yyyyy" />
140 // </properties>
141 indent();
142 writeProperties(rule);
143 outdent();
144
145 // </ruleset>
146 setupNewLine();
147 m_line.append("</rule>");
148 outputLine();
149 outdent();
150 }
151
152 /***
153 *******************************************************************************
154 *
155 * @param description
156 */
157 private void writeDescription(String description) {
158 // <description>
159 setupNewLine();
160 m_line.append("<description>");
161 outputLine();
162
163 {
164 // xxxxxxxx
165 indent();
166 setupNewLine();
167 m_line.append(description);
168 outputLine();
169 outdent();
170 }
171
172 // </description>
173 setupNewLine();
174 m_line.append("</description>");
175 outputLine();
176 }
177
178 /***
179 *******************************************************************************
180 *
181 * @param example
182 */
183 private void writeExample(String example) {
184 // <example>
185 setupNewLine();
186 m_line.append("<example>");
187 outputLine();
188
189 {
190 // xxxxxxxx
191 indent();
192 setupNewLineWithoutIndent();
193 m_line.append("<![CDATA[");
194 outputLine();
195 setupNewLineWithoutIndent();
196 m_line.append(example);
197 outputLine();
198 setupNewLineWithoutIndent();
199 m_line.append("]]>");
200 outputLine();
201 outdent();
202 }
203
204 // </description>
205 setupNewLine();
206 m_line.append("</example>");
207 outputLine();
208 }
209
210 /***
211 *******************************************************************************
212 *
213 * @param priority
214 */
215 private void writePriority(int priority) {
216 // <priority>
217 setupNewLine();
218 m_line.append("<priority>");
219 outputLine();
220
221 {
222 // xx
223 indent();
224 setupNewLine();
225 m_line.append(String.valueOf(priority));
226 outputLine();
227 outdent();
228 }
229
230 // </priority>
231 setupNewLine();
232 m_line.append("</priority>");
233 outputLine();
234 }
235
236 /***
237 *******************************************************************************
238 *
239 * @param rule
240 */
241 private void writeProperties(Rule rule) {
242 // <properties>
243 setupNewLine();
244 m_line.append("<properties>");
245 outputLine();
246 indent();
247
248 RuleProperties properties = rule.getProperties();
249 Enumeration keys = properties.keys();
250
251 while (keys.hasMoreElements()) {
252 String name = (String) keys.nextElement();
253 String value = properties.getValue(name);
254 String valueType = properties.getValueType(name);
255
256 // <property name="xxxxx" value="yyyyy" />
257 setupNewLine();
258 m_line.append("<property name=\"");
259 m_line.append(name);
260 m_line.append("\" value=\"");
261 m_line.append(value);
262 m_line.append("\" type=\"");
263 m_line.append(valueType);
264 m_line.append("\"/>");
265 outputLine();
266 }
267
268 outdent();
269 setupNewLine();
270 m_line.append("</properties>");
271 outputLine();
272 }
273
274 /***
275 *******************************************************************************
276 *
277 */
278 private void indent() {
279 m_indent += 3;
280 }
281
282
283 /***
284 *******************************************************************************
285 *
286 */
287 private void outdent() {
288 m_indent -= 3;
289 }
290
291 /***
292 *******************************************************************************
293 *
294 */
295 private void setupNewLine() {
296 m_line.setLength(0);
297
298 for (int n = 0; n < m_indent; n++) {
299 m_line.append(' ');
300 }
301 }
302
303 /***
304 *******************************************************************************
305 *
306 */
307 private void setupNewLineWithoutIndent() {
308 m_line.setLength(0);
309 }
310
311 /***
312 *******************************************************************************
313 *
314 */
315 private void outputLine() {
316 m_outputStream.println(m_line.toString());
317 }
318 }
This page was automatically generated by Maven