package hudson.plugins.tfs; import hudson.Util; import hudson.plugins.tfs.model.ChangeSet; import hudson.plugins.tfs.util.DateUtil; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.List; import org.apache.commons.io.IOUtils; /** * Team Foundation change log writer. * * @author Erik Ramfelt */ public class ChangeSetWriter { /** * Writes the list of change sets to the file * @param changeSets list of change sets * @param changelogFile file to write change sets to */ public void write(List<ChangeSet> changeSets, File changelogFile) throws IOException { FileWriter writer = new FileWriter(changelogFile); try { write(changeSets, writer); } finally { IOUtils.closeQuietly(writer); } } /** * Writes the list of change sets to the writer * @param changeSets list of change sets * @param output output writer */ public void write(List<ChangeSet> changeSets, Writer output) { PrintWriter writer = new PrintWriter(output); writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.println("<changelog>"); for (ChangeSet changeSet : changeSets) { writer.println(String.format("\t<changeset version=\"%s\">", changeSet.getVersion())); write(changeSet, writer); writer.println("\t</changeset>"); } writer.println("</changelog>"); writer.flush(); } private void write(ChangeSet changeSet, PrintWriter writer) { writer.println(String.format("\t\t<date>%s</date>", DateUtil.TFS_DATETIME_FORMATTER.get().format(changeSet.getDate()))); if (Util.fixEmpty(changeSet.getDomain()) == null) { writer.println(String.format("\t\t<user>%s</user>", escapeForXml(changeSet.getUser()))); } else { writer.println(String.format("\t\t<user>%s\\%s</user>", escapeForXml(changeSet.getDomain()), escapeForXml(changeSet.getUser()))); } if (Util.fixEmpty(changeSet.getCheckedInBy()) != null) { writer.println(String.format("\t\t<checked_in_by_user>%s</checked_in_by_user>", escapeForXml(changeSet.getCheckedInBy()))); } writer.println(String.format("\t\t<comment>%s</comment>", escapeForXml(changeSet.getComment()))); if (changeSet.getItems().size() > 0) { writer.println("\t\t<items>"); for (ChangeSet.Item item : changeSet.getItems()) { writer.println(String.format("\t\t\t<item action=\"%s\">%s</item>", escapeForXml(item.getAction()), escapeForXml(item.getPath()))); } writer.println("\t\t</items>"); } } /** * * Converts the input in the way that it can be written to the XML. * Special characters are converted to XML understandable way. * * @param object The object to be escaped. * @return Escaped string that can be written to XML. */ private String escapeForXml(Object object) { if(object == null) { return null; } //Loop through and replace the special chars. String string = object.toString(); int size = string.length(); char ch; StringBuilder escapedString = new StringBuilder(size); for(int index = 0;index < size;index ++) { //Convert special chars. ch = string.charAt(index); switch(ch) { case '&' : escapedString.append("&"); break; case '<' : escapedString.append("<"); break; case '>' : escapedString.append(">"); break; case '\'' : escapedString.append("'"); break; case '\"' : escapedString.append(""");break; default: escapedString.append(ch); } } return escapedString.toString(); } }