Formatter.java
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 baseDirthrows 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 }