1 package net.jaekl.cfb.analyze;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.PrintWriter;
8 import net.jaekl.cfb.CfbBundle;
9 import net.jaekl.cfb.store.Location;
10 import net.jaekl.cfb.xml.BugInstance;
11 import net.jaekl.cfb.xml.messages.BugPattern;
12 import net.jaekl.cfb.xml.messages.MessageCollection;
14 public class HtmlReport {
16 MessageCollection m_msgColl;
18 public HtmlReport(CfbBundle bundle, MessageCollection msgColl)
24 public void write(File output, Delta delta) throws IOException
26 try ( FileOutputStream fos = new FileOutputStream(output);
27 PrintWriter pw = new PrintWriter(fos); )
33 void write(PrintWriter pw, Delta delta)
38 void startPage(PrintWriter pw, Delta delta)
40 writeHeader(pw, delta);
41 pw.println(" <BODY>");
43 pw.println(" </BODY>");
44 pw.println("</HTML>");
47 String trans(String key, Object... arguments) {
48 return m_bundle.get(key, arguments);
51 void writeBody(PrintWriter pw, Delta delta)
53 writeSummary(pw, delta);
54 writeBugs(pw, CfbBundle.NEW_BUGS, delta.getNew());
55 writeBugs(pw, CfbBundle.FIXED_BUGS, delta.getFixed());
56 writeBugs(pw, CfbBundle.OLD_BUGS, delta.getCommon());
59 void writeBugLocations(PrintWriter pw, BugInstance bug)
61 for (Location loc : bug.getLocations()) {
62 StringBuffer sb = new StringBuffer();
65 if (null != loc.getClassName()) {
66 sb.append(loc.getClassName());
68 if ((null != loc.getMethodName()) && (loc.getMethodName().length() > 0)) {
69 sb.append(".").append(loc.getMethodName()).append("()");
71 int start = loc.getStart();
72 int end = loc.getEnd();
74 sb.append(":").append("" + start);
75 if ((end > 0) && (end > start)) {
76 sb.append("-").append("" + end);
80 if (null != loc.getMethodRole()) {
81 sb.append(" (" + loc.getMethodRole() + ")");
86 pw.write(" <TD COLSPAN=\"2\" CLASS=\"Loc\">" + sb.toString() + "</TD>");
91 void writeBugs(PrintWriter pw, String key, BugInstance[] bugs)
93 if (null == bugs || bugs.length < 1) {
97 writeSectionHeading(pw, trans(key));
99 for (BugInstance bug : bugs) {
100 BugPattern pattern = m_msgColl.getPattern(bug.getType());
103 pw.write(" <TABLE CLASS=\"bug\">");
105 pw.write(" <TD WIDTH=\"20%\">" + bug.getCategory() + "</TD>");
106 pw.write(" <TD>" + bug.getType() + "</TD>");
108 writeBugLocations(pw, bug);
110 pw.write(" <TD COLSPAN=\"2\">" + pattern.getShort() + "</TD>");
113 pw.write(" <TD COLSPAN=\"2\">" + pattern.getDetails() + "</TD>");
115 pw.write(" </TABLE>");
120 void writeHeader(PrintWriter pw, Delta delta)
122 String title = trans(CfbBundle.CFB_REPORT);
124 pw.println("<HTML>");
125 pw.println(" <HEAD>");
126 pw.println(" <META CHARSET=\"UTF-8\"/>");
127 pw.println(" <TITLE>" + title + "</TITLE>");
129 pw.println(" </HEAD>");
132 void writeSectionHeading(PrintWriter pw, String heading)
134 pw.println(" <P CLASS=\"SectionHead\">");
135 pw.println(" <TABLE WIDTH=\"100%\"><TR><TD>" + heading + "</TD></TR></TABLE>");
139 void writeSummary(PrintWriter pw, Delta delta)
141 final String SEP = ": ";
143 writeSectionHeading(pw, trans(CfbBundle.CFB_REPORT));
145 pw.println(" <TABLE>");
147 pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.NEW_VERSION) + SEP + "</TD>");
148 pw.println(" <TD CLASS=\"CategoryValue\">" + delta.getLater().constructVersionText(m_bundle) + "</TD>");
149 pw.println(" </TR>");
151 pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.OLD_VERSION) + SEP + "</TD>");
152 pw.println(" <TD CLASS=\"CategoryValue\">" + delta.getEarlier().constructVersionText(m_bundle) + "</TD>");
153 pw.println(" </TR>");
154 pw.println(" <TR><TD> </TD></TR>");
156 pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.NEW_BUGS) + SEP + "</TD>");
157 pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, delta.getNumNew()) + "</TD>");
158 pw.println(" </TR>");
160 pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.FIXED_BUGS) + SEP + "</TD>");
161 pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, delta.getNumFixed()) + "</TD>");
162 pw.println(" </TR>");
164 pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.OLD_BUGS) + SEP + "</TD>");
165 pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS_OLD, delta.getNumCommon()) + "</TD>");
166 pw.println(" </TR>");
167 pw.println(" </TABLE>");
171 void writeStyle(PrintWriter pw)
173 pw.println(" <STYLE>");
174 pw.println(" body { background-color: #F0F0FF; }");
175 pw.println(" .CategoryName { text-align: right; }");
176 pw.println(" .CategoryValue { text-align: left; }");
177 pw.println(" .Loc { font-family: monospace; }");
178 pw.println(" .SectionHead td { background-color: #0000FF; color: #FFFFFF; font-size: 1.25em; font-weight: bold; }");
179 pw.println(" </STYLE>");