package com.awsle.aibatis.xml.engine.xml.text; import com.awsle.aibatis.xml.engine.xml.XMLWriter; import java.io.PrintWriter; import java.io.Writer; import java.util.LinkedList; public class PrettyPrintXMLWriter implements XMLWriter { private PrintWriter writer; private LinkedList elementStack = new LinkedList(); private boolean tagInProgress; private int depth; private String lineIndenter; private boolean readyForNewLine; private boolean tagIsEmpty; public PrettyPrintXMLWriter(PrintWriter writer, String lineIndenter) { this.writer = writer; this.lineIndenter = lineIndenter; } public PrettyPrintXMLWriter(Writer writer, String lineIndenter) { this(new PrintWriter(writer), lineIndenter); } public PrettyPrintXMLWriter(PrintWriter writer) { this(writer, " "); } public PrettyPrintXMLWriter(Writer writer) { this(new PrintWriter(writer)); } public void startElement(String name) { tagIsEmpty = false; finishTag(); write("<"); write(name); elementStack.addLast(name); tagInProgress = true; depth++; readyForNewLine = true; tagIsEmpty = true; } public void writeText(String text) { readyForNewLine = false; tagIsEmpty = false; finishTag(); text = text.replaceAll("&", "&"); text = text.replaceAll("<", "<"); text = text.replaceAll(">", ">"); write(text); } public void addAttribute(String key, String value) { write(" "); write(key); write("=\""); write(value); write("\""); } public void endElement() { depth--; if (tagIsEmpty) { write("/"); readyForNewLine = false; finishTag(); elementStack.removeLast(); } else { finishTag(); write(""); } readyForNewLine = true; } private void write(String str) { writer.write(str); } private void finishTag() { if (tagInProgress) { write(">"); } tagInProgress = false; if (readyForNewLine) { endOfLine(); } readyForNewLine = false; tagIsEmpty = false; } protected void endOfLine() { write("\n"); for (int i = 0; i < depth; i++) { write(lineIndenter); } } }