AbstractIncrementingRenderer xref
1 /**
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.renderers;
5
6 import java.io.IOException;
7 import java.util.Iterator;
8 import java.util.LinkedList;
9 import java.util.List;
10
11 import net.sourceforge.pmd.Report;
12 import net.sourceforge.pmd.RuleViolation;
13 import net.sourceforge.pmd.util.datasource.DataSource;
14
15 /**
16 * Abstract base class for {@link Renderer} implementations which can produce
17 * output incrementally for {@link RuleViolation}s as source files are
18 * processed. Such {@link Renderer}s are able to produce large reports with
19 * significantly less working memory at any given time. Variations in the
20 * delivery of source file reports are reflected in the output of the
21 * {@link Renderer}, so report output can be different between runs.
22 *
23 * Only processing errors and suppressed violations are accumulated across all
24 * files. These are intended to be processed in the {@link #end()} method.
25 */
26 public abstract class AbstractIncrementingRenderer extends AbstractRenderer {
27
28 /**
29 * Accumulated processing errors.
30 */
31 protected List<Report.ProcessingError> errors = new LinkedList<Report.ProcessingError>();
32
33 /**
34 * Accumulated suppressed violations.
35 */
36 protected List<Report.SuppressedViolation> suppressed = new LinkedList<Report.SuppressedViolation>();
37
38 public AbstractIncrementingRenderer(String name, String description) {
39 super(name, description);
40 }
41
42 /**
43 * {@inheritDoc}
44 */
45 public void start() throws IOException {
46 }
47
48 /**
49 * {@inheritDoc}
50 */
51 public void startFileAnalysis(DataSource dataSource) {
52 }
53
54 /**
55 * {@inheritDoc}
56 */
57 public void renderFileReport(Report report) throws IOException {
58 Iterator<RuleViolation> violations = report.iterator();
59 if (violations.hasNext()) {
60 renderFileViolations(violations);
61 getWriter().flush();
62 }
63
64 for (Iterator<Report.ProcessingError> i = report.errors(); i.hasNext();) {
65 errors.add(i.next());
66 }
67
68 if (showSuppressedViolations) {
69 suppressed.addAll(report.getSuppressedRuleViolations());
70 }
71 }
72
73 /**
74 * Render a series of {@link RuleViolation}s.
75 * @param violations The iterator of violations to render.
76 * @throws IOException
77 */
78 public abstract void renderFileViolations(Iterator<RuleViolation> violations) throws IOException;
79
80 /**
81 * {@inheritDoc}
82 */
83 public void end() throws IOException {
84 }
85 }