View Javadoc

    1   package net.sourceforge.pmd.dfa.report;
    2
    3   import net.sourceforge.pmd.PMD;
    4   import net.sourceforge.pmd.RuleViolation;
    5   import net.sourceforge.pmd.IRuleViolation;
    6
    7   import java.io.BufferedWriter;
    8   import java.io.File;
    9   import java.io.FileWriter;
    10  import java.io.IOException;
    11
    12  /***
    13   * @author raik
    14   *         <p/>
    15   *         * Uses the generated result tree instead of the result list. The visitor
    16   *         * traverses the tree and creates several html files. The "package view" file
    17   *         * (index.html) displays an overview of packgages, classes and the number of
    18   *         * rule violations they contain. All the other html files represent a class
    19   *         * and show detailed information about the violations.
    20   */
    21  public class ReportHTMLPrintVisitor extends ReportVisitor {
    22
    23      privateong> StringBuffer packageBuf = new StringBuffer();
    24      private StringBuffer classBuf = new StringBuffer();
    25      private int length;
    26
    27      /***
    28       * Writes the buffer to file.
    29       */
    30      private void write(String filename, StringBuffer buf) throws IOException {
    31          String fs = System.getProperty("file.separator");
    32          String baseDir = ".." + fs; // TODO output destination
    33
    34          BufferedWriter bw = new BufferedWriter(new FileWriter(new File(baseDir + fs + filename)));
    35          bw.write(buf.toString(), 0, buf.length());
    36          bw.close();
    37      }
    38
    39      /***
    40       * Generates a html table with violation information.
    41       */
    42      private String displayRuleViolation(IRuleViolation vio) {
    43          String ret = "<table border=\"0\">";
    44
    45          ret += "<tr><td><b>Rule:</b></td><td>" + vio.getRule().getName() + "</td></tr>";
    46
    47          ret += "<tr><td><b>Description:</b></td><td>" + vio.getDescription() + "</td></tr>";
    48
    49          if (vio.getVariableName().length() > 0) {
    50              ret += "<tr><td><b>Variable:</b></td><td>" + vio.getVariableName() + "</td></tr>";
    51          }
    52
    53          if (vio.getEndLine() > 0) {
    54              ret += "<tr><td><b>Line:</b></td><td>" + vio.getEndLine() + " and " + vio.getBeginLine() + "</td></tr>";
    55          } else {
    56              ret += "<tr><td><b>Line:</b></td><td>" + vio.getBeginLine() + "</td></tr>";
    57          }
    58
    59          ret += "</table>";
    60          return ret;
    61      }
    62
    63      /***
    64       * The visit method (Visitor Pattern). There are 3 types of ReportNodes:
    65       * RuleViolation - contains a RuleViolation, Class - represents a class and
    66       * contains the name of the class, Package - represents a package and
    67       * contains the name(s) of the package.
    68       */
    69      public void visit(AbstractReportNode node) {
    70
    71          /*
    72           * The first node of result tree.
    73           */
    74          if (node.getParent() == null) {
    75              this.packageBuf.insert(0,
    76                      "<html>" +
    77                      " <head>" +
    78                      "   <title>PMD</title>" +
    79                      " </head>" +
    80                      " <body>" + PMD.EOL + "" +
    81                      "<h2>Package View</h2>" +
    82                      "<table border=\"1\" align=\"center\" cellspacing=\"0\" cellpadding=\"3\">" +
    83                      " <tr>" + PMD.EOL + "" +
    84                      "<th>Package</th>" +
    85                      "<th>Class</th>" +
    86                      "<th>#</th>" +
    87                      " </tr>" + PMD.EOL);
    88
    89              thisrong>.length = this.packageBuf.length();
    90          }
    91
    92
    93          super.visit(node);
    94
    95
    96          if (node instanceof ViolationNode) {
    97              ViolationNode vnode = (ViolationNode) node;
    98              vnode.getParent().addNumberOfViolation(1);
    99              IRuleViolation vio = vnode.getRuleViolation();
    100             classBuf.append("<tr>" +
    101                     " <td>" + vio.getMethodName() + "</td>" +
    102                     " <td>" + this.displayRuleViolation(vio) + "</td>" +
    103                     "</tr>");
    104         }
    105         if (node instanceof ClassNode) {
    106             ClassNode cnode = (ClassNode) node;
    107             String str = cnode.getClassName();
    108
    109             classBuf.insert(0,
    110                     "<html><head><title>PMD - " + str + "</title></head><body>" + PMD.EOL + "" +
    111                     "<h2>Class View</h2>" +
    112                     "<h3 align=\"center\">Class: " + str + "</h3>" +
    113                     "<table border=\"\" align=\"center\" cellspacing=\"0\" cellpadding=\"3\">" +
    114                     " <tr>" + PMD.EOL + "" +
    115                     "<th>Method</th>" +
    116                     "<th>Violation</th>" +
    117                     " </tr>" + PMD.EOL);
    118
    119             classBuf.append("</table>" +
    120                     " </body>" +
    121                     "</html>");
    122
    123
    124             try {
    125                 this.write(str + ".html", classBuf);
    126             } catch (Exception e) {
    127                 throw new RuntimeException("Error while writing HTML report: " + e.getMessage());
    128             }
    129             classBuf = new StringBuffer();
    130
    131
    132             this.packageBuf.insert(this.length,
    133                     "<tr>" +
    134                     " <td>-</td>" +
    135                     " <td><a href=\"" + str + ".html\">" + str + "</a></td>" +
    136                     " <td>" + node.getNumberOfViolations() + "</td>" +
    137                     "</tr>" + PMD.EOL);
    138             node.getParent().addNumberOfViolation(node.getNumberOfViolations());
    139         }
    140         if (node instanceof PackageNode) {
    141             PackageNode pnode = (PackageNode) node;
    142             String str;
    143
    144             // rootNode
    145             if (node.getParent() == null) {
    146                 str = "Aggregate";
    147             } else {           // all the other nodes
    148                 str = pnode.getPackageName();
    149                 node.getParent().addNumberOfViolation(node.getNumberOfViolations());
    150             }
    151
    152             this.packageBuf.insert(this.length,
    153                     "<tr><td><b>" + str + "</b></td>" +
    154                     " <td>-</td>" +
    155                     " <td>" + node.getNumberOfViolations() + "</td>" +
    156                     "</tr>" + PMD.EOL);
    157         }
    158         // The first node of result tree.
    159         if (node.getParent() == null) {
    160             this.packageBuf.append("</table> </body></html>");
    161             try {
    162                 this.write("index.html", this.packageBuf);
    163             } catch (Exception e) {
    164                 throw new RuntimeException("Error while writing HTML report: " + e.getMessage());
    165             }
    166         }
    167     }
    168 }