001 /**
002 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
003 */
004 package net.sourceforge.pmd.ant;
005
006 import java.io.BufferedWriter;
007 import java.io.File;
008 import java.io.FileWriter;
009 import java.io.IOException;
010 import java.io.OutputStreamWriter;
011 import java.io.Writer;
012 import java.util.ArrayList;
013 import java.util.List;
014 import java.util.Properties;
015
016 import net.sourceforge.pmd.Report;
017 import net.sourceforge.pmd.renderers.Renderer;
018 import net.sourceforge.pmd.renderers.RendererFactory;
019
020 import org.apache.tools.ant.BuildException;
021 import org.apache.tools.ant.types.Parameter;
022
023 public class Formatter {
024
025 private File toFile;
026 private String type;
027 private boolean toConsole;
028 private boolean showSuppressed;
029 private final List<Parameter> parameters = new ArrayList<Parameter>();
030
031 public void setShowSuppressed(boolean value) {
032 this.showSuppressed = value;
033 }
034
035 public void setType(String type) {
036 this.type = type;
037 }
038
039 public void setToFile(File toFile) {
040 this.toFile = toFile;
041 }
042
043 public void setToConsole(boolean toConsole) {
044 this.toConsole = toConsole;
045 }
046
047 public void addConfiguredParam(Parameter parameter) {
048 this.parameters.add(parameter);
049 }
050
051 private Writer writer;
052
053 private Renderer renderer;
054
055 public Renderer getRenderer() {
056 return renderer;
057 }
058
059 public void start(String baseDir) {
060 try {
061 if (toConsole) {
062 writer = new BufferedWriter(new OutputStreamWriter(System.out));
063 }
064 if (toFile != null) {
065 writer = getToFileWriter(baseDir);
066 }
067 renderer = createRenderer();
068 renderer.setWriter(writer);
069 renderer.start();
070 } catch (IOException ioe) {
071 throw new BuildException(ioe.getMessage(), ioe);
072 }
073 }
074
075 public void end(Report errorReport) {
076 try {
077 renderer.renderFileReport(errorReport);
078 renderer.end();
079 if (toConsole) {
080 writer.flush();
081 } else {
082 writer.close();
083 }
084 } catch (IOException ioe) {
085 throw new BuildException(ioe.getMessage(), ioe);
086 }
087 }
088
089 public boolean isNoOutputSupplied() {
090 return toFile == null && !toConsole;
091 }
092
093 @Override
094 public String toString() {
095 return "file = " + toFile + "; renderer = " + type;
096 }
097
098 private static String[] validRendererCodes() {
099 return RendererFactory.REPORT_FORMAT_TO_RENDERER.keySet().toArray(new String[RendererFactory.REPORT_FORMAT_TO_RENDERER.size()]);
100 }
101
102 private static String unknownRendererMessage(String userSpecifiedType) {
103 StringBuffer sb = new StringBuffer(100);
104 sb.append("Formatter type must be one of: '");
105 String[] typeCodes = validRendererCodes();
106 sb.append(typeCodes[0]);
107 for (int i = 1; i < typeCodes.length; i++) {
108 sb.append("', '").append(typeCodes[i]);
109 }
110 sb.append("', or a class name; you specified: ");
111 sb.append(userSpecifiedType);
112 return sb.toString();
113 }
114
115 // FIXME - hm, what about this consoleRenderer thing... need a test for this
116 private Renderer createRenderer() {
117 if ("".equals(type)) {
118 throw new BuildException(unknownRendererMessage("<unspecified>"));
119 }
120
121 Properties properties = createProperties();
122 Renderer renderer = RendererFactory.createRenderer(type, properties);
123 renderer.setShowSuppressedViolations(showSuppressed);
124 return renderer;
125 }
126
127 private Properties createProperties() {
128 Properties properties = new Properties();
129 for (Parameter parameter : parameters) {
130 properties.put(parameter.getName(), parameter.getValue());
131 }
132 return properties;
133 }
134
135 private Writer getToFileWriter(String baseDir) throws IOException {
136 if (!toFile.isAbsolute()) {
137 return new BufferedWriter(new FileWriter(new File(baseDir + System.getProperty("file.separator") + toFile.getPath())));
138 }
139 return new BufferedWriter(new FileWriter(toFile));
140 }
141 }
|