Remove deprecated methods from Renderer.

Also split AbstractRenderer off into AbstractAccumulatingRenderer to make the distinction with the AbstractIncrementalRenderer explicit.  JavaDoc updated accordingly.

git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@6576 51baf565-9d33-0410-a72c-fc3788e3496d
This commit is contained in:
Ryan Gustafson
2008-10-07 04:28:39 +00:00
parent 465b903f04
commit fbd966a099
20 changed files with 122 additions and 142 deletions

@ -322,9 +322,12 @@ The following is relatively complete list of the major changes (this may not be
Added - Renderer.setDescription(String)
Added - Renderer.getPropertyDefinitions()
Added - Renderer.isShowSuppressedViolations()
Added - AbstractAccumulatingRenderer
Removed - Renderer.render(Report)
Removed - Renderer.render(Report, Writer)
Renamed - Renderer.showSuppressedViolations(boolean) to Renderer.setShowSuppressedViolations(boolean)
Renamed - PapariTextRenderer to TextColorRenderer
Renamed - OntheFlyRenderer to AbstractIncrementalRenderer
Renamed - OntheFlyRenderer to AbstractIncrementingRenderer
PMD command line changes:

@ -6,6 +6,8 @@ package test.net.sourceforge.pmd;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
@ -152,7 +154,7 @@ public class ReportTest extends RuleTst implements ReportListener {
// Files are grouped together now.
@Test
public void testSortedReport_File() {
public void testSortedReport_File() throws IOException {
Report r = new Report();
RuleContext ctx = new RuleContext();
ctx.setSourceCodeFilename("foo");
@ -162,12 +164,12 @@ public class ReportTest extends RuleTst implements ReportListener {
JavaNode s1 = getNode(10, 5, ctx.getSourceCodeFilename());
r.addRuleViolation(new JavaRuleViolation(new MockRule("name", "desc", "msg", "rulesetname"), ctx, s1));
Renderer rend = new XMLRenderer(new Properties());
String result = rend.render(r);
String result = render(rend, r);
assertTrue("sort order wrong", result.indexOf("bar") < result.indexOf("foo"));
}
@Test
public void testSortedReport_Line() {
public void testSortedReport_Line() throws IOException {
Report r = new Report();
RuleContext ctx = new RuleContext();
ctx.setSourceCodeFilename("foo1");
@ -177,7 +179,7 @@ public class ReportTest extends RuleTst implements ReportListener {
JavaNode s1 = getNode(20, 5, ctx.getSourceCodeFilename());
r.addRuleViolation(new JavaRuleViolation(new MockRule("rule1", "rule1", "msg", "rulesetname"), ctx, s1));
Renderer rend = new XMLRenderer(new Properties());
String result = rend.render(r);
String result = render(rend, r);
assertTrue("sort order wrong", result.indexOf("rule2") < result.indexOf("rule1"));
}
@ -229,7 +231,16 @@ public class ReportTest extends RuleTst implements ReportListener {
s.testingOnly__setBeginColumn(5);
return s;
}
public static String render(Renderer renderer, Report report) throws IOException {
StringWriter writer = new StringWriter();
renderer.setWriter(writer);
renderer.start();
renderer.renderFileReport(null);
renderer.end();
return writer.toString();
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(ReportTest.class);
}

@ -13,6 +13,7 @@ import net.sourceforge.pmd.renderers.Renderer;
import org.junit.Test;
import test.net.sourceforge.pmd.ReportTest;
import test.net.sourceforge.pmd.testframework.RuleTst;
public abstract class AbstractRendererTst extends RuleTst {
@ -52,22 +53,22 @@ public abstract class AbstractRendererTst extends RuleTst {
}
@Test(expected = NullPointerException.class)
public void testNullPassedIn() {
getRenderer().render(null);
public void testNullPassedIn() throws Throwable {
ReportTest.render(getRenderer(), null);
}
@Test
public void testRenderer() throws Throwable {
Report rep = new Report();
runTestFromString(TEST1, new FooRule(), rep);
String actual = getRenderer().render(rep);
String actual = ReportTest.render(getRenderer(), rep);
assertEquals(getExpected(), actual);
}
@Test
public void testRendererEmpty() throws Throwable {
Report rep = new Report();
String actual = getRenderer().render(rep);
String actual = ReportTest.render(getRenderer(), rep);
assertEquals(getExpectedEmpty(), actual);
}
@ -75,7 +76,7 @@ public abstract class AbstractRendererTst extends RuleTst {
public void testRendererMultiple() throws Throwable {
Report rep = new Report();
runTestFromString(TEST1, new FooRule2(), rep);
String actual = getRenderer().render(rep);
String actual = ReportTest.render(getRenderer(), rep);
assertEquals(getExpectedMultiple(), actual);
}
@ -84,7 +85,7 @@ public abstract class AbstractRendererTst extends RuleTst {
Report rep = new Report();
Report.ProcessingError err = new Report.ProcessingError("Error", "file");
rep.addError(err);
String actual = getRenderer().render(rep);
String actual = ReportTest.render(getRenderer(), rep);
assertEquals(getExpectedError(err), actual);
}

@ -28,6 +28,7 @@ import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import test.net.sourceforge.pmd.ReportTest;
import test.net.sourceforge.pmd.testframework.RuleTst;
public class XMLRendererTest extends RuleTst {
@ -119,7 +120,8 @@ public class XMLRendererTest extends RuleTst {
}
private Element parseRootElement(Report rpt) throws SAXException, IOException, ParserConfigurationException {
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(new XMLRenderer(new Properties()).render(rpt)))).getDocumentElement();
String result = ReportTest.render(new XMLRenderer(new Properties()), rpt);
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(result))).getDocumentElement();
}
public static junit.framework.Test suite() {

@ -7,7 +7,6 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@ -255,15 +254,12 @@ public class PMDTask extends Task {
final String inputPath = ds.getBasedir().getPath();
Renderer logRenderer = new AbstractRenderer("log", "Logging renderer", null) {
@Override
public void start() {}
@Override
public void startFileAnalysis(DataSource dataSource) {
log("Processing file " + dataSource.getNiceFileName(false, inputPath), Project.MSG_VERBOSE);
}
@Override
public void renderFileReport(Report r) {
int size = r.size();
if (size > 0) {
@ -271,10 +267,7 @@ public class PMDTask extends Task {
}
}
@Override
public void end() {}
public void render(Writer writer, Report r) {}
};
List<Renderer> renderers = new LinkedList<Renderer>();
renderers.add(logRenderer);

@ -0,0 +1,61 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.util.Properties;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.util.datasource.DataSource;
/**
* Abstract base class for {@link Renderer} implementations which only produce
* output once all source files are processed. Such {@link Renderer}s use
* working memory proportional to the number of violations found, which can
* be quite large in some scenarios. Consider using
* {@link AbstractIncrementingRenderer} which can use significantly less memory.
*
* Subclasses should implement the {@link #end()} method to output the
* {@link #report}.
*
* @see AbstractIncrementingRenderer
*/
public abstract class AbstractAccumulatingRenderer extends AbstractRenderer {
/**
* The accumulated Report.
*/
protected Report report;
public AbstractAccumulatingRenderer(String name, String description, Properties properties) {
super(name, description, properties);
}
/**
* {@inheritDoc}
*/
public void start() throws IOException {
report = new Report();
}
/**
* {@inheritDoc}
*/
public void startFileAnalysis(DataSource dataSource) {
}
/**
* {@inheritDoc}
*/
public void renderFileReport(Report report) throws IOException {
this.report.merge(report);
}
/**
* Subclasses should output the {@link #report}.
*
* {@inheritDoc}
*/
public abstract void end() throws IOException;
}

@ -4,7 +4,6 @@
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -12,6 +11,7 @@ import java.util.Properties;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.util.datasource.DataSource;
/**
* Abstract base class for {@link Renderer} implementations which can produce
@ -24,7 +24,7 @@ import net.sourceforge.pmd.RuleViolation;
* Only processing errors and suppressed violations are accumulated across all
* files. These are intended to be processed in the {@link #end()} method.
*/
public abstract class AbstractIncrementalRenderer extends AbstractRenderer {
public abstract class AbstractIncrementingRenderer extends AbstractRenderer {
/**
* Accumulated processing errors.
@ -36,24 +36,25 @@ public abstract class AbstractIncrementalRenderer extends AbstractRenderer {
*/
protected List<Report.SuppressedViolation> suppressed = new LinkedList<Report.SuppressedViolation>();
public AbstractIncrementalRenderer(String name, String description, Properties properties) {
public AbstractIncrementingRenderer(String name, String description, Properties properties) {
super(name, description, properties);
}
/**
* {@inheritDoc}
*/
public void render(Writer writer, Report report) throws IOException {
setWriter(writer);
start();
renderFileReport(report);
end();
public void start() throws IOException {
}
/**
* {@inheritDoc}
*/
public void startFileAnalysis(DataSource dataSource) {
}
/**
* {@inheritDoc}
*/
@Override
public void renderFileReport(Report report) throws IOException {
Iterator<RuleViolation> violations = report.iterator();
if (violations.hasNext()) {
@ -70,13 +71,6 @@ public abstract class AbstractIncrementalRenderer extends AbstractRenderer {
}
}
/**
* {@inheritDoc}
*/
@Override
public void start() throws IOException {
}
/**
* Render a series of {@link RuleViolation}s.
* @param violations The iterator of violations to render.
@ -87,7 +81,6 @@ public abstract class AbstractIncrementalRenderer extends AbstractRenderer {
/**
* {@inheritDoc}
*/
@Override
public void end() throws IOException {
}
}

@ -3,16 +3,11 @@
*/
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.util.datasource.DataSource;
/**
* Abstract base class for {@link Renderer} implementations.
*/
@ -23,10 +18,9 @@ public abstract class AbstractRenderer implements Renderer {
protected Map<String, String> propertyDefinitions = new LinkedHashMap<String, String>();
protected Properties properties;
protected boolean showSuppressedViolations = true;
private Writer writer;
private Report mainReport;
protected Writer writer;
public AbstractRenderer(String name, String description, java.util.Properties properties) {
public AbstractRenderer(String name, String description, Properties properties) {
this.name = name;
this.description = description;
this.properties = properties;
@ -90,19 +84,6 @@ public abstract class AbstractRenderer implements Renderer {
this.showSuppressedViolations = showSuppressedViolations;
}
/**
* {@inheritDoc}
*/
public String render(Report report) {
StringWriter w = new StringWriter();
try {
render(w, report);
} catch (IOException e) {
throw new Error("StringWriter doesn't throw IOException", e);
}
return w.toString();
}
/**
* {@inheritDoc}
*/
@ -116,37 +97,4 @@ public abstract class AbstractRenderer implements Renderer {
public Writer getWriter() {
return writer;
}
/**
* {@inheritDoc}
*/
public void start() throws IOException {
// default (and backward compatible) behavior is to build a full report.
// Optimized rendering is done in AbstractIncrementalRenderer and descendants
mainReport = new Report();
}
/**
* {@inheritDoc}
*/
public void startFileAnalysis(DataSource dataSource) {
}
/**
* {@inheritDoc}
*/
public void renderFileReport(Report report) throws IOException {
// default (and backward compatible) behavior is to build a full report.
// Optimized rendering is done in AbstractIncrementalRenderer and descendants
mainReport.merge(report);
}
/**
* {@inheritDoc}
*/
public void end() throws IOException {
// default (and backward compatible) behavior is to build a full report.
// Optimized rendering is done in AbstractIncrementalRenderer and descendants
render(writer, mainReport);
}
}

@ -15,7 +15,7 @@ import net.sourceforge.pmd.util.StringUtil;
/**
* Renderer to comma separated format.
*/
public class CSVRenderer extends AbstractIncrementalRenderer {
public class CSVRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "csv";

@ -13,7 +13,7 @@ import net.sourceforge.pmd.RuleViolation;
/**
* Renderer to GNU Emacs parsable format.
*/
public class EmacsRenderer extends AbstractIncrementalRenderer {
public class EmacsRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "emacs";

@ -17,7 +17,7 @@ import net.sourceforge.pmd.util.StringUtil;
/**
* Renderer to basic HTML format.
*/
public class HTMLRenderer extends AbstractIncrementalRenderer {
public class HTMLRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "html";

@ -17,7 +17,7 @@ import net.sourceforge.pmd.RuleViolation;
/**
* Renderer for IntelliJ IDEA integration.
*/
public class IDEAJRenderer extends AbstractIncrementalRenderer {
public class IDEAJRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "ideaj";

@ -76,29 +76,6 @@ public interface Renderer {
*/
void setShowSuppressedViolations(boolean showSuppressedViolations);
/**
*
* @deprecated This method consumes too much memory.
* Use the render method with the Writer argument instead.
*
* @param report Report
* @return String
*/
// TODO Remove this
String render(Report report);
/**
*
* @deprecated This method consumes too much memory.
* Use the start, renderFileReport and end methods instead.
*
* @param writer Writer
* @param report Report
* @throws IOException
*/
// TODO Remove this
void render(Writer writer, Report report) throws IOException;
/**
* Get the Writer for the Renderer.
* @return The Writer.

@ -4,17 +4,15 @@
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import java.util.Properties;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.Report;
/**
* Renderer to a summarized HTML format.
*/
public class SummaryHTMLRenderer extends AbstractRenderer {
public class SummaryHTMLRenderer extends AbstractAccumulatingRenderer {
public static final String NAME = "summaryhtml";
@ -32,9 +30,10 @@ public class SummaryHTMLRenderer extends AbstractRenderer {
/**
* {@inheritDoc}
*/
public void render(Writer writer, Report report) throws IOException {
@Override
public void end() throws IOException {
writer.write("<html><head><title>PMD</title></head><body>" + PMD.EOL);
renderSummary(writer, report);
renderSummary();
writer.write("<h2><center>Detail</h2></center>");
writer.write("<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\"><tr>" + PMD.EOL);
new HTMLRenderer(properties).renderBody(writer, report);
@ -44,11 +43,9 @@ public class SummaryHTMLRenderer extends AbstractRenderer {
/**
* Write a Summary HTML table.
*
* @param writer Writer to write to.
* @param report Report to write.
* @throws IOException
*/
public void renderSummary(Writer writer, Report report) throws IOException {
public void renderSummary() throws IOException {
StringBuffer buf = new StringBuffer(500);
buf.append("<h2><center>Summary</h2></center>");
buf.append("<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\">");

@ -9,7 +9,6 @@ import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
@ -48,7 +47,7 @@ import net.sourceforge.pmd.RuleViolation;
* colorization is atm only supported under *nix terminals accepting ansi escape
* sequences, such as xterm, rxvt et cetera.</p>
*/
public class TextColorRenderer extends AbstractRenderer {
public class TextColorRenderer extends AbstractAccumulatingRenderer {
public static final String NAME = "textcolor";
@ -97,7 +96,8 @@ public class TextColorRenderer extends AbstractRenderer {
/**
* {@inheritDoc}
*/
public void render(Writer writer, Report report) throws IOException {
@Override
public void end() throws IOException {
StringBuffer buf = new StringBuffer(500);
buf.append(PMD.EOL);
initializeColorsIfSupported();

@ -26,7 +26,7 @@ import net.sourceforge.pmd.RuleViolation;
*
* @author Jeff Epstein, based upon <a href="EmacsRenderer.html">EmacsRenderer</a>, Tuesday, September 23, 2003
*/
public class TextPadRenderer extends AbstractIncrementalRenderer {
public class TextPadRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "textpad";

@ -15,12 +15,10 @@ import net.sourceforge.pmd.RuleViolation;
/**
* Renderer to simple text format.
*/
public class TextRenderer extends AbstractIncrementalRenderer {
public class TextRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "text";
private boolean empty;
public TextRenderer(Properties properties) {
super(NAME, "Text format.", properties);
}
@ -30,7 +28,6 @@ public class TextRenderer extends AbstractIncrementalRenderer {
*/
@Override
public void start() throws IOException {
empty = true;
}
/**
@ -41,7 +38,6 @@ public class TextRenderer extends AbstractIncrementalRenderer {
Writer writer = getWriter();
StringBuffer buf = new StringBuffer();
empty = !violations.hasNext();
while (violations.hasNext()) {
buf.setLength(0);
RuleViolation rv = violations.next();
@ -60,7 +56,6 @@ public class TextRenderer extends AbstractIncrementalRenderer {
Writer writer = getWriter();
StringBuffer buf = new StringBuffer(500);
if (!errors.isEmpty()) {
empty = false;
for (Report.ProcessingError error : errors) {
buf.setLength(0);

@ -16,7 +16,7 @@ import net.sourceforge.pmd.RuleViolation;
* Renderer to another HTML format.
* @author Vladimir
*/
public class VBHTMLRenderer extends AbstractIncrementalRenderer {
public class VBHTMLRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "vbhtml";

@ -18,7 +18,7 @@ import net.sourceforge.pmd.util.StringUtil;
/**
* Renderer to XML format.
*/
public class XMLRenderer extends AbstractIncrementalRenderer {
public class XMLRenderer extends AbstractIncrementingRenderer {
public static final String NAME = "xml";

@ -4,17 +4,15 @@
package net.sourceforge.pmd.renderers;
import java.io.IOException;
import java.io.Writer;
import java.util.Properties;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.lang.dfa.report.ReportHTMLPrintVisitor;
import net.sourceforge.pmd.lang.dfa.report.ReportTree;
/**
* Renderer to another HTML format.
*/
public class YAHTMLRenderer extends AbstractRenderer {
public class YAHTMLRenderer extends AbstractAccumulatingRenderer {
public static final String NAME = "yahtml";
@ -33,7 +31,8 @@ public class YAHTMLRenderer extends AbstractRenderer {
/**
* {@inheritDoc}
*/
public void render(Writer writer, Report report) throws IOException {
@Override
public void end() throws IOException {
ReportTree tree = report.getViolationTree();
tree.getRootNode().accept(new ReportHTMLPrintVisitor(outputDir == null ? ".." : outputDir));
writer.write("<h3 align=\"center\">The HTML files are located "