1<?xml version="1.0" encoding="UTF-8" ?>
2<!--
3  Copyright (C) 2005, 2006 Etienne Giraudy, InStranet Inc
4
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  Lesser General Public License for more details.
14
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18-->
19
20<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
21   <xsl:output
22         method="xml" indent="yes"
23         doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
24         doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
25         encoding="UTF-8"/>
26
27    <!--
28        Parameter for specifying HTMLized sources location; if current dir, use "./"
29        If not passed, no links to sources are generated.
30        because of back-compatibility reasons.
31        The source filename should be package.class.java.html
32        The source can have line no anchors like #11 -->
33    <xsl:param name="htmlsrcpath"></xsl:param>
34
35   <!--xsl:key name="lbc-category-key"    match="/BugCollection/BugInstance" use="@category" /-->
36   <xsl:key name="lbc-code-key"        match="/BugCollection/BugInstance" use="concat(@category,@abbrev)" />
37   <xsl:key name="lbc-bug-key"         match="/BugCollection/BugInstance" use="concat(@category,@abbrev,@type)" />
38   <xsl:key name="lbp-class-b-t"  match="/BugCollection/BugInstance" use="concat(Class/@classname,@type)" />
39
40<xsl:template match="/" >
41
42<html>
43   <head>
44      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
45      <title>
46        FindBugs (<xsl:value-of select="/BugCollection/@version" />)
47         Analysis for
48         <xsl:choose>
49            <xsl:when test='string-length(/BugCollection/Project/@projectName)>0'><xsl:value-of select="/BugCollection/Project/@projectName" /></xsl:when>
50            <xsl:otherwise><xsl:value-of select="/BugCollection/Project/@filename" /></xsl:otherwise>
51         </xsl:choose>
52      </title>
53      <script type="text/javascript">
54         function show(foo) {
55            document.getElementById(foo).style.display="block";
56         }
57         function hide(foo) {
58            document.getElementById(foo).style.display="none";
59         }
60         function toggle(foo) {
61            if( document.getElementById(foo).style.display == "none") {
62               show(foo);
63            } else {
64               if( document.getElementById(foo).style.display == "block") {
65                  hide(foo);
66               } else {
67                  show(foo);
68               }
69            }
70         }
71
72         function showmenu(foo) {
73            if( document.getElementById(foo).style.display == "none") {
74               hide("bug-summary");
75               document.getElementById("bug-summary-tab").className="menu-tab";
76               hide("analysis-data");
77               document.getElementById("analysis-data-tab").className="menu-tab";
78               //hide("list-by-b-t");
79               //document.getElementById("list-by-b-t-tab").className="menu-tab";
80               hide("list-by-package");
81               document.getElementById("list-by-package-tab").className="menu-tab";
82               hide("list-by-category");
83               document.getElementById("list-by-category-tab").className="menu-tab";
84               document.getElementById(foo+"-tab").className="menu-tab-selected";
85               show(foo);
86
87            }
88            // else menu already selected!
89         }
90         function showbug(buguid, list) {
91            var bugplaceholder   = document.getElementById(buguid+'-ph-'+list);
92            var bug              = document.getElementById(buguid);
93
94            if ( bugplaceholder==null) {
95               alert(buguid+'-ph-'+list+' - '+buguid+' - bugplaceholder==null');
96               return;
97            }
98            if ( bug==null) {
99               alert(buguid+'-ph-'+list+' - '+buguid+' - bug==null');
100               return;
101            }
102
103            var oldBug = bugplaceholder.innerHTML;
104            var newBug = bug.innerHTML;
105            //alert(oldBug);
106            //alert(newBug);
107            toggle(buguid+'-ph-'+list);
108            bugplaceholder.innerHTML = newBug;
109         }
110      </script>
111      <script type='text/javascript'><xsl:text disable-output-escaping='yes'>
112     /* <![CDATA[ */
113         // Extended Tooltip Javascript
114         // copyright 9th August 2002, 3rd July 2005
115         // by Stephen Chapman, Felgall Pty Ltd
116
117         // permission is granted to use this javascript provided that the below code is not altered
118         var DH = 0;var an = 0;var al = 0;var ai = 0;if (document.getElementById) {ai = 1; DH = 1;}else {if (document.all) {al = 1; DH = 1;} else { browserVersion = parseInt(navigator.appVersion); if (navigator.appName.indexOf('Netscape') != -1) if (browserVersion == 4) {an = 1; DH = 1;}}}
119         function fd(oi, wS) {if (ai) return wS ? document.getElementById(oi).style:document.getElementById(oi); if (al) return wS ? document.all[oi].style: document.all[oi]; if (an) return document.layers[oi];}
120         function pw() {return window.innerWidth != null? window.innerWidth: document.body.clientWidth != null? document.body.clientWidth:null;}
121         function mouseX(evt) {if (evt.pageX) return evt.pageX; else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft); else return null;}
122         function mouseY(evt) {if (evt.pageY) return evt.pageY; else if (evt.clientY)return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); else return null;}
123         function popUp(evt,oi) {if (DH) {var wp = pw(); ds = fd(oi,1); dm = fd(oi,0); st = ds.visibility; if (dm.offsetWidth) ew = dm.offsetWidth; else if (dm.clip.width) ew = dm.clip.width; if (st == "visible" || st == "show") { ds.visibility = "hidden"; } else {tv = mouseY(evt) + 20; lv = mouseX(evt) - (ew/4); if (lv < 2) lv = 2; else if (lv + ew > wp) lv -= ew/2; if (!an) {lv += 'px';tv += 'px';} ds.left = lv; ds.top = tv; ds.visibility = "visible";}}}
124  /* ]]> */
125</xsl:text></script>
126      <style type='text/css'>
127         html, body {
128            background-color: #ffffff;
129         }
130         a, a:link , a:active, a:visited, a:hover {
131            text-decoration: none; color: black;
132         }
133         .b-r a {
134            text-decoration: underline; color: blue;
135         }
136         div, span {
137            vertical-align: top;
138         }
139         p {
140            margin: 0px;
141         }
142         h1 {
143            /*font-size: 14pt;*/
144            color: red;
145         }
146         #menu {
147            margin-bottom: 10px;
148         }
149         #menu ul {
150            margin-left: 0;
151            padding-left: 0;
152            display: inline;
153         }
154         #menu ul li {
155            margin-left: 0;
156            margin-bottom: 0;
157            padding: 2px 15px 5px;
158            border: 1px solid #000;
159            list-style: none;
160            display: inline;
161         }
162         #menu ul li.here {
163            border-bottom: 1px solid #ffc;
164            list-style: none;
165            display: inline;
166         }
167         .menu-tab {
168            background: white;
169         }
170         .menu-tab:hover {
171            background: grey;
172         }
173         .menu-tab-selected {
174            background: #aaaaaa;
175         }
176         #analysis-data ul {
177            margin-left: 15px;
178         }
179         #analyzed-files, #used-libraries, #analysis-error {
180           margin: 2px;
181           border: 1px black solid;
182           padding: 2px;
183           float: left;
184           overflow:auto;
185         }
186         #analyzed-files {
187           width: 25%;
188         }
189         #used-libraries {
190           width: 25%;
191         }
192         #analysis-error {
193           width: 40%;
194         }
195         div.summary {
196            width:100%;
197            text-align:left;
198         }
199         .summary table {
200            border:1px solid black;
201         }
202         .summary th {
203            background: #aaaaaa;
204            color: white;
205         }
206         .summary th, .summary td {
207            padding: 2px 4px 2px 4px;
208         }
209         .summary-name {
210            background: #eeeeee;
211            text-align:left;
212         }
213         .summary-size {
214            background: #eeeeee;
215            text-align:center;
216         }
217         .summary-ratio {
218            background: #eeeeee;
219            text-align:center;
220         }
221         .summary-priority-all {
222            background: #dddddd;
223            text-align:center;
224         }
225         .summary-priority-1 {
226            background: red;
227            text-align:center;
228         }
229         .summary-priority-2 {
230            background: orange;
231            text-align:center;
232         }
233         .summary-priority-3 {
234            background: green;
235            text-align:center;
236         }
237         .summary-priority-4 {
238            background: blue;
239            text-align:center;
240         }
241         .ob {
242            border: 1px solid black;
243            margin: 10px;
244         }
245         .ob-t {
246            border-bottom: 1px solid #000000; font-size: 12pt; font-weight: bold;
247            background: #cccccc; margin: 0; padding: 0 5px 0 5px;
248         }
249         .t-h {
250            font-weight: normal;
251         }
252         .ib-1, .ib-2 {
253            margin: 0 0 0 10px;
254         }
255         .ib-1-t, .ib-2-t {
256            border-bottom: 1px solid #000000; border-left: 1px solid #000000;
257            margin: 0; padding: 0 5px 0 5px;
258            font-size: 12pt; font-weight: bold; background: #cccccc;
259         }
260         .bb {
261            border-bottom: 1px solid #000000; border-left: 1px solid #000000;
262         }
263         .b-1 {
264            background: red; height: 0.5em; width: 1em;
265            margin-right: 0.5em;
266         }
267         .b-2 {
268            background: orange; height: 0.5em; width: 1em;
269            margin-right: 0.5em;
270         }
271         .b-3 {
272            background: green; height: 0.5em; width: 1em;
273            margin-right: 0.5em;
274         }
275         .b-4 {
276            background: blue; height: 0.5em; width: 1em;
277            margin-right: 0.5em;
278         }
279         .b-t {
280         }
281         .b-r {
282            font-size: 10pt; font-weight: bold; padding: 0 0 0 60px;
283         }
284         .b-d {
285            font-weight: normal; background: #eeeee0;
286            padding: 0 5px 0 5px; margin: 0px;
287         }
288         .bug-placeholder {
289            top:140px;
290            border:1px solid black;
291            display:none;
292         }
293         .tip {
294            border:solid 1px #666666;
295            width:600px;
296            padding:3px;
297            position:absolute;
298            z-index:100;
299            visibility:hidden;
300            color:#333333;
301            top:20px;
302            left:90px;
303            background-color:#ffffcc;
304            layer-background-color:#ffffcc;
305         }
306
307
308      </style>
309   </head>
310   <body>
311   <div id='content'>
312      <h1>
313         FindBugs (<xsl:value-of select="/BugCollection/@version" />)
314         Analysis for
315         <xsl:choose>
316            <xsl:when test='string-length(/BugCollection/Project/@projectName)>0'><xsl:value-of select="/BugCollection/Project/@projectName" /></xsl:when>
317            <xsl:otherwise><xsl:value-of select="/BugCollection/Project/@filename" /></xsl:otherwise>
318         </xsl:choose>
319      </h1>
320      <div id="menu">
321         <ul>
322            <li id='bug-summary-tab' class='menu-tab-selected'>
323               <xsl:attribute name="onclick">showmenu('bug-summary');return false;</xsl:attribute>
324               <a href='' onclick='return false;'>Bug Summary</a>
325            </li>
326            <li id='analysis-data-tab' class='menu-tab'>
327               <xsl:attribute name="onclick">showmenu('analysis-data');return false;</xsl:attribute>
328               <a href='' onclick='return false;'>Analysis Information</a>
329            </li>
330            <li id='list-by-category-tab' class='menu-tab'>
331               <xsl:attribute name="onclick">showmenu('list-by-category');return false;</xsl:attribute>
332               <a href='' onclick='return false;'>List bugs by bug category</a>
333            </li>
334            <li id='list-by-package-tab' class='menu-tab'>
335               <xsl:attribute name="onclick">showmenu('list-by-package');return false;</xsl:attribute>
336               <a href='' onclick='return false;'>List bugs by package</a>
337            </li>
338         </ul>
339      </div>
340      <xsl:call-template name="generateSummary" />
341      <xsl:call-template name="analysis-data" />
342      <xsl:call-template name="list-by-category" />
343      <xsl:call-template name="list-by-package" />
344
345
346      <!-- advanced tooltips -->
347      <xsl:for-each select="/BugCollection/BugPattern">
348         <xsl:variable name="b-t"><xsl:value-of select="@type" /></xsl:variable>
349         <div>
350            <xsl:attribute name="id">tip-<xsl:value-of select="$b-t" /></xsl:attribute>
351            <xsl:attribute name="class">tip</xsl:attribute>
352            <b><xsl:value-of select="@abbrev" /> / <xsl:value-of select="@type" /></b><br/>
353            <xsl:value-of select="/BugCollection/BugPattern[@type=$b-t]/Details" disable-output-escaping="yes" />
354         </div>
355      </xsl:for-each>
356
357      <!-- bug descriptions - hidden -->
358      <xsl:for-each select="/BugCollection/BugInstance[not(@last)]">
359            <div style="display:none;">
360               <xsl:attribute name="id">b-uid-<xsl:value-of select="@instanceHash" />-<xsl:value-of select="@instanceOccurrenceNum" /></xsl:attribute>
361               <xsl:for-each select="*/Message">
362                   <xsl:choose>
363                    <xsl:when test="parent::SourceLine and $htmlsrcpath != '' ">
364                      <div class="b-r"><a>
365                        <xsl:attribute name="href"><xsl:value-of select="$htmlsrcpath"/><xsl:value-of select="../@sourcepath" />.html#<xsl:value-of select="../@start" /></xsl:attribute>
366                        <xsl:apply-templates />
367                      </a></div>
368                    </xsl:when>
369                    <xsl:otherwise>
370                      <div class="b-r"><xsl:apply-templates /></div>
371                    </xsl:otherwise>
372                   </xsl:choose>
373               </xsl:for-each>
374               <div class="b-d">
375                  <xsl:value-of select="LongMessage" disable-output-escaping="no" />
376               </div>
377            </div>
378      </xsl:for-each>
379   </div>
380   <div id='fixedbox'>
381      <div id='bug-placeholder'></div>
382   </div>
383   </body>
384</html>
385</xsl:template>
386
387<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
388<!-- generate summary report from stats -->
389<xsl:template name="generateSummary" >
390<div class='summary' id='bug-summary'>
391   <h2>FindBugs Analysis generated at: <xsl:value-of select="/BugCollection/FindBugsSummary/@timestamp" /></h2>
392   <table>
393      <tr>
394         <th>Package</th>
395         <th>Code Size</th>
396         <th>Bugs</th>
397         <th>High Prio Bugs</th>
398         <th>Medium Prio Bugs</th>
399         <th>Low Prio Bugs</th>
400         <th>Exp. Bugs</th>
401         <th>Ratio</th>
402      </tr>
403      <tr>
404         <td class='summary-name'>
405            Overall
406            (<xsl:value-of select="/BugCollection/FindBugsSummary/@num_packages" /> packages),
407            (<xsl:value-of select="/BugCollection/FindBugsSummary/@total_classes" /> classes)
408         </td>
409         <td class='summary-size'><xsl:value-of select="/BugCollection/FindBugsSummary/@total_size" /></td>
410         <td class='summary-priority-all'><xsl:value-of select="/BugCollection/FindBugsSummary/@total_bugs" /></td>
411         <td class='summary-priority-1'><xsl:value-of select="/BugCollection/FindBugsSummary/@priority_1" /></td>
412         <td class='summary-priority-2'><xsl:value-of select="/BugCollection/FindBugsSummary/@priority_2" /></td>
413         <td class='summary-priority-3'><xsl:value-of select="/BugCollection/FindBugsSummary/@priority_3" /></td>
414         <td class='summary-priority-4'><xsl:value-of select="/BugCollection/FindBugsSummary/@priority_4" /></td>
415         <td class='summary-ratio'></td>
416      </tr>
417      <xsl:for-each select="/BugCollection/FindBugsSummary/PackageStats">
418         <xsl:sort select="@package" />
419         <xsl:if test="@total_bugs!='0'" >
420            <tr>
421               <td class='summary-name'><xsl:value-of select="@package" /></td>
422               <td class='summary-size'><xsl:value-of select="@total_size" /></td>
423               <td class='summary-priority-all'><xsl:value-of select="@total_bugs" /></td>
424               <td class='summary-priority-1'><xsl:value-of select="@priority_1" /></td>
425               <td class='summary-priority-2'><xsl:value-of select="@priority_2" /></td>
426               <td class='summary-priority-3'><xsl:value-of select="@priority_3" /></td>
427               <td class='summary-priority-4'><xsl:value-of select="@priority_4" /></td>
428               <td class='summary-ratio'></td>
429<!--
430               <xsl:for-each select="ClassStats">
431                  <xsl:if test="@bugs!='0'" >
432                  <li>
433                     <xsl:value-of select="@class" /> - total: <xsl:value-of select="@bugs" />
434                  </li>
435                  </xsl:if>
436               </xsl:for-each>
437-->
438            </tr>
439         </xsl:if>
440      </xsl:for-each>
441   </table>
442</div>
443</xsl:template>
444
445<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
446<!-- display analysis info -->
447<xsl:template name="analysis-data">
448      <div id='analysis-data' style='display:none;'>
449         <div id='analyzed-files'>
450            <h3>Analyzed Files:</h3>
451            <ul>
452               <xsl:for-each select="/BugCollection/Project/Jar">
453                  <li><xsl:apply-templates /></li>
454               </xsl:for-each>
455            </ul>
456         </div>
457         <div id='used-libraries'>
458            <h3>Used Libraries:</h3>
459            <ul>
460               <xsl:for-each select="/BugCollection/Project/AuxClasspathEntry">
461                  <li><xsl:apply-templates /></li>
462               </xsl:for-each>
463               <xsl:if test="count(/BugCollection/Project/AuxClasspathEntry)=0" >
464                  <li>None</li>
465               </xsl:if>
466            </ul>
467         </div>
468         <div id='analysis-error'>
469            <h3>Analysis Errors:</h3>
470            <ul>
471               <xsl:variable name="error-count"
472                             select="count(/BugCollection/Errors/MissingClass)" />
473               <xsl:if test="$error-count=0" >
474                  <li>None</li>
475               </xsl:if>
476               <xsl:if test="$error-count>0" >
477                  <li>Missing ref classes for analysis:
478                     <ul>
479                        <xsl:for-each select="/BugCollection/Errors/MissingClass">
480                           <li><xsl:apply-templates /></li>
481                        </xsl:for-each>
482                     </ul>
483                  </li>
484               </xsl:if>
485            </ul>
486         </div>
487      </div>
488</xsl:template>
489
490<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
491<!-- show priorities helper -->
492<xsl:template name="helpPriorities">
493   <span>
494      <xsl:attribute name="class">b-1</xsl:attribute>
495      <xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
496   </span> High Prio
497   <span>
498      <xsl:attribute name="class">b-2</xsl:attribute>
499      <xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
500   </span> Medium Prio
501   <span>
502      <xsl:attribute name="class">b-3</xsl:attribute>
503      <xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
504   </span> Low Prio
505   <span>
506      <xsl:attribute name="class">b-4</xsl:attribute>
507      <xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
508   </span> Exp.
509</xsl:template>
510
511<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
512<!-- display the details of a bug -->
513<xsl:template name="display-bug" >
514   <xsl:param name="b-t"    select="''" />
515   <xsl:param name="bug-id"      select="''" />
516   <xsl:param name="which-list"  select="''" />
517   <div class="bb">
518      <a>
519         <xsl:attribute name="href"></xsl:attribute>
520         <xsl:attribute name="onclick">showbug('b-uid-<xsl:value-of select="@instanceHash" />-<xsl:value-of select="@instanceOccurrenceNum" />','<xsl:value-of select="$which-list" />');return false;</xsl:attribute>
521         <span>
522            <xsl:attribute name="class">b-<xsl:value-of select="@priority"/></xsl:attribute>
523            <xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
524         </span>
525         <span class="b-t"><xsl:value-of select="@abbrev" />: </span> <xsl:value-of select="Class/Message" />
526      </a>
527      <div style="display:none;">
528         <xsl:attribute name="id">b-uid-<xsl:value-of select="@instanceHash" />-<xsl:value-of select="@instanceOccurrenceNum" />-ph-<xsl:value-of select="$which-list" /></xsl:attribute>
529         loading...
530      </div>
531   </div>
532</xsl:template>
533
534<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
535<!-- main template for the list by category -->
536<xsl:template name="list-by-category" >
537   <div id='list-by-category' class='data-box' style='display:none;'>
538      <xsl:call-template name="helpPriorities" />
539      <xsl:variable name="unique-category" select="/BugCollection/BugCategory/@category"/>
540      <xsl:for-each select="$unique-category">
541         <xsl:sort select="." order="ascending" />
542            <xsl:call-template name="categories">
543               <xsl:with-param name="category" select="." />
544            </xsl:call-template>
545      </xsl:for-each>
546   </div>
547</xsl:template>
548
549<xsl:template name="categories" >
550   <xsl:param name="category" select="''" />
551   <xsl:variable name="category-count"
552                       select="count(/BugCollection/BugInstance[@category=$category and not(@last)])" />
553   <xsl:variable name="category-count-p1"
554                       select="count(/BugCollection/BugInstance[@category=$category and @priority='1' and not(@last)])" />
555   <xsl:variable name="category-count-p2"
556                       select="count(/BugCollection/BugInstance[@category=$category and @priority='2' and not(@last)])" />
557   <xsl:variable name="category-count-p3"
558                       select="count(/BugCollection/BugInstance[@category=$category and @priority='3' and not(@last)])" />
559   <xsl:variable name="category-count-p4"
560                       select="count(/BugCollection/BugInstance[@category=$category and @priority='4' and not(@last)])" />
561   <div class='ob'>
562      <div class='ob-t'>
563         <a>
564            <xsl:attribute name="href"></xsl:attribute>
565            <xsl:attribute name="onclick">toggle('category-<xsl:value-of select="$category" />');return false;</xsl:attribute>
566            <xsl:value-of select="/BugCollection/BugCategory[@category=$category]/Description" />
567            (<xsl:value-of select="$category-count" />:
568            <span class='t-h'><xsl:value-of select="$category-count-p1" />/<xsl:value-of select="$category-count-p2" />/<xsl:value-of select="$category-count-p3" />/<xsl:value-of select="$category-count-p4" /></span>)
569         </a>
570      </div>
571      <div style="display:none;">
572         <xsl:attribute name="id">category-<xsl:value-of select="$category" /></xsl:attribute>
573         <xsl:call-template name="list-by-category-and-code">
574            <xsl:with-param name="category" select="$category" />
575         </xsl:call-template>
576      </div>
577   </div>
578</xsl:template>
579
580<xsl:template name="list-by-category-and-code" >
581   <xsl:param name="category" select="''" />
582   <xsl:variable name="unique-code" select="/BugCollection/BugInstance[@category=$category and not(@last) and generate-id()= generate-id(key('lbc-code-key',concat(@category,@abbrev)))]/@abbrev" />
583   <xsl:for-each select="$unique-code">
584      <xsl:sort select="." order="ascending" />
585         <xsl:call-template name="codes">
586            <xsl:with-param name="category" select="$category" />
587            <xsl:with-param name="code" select="." />
588         </xsl:call-template>
589   </xsl:for-each>
590</xsl:template>
591
592<xsl:template name="codes" >
593   <xsl:param name="category" select="''" />
594   <xsl:param name="code"     select="''" />
595   <xsl:variable name="code-count"
596                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and not(@last)])" />
597   <xsl:variable name="code-count-p1"
598                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @priority='1' and not(@last)])" />
599   <xsl:variable name="code-count-p2"
600                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @priority='2' and not(@last)])" />
601   <xsl:variable name="code-count-p3"
602                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @priority='3' and not(@last)])" />
603   <xsl:variable name="code-count-p4"
604                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @priority='4' and not(@last)])" />
605   <div class='ib-1'>
606      <div class="ib-1-t">
607         <a>
608            <xsl:attribute name="href"></xsl:attribute>
609            <xsl:attribute name="onclick">toggle('category-<xsl:value-of select="$category" />-and-code-<xsl:value-of select="$code" />');return false;</xsl:attribute>
610            <xsl:value-of select="$code" />: <xsl:value-of select="/BugCollection/BugCode[@abbrev=$code]/Description" />
611            (<xsl:value-of select="$code-count" />:
612            <span class='t-h'><xsl:value-of select="$code-count-p1" />/<xsl:value-of select="$code-count-p2" />/<xsl:value-of select="$code-count-p3" />/<xsl:value-of select="$code-count-p4" /></span>)
613         </a>
614      </div>
615      <div style="display:none;">
616         <xsl:attribute name="id">category-<xsl:value-of select="$category" />-and-code-<xsl:value-of select="$code" /></xsl:attribute>
617         <xsl:call-template name="list-by-category-and-code-and-bug">
618            <xsl:with-param name="category" select="$category" />
619            <xsl:with-param name="code" select="$code" />
620         </xsl:call-template>
621      </div>
622   </div>
623</xsl:template>
624
625<xsl:template name="list-by-category-and-code-and-bug" >
626   <xsl:param name="category" select="''" />
627   <xsl:param name="code" select="''" />
628   <xsl:variable name="unique-bug" select="/BugCollection/BugInstance[@category=$category and not(@last) and @abbrev=$code and generate-id()= generate-id(key('lbc-bug-key',concat(@category,@abbrev,@type)))]/@type" />
629   <xsl:for-each select="$unique-bug">
630      <xsl:sort select="." order="ascending" />
631         <xsl:call-template name="bugs">
632            <xsl:with-param name="category" select="$category" />
633            <xsl:with-param name="code" select="$code" />
634            <xsl:with-param name="bug" select="." />
635         </xsl:call-template>
636   </xsl:for-each>
637</xsl:template>
638
639<xsl:template name="bugs" >
640   <xsl:param name="category" select="''" />
641   <xsl:param name="code"     select="''" />
642   <xsl:param name="bug"      select="''" />
643   <xsl:variable name="bug-count"
644                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and not(@last)])" />
645   <xsl:variable name="bug-count-p1"
646                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and @priority='1' and not(@last)])" />
647   <xsl:variable name="bug-count-p2"
648                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and @priority='2' and not(@last)])" />
649   <xsl:variable name="bug-count-p3"
650                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and @priority='3' and not(@last)])" />
651   <xsl:variable name="bug-count-p4"
652                       select="count(/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and @priority='4' and not(@last)])" />
653   <div class='ib-2'>
654      <div class='ib-2-t'>
655         <a>
656            <xsl:attribute name="href"></xsl:attribute>
657            <xsl:attribute name="onclick">toggle('category-<xsl:value-of select="$category" />-and-code-<xsl:value-of select="$code" />-and-bug-<xsl:value-of select="$bug" />');return false;</xsl:attribute>
658            <xsl:attribute name="onmouseout">popUp(event,'tip-<xsl:value-of select="$bug" />');</xsl:attribute>
659            <xsl:attribute name="onmouseover">popUp(event,'tip-<xsl:value-of select="$bug" />');</xsl:attribute>
660            <xsl:value-of select="/BugCollection/BugPattern[@category=$category and @abbrev=$code and @type=$bug]/ShortDescription" /><xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
661            (<xsl:value-of select="$bug-count" />:
662            <span class='t-h'><xsl:value-of select="$bug-count-p1" />/<xsl:value-of select="$bug-count-p2" />/<xsl:value-of select="$bug-count-p3" />/<xsl:value-of select="$bug-count-p4" /></span>)
663         </a>
664      </div>
665      <div style="display:none;">
666         <xsl:attribute name="id">category-<xsl:value-of select="$category" />-and-code-<xsl:value-of select="$code" />-and-bug-<xsl:value-of select="$bug" /></xsl:attribute>
667         <xsl:variable name="cat-code-type">category-<xsl:value-of select="$category" />-and-code-<xsl:value-of select="$code" />-and-bug-<xsl:value-of select="$bug" /></xsl:variable>
668         <xsl:variable name="bug-id">b-uid-<xsl:value-of select="@instanceHash" />-<xsl:value-of select="@instanceOccurrenceNum" /></xsl:variable>
669         <xsl:for-each select="/BugCollection/BugInstance[@category=$category and @abbrev=$code and @type=$bug and not(@last)]">
670            <xsl:call-template name="display-bug">
671               <xsl:with-param name="b-t"     select="@type" />
672               <xsl:with-param name="bug-id"       select="$bug-id" />
673               <xsl:with-param name="which-list"   select="'c'" />
674            </xsl:call-template>
675         </xsl:for-each>
676      </div>
677   </div>
678</xsl:template>
679
680<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
681<!-- main template for the list by package -->
682<xsl:template name="list-by-package" >
683   <div id='list-by-package' class='data-box' style='display:none;'>
684      <xsl:call-template name="helpPriorities" />
685      <xsl:for-each select="/BugCollection/FindBugsSummary/PackageStats[@total_bugs != '0']/@package">
686         <xsl:sort select="." order="ascending" />
687            <xsl:call-template name="packages">
688               <xsl:with-param name="package" select="." />
689            </xsl:call-template>
690      </xsl:for-each>
691   </div>
692</xsl:template>
693
694<xsl:template name="packages" >
695   <xsl:param name="package" select="''" />
696   <xsl:variable name="package-count-p1">
697      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_1 != '')">0</xsl:if>
698      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_1 != ''">
699         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_1" />
700      </xsl:if>
701   </xsl:variable>
702   <xsl:variable name="package-count-p2">
703      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_2 != '')">0</xsl:if>
704      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_2 != ''">
705         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_2" />
706      </xsl:if>
707   </xsl:variable>
708   <xsl:variable name="package-count-p3">
709      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_3 != '')">0</xsl:if>
710      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_3 != ''">
711         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_3" />
712      </xsl:if>
713   </xsl:variable>
714   <xsl:variable name="package-count-p4">
715      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_4 != '')">0</xsl:if>
716      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_4 != ''">
717         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@priority_4" />
718      </xsl:if>
719   </xsl:variable>
720
721   <div class='ob'>
722      <div class='ob-t'>
723         <a>
724            <xsl:attribute name="href"></xsl:attribute>
725            <xsl:attribute name="onclick">toggle('package-<xsl:value-of select="$package" />');return false;</xsl:attribute>
726            <xsl:value-of select="$package" />
727            (<xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/@total_bugs" />:
728            <span class='t-h'><xsl:value-of select="$package-count-p1" />/<xsl:value-of select="$package-count-p2" />/<xsl:value-of select="$package-count-p3" />/<xsl:value-of select="$package-count-p4" /></span>)
729         </a>
730      </div>
731      <div style="display:none;">
732         <xsl:attribute name="id">package-<xsl:value-of select="$package" /></xsl:attribute>
733         <xsl:call-template name="list-by-package-and-class">
734            <xsl:with-param name="package" select="$package" />
735         </xsl:call-template>
736      </div>
737   </div>
738</xsl:template>
739
740<xsl:template name="list-by-package-and-class" >
741   <xsl:param name="package" select="''" />
742   <xsl:for-each select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@bugs != '0']/@class">
743      <xsl:sort select="." order="ascending" />
744         <xsl:call-template name="classes">
745            <xsl:with-param name="package" select="$package" />
746            <xsl:with-param name="class" select="." />
747         </xsl:call-template>
748   </xsl:for-each>
749</xsl:template>
750
751<xsl:template name="classes" >
752   <xsl:param name="package" select="''" />
753   <xsl:param name="class"     select="''" />
754   <xsl:variable name="class-count"
755                       select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@bugs" />
756
757   <xsl:variable name="class-count-p1">
758      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_1 != '')">0</xsl:if>
759      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_1 != ''">
760         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_1" />
761      </xsl:if>
762   </xsl:variable>
763   <xsl:variable name="class-count-p2">
764      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_2 != '')">0</xsl:if>
765      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_2 != ''">
766         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_2" />
767      </xsl:if>
768   </xsl:variable>
769   <xsl:variable name="class-count-p3">
770      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_3 != '')">0</xsl:if>
771      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_3 != ''">
772         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_3" />
773      </xsl:if>
774   </xsl:variable>
775   <xsl:variable name="class-count-p4">
776      <xsl:if test="not(/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_4 != '')">0</xsl:if>
777      <xsl:if test="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_4 != ''">
778         <xsl:value-of select="/BugCollection/FindBugsSummary/PackageStats[@package=$package]/ClassStats[@class=$class and @bugs != '0']/@priority_4" />
779      </xsl:if>
780   </xsl:variable>
781
782   <div class='ib-1'>
783      <div class="ib-1-t">
784         <a>
785            <xsl:attribute name="href"></xsl:attribute>
786            <xsl:attribute name="onclick">toggle('package-<xsl:value-of select="$package" />-and-class-<xsl:value-of select="$class" />');return false;</xsl:attribute>
787            <xsl:value-of select="$class" />  (<xsl:value-of select="$class-count" />:
788            <span class='t-h'><xsl:value-of select="$class-count-p1" />/<xsl:value-of select="$class-count-p2" />/<xsl:value-of select="$class-count-p3" />/<xsl:value-of select="$class-count-p4" /></span>)
789         </a>
790      </div>
791      <div style="display:none;">
792         <xsl:attribute name="id">package-<xsl:value-of select="$package" />-and-class-<xsl:value-of select="$class" /></xsl:attribute>
793         <xsl:call-template name="list-by-package-and-class-and-bug">
794            <xsl:with-param name="package" select="$package" />
795            <xsl:with-param name="class" select="$class" />
796         </xsl:call-template>
797      </div>
798   </div>
799</xsl:template>
800
801<xsl:template name="list-by-package-and-class-and-bug" >
802   <xsl:param name="package" select="''" />
803   <xsl:param name="class" select="''" />
804   <xsl:variable name="unique-class-bugs" select="/BugCollection/BugInstance[not(@last) and Class[position()=1 and @classname=$class] and generate-id() = generate-id(key('lbp-class-b-t',concat(Class/@classname,@type)))]/@type" />
805
806   <xsl:for-each select="$unique-class-bugs">
807      <xsl:sort select="." order="ascending" />
808         <xsl:call-template name="class-bugs">
809            <xsl:with-param name="package" select="$package" />
810            <xsl:with-param name="class" select="$class" />
811            <xsl:with-param name="type" select="." />
812         </xsl:call-template>
813   </xsl:for-each>
814</xsl:template>
815
816<xsl:template name="class-bugs" >
817   <xsl:param name="package" select="''" />
818   <xsl:param name="class"     select="''" />
819   <xsl:param name="type"      select="''" />
820   <xsl:variable name="bug-count"
821                       select="count(/BugCollection/BugInstance[@type=$type and not(@last) and Class[position()=1 and @classname=$class]])" />
822   <div class='ib-2'>
823      <div class='ib-2-t'>
824         <a>
825            <xsl:attribute name="href"></xsl:attribute>
826            <xsl:attribute name="onclick">toggle('package-<xsl:value-of select="$package" />-and-class-<xsl:value-of select="$class" />-and-type-<xsl:value-of select="$type" />');return false;</xsl:attribute>
827            <xsl:attribute name="onmouseout">popUp(event,'tip-<xsl:value-of select="$type" />')</xsl:attribute>
828            <xsl:attribute name="onmouseover">popUp(event,'tip-<xsl:value-of select="$type" />')</xsl:attribute>
829            <xsl:value-of select="/BugCollection/BugPattern[@type=$type]/ShortDescription" /><xsl:text disable-output-escaping="yes">&amp;nbsp;&amp;nbsp;</xsl:text>
830            (<xsl:value-of select="$bug-count" />)
831         </a>
832      </div>
833      <div style="display:none;">
834         <xsl:attribute name="id">package-<xsl:value-of select="$package" />-and-class-<xsl:value-of select="$class" />-and-type-<xsl:value-of select="$type" /></xsl:attribute>
835         <xsl:variable name="package-class-type">package-<xsl:value-of select="$package" />-and-class-<xsl:value-of select="$class" />-and-type-<xsl:value-of select="$type" /></xsl:variable>
836         <xsl:variable name="bug-id">b-uid-<xsl:value-of select="@instanceHash" />-<xsl:value-of select="@instanceOccurrenceNum" /></xsl:variable>
837         <xsl:for-each select="/BugCollection/BugInstance[@type=$type and not(@last) and Class[position()=1 and @classname=$class]]">
838            <xsl:call-template name="display-bug">
839               <xsl:with-param name="b-t"     select="@type" />
840               <xsl:with-param name="bug-id"       select="$bug-id" />
841               <xsl:with-param name="which-list"   select="'p'" />
842            </xsl:call-template>
843         </xsl:for-each>
844      </div>
845   </div>
846</xsl:template>
847
848</xsl:transform>
849