1 package com.thoughtworks.xstream.xml.text;
2
3 import com.thoughtworks.xstream.xml.XMLWriter;
4
5 import java.io.PrintWriter;
6 import java.io.Writer;
7 import java.util.LinkedList;
8
9 public class PrettyPrintXMLWriter implements XMLWriter {
10
11 private PrintWriter writer;
12 private LinkedList elementStack = new LinkedList();
13 private boolean tagInProgress;
14 private int depth;
15 private String lineIndenter;
16 private boolean readyForNewLine;
17 private boolean tagIsEmpty;
18
19 public PrettyPrintXMLWriter(PrintWriter writer, String lineIndenter) {
20 this.writer = writer;
21 this.lineIndenter = lineIndenter;
22 }
23
24 public PrettyPrintXMLWriter(Writer writer, String lineIndenter) {
25 this(new PrintWriter(writer), lineIndenter);
26 }
27
28 public PrettyPrintXMLWriter(PrintWriter writer) {
29 this(writer, " ");
30 }
31
32 public PrettyPrintXMLWriter(Writer writer) {
33 this(new PrintWriter(writer));
34 }
35
36 public void startElement(String name) {
37 tagIsEmpty = false;
38 finishTag();
39 write("<");
40 write(name);
41 elementStack.addLast(name);
42 tagInProgress = true;
43 depth++;
44 readyForNewLine = true;
45 tagIsEmpty = true;
46 }
47
48 public void writeText(String text) {
49 readyForNewLine = false;
50 tagIsEmpty = false;
51 finishTag();
52 text = text.replaceAll("&", "&");
53 text = text.replaceAll("<", "<");
54 text = text.replaceAll(">", ">");
55 write(text);
56 }
57
58 public void addAttribute(String key, String value) {
59 write(" ");
60 write(key);
61 write("=\"");
62 write(value);
63 write("\"");
64 }
65
66 public void endElement() {
67 depth--;
68 if (tagIsEmpty) {
69 write("/");
70 readyForNewLine = false;
71 finishTag();
72 elementStack.removeLast();
73 } else {
74 finishTag();
75 write("</" + elementStack.removeLast() + ">");
76 }
77 readyForNewLine = true;
78 }
79
80 private void write(String str) {
81 writer.write(str);
82 }
83
84 private void finishTag() {
85 if (tagInProgress) {
86 write(">");
87 }
88 tagInProgress = false;
89 if (readyForNewLine) {
90 endOfLine();
91 }
92 readyForNewLine = false;
93 tagIsEmpty = false;
94 }
95
96 protected void endOfLine() {
97 write("\n");
98 for (int i = 0; i < depth; i++) {
99 write(lineIndenter);
100 }
101 }
102 }
This page was automatically generated by Maven