/** * 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.Iterator; import java.util.LinkedList; import java.util.List; 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 * output incrementally for {@link RuleViolation}s as source files are * processed. Such {@link Renderer}s are able to produce large reports with * significantly less working memory at any given time. Variations in the * delivery of source file reports are reflected in the output of the * {@link Renderer}, so report output can be different between runs. * * 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 AbstractIncrementingRenderer extends AbstractRenderer { /** * Accumulated processing errors. */ protected List<Report.ProcessingError> errors = new LinkedList<>(); /** * Accumulated suppressed violations. */ protected List<Report.SuppressedViolation> suppressed = new LinkedList<>(); public AbstractIncrementingRenderer(String name, String description) { super(name, description); } /** * {@inheritDoc} */ @Override public void start() throws IOException { } /** * {@inheritDoc} */ @Override public void startFileAnalysis(DataSource dataSource) { } /** * {@inheritDoc} */ @Override public void renderFileReport(Report report) throws IOException { Iterator<RuleViolation> violations = report.iterator(); if (violations.hasNext()) { renderFileViolations(violations); getWriter().flush(); } for (Iterator<Report.ProcessingError> i = report.errors(); i.hasNext();) { errors.add(i.next()); } if (showSuppressedViolations) { suppressed.addAll(report.getSuppressedRuleViolations()); } } /** * Render a series of {@link RuleViolation}s. * * @param violations * The iterator of violations to render. * @throws IOException */ public abstract void renderFileViolations(Iterator<RuleViolation> violations) throws IOException; /** * {@inheritDoc} */ @Override public void end() throws IOException { } }