1<?xml version="1.0"?> 2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 3 xmlns:lxslt="http://xml.apache.org/xslt" 4 xmlns:redirect="org.apache.xalan.lib.Redirect" 5 extension-element-prefixes="redirect"> 6<xsl:output method="html" indent="yes" encoding="US-ASCII"/> 7<xsl:decimal-format decimal-separator="." grouping-separator="," /> 8<!-- 9 Licensed to the Apache Software Foundation (ASF) under one or more 10 contributor license agreements. See the NOTICE file distributed with 11 this work for additional information regarding copyright ownership. 12 The ASF licenses this file to You under the Apache License, Version 2.0 13 (the "License"); you may not use this file except in compliance with 14 the License. You may obtain a copy of the License at 15 16 http://www.apache.org/licenses/LICENSE-2.0 17 18 Unless required by applicable law or agreed to in writing, software 19 distributed under the License is distributed on an "AS IS" BASIS, 20 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21 See the License for the specific language governing permissions and 22 limitations under the License. 23--> 24<!-- 25 26 Stylesheet to transform an XML file generated by the Ant MAudit task into 27 a set of JavaDoc-like HTML page to make pages more convenient to be browsed. 28 29 It use the Xalan redirect extension to write to multiple output files. 30 31 @author Stephane Bailliez <a href="mailto:sbailliez@apache.org"/> 32--> 33 34<xsl:param name="output.dir" select="'.'"/> 35 36 37<xsl:template match="classes"> 38 <!-- create the index.html --> 39 <redirect:write file="{$output.dir}/index.html"> 40 <xsl:call-template name="index.html"/> 41 </redirect:write> 42 43 <!-- create the stylesheet.css --> 44 <redirect:write file="{$output.dir}/stylesheet.css"> 45 <xsl:call-template name="stylesheet.css"/> 46 </redirect:write> 47 48 <!-- create the overview-packages.html at the root --> 49 <redirect:write file="{$output.dir}/overview-summary.html"> 50 <xsl:apply-templates select="." mode="overview.packages"/> 51 </redirect:write> 52 53 <!-- create the all-packages.html at the root --> 54 <redirect:write file="{$output.dir}/overview-frame.html"> 55 <xsl:apply-templates select="." mode="all.packages"/> 56 </redirect:write> 57 58 <!-- create the all-classes.html at the root --> 59 <redirect:write file="{$output.dir}/allclasses-frame.html"> 60 <xsl:apply-templates select="." mode="all.classes"/> 61 </redirect:write> 62 63 <!-- process all packages --> 64 <xsl:for-each select="./class[not(./@package = preceding-sibling::class/@package)]"> 65 <xsl:call-template name="package"> 66 <xsl:with-param name="name" select="@package"/> 67 </xsl:call-template> 68 </xsl:for-each> 69</xsl:template> 70 71 72<xsl:template name="package"> 73 <xsl:param name="name"/> 74 <xsl:variable name="package.dir"> 75 <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if> 76 <xsl:if test="$name = ''">.</xsl:if> 77 </xsl:variable> 78 <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> --> 79 <!-- create a classes-list.html in the package directory --> 80 <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html"> 81 <xsl:call-template name="classes.list"> 82 <xsl:with-param name="name" select="$name"/> 83 </xsl:call-template> 84 </redirect:write> 85 86 <!-- create a package-summary.html in the package directory --> 87 <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html"> 88 <xsl:call-template name="package.summary"> 89 <xsl:with-param name="name" select="$name"/> 90 </xsl:call-template> 91 </redirect:write> 92 93 <!-- for each class, creates a @name.html --> 94 <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten --> 95 <xsl:for-each select="/classes/class[@package = $name]"> 96 <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html"> 97 <xsl:apply-templates select="." mode="class.details"/> 98 </redirect:write> 99 </xsl:for-each> 100</xsl:template> 101 102<xsl:template name="index.html"> 103<HTML> 104 <HEAD><TITLE>Audit Results.</TITLE></HEAD> 105 <FRAMESET cols="20%,80%"> 106 <FRAMESET rows="30%,70%"> 107 <FRAME src="overview-frame.html" name="packageListFrame"/> 108 <FRAME src="allclasses-frame.html" name="classListFrame"/> 109 </FRAMESET> 110 <FRAME src="overview-summary.html" name="classFrame"/> 111 </FRAMESET> 112 <noframes> 113 <H2>Frame Alert</H2> 114 <P> 115 This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. 116 </P> 117 </noframes> 118</HTML> 119</xsl:template> 120 121 122<!-- this is the stylesheet css to use for nearly everything --> 123<xsl:template name="stylesheet.css"> 124 .bannercell { 125 border: 0px; 126 padding: 0px; 127 } 128 body { 129 margin-left: 10; 130 margin-right: 10; 131 font:normal 80% arial,helvetica,sanserif; 132 background-color:#FFFFFF; 133 color:#000000; 134 } 135 .a td { 136 background: #efefef; 137 } 138 .b td { 139 background: #fff; 140 } 141 th, td { 142 text-align: left; 143 vertical-align: top; 144 } 145 th { 146 font-weight:bold; 147 background: #ccc; 148 color: black; 149 } 150 table, th, td { 151 font-size:100%; 152 border: none 153 } 154 table.log tr td, tr th { 155 156 } 157 h2 { 158 font-weight:bold; 159 font-size:140%; 160 margin-bottom: 5; 161 } 162 h3 { 163 font-size:100%; 164 font-weight:bold; 165 background: #525D76; 166 color: white; 167 text-decoration: none; 168 padding: 5px; 169 margin-right: 2px; 170 margin-left: 2px; 171 margin-bottom: 0; 172 } 173</xsl:template> 174 175 176<!-- print the violations of the class --> 177<xsl:template match="class" mode="class.details"> 178 <xsl:variable name="package.name" select="@package"/> 179 <HTML> 180 <HEAD> 181 <xsl:call-template name="create.stylesheet.link"> 182 <xsl:with-param name="package.name" select="$package.name"/> 183 </xsl:call-template> 184 </HEAD> 185 <BODY> 186 <xsl:call-template name="pageHeader"/> 187 <H3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3> 188 189 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 190 <xsl:call-template name="class.audit.header"/> 191 <xsl:apply-templates select="." mode="print.audit"/> 192 </table> 193 194 <H3>Violations</H3> 195 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 196 <xsl:call-template name="violation.audit.header"/> 197 <xsl:apply-templates select="./violation" mode="print.audit"> 198 <xsl:sort data-type="number" select="@line"/> 199 </xsl:apply-templates> 200 </table> 201 <xsl:call-template name="pageFooter"/> 202 </BODY> 203 </HTML> 204</xsl:template> 205 206 207<!-- list of classes in a package --> 208<xsl:template name="classes.list"> 209 <xsl:param name="name"/> 210 <HTML> 211 <HEAD> 212 <xsl:call-template name="create.stylesheet.link"> 213 <xsl:with-param name="package.name" select="$name"/> 214 </xsl:call-template> 215 </HEAD> 216 <BODY> 217 <table width="100%"> 218 <tr> 219 <td nowrap="nowrap"> 220 <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></H2> 221 </td> 222 </tr> 223 </table> 224 225 <h2>Classes</h2> 226 <TABLE WIDTH="100%"> 227 <xsl:apply-templates select="/classes/class[./@package = $name]" mode="classes.list"> 228 <xsl:sort select="@name"/> 229 </xsl:apply-templates> 230 </TABLE> 231 </BODY> 232 </HTML> 233</xsl:template> 234<!-- the class to list --> 235<xsl:template match="class" mode="classes.list"> 236 <tr> 237 <td nowrap="nowrap"> 238 <!-- @bug naming to fix for inner classes --> 239 <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a> 240 </td> 241 </tr> 242</xsl:template> 243 244 245<!-- 246 Creates an all-classes.html file that contains a link to all package-summary.html 247 on each class. 248--> 249<xsl:template match="classes" mode="all.classes"> 250 <html> 251 <head> 252 <xsl:call-template name="create.stylesheet.link"> 253 <xsl:with-param name="package.name"/> 254 </xsl:call-template> 255 </head> 256 <body> 257 <h2>Classes</h2> 258 <table width="100%"> 259 <xsl:apply-templates select=".//class" mode="all.classes"> 260 <xsl:sort select="@name"/> 261 </xsl:apply-templates> 262 </table> 263 </body> 264 </html> 265</xsl:template> 266 267<xsl:template match="class" mode="all.classes"> 268 <!-- (ancestor::package)[last()] is buggy in MSXML3 ? --> 269 <xsl:variable name="package.name" select="@package"/> 270 <tr> 271 <td nowrap="nowrap"> 272 <a target="classFrame"> 273 <xsl:attribute name="href"> 274 <xsl:if test="not($package.name='')"> 275 <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text> 276 </xsl:if><xsl:value-of select="@name"/><xsl:text>.html</xsl:text> 277 </xsl:attribute> 278 <xsl:value-of select="@name"/> 279 </a> 280 </td> 281 </tr> 282</xsl:template> 283 284 285<!-- 286 Creates an html file that contains a link to all package-summary.html files on 287 each package existing on testsuites. 288 @bug there will be a problem here, I don't know yet how to handle unnamed package :( 289--> 290<xsl:template match="classes" mode="all.packages"> 291 <html> 292 <head> 293 <xsl:call-template name="create.stylesheet.link"> 294 <xsl:with-param name="package.name"/> 295 </xsl:call-template> 296 </head> 297 <body> 298 <h2><a href="overview-summary.html" target="classFrame">Home</a></h2> 299 <h2>Packages</h2> 300 <table width="100%"> 301 <xsl:apply-templates select="class[not(./@package = preceding-sibling::class/@package)]" mode="all.packages"> 302 <xsl:sort select="@package" order="ascending"/> 303 </xsl:apply-templates> 304 </table> 305 </body> 306 </html> 307</xsl:template> 308 309<xsl:template match="class" mode="all.packages"> 310 <tr> 311 <td nowrap="nowrap"> 312 <a href="{translate(@package,'.','/')}/package-summary.html" target="classFrame"> 313 <xsl:value-of select="@package"/> 314 </a> 315 </td> 316 </tr> 317</xsl:template> 318 319 320<xsl:template match="classes" mode="overview.packages"> 321 <html> 322 <head> 323 <xsl:call-template name="create.stylesheet.link"> 324 <xsl:with-param name="package.name"/> 325 </xsl:call-template> 326 </head> 327 <body onload="open('allclasses-frame.html','classListFrame')"> 328 <xsl:call-template name="pageHeader"/> 329 <h3>Summary</h3> 330 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 331 <tr> 332 <th>Audited classes</th> 333 <th>Reported classes</th> 334 <th>Violations</th> 335 </tr> 336 <tr class="a"> 337 <td><xsl:value-of select="@audited"/></td> 338 <td><xsl:value-of select="@reported"/></td> 339 <td><xsl:value-of select="@violations"/></td> 340 </tr> 341 </table> 342 <table border="0" width="100%"> 343 <tr> 344 <td style="text-align: justify;"> 345 Note: Rules checked have originated from style guidelines suggested by the language designers, 346 experience from the Java development community and insite experience. Violations are generally 347 reported with a reference to the <a href="http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html">Java Language Specifications</a> (JLS x.x.x) 348 and Metamata Audit rules (x.x). 349 Please consult these documents for additional information about violations. 350 <p/> 351 Rules checked also enforce adherence to <a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html">Sun Java coding guidelines</a> in use at Jakarta. 352 <p/> 353 One should note that these violations do not necessary underline errors but should be used 354 as an indication for <i>possible</i> errors. As always, use your best judgment and review 355 them carefully, it might save you hours of debugging. 356 </td> 357 </tr> 358 </table> 359 360 <h3>Packages</h3> 361 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 362 <xsl:call-template name="class.audit.header"/> 363 <xsl:for-each select="class[not(./@package = preceding-sibling::class/@package)]"> 364 <xsl:sort select="@package" order="ascending"/> 365 <tr> 366 <xsl:call-template name="alternate-row"/> 367 <td><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td> 368 <td><xsl:value-of select="sum(/classes/class[./@package = current()/@package]/@violations)"/></td> 369 </tr> 370 </xsl:for-each> 371 </table> 372 <xsl:call-template name="pageFooter"/> 373 </body> 374 </html> 375</xsl:template> 376 377 378<xsl:template name="package.summary"> 379 <xsl:param name="name"/> 380 <HTML> 381 <HEAD> 382 <xsl:call-template name="create.stylesheet.link"> 383 <xsl:with-param name="package.name" select="$name"/> 384 </xsl:call-template> 385 </HEAD> 386 <BODY> 387 <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute> 388 <xsl:call-template name="pageHeader"/> 389 <h3>Package <xsl:value-of select="$name"/></h3> 390 391 <!--table border="0" cellpadding="5" cellspacing="2" width="100%"> 392 <xsl:call-template name="class.metrics.header"/> 393 <xsl:apply-templates select="." mode="print.metrics"/> 394 </table--> 395 396 <xsl:if test="count(/classes/class[./@package = $name]) > 0"> 397 <H3>Classes</H3> 398 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 399 <xsl:call-template name="class.audit.header"/> 400 <xsl:apply-templates select="/classes/class[./@package = $name]" mode="print.audit"> 401 <xsl:sort select="@name"/> 402 </xsl:apply-templates> 403 </table> 404 </xsl:if> 405 <xsl:call-template name="pageFooter"/> 406 </BODY> 407 </HTML> 408</xsl:template> 409 410 411<!-- 412 transform string like a.b.c to ../../../ 413 @param path the path to transform into a descending directory path 414--> 415<xsl:template name="path"> 416 <xsl:param name="path"/> 417 <xsl:if test="contains($path,'.')"> 418 <xsl:text>../</xsl:text> 419 <xsl:call-template name="path"> 420 <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param> 421 </xsl:call-template> 422 </xsl:if> 423 <xsl:if test="not(contains($path,'.')) and not($path = '')"> 424 <xsl:text>../</xsl:text> 425 </xsl:if> 426</xsl:template> 427 428 429<!-- create the link to the stylesheet based on the package name --> 430<xsl:template name="create.stylesheet.link"> 431 <xsl:param name="package.name"/> 432 <LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK> 433</xsl:template> 434 435<!-- Page HEADER --> 436<xsl:template name="pageHeader"> 437 438 <!-- jakarta logo --> 439 <table border="0" cellpadding="0" cellspacing="0" width="100%"> 440 <tr> 441 <td class="bannercell" rowspan="2"> 442 <a href="http://jakarta.apache.org/"> 443 <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/> 444 </a> 445 </td> 446 <td style="text-align:right"><h2>Source Code Audit</h2></td> 447 </tr> 448 <tr> 449 <td style="text-align:right">Designed for use with <a href='http://www.webgain.com/products/quality_analyzer/'>Webgain QA/Metamata Audit</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td> 450 </tr> 451 </table> 452 <hr size="1"/> 453</xsl:template> 454 455<!-- Page HEADER --> 456<xsl:template name="pageFooter"> 457</xsl:template> 458 459 460<!-- class header --> 461<xsl:template name="class.audit.header"> 462 <tr> 463 <th width="80%">Name</th> 464 <th>Violations</th> 465 </tr> 466</xsl:template> 467 468<!-- method header --> 469<xsl:template name="violation.audit.header"> 470 <tr> 471 <th>Line</th> 472 <th>Message</th> 473 </tr> 474</xsl:template> 475 476 477<!-- class information --> 478<xsl:template match="class" mode="print.audit"> 479 <tr> 480 <xsl:call-template name="alternate-row"/> 481 <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td> 482 <td><xsl:apply-templates select="@violations"/></td> 483 </tr> 484</xsl:template> 485 486<xsl:template match="violation" mode="print.audit"> 487 <tr> 488 <xsl:call-template name="alternate-row"/> 489 <td><xsl:value-of select="@line"/></td> 490 <td><xsl:apply-templates select="@message"/></td> 491 </tr> 492</xsl:template> 493 494<!-- alternated row style --> 495<xsl:template name="alternate-row"> 496<xsl:attribute name="class"> 497 <xsl:if test="position() mod 2 = 1">a</xsl:if> 498 <xsl:if test="position() mod 2 = 0">b</xsl:if> 499</xsl:attribute> 500</xsl:template> 501 502</xsl:stylesheet> 503 504