1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.ant; 5 6 import net.sourceforge.pmd.PMD; 7 import net.sourceforge.pmd.Report; 8 import net.sourceforge.pmd.renderers.CSVRenderer; 9 import net.sourceforge.pmd.renderers.EmacsRenderer; 10 import net.sourceforge.pmd.renderers.HTMLRenderer; 11 import net.sourceforge.pmd.renderers.PapariTextRenderer; 12 import net.sourceforge.pmd.renderers.Renderer; 13 import net.sourceforge.pmd.renderers.SummaryHTMLRenderer; 14 import net.sourceforge.pmd.renderers.TextRenderer; 15 import net.sourceforge.pmd.renderers.VBHTMLRenderer; 16 import net.sourceforge.pmd.renderers.XMLRenderer; 17 import net.sourceforge.pmd.renderers.YAHTMLRenderer; 18 import org.apache.tools.ant.BuildException; 19 20 import java.io.BufferedWriter; 21 import java.io.File; 22 import java.io.FileWriter; 23 import java.io.IOException; 24 import java.io.OutputStreamWriter; 25 import java.io.Writer; 26 27 public class Formatter { 28 29 private File toFile; 30 private String linkPrefix; 31 private String type; 32 private boolean toConsole; 33 private boolean showSuppressed; 34 35 public void setShowSuppressed(boolean value) { 36 this.showSuppressed = value; 37 } 38 39 public void setType(String type) { 40 this.type = type; 41 } 42 43 public void setLinkPrefix(String linkPrefix) { 44 this.linkPrefix = linkPrefix; 45 } 46 47 public void setToFile(File toFile) { 48 this.toFile = toFile; 49 } 50 51 public void setToConsole(boolean toConsole) { 52 this.toConsole = toConsole; 53 } 54 55 public void outputReport(Report report, String baseDir) { 56 try { 57 if (toConsole) { 58 outputReportTo(new BufferedWriter(new OutputStreamWriter(System.out)), report, true); 59 } 60 if (toFile != null) { 61 outputReportTo(getToFileWriter(baseDir), report, false); 62 } 63 } catch (IOException ioe) { 64 throw new BuildException(ioe.getMessage()); 65 } 66 } 67 68 private void outputReportTo(Writer writer, Report report, boolean consoleRenderer) throws IOException { 69 String renderedReport = getRenderer(consoleRenderer).render(report) + PMD.EOL; 70 writer.write(renderedReport, 0, renderedReport.length()); 71 writer.close(); 72 } 73 74 public boolean isNoOutputSupplied() { 75 return toFile == null && !toConsole; 76 } 77 78 public String toString() { 79 return "file = " + toFile + "; renderer = " + type; 80 } 81 82 private Renderer getRenderer(boolean consoleRenderer) { 83 Renderer renderer; 84 if (type.equals("xml")) { 85 renderer = new XMLRenderer(); 86 } else if (type.equals("html")) { 87 renderer = new HTMLRenderer(linkPrefix); 88 } else if (type.equals("summaryhtml")) { 89 renderer = new SummaryHTMLRenderer(); 90 } else if (type.equals("papari")) { 91 renderer = new PapariTextRenderer(); 92 } else if (type.equals("csv")) { 93 renderer = new CSVRenderer(); 94 } else if (type.equals("text")) { 95 renderer = new TextRenderer(); 96 } else if (type.equals("emacs")) { 97 renderer = new EmacsRenderer(); 98 } else if (type.equals("vbhtml")) { 99 renderer = new VBHTMLRenderer(); 100 } else if (type.equals("yahtml")) { 101 renderer = new YAHTMLRenderer(); 102 } else if (!type.equals("")) { 103 try { 104 renderer = (Renderer) Class.forName(type).newInstance(); 105 } catch (Exception e) { 106 throw new BuildException("Unable to instantiate custom formatter: " + type); 107 } 108 } else { 109 throw new BuildException("Formatter type must be 'xml', 'text', 'html', 'emacs', 'summaryhtml', 'papari', 'csv', 'vbhtml', 'yahtml', or a class name; you specified " + type); 110 } 111 renderer.showSuppressedViolations(showSuppressed); 112 return renderer; 113 } 114 115 private Writer getToFileWriter(String baseDir) throws IOException { 116 if (!toFile.isAbsolute()) { 117 return new BufferedWriter(new FileWriter(new File(baseDir + System.getProperty("file.separator") + toFile.getPath()))); 118 } 119 return new BufferedWriter(new FileWriter(toFile)); 120 } 121 122 }