import net.jaekl.cfb.CfbBundle;
import net.jaekl.cfb.store.Location;
import net.jaekl.cfb.util.Command;
+import net.jaekl.cfb.util.XmlEscape;
import net.jaekl.cfb.xml.BugInstance;
+import net.jaekl.cfb.xml.Variable;
import net.jaekl.cfb.xml.messages.BugPattern;
import net.jaekl.cfb.xml.messages.MessageCollection;
public class HtmlReport {
+ private static final String NBSP = " "; // " " isn't valid XML, but " " is.
+
CfbBundle m_bundle;
Delta m_delta;
MessageCollection m_msgColl;
}
}
- pw.write(" <TR>");
- pw.write(" <TD COLSPAN=\"2\" CLASS=\"Loc\">" + sb.toString() + "</TD>");
- pw.write(" </TR>");
+ String displayText = XmlEscape.toEscaped(sb.toString());
+
+ pw.println(" <TR><TD COLSPAN=\"2\" CLASS=\"Loc\">" + displayText + "</TD></TR>");
}
}
for (BugInstance bug : bugs) {
BugPattern pattern = m_msgColl.getPattern(bug.getType());
- pw.write(" <P>");
- pw.write(" <TABLE CLASS=\"bug\">");
- pw.write(" <TR>");
- pw.write(" <TD WIDTH=\"20%\">" + bug.getCategory() + "</TD>");
- pw.write(" <TD>" + bug.getType() + "</TD>");
- pw.write(" </TR>");
+ pw.println(" <P>");
+ pw.println(" <TABLE CLASS=\"Bug\">");
+ pw.println(" <TR>");
+ pw.println(" <TD WIDTH=\"20%\">" + bug.getCategory() + "</TD>");
+ pw.println(" <TD>" + bug.getType() + "</TD>");
+ pw.println(" </TR>");
writeBugLocations(pw, bug);
- pw.write(" <TR>");
- pw.write(" <TD COLSPAN=\"2\">" + pattern.getShort() + "</TD>");
- pw.write(" </TR>");
- pw.write(" <TR>");
- pw.write(" <TD COLSPAN=\"2\">" + pattern.getDetails() + "</TD>");
- pw.write(" </TR>");
- pw.write(" </TABLE>");
- pw.write(" </P>");
+ writeBugVariables(pw, bug);
+ pw.println(" <TR><TD COLSPAN=\"2\"><B>" + pattern.getShort() + "</B></TD></TR>");
+ pw.println(" <TR>");
+ pw.println(" <TD COLSPAN=\"2\">" + pattern.getDetails() + "</TD>");
+ pw.println(" </TR>");
+ pw.println(" </TABLE>");
+ pw.println(" </P>");
+ pw.println(" <HR/>");
+ }
+ }
+
+ void writeBugVariables(PrintWriter pw, BugInstance bug)
+ {
+ for (Variable var : bug.getVariables()) {
+ StringBuffer sb = new StringBuffer();
+
+ if (null != var) {
+ sb.append(var.getDescription() + "<BR/>");
+ }
+
+ pw.println(" <TR><TD COLSPAN=\"2\" CLASS=\"Var\">" + sb.toString() + "</TD></TR>");
}
}
void writeSummary(PrintWriter pw)
{
- final String SEP = ": ";
+ final String SEP = ":" + NBSP + NBSP;
+
+ String earlierVersion = "";
+ if (null != m_delta.getEarlier()) {
+ earlierVersion = m_delta.getEarlier().constructVersionText(m_bundle);
+ }
writeSectionHeading(pw, trans(CfbBundle.CFB_REPORT));
pw.println(" <P>");
pw.println(" </TR>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.OLD_VERSION) + SEP + "</TD>");
- pw.println(" <TD CLASS=\"CategoryValue\">" + m_delta.getEarlier().constructVersionText(m_bundle) + "</TD>");
+ pw.println(" <TD CLASS=\"CategoryValue\">" + earlierVersion + "</TD>");
pw.println(" </TR>");
- pw.println(" <TR><TD> </TD></TR>");
+ pw.println(" <TR><TD>" + NBSP + "</TD></TR>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.NEW_BUGS) + SEP + "</TD>");
pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, m_delta.getNumNew()) + "</TD>");
pw.println(" .CategoryValue { text-align: left; }");
pw.println(" .Loc { font-family: monospace; }");
pw.println(" .SectionHead td { background-color: #0000FF; color: #FFFFFF; font-size: 1.25em; font-weight: bold; }");
+ pw.println(" .Var { font-family: monospace; }");
pw.println(" </STYLE>");
}
}