adds support for fields as well as local variables.
[cfb.git] / prod / net / jaekl / cfb / analyze / HtmlReport.java
index e2e76cb4bae3b1e2f678fd93046931f81c3000ab..75e39a94c4d09933a63a83a426337a325d0f292d 100644 (file)
@@ -1,17 +1,21 @@
 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;
@@ -27,10 +31,10 @@ public class HtmlReport {
        
        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);
+                       pw.flush();
                }
        }
        
@@ -86,9 +90,9 @@ public class HtmlReport {
                                }
                        }
                        
-                       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>");                                        
                }
        }
        
@@ -103,21 +107,34 @@ public class HtmlReport {
                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>");                                      
                }
        }
        
@@ -142,7 +159,12 @@ public class HtmlReport {
        
        void writeSummary(PrintWriter pw)
        {
-               final String SEP = ":&nbsp;&nbsp;";
+               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>");
@@ -153,9 +175,9 @@ public class HtmlReport {
                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>&nbsp;</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>");
@@ -180,6 +202,7 @@ public class HtmlReport {
            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>");
        }
 }