Home | History | Annotate | Download | only in xsl
      1 <?xml version="1.0" encoding="UTF-8"?>
      2 
      3 <!--
      4   FindBugs - Find bugs in Java programs
      5   Copyright (C) 2004,2005 University of Maryland
      6   Copyright (C) 2005, Chris Nappin
      7   
      8   This library is free software; you can redistribute it and/or
      9   modify it under the terms of the GNU Lesser General Public
     10   License as published by the Free Software Foundation; either
     11   version 2.1 of the License, or (at your option) any later version.
     12   
     13   This library is distributed in the hope that it will be useful,
     14   but WITHOUT ANY WARRANTY; without even the implied warranty of
     15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16   Lesser General Public License for more details.
     17   
     18   You should have received a copy of the GNU Lesser General Public
     19   License along with this library; if not, write to the Free Software
     20   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21 -->
     22 
     23 <!--
     24   A simple XSLT stylesheet to transform FindBugs XML results
     25   annotated with messages into HTML.
     26 
     27   If you want to experiment with modifying this stylesheet,
     28   or write your own, you need to generate XML output from FindBugs
     29   using a special option which lets it know to include
     30   human-readable messages in the XML.  Invoke the findbugs script
     31   as follows:
     32 
     33     findbugs -textui -xml:withMessages -project myProject.fb > results.xml
     34 
     35   Then you can use your favorite XSLT implementation to transform
     36   the XML output into HTML. (But don't use xsltproc. It generates well-nigh
     37   unreadable output, and generates incorrect output for the
     38   <script> element.)
     39 
     40   Authors:
     41   David Hovemeyer
     42   Chris Nappin (summary table)
     43 -->
     44 
     45 <xsl:stylesheet
     46 	version="1.0"
     47 	xmlns="http://www.w3.org/1999/xhtml"
     48 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     49 
     50 <xsl:output
     51 	method="xml"
     52 	indent="yes"
     53 	omit-xml-declaration="yes"
     54 	standalone="yes"
     55     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
     56 	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
     57 	encoding="UTF-8"/>
     58 
     59 <xsl:variable name="literalNbsp">&amp;nbsp;</xsl:variable>
     60 
     61 <!--xsl:key name="bug-category-key" match="/BugCollection/BugInstance" use="@category"/-->
     62 
     63 <xsl:variable name="bugTableHeader">
     64 	<tr class="tableheader">
     65 		<th align="left">Code</th>
     66 		<th align="left">Warning</th>
     67 	</tr>
     68 </xsl:variable>
     69 
     70 <xsl:template match="/">
     71 	<html>
     72 	<head>
     73 		<title>FindBugs Report</title>
     74 		<style type="text/css">
     75 		.tablerow0 {
     76 			background: #EEEEEE;
     77 		}
     78 
     79 		.tablerow1 {
     80 			background: white;
     81 		}
     82 
     83 		.detailrow0 {
     84 			background: #EEEEEE;
     85 		}
     86 
     87 		.detailrow1 {
     88 			background: white;
     89 		}
     90 
     91 		.tableheader {
     92 			background: #b9b9fe;
     93 			font-size: larger;
     94 		}
     95 
     96 		.tablerow0:hover, .tablerow1:hover {
     97 			background: #aaffaa;
     98 		}
     99 
    100 		.priority-1 {
    101 		    color: red;
    102 		    font-weight: bold;
    103 		}
    104 		.priority-2 {
    105 		    color: orange;
    106 		    font-weight: bold;
    107 		}
    108 		.priority-3 {
    109 		    color: green;
    110 		    font-weight: bold;
    111 		}
    112 		.priority-4 {
    113 		    color: blue;
    114 		    font-weight: bold;
    115 		}
    116 		</style>
    117 		<script type="text/javascript">
    118 			function toggleRow(elid) {
    119 				if (document.getElementById) {
    120 					element = document.getElementById(elid);
    121 					if (element) {
    122 						if (element.style.display == 'none') {
    123 							element.style.display = 'block';
    124 							//window.status = 'Toggle on!';
    125 						} else {
    126 							element.style.display = 'none';
    127 							//window.status = 'Toggle off!';
    128 						}
    129 					}
    130 				}
    131 			}
    132 		</script>
    133 	</head>
    134 
    135 	<xsl:variable name="unique-catkey" select="/BugCollection/BugCategory/@category"/>
    136 	<!--xsl:variable name="unique-catkey" select="/BugCollection/BugInstance[generate-id() = generate-id(key('bug-category-key',@category))]/@category"/-->
    137 
    138 	<body>
    139 
    140 		<h1><a href="http://findbugs.sourceforge.net">FindBugs</a> Report</h1>
    141 
    142 	<h2>Project Information</h2>	
    143 	<xsl:apply-templates select="/BugCollection/Project"/>
    144 
    145 	<h2>Metrics</h2>
    146 	<xsl:apply-templates select="/BugCollection/FindBugsSummary"/>
    147 
    148 	<h2>Contents</h2>
    149 	<ul>
    150 		<xsl:for-each select="$unique-catkey">
    151 			<xsl:sort select="." order="ascending"/>
    152 			<xsl:variable name="catkey" select="."/>
    153 			<xsl:variable name="catdesc" select="/BugCollection/BugCategory[@category=$catkey]/Description"/>
    154 			
    155 			<li><a href="#Warnings_{$catkey}"><xsl:value-of select="$catdesc"/> Warnings</a></li>
    156 		</xsl:for-each>
    157 
    158 		<li><a href="#Details">Details</a></li>
    159 	</ul>
    160 
    161 	<h1>Summary</h1>
    162 	<table width="500" cellpadding="5" cellspacing="2">
    163 	    <tr class="tableheader">
    164 			<th align="left">Warning Type</th>
    165 			<th align="right">Number</th>
    166 		</tr>
    167 
    168 		<xsl:for-each select="$unique-catkey">
    169 			<xsl:sort select="." order="ascending"/>
    170 			<xsl:variable name="catkey" select="."/>
    171 			<xsl:variable name="catdesc" select="/BugCollection/BugCategory[@category=$catkey]/Description"/>
    172 			<xsl:variable name="styleclass">
    173 				<xsl:choose><xsl:when test="position() mod 2 = 1">tablerow0</xsl:when>
    174 					<xsl:otherwise>tablerow1</xsl:otherwise>
    175 				</xsl:choose>
    176 			</xsl:variable>
    177 			
    178 		<tr class="{$styleclass}">
    179 			<td><a href="#Warnings_{$catkey}"><xsl:value-of select="$catdesc"/> Warnings</a></td>
    180 			<td align="right"><xsl:value-of select="count(/BugCollection/BugInstance[(@category=$catkey) and not(@last)])"/></td>
    181 		</tr>
    182 		</xsl:for-each>
    183 
    184 		<xsl:variable name="styleclass">
    185 			<xsl:choose><xsl:when test="count($unique-catkey) mod 2 = 0">tablerow0</xsl:when>
    186 				<xsl:otherwise>tablerow1</xsl:otherwise>
    187 			</xsl:choose>
    188 		</xsl:variable>
    189 		<tr class="{$styleclass}">
    190 		    <td><b>Total</b></td>
    191 		    <td align="right"><b><xsl:value-of select="count(/BugCollection/BugInstance[not(@last)])"/></b></td>
    192 		</tr>
    193 	</table>
    194 
    195 	<h1>Warnings</h1>
    196 
    197 	<p>Click on a warning row to see full context information.</p>
    198 
    199 	<xsl:for-each select="$unique-catkey">
    200 		<xsl:sort select="." order="ascending"/>
    201 		<xsl:variable name="catkey" select="."/>
    202 		<xsl:variable name="catdesc" select="/BugCollection/BugCategory[@category=$catkey]/Description"/>
    203 			
    204 		<xsl:call-template name="generateWarningTable">
    205 			<xsl:with-param name="warningSet" select="/BugCollection/BugInstance[(@category=$catkey) and not(@last)]"/>
    206 			<xsl:with-param name="sectionTitle"><xsl:value-of select="$catdesc"/> Warnings</xsl:with-param>
    207 			<xsl:with-param name="sectionId">Warnings_<xsl:value-of select="$catkey"/></xsl:with-param>
    208 		</xsl:call-template>
    209 	</xsl:for-each>
    210 
    211 	<h1><a name="Details">Details</a></h1>
    212 
    213 	<xsl:apply-templates select="/BugCollection/BugPattern">
    214 		<xsl:sort select="@abbrev"/>
    215 		<xsl:sort select="ShortDescription"/>
    216 	</xsl:apply-templates>
    217 
    218 	</body>
    219 	</html>
    220 </xsl:template>
    221 
    222 <xsl:template match="Project">
    223 	<p>Project: 
    224 		<xsl:choose>
    225 			<xsl:when test='string-length(/BugCollection/Project/@projectName)>0'><xsl:value-of select="/BugCollection/Project/@projectName" /></xsl:when>
    226 			<xsl:otherwise><xsl:value-of select="/BugCollection/Project/@filename" /></xsl:otherwise>
    227 		</xsl:choose>
    228 	</p>
    229 	<p>FindBugs version: <xsl:value-of select="/BugCollection/@version"/></p>
    230 	
    231 	<p>Code analyzed:</p>
    232 	<ul>
    233 		<xsl:for-each select="./Jar">
    234 			<li><xsl:value-of select="text()"/></li>
    235 		</xsl:for-each>
    236 	</ul>
    237 	<p><br/><br/></p>
    238 </xsl:template>
    239 
    240 <xsl:template match="BugInstance[not(@last)]">
    241 	<xsl:variable name="warningId"><xsl:value-of select="generate-id()"/></xsl:variable>
    242 
    243 	<tr class="tablerow{position() mod 2}" onclick="toggleRow('{$warningId}');">
    244 
    245 	<td>
    246 	    <span><xsl:attribute name="class">priority-<xsl:value-of select="@priority"/></xsl:attribute>
    247 	        <xsl:value-of select="@abbrev"/>
    248         </span>
    249 	</td>
    250 
    251 	<td>
    252 	<xsl:value-of select="LongMessage"/>
    253 	</td>
    254 
    255 	</tr>
    256 
    257 	<!-- Add bug annotation elements: Class, Method, Field, SourceLine, Field -->
    258 	<tr class="detailrow{position() mod 2}">
    259 		<td/>
    260 		<td>
    261 			<p id="{$warningId}" style="display: none;">
    262 				<a href="#{@type}">Bug type <xsl:value-of select="@type"/> (click for details)</a>
    263 				<xsl:for-each select="./*/Message">
    264 					<br/><xsl:value-of select="text()" disable-output-escaping="no"/>
    265 				</xsl:for-each>
    266 			</p>
    267 		</td>
    268 	</tr>
    269 </xsl:template>
    270 
    271 <xsl:template match="BugPattern">
    272 	<h2><a name="{@type}"><xsl:value-of select="@type"/>: <xsl:value-of select="ShortDescription"/></a></h2>
    273 	<xsl:value-of select="Details" disable-output-escaping="yes"/>
    274 </xsl:template>
    275 
    276 <xsl:template name="generateWarningTable">
    277 	<xsl:param name="warningSet"/>
    278 	<xsl:param name="sectionTitle"/>
    279 	<xsl:param name="sectionId"/>
    280 
    281 	<h2><a name="{$sectionId}"><xsl:value-of select="$sectionTitle"/></a></h2>
    282 	<table class="warningtable" width="100%" cellspacing="0">
    283 		<xsl:copy-of select="$bugTableHeader"/>
    284 		<xsl:apply-templates select="$warningSet">
    285 			<xsl:sort select="@abbrev"/>
    286 			<xsl:sort select="Class/@classname"/>
    287 		</xsl:apply-templates>
    288 	</table>
    289 </xsl:template>
    290 
    291 <xsl:template match="FindBugsSummary">
    292     <xsl:variable name="kloc" select="@total_size div 1000.0"/>
    293     <xsl:variable name="format" select="'#######0.00'"/>
    294 
    295 	<p><xsl:value-of select="@total_size"/> lines of code analyzed,
    296 	in <xsl:value-of select="@total_classes"/> classes, 
    297 	in <xsl:value-of select="@num_packages"/> packages.</p>
    298 	<table width="500" cellpadding="5" cellspacing="2">
    299 	    <tr class="tableheader">
    300 			<th align="left">Metric</th>
    301 			<th align="right">Total</th>
    302 			<th align="right">Density*</th>
    303 		</tr>
    304 		<tr class="tablerow0">
    305 			<td>High Priority Warnings</td>
    306 			<td align="right"><xsl:value-of select="@priority_1"/></td>
    307 			<td align="right">
    308 			    <xsl:choose>
    309                     <xsl:when test= "number($kloc) &gt; 0.0 and number(@priority_1) &gt; 0.0">
    310         			    <xsl:value-of select="format-number(@priority_1 div $kloc, $format)"/>
    311                     </xsl:when>
    312                     <xsl:otherwise>
    313         			    <xsl:value-of select="format-number(0.0, $format)"/>
    314                     </xsl:otherwise>
    315 			    </xsl:choose>
    316 			</td>
    317 		</tr>
    318 		<tr class="tablerow1">
    319 			<td>Medium Priority Warnings</td>
    320 			<td align="right"><xsl:value-of select="@priority_2"/></td>
    321 			<td align="right">
    322 			    <xsl:choose>
    323                     <xsl:when test= "number($kloc) &gt; 0.0 and number(@priority_2) &gt; 0.0">
    324         			    <xsl:value-of select="format-number(@priority_2 div $kloc, $format)"/>
    325                     </xsl:when>
    326                     <xsl:otherwise>
    327         			    <xsl:value-of select="format-number(0.0, $format)"/>
    328                     </xsl:otherwise>
    329 			    </xsl:choose>
    330 			</td>
    331 		</tr>
    332 
    333     <xsl:choose>
    334 		<xsl:when test="@priority_3">
    335 			<tr class="tablerow1">
    336 				<td>Low Priority Warnings</td>
    337 				<td align="right"><xsl:value-of select="@priority_3"/></td>
    338 				<td align="right">
    339                     <xsl:choose>
    340                         <xsl:when test= "number($kloc) &gt; 0.0 and number(@priority_3) &gt; 0.0">
    341         			        <xsl:value-of select="format-number(@priority_3 div $kloc, $format)"/>
    342                         </xsl:when>
    343                         <xsl:otherwise>
    344         		            <xsl:value-of select="format-number(0.0, $format)"/>
    345                         </xsl:otherwise>
    346 			        </xsl:choose>
    347 				</td>
    348 			</tr>
    349 			<xsl:variable name="totalClass" select="tablerow0"/>
    350 		</xsl:when>
    351 		<xsl:otherwise>
    352 		    <xsl:variable name="totalClass" select="tablerow1"/>
    353 		</xsl:otherwise>
    354 	</xsl:choose>
    355 
    356 		<tr class="$totalClass">
    357 			<td><b>Total Warnings</b></td>
    358 			<td align="right"><b><xsl:value-of select="@total_bugs"/></b></td>
    359             <xsl:choose>
    360                 <xsl:when test="number($kloc) &gt; 0.0">
    361   					<td align="right"><b><xsl:value-of select="format-number(@total_bugs div $kloc, $format)"/></b></td>
    362                 </xsl:when>
    363                 <xsl:otherwise>
    364 					<td align="right"><b><xsl:value-of select="format-number(0.0, $format)"/></b></td>
    365                 </xsl:otherwise>
    366 	        </xsl:choose>
    367 		</tr>
    368 	</table>
    369 	<p><i>(* Defects per Thousand lines of non-commenting source statements)</i></p>
    370 	<p><br/><br/></p>
    371 
    372 </xsl:template>
    373 
    374 </xsl:stylesheet>
    375 
    376 <!-- vim:set ts=4: -->
    377