From 8e1526690c36888c17997c5730c897819117fe70 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Mon, 14 Mar 2005 20:08:55 +0000 Subject: [PATCH] Use DOMElementWriter git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277963 13f79535-47bb-0310-9956-ffa450edef68 --- .../ant/taskdefs/svn/SvnChangeLogWriter.java | 89 ++++++++++++++----- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/proposal/sandbox/svn/src/main/org/apache/tools/ant/taskdefs/svn/SvnChangeLogWriter.java b/proposal/sandbox/svn/src/main/org/apache/tools/ant/taskdefs/svn/SvnChangeLogWriter.java index 95550e2fd..0e09274bc 100644 --- a/proposal/sandbox/svn/src/main/org/apache/tools/ant/taskdefs/svn/SvnChangeLogWriter.java +++ b/proposal/sandbox/svn/src/main/org/apache/tools/ant/taskdefs/svn/SvnChangeLogWriter.java @@ -16,8 +16,18 @@ */ package org.apache.tools.ant.taskdefs.svn; +import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; +import javax.xml.parsers.DocumentBuilder; + +import org.apache.tools.ant.util.DOMElementWriter; +import org.apache.tools.ant.util.JAXPUtils; + +import org.w3c.dom.CDATASection; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Text; /** * Class used to generate an XML changelog. @@ -29,6 +39,8 @@ public class SvnChangeLogWriter { /** output format for times written to xml file */ private static final SimpleDateFormat OUTPUT_TIME = new SimpleDateFormat("HH:mm"); + /** stateless helper for writing the XML document */ + private static final DOMElementWriter DOM_WRITER = new DOMElementWriter(); /** * Print out the specified entries. @@ -37,15 +49,18 @@ public class SvnChangeLogWriter { * @param entries the entries to be written. */ public void printChangeLog(final PrintWriter output, - final SvnEntry[] entries) { + final SvnEntry[] entries) throws IOException { output.println(""); - output.println(""); + Document doc = JAXPUtils.getDocumentBuilder().newDocument(); + Element root = doc.createElement("changelog"); + DOM_WRITER.openElement(root, output, 0, "\t"); + output.println(); for (int i = 0; i < entries.length; i++) { final SvnEntry entry = entries[i]; - printEntry(output, entry); + printEntry(output, entry, root); } - output.println(""); + DOM_WRITER.closeElement(root, output, 0, "\t", entries.length > 0); output.flush(); output.close(); } @@ -57,28 +72,58 @@ public class SvnChangeLogWriter { * @param entry the entry to print * @param output writer to which to send output. */ - private void printEntry(final PrintWriter output, final SvnEntry entry) { - output.println("\t"); - output.println("\t\t" + OUTPUT_DATE.format(entry.getDate()) - + ""); - output.println("\t\t"); - output.println("\t\t"); - output.println("\t\t" + entry.getRevision() - + ""); + private void printEntry(final PrintWriter output, final SvnEntry entry, + final Element element) throws IOException { + Document doc = element.getOwnerDocument(); + + Element ent = doc.createElement("entry"); + appendTextElement(ent, "date", OUTPUT_DATE.format(entry.getDate())); + appendTextElement(ent, "time", OUTPUT_TIME.format(entry.getDate())); + appendCDATAElement(ent, "author", entry.getAuthor()); + appendTextElement(ent, "revision", entry.getRevision()); SvnEntry.Path[] paths = entry.getPaths(); for (int i = 0; i < paths.length; i++) { - output.println("\t\t"); - output.println("\t\t\t"); - output.println("\t\t\t" + paths[i].getActionDescription() - + ""); - output.println("\t\t"); + Element path = doc.createElement("path"); + ent.appendChild(path); + appendCDATAElement(path, "name", paths[i].getName()); + appendTextElement(path, "action", paths[i].getActionDescription()); } - output.println("\t\t"); - output.println("\t"); + appendCDATAElement(ent, "message", entry.getMessage()); + DOM_WRITER.write(ent, output, 1, "\t"); + } + + /** + * Creates a named element with nested text as child of the given element. + * + * @param parent the parent element + * @param name name of the child element + * @param content the content of the nested text + */ + private static void appendTextElement(Element parent, String name, + String content) { + Document doc = parent.getOwnerDocument(); + Element e = doc.createElement(name); + parent.appendChild(e); + Text t = doc.createTextNode(content); + e.appendChild(t); + } + + /** + * Creates a named element with a nested CDATA section as child of + * the given element. + * + * @param parent the parent element + * @param name name of the child element + * @param content the content of the nested text + */ + private static void appendCDATAElement(Element parent, String name, + String content) { + Document doc = parent.getOwnerDocument(); + Element e = doc.createElement(name); + parent.appendChild(e); + CDATASection c = doc.createCDATASection(content); + e.appendChild(c); } }