• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pmd / pmd / 415

27 Feb 2026 12:39PM UTC coverage: 79.038% (+0.03%) from 79.004%
415

push

github

adangel
[release] Prepare next development version

18604 of 24437 branches covered (76.13%)

Branch coverage included in aggregate %.

40598 of 50466 relevant lines covered (80.45%)

0.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.18
/pmd-core/src/main/java/net/sourceforge/pmd/renderers/VBHTMLRenderer.java
1
/*
2
 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3
 */
4

5
package net.sourceforge.pmd.renderers;
6

7
import java.io.IOException;
8
import java.util.Iterator;
9

10
import org.apache.commons.lang3.StringEscapeUtils;
11

12
import net.sourceforge.pmd.reporting.Report;
13
import net.sourceforge.pmd.reporting.RuleViolation;
14

15
/**
16
 * Renderer to another HTML format.
17
 *
18
 * @author Vladimir
19
 */
20
public class VBHTMLRenderer extends AbstractIncrementingRenderer {
21

22
    public static final String NAME = "vbhtml";
23

24
    public VBHTMLRenderer() {
25
        super(NAME, "Vladimir Bossicard HTML format.");
1✔
26
    }
1✔
27

28
    @Override
29
    public String defaultFileExtension() {
30
        return "vb.html";
×
31
    }
32

33
    private static String escape(String s) {
34
        return StringEscapeUtils.escapeHtml4(s);
1✔
35
    }
36

37
    @Override
38
    public void start() throws IOException {
39
        getWriter().write(header());
1✔
40
    }
1✔
41

42
    @Override
43
    public void renderFileViolations(Iterator<RuleViolation> violations) throws IOException {
44
        if (!violations.hasNext()) {
1!
45
            return;
×
46
        }
47

48
        StringBuilder sb = new StringBuilder(500);
1✔
49
        String filename = null;
1✔
50
        String lineSep = System.lineSeparator();
1✔
51

52
        boolean colorize = false;
1✔
53
        while (violations.hasNext()) {
1✔
54
            sb.setLength(0);
1✔
55
            RuleViolation rv = violations.next();
1✔
56
            String nextFilename = determineFileName(rv.getFileId());
1✔
57
            if (!nextFilename.equals(filename)) { // New File
1✔
58
                if (filename != null) {
1!
59
                    sb.append("</table></br>");
×
60
                    colorize = false;
×
61
                }
62
                filename = nextFilename;
1✔
63
                sb.append("<table border=\"0\" width=\"80%\">");
1✔
64
                sb.append("<tr id=TableHeader><td colspan=\"2\"><font class=title>&nbsp;").append(escape(filename))
1✔
65
                        .append("</font></tr>");
1✔
66
                sb.append(lineSep);
1✔
67
            }
68

69
            if (colorize) {
1✔
70
                sb.append("<tr id=RowColor1>");
1✔
71
            } else {
72
                sb.append("<tr id=RowColor2>");
1✔
73
            }
74

75
            colorize = !colorize;
1✔
76
            sb.append("<td width=\"50\" align=\"right\"><font class=body>").append(rv.getBeginLine()).append("&nbsp;&nbsp;&nbsp;</font></td>");
1✔
77
            sb.append("<td><font class=body>").append(escape(rv.getDescription())).append("</font></td>");
1✔
78
            sb.append("</tr>");
1✔
79
            sb.append(lineSep);
1✔
80
            writer.write(sb.toString());
1✔
81
        }
1✔
82
        if (filename != null) {
1!
83
            writer.write("</table>");
1✔
84
        }
85
    }
1✔
86

87
    @Override
88
    public void end() throws IOException {
89
        StringBuilder sb = new StringBuilder();
1✔
90

91
        writer.write("<br>");
1✔
92

93
        // output the problems
94
        if (!errors.isEmpty()) {
1✔
95
            sb.setLength(0);
1✔
96
            sb.append("<table border=\"0\" width=\"80%\">");
1✔
97
            sb.append("<tr id=TableHeader><td colspan=\"2\"><font class=title>&nbsp;Problems found</font></td></tr>");
1✔
98
            boolean colorize = false;
1✔
99
            for (Report.ProcessingError error : errors) {
1✔
100
                if (colorize) {
1!
101
                    sb.append("<tr id=RowColor1>");
×
102
                } else {
103
                    sb.append("<tr id=RowColor2>");
1✔
104
                }
105
                colorize = !colorize;
1!
106
                sb.append("<td><font class=body>").append(escape(determineFileName(error.getFileId()))).append("</font></td>");
1✔
107
                sb.append("<td><font class=body><pre>").append(escape(error.getDetail())).append("</pre></font></td></tr>");
1✔
108
            }
1✔
109
            sb.append("</table>");
1✔
110
            writer.write(sb.toString());
1✔
111
        }
112

113
        if (!configErrors.isEmpty()) {
1✔
114
            sb.setLength(0);
1✔
115
            sb.append("<table border=\"0\" width=\"80%\">");
1✔
116
            sb.append("<tr id=TableHeader><td colspan=\"2\"><font class=title>&nbsp;Configuration problems found</font></td></tr>");
1✔
117
            boolean colorize = false;
1✔
118
            for (Report.ConfigurationError error : configErrors) {
1✔
119
                if (colorize) {
1!
120
                    sb.append("<tr id=RowColor1>");
×
121
                } else {
122
                    sb.append("<tr id=RowColor2>");
1✔
123
                }
124
                colorize = !colorize;
1!
125
                sb.append("<td><font class=body>").append(escape(error.rule().getName())).append("</font></td>");
1✔
126
                sb.append("<td><font class=body>").append(escape(error.issue())).append("</font></td></tr>");
1✔
127
            }
1✔
128
            sb.append("</table>");
1✔
129
            writer.write(sb.toString());
1✔
130
        }
131

132
        writer.write(footer());
1✔
133
    }
1✔
134

135
    private String header() {
136
        return "<html><head><title>PMD</title></head>"
1✔
137
            + "<style type=\"text/css\">" + "<!--" + System.lineSeparator()
1✔
138
            + "body { background-color: white; font-family:verdana, arial, helvetica, geneva; font-size: 16px; font-style: italic; color: black; }"
139
            + System.lineSeparator()
1✔
140
            + ".title { font-family: verdana, arial, helvetica,geneva; font-size: 12px; font-weight:bold; color: white; }"
141
            + System.lineSeparator()
1✔
142
            + ".body { font-family: verdana, arial, helvetica, geneva; font-size: 12px; font-weight:plain; color: black; }"
143
            + System.lineSeparator() + "#TableHeader { background-color: #003366; }" + System.lineSeparator()
1✔
144
            + "#RowColor1 { background-color: #eeeeee; }" + System.lineSeparator()
1✔
145
            + "#RowColor2 { background-color: white; }" + System.lineSeparator() + "-->" + "</style>"
1✔
146
            + "<body><center>";
147
    }
148

149
    private String footer() {
150
        return "</center></body></html>" + System.lineSeparator();
1✔
151
    }
152

153
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc