package net.jaekl.cfb.analyze;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
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;
- public HtmlReport(CfbBundle bundle, MessageCollection msgColl)
+ public HtmlReport(CfbBundle bundle, MessageCollection msgColl, Delta delta)
{
m_bundle = bundle;
+ m_delta = delta;
m_msgColl = msgColl;
}
- public void write(File output, Delta delta) throws IOException
+ public Delta getDelta() { return m_delta; }
+
+ public void write(File output) throws IOException
{
- try ( FileOutputStream fos = new FileOutputStream(output);
- PrintWriter pw = new PrintWriter(fos); )
+ try ( PrintWriter pw = new PrintWriter(output, Command.UTF_8) )
{
- write(pw, delta);
+ write(pw);
+ pw.flush();
}
}
- void write(PrintWriter pw, Delta delta)
+ void write(PrintWriter pw)
{
- startPage(pw, delta);
+ startPage(pw);
}
- void startPage(PrintWriter pw, Delta delta)
+ void startPage(PrintWriter pw)
{
- writeHeader(pw, delta);
+ writeHeader(pw);
pw.println(" <BODY>");
- writeBody(pw, delta);
+ writeBody(pw);
pw.println(" </BODY>");
pw.println("</HTML>");
}
return m_bundle.get(key, arguments);
}
- void writeBody(PrintWriter pw, Delta delta)
+ void writeBody(PrintWriter pw)
{
- writeSummary(pw, delta);
- writeBugs(pw, CfbBundle.NEW_BUGS, delta.getNew());
- writeBugs(pw, CfbBundle.FIXED_BUGS, delta.getFixed());
- writeBugs(pw, CfbBundle.OLD_BUGS, delta.getCommon());
+ writeSummary(pw);
+ writeBugs(pw, CfbBundle.NEW_BUGS, m_delta.getNew());
+ writeBugs(pw, CfbBundle.FIXED_BUGS, m_delta.getFixed());
+ writeBugs(pw, CfbBundle.OLD_BUGS, m_delta.getCommon());
}
void writeBugLocations(PrintWriter pw, BugInstance bug)
}
}
- 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 writeHeader(PrintWriter pw, Delta delta)
+ 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 writeHeader(PrintWriter pw)
{
String title = trans(CfbBundle.CFB_REPORT);
pw.println(" </P>");
}
- void writeSummary(PrintWriter pw, Delta delta)
+ 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(" <TABLE>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.NEW_VERSION) + SEP + "</TD>");
- pw.println(" <TD CLASS=\"CategoryValue\">" + delta.getLater().constructVersionText(m_bundle) + "</TD>");
+ pw.println(" <TD CLASS=\"CategoryValue\">" + m_delta.getLater().constructVersionText(m_bundle) + "</TD>");
pw.println(" </TR>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.OLD_VERSION) + SEP + "</TD>");
- pw.println(" <TD CLASS=\"CategoryValue\">" + 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, delta.getNumNew()) + "</TD>");
+ pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, m_delta.getNumNew()) + "</TD>");
pw.println(" </TR>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.FIXED_BUGS) + SEP + "</TD>");
- pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, delta.getNumFixed()) + "</TD>");
+ pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS, m_delta.getNumFixed()) + "</TD>");
pw.println(" </TR>");
pw.println(" <TR>");
pw.println(" <TD CLASS=\"CategoryName\">" + trans(CfbBundle.OLD_BUGS) + SEP + "</TD>");
- pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS_OLD, delta.getNumCommon()) + "</TD>");
+ pw.println(" <TD CLASS=\"CategoryValue\">" + trans(CfbBundle.NUM_BUGS_OLD, m_delta.getNumCommon()) + "</TD>");
pw.println(" </TR>");
pw.println(" </TABLE>");
pw.println(" </P>");
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>");
}
}