1
2
3
4 package net.sourceforge.pmd.ant;
5
6 import java.io.BufferedWriter;
7 import java.io.File;
8 import java.io.FileWriter;
9 import java.io.IOException;
10 import java.io.OutputStreamWriter;
11 import java.io.Writer;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Properties;
15
16 import net.sourceforge.pmd.Report;
17 import net.sourceforge.pmd.renderers.Renderer;
18 import net.sourceforge.pmd.renderers.RendererFactory;
19 import net.sourceforge.pmd.util.StringUtil;
20
21 import org.apache.tools.ant.BuildException;
22 import org.apache.tools.ant.types.Parameter;
23
24 public class Formatter {
25
26 private File toFile;
27 private String type;
28 private boolean toConsole;
29 private boolean showSuppressed;
30 private final List<Parameter> parameters = new ArrayList<Parameter>();
31
32 public void setShowSuppressed(boolean value) {
33 this.showSuppressed = value;
34 }
35
36 public void setType(String type) {
37 this.type = type;
38 }
39
40 public void setToFile(File toFile) {
41 this.toFile = toFile;
42 }
43
44 public void setToConsole(boolean toConsole) {
45 this.toConsole = toConsole;
46 }
47
48 public void addConfiguredParam(Parameter parameter) {
49 this.parameters.add(parameter);
50 }
51
52 private Writer writer;
53
54 private Renderer renderer;
55
56 public Renderer getRenderer() {
57 return renderer;
58 }
59
60 public void start(String baseDir) {
61 try {
62 if (toConsole) {
63 writer = new BufferedWriter(new OutputStreamWriter(System.out));
64 }
65 if (toFile != null) {
66 writer = getToFileWriter(baseDir);
67 }
68 renderer = createRenderer();
69 renderer.setWriter(writer);
70 renderer.start();
71 } catch (IOException ioe) {
72 throw new BuildException(ioe.getMessage(), ioe);
73 }
74 }
75
76 public void end(Report errorReport) {
77 try {
78 renderer.renderFileReport(errorReport);
79 renderer.end();
80 if (toConsole) {
81 writer.flush();
82 } else {
83 writer.close();
84 }
85 } catch (IOException ioe) {
86 throw new BuildException(ioe.getMessage(), ioe);
87 }
88 }
89
90 public boolean isNoOutputSupplied() {
91 return toFile == null && !toConsole;
92 }
93
94 @Override
95 public String toString() {
96 return "file = " + toFile + "; renderer = " + type;
97 }
98
99 private static String[] validRendererCodes() {
100 return RendererFactory.REPORT_FORMAT_TO_RENDERER.keySet().toArray(new String[RendererFactory.REPORT_FORMAT_TO_RENDERER.size()]);
101 }
102
103 private static String unknownRendererMessage(String userSpecifiedType) {
104 StringBuilder sb = new StringBuilder(100);
105 sb.append("Formatter type must be one of: '");
106 String[] typeCodes = validRendererCodes();
107 sb.append(typeCodes[0]);
108 for (int i = 1; i < typeCodes.length; i++) {
109 sb.append("', '").append(typeCodes[i]);
110 }
111 sb.append("', or a class name; you specified: ");
112 sb.append(userSpecifiedType);
113 return sb.toString();
114 }
115
116
117 private Renderer createRenderer() {
118 if (StringUtil.isEmpty(type)) {
119 throw new BuildException(unknownRendererMessage("<unspecified>"));
120 }
121
122 Properties properties = createProperties();
123 Renderer renderer = RendererFactory.createRenderer(type, properties);
124 renderer.setShowSuppressedViolations(showSuppressed);
125 return renderer;
126 }
127
128 private Properties createProperties() {
129 Properties properties = new Properties();
130 for (Parameter parameter : parameters) {
131 properties.put(parameter.getName(), parameter.getValue());
132 }
133 return properties;
134 }
135
136 private Writer getToFileWriter(String baseDir) throws IOException {
137 if (!toFile.isAbsolute()) {
138 return new BufferedWriter(new FileWriter(new File(baseDir + System.getProperty("file.separator") + toFile.getPath())));
139 }
140 return new BufferedWriter(new FileWriter(toFile));
141 }
142 }