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 }