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:xalan="http://xml.apache.org/xalan" 5 xmlns:redirect="org.apache.xalan.lib.Redirect" 6 exclude-result-prefixes="xalan" 7 extension-element-prefixes="redirect"> 8 <xsl:output method="html" indent="yes" encoding="US-ASCII"/> 9 <xsl:decimal-format decimal-separator="." grouping-separator="," /> 10 <!-- 11 Licensed to the Apache Software Foundation (ASF) under one or more 12 contributor license agreements. See the NOTICE file distributed with 13 this work for additional information regarding copyright ownership. 14 The ASF licenses this file to You under the Apache License, Version 2.0 15 (the "License"); you may not use this file except in compliance with 16 the License. You may obtain a copy of the License at 17 18 http://www.apache.org/licenses/LICENSE-2.0 19 20 Unless required by applicable law or agreed to in writing, software 21 distributed under the License is distributed on an "AS IS" BASIS, 22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 23 See the License for the specific language governing permissions and 24 limitations under the License. 25 --> 26 <!-- 27 @author Stephane Bailliez <a href="mailto:sbailliez (a] apache.org"/> 28 --> 29 <xsl:param name="output.dir" select="'.'"/> 30 31 <!-- default max value for the metrics --> 32 <xsl:param name="vg.max" select="10"/> 33 <xsl:param name="loc.max" select="1000"/> 34 <xsl:param name="dit.max" select="10"/> 35 <xsl:param name="noa.max" select="250"/> 36 <xsl:param name="nrm.max" select="50"/> 37 <xsl:param name="nlm.max" select="250"/> 38 <xsl:param name="wmc.max" select="250"/> 39 <xsl:param name="rfc.max" select="50"/> 40 <xsl:param name="dac.max" select="10"/> 41 <xsl:param name="fanout.max" select="10"/> 42 <xsl:param name="cbo.max" select="15"/> 43 <xsl:param name="lcom.max" select="10"/> 44 <xsl:param name="nocl.max" select="10"/> 45 46 47 <!-- create a tree fragment to speed up processing --> 48 <xsl:variable name="doctree.var"> 49 <xsl:element name="classes"> 50 <xsl:for-each select=".//class"> 51 <xsl:element name="class"> 52 <xsl:attribute name="package"> 53 <xsl:value-of select="(ancestor::package)[last()]/@name"/> 54 </xsl:attribute> 55 <xsl:copy-of select="@*"/> 56 <xsl:attribute name="name"> 57 <xsl:apply-templates select="." mode="class.name"/> 58 </xsl:attribute> 59 <xsl:copy-of select="method"/> 60 </xsl:element> 61 </xsl:for-each> 62 </xsl:element> 63 </xsl:variable> 64 65 <xsl:variable name="doctree" select="xalan:nodeset($doctree.var)"/> 66 67 <xsl:template match="metrics"> 68 69 <!-- create the index.html --> 70 <redirect:write file="{$output.dir}/index.html"> 71 <xsl:call-template name="index.html"/> 72 </redirect:write> 73 74 <!-- create the stylesheet.css --> 75 <redirect:write file="{$output.dir}/stylesheet.css"> 76 <xsl:call-template name="stylesheet.css"/> 77 </redirect:write> 78 79 <redirect:write file="{$output.dir}/metrics-reference.html"> 80 <xsl:call-template name="metrics-reference.html"/> 81 </redirect:write> 82 83 <!-- create the overview-packages.html at the root --> 84 <redirect:write file="{$output.dir}/overview-summary.html"> 85 <xsl:apply-templates select="." mode="overview.packages"/> 86 </redirect:write> 87 88 <!-- create the all-packages.html at the root --> 89 <redirect:write file="{$output.dir}/overview-frame.html"> 90 <xsl:apply-templates select="." mode="all.packages"/> 91 </redirect:write> 92 93 <!-- create the all-classes.html at the root --> 94 <redirect:write file="{$output.dir}/allclasses-frame.html"> 95 <xsl:apply-templates select="." mode="all.classes"/> 96 </redirect:write> 97 98 <!-- process all packages --> 99 <xsl:apply-templates select=".//package"/> 100 </xsl:template> 101 102 103 <xsl:template match="package"> 104 <xsl:variable name="package.name" select="@name"/> 105 <xsl:variable name="package.dir"> 106 <xsl:if test="not($package.name = 'unnamed package')"><xsl:value-of select="translate($package.name,'.','/')"/></xsl:if> 107 <xsl:if test="$package.name = 'unnamed package'">.</xsl:if> 108 </xsl:variable> 109 <!-- create a classes-list.html in the package directory --> 110 <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html"> 111 <xsl:apply-templates select="." mode="classes.list"/> 112 </redirect:write> 113 114 <!-- create a package-summary.html in the package directory --> 115 <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html"> 116 <xsl:apply-templates select="." mode="package.summary"/> 117 </redirect:write> 118 119 <!-- for each class, creates a @name.html --> 120 <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten --> 121 <xsl:for-each select="$doctree/classes/class[@package = current()/@name]"> 122 <!--Processing <xsl:value-of select="$class.name"/><xsl:text> </xsl:text> --> 123 <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html"> 124 <xsl:apply-templates select="." mode="class.details"/> 125 </redirect:write> 126 </xsl:for-each> 127 </xsl:template> 128 129 <!-- little trick to compute the classname for inner and non inner classes --> 130 <!-- this is all in one line to avoid CRLF in the name --> 131 <xsl:template match="class" mode="class.name"> 132 <xsl:if test="parent::class"><xsl:apply-templates select="parent::class" mode="class.name"/>.<xsl:value-of select="@name"/></xsl:if><xsl:if test="not(parent::class)"><xsl:value-of select="@name"/></xsl:if> 133 </xsl:template> 134 135 136 <xsl:template name="index.html"> 137 <HTML> 138 <HEAD><TITLE>Metrics Results.</TITLE></HEAD> 139 <FRAMESET cols="20%,80%"> 140 <FRAMESET rows="30%,70%"> 141 <FRAME src="overview-frame.html" name="packageListFrame"/> 142 <FRAME src="allclasses-frame.html" name="classListFrame"/> 143 </FRAMESET> 144 <FRAME src="overview-summary.html" name="classFrame"/> 145 </FRAMESET> 146 <noframes> 147 <H2>Frame Alert</H2> 148 <P> 149 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. 150 </P> 151 </noframes> 152 </HTML> 153 </xsl:template> 154 155 <!-- this is the stylesheet css to use for nearly everything --> 156 <xsl:template name="metrics-reference.html"> 157 <html> 158 <head> 159 <link title="Style" type="text/css" rel="stylesheet" href="stylesheet.css"/> 160 </head> 161 <body style="text-align:justify;"> 162 <h2>Metrics Reference</h2> 163 <a href="#V(G)">V(G)</a> | 164 <a href="#LOC">LOC</a> | 165 <a href="#DIT">DIT</a> | 166 <a href="#NOA">NOA</a> | 167 <a href="#NRM">NRM</a> | 168 <a href="#NLM">NLM</a> | 169 <a href="#WMC">WMC</a> | 170 <a href="#RFC">RFC</a> | 171 <a href="#DAC">DAC</a> | 172 <a href="#FANOUT">FANOUT</a> | 173 <a href="#CBO">CBO</a> | 174 <a href="#LCOM">LCOM</a> | 175 <a href="#NOC">NOC</a> 176 177 <a name="V(G)"/> 178 <h3>Cyclomatic Complexity - V(G)</h3> 179 This metric was introduced in the 1970s to measure the amount of control 180 flow complexity or branching complexity in a module such as a 181 subroutine. It gives the number of paths that may be taken through the 182 code, and was initially developed to give some measure of the cost of 183 producing a test case for the module by executing each path. 184 <p/> 185 Methods with a high cyclomatic complexity tend to be more difficult to 186 understand and maintain. In general the more complex the methods of an 187 application, the more difficult it will be to test it, and this will adversely 188 affect its reliability. 189 <p/> 190 V(G) is a measure of the control flow complexity of a method or 191 constructor. It counts the number of branches in the body of the method, 192 defined as: 193 <ul> 194 <li>while statements;</li> 195 <li>if statements;</li> 196 <li>for statements.</li> 197 </ul> 198 199 The metric can also be configured to count each case of a switch 200 statement as well. 201 202 <a name="LOC"/> 203 <h3>Lines of Code - LOC</h3> 204 205 This is perhaps the simplest of all the metrics to define and compute. 206 Counting lines has a long history as a software metric dating from before 207 the rise of structured programming, and it is still in widespread use today. 208 The size of a method affects the ease with which it can be understood, its 209 reusability and its maintainability. There are a variety of ways that the size 210 can be calculated. These include counting all the lines of code, the number 211 of statements, the blank lines of code, the lines of commentary, and the 212 lines consisting only of syntax such as block delimiters. 213 <p/> 214 This metric can also be used for sizing other constructs as well, for 215 example, the overall size of a Java class or package can be measured by 216 counting the number of source lines it consists of. 217 <p/> 218 LOC can be used to determine the size of a compilation unit (source file), 219 class or interface, method, constructor, or field. It can be configured to 220 ignore: 221 <ul> 222 <li>blank lines;</li> 223 <li>lines consisting only of comments;</li> 224 <li>lines consisting only of opening and closing braces.</li> 225 </ul> 226 227 <a name="DIT"/> 228 <h3>Depth of Inheritance Hierarchy - DIT</h3> 229 230 This metric calculates how far down the inheritance hierarchy a class is 231 declared. In Java all classes have java.lang.Object as their ultimate 232 superclass, which is defined to have a depth of 1. So a class that 233 immediately extends java.lang.Object has a metric value of 2; any of its 234 subclasses will have a value of 3, and so on. 235 <p/> 236 A class that is deep within the tree inherits more methods and state 237 variables, thereby increasing its complexity and making it difficult to 238 predict its behavior. It can be harder to understand a system with many 239 inheritance layers. 240 <p/> 241 DIT is defined for classes and interfaces: 242 <ul> 243 <li>all interface types have a depth of 1;</li> 244 <li>the class java.lang.Object has a depth of 1;</li> 245 <li>all other classes have a depth of 1 + the depth of their super class.</li> 246 </ul> 247 248 <a name="NOA"/> 249 <h3>Number of Attributes - NOA</h3> 250 251 The number of distinct state variables in a class serves as one measure of 252 its complexity. The more state a class represents the more difficult it is to 253 maintain invariants for it. It also hinders comprehensibility and reuse. 254 <p/> 255 In Java, state can be exposed to subclasses through protected fields, which 256 entails that the subclass also be aware of and maintain any invariants. This 257 interference with the class's data encapsulation can be a source of defects 258 and hidden dependencies between the state variables. 259 <p/> 260 NOA is defined for classes and interfaces. It counts the number of fields 261 declared in the class or interface. 262 263 <a name="NRM"/> 264 <h3>Number of Remote Methods - NRM</h3> 265 266 NRM is defined for classes. A remote method call is defined as an 267 invocation of a method that is not declared in any of: 268 <ul> 269 <li>the class itself;</li> 270 <li>a class or interface that the class extends or implements;</li> 271 <li>a class or method that extends the class.</li> 272 </ul> 273 274 The value is the count of all the remote method calls in all of the methods 275 and constructors of the class. 276 277 <a name="NLM"/> 278 <h3>Number of Local Methods - NLM</h3> 279 280 NLM is defined for classes and interfaces. A local method is defined as a 281 method that is declared in the class or interface. NLM can be configured to 282 include the local methods of all of the class's superclasses. Methods with 283 public, protected, package and private visibility can be independently 284 counted by setting configuration parameters. 285 286 <a name="WMC"/> 287 <h3>Weighted Methods per Class - WMC</h3> 288 289 If the number of methods in a class can be determined during the design 290 and modeling phase of a project, it can be used as a predictor of how 291 much time and effort is needed to develop, debug and maintain it. This 292 metric can be further refined by incorporating a weighting for the 293 complexity of each method. The usual weighting is given by the cyclomatic 294 complexity of the method. 295 <p/> 296 The subclasses of a class inherit all of its public and protected methods, 297 and possibly its package methods as well, so the number of methods a 298 class has directly impacts the complexity of its subclasses. Classes with 299 large numbers of methods are often specific to a particular application, 300 reducing the ability to reuse them. 301 <p/> 302 The definition of WMC is based upon NLM, and it provides the same 303 configuration parameters for counting inherited methods and of varying 304 visibility. The main difference is that NLM always counts each method as 1, 305 whereas WMC will weight each method. There are two weighting schemes: 306 <ul> 307 <li>V(G) the cyclomatic complexity of the method is used as its weight. 308 Methods from class files are given a V(G) of 1.</li> 309 <li>the arity, or the number of parameters of the method are used to 310 determine the weight.</li> 311 </ul> 312 313 <a name="RFC"/> 314 <h3>Response For Class - RFC</h3> 315 316 The response set of a class is the set of all methods that can be invoked as 317 a result of a message sent to an object of the class. This includes methods 318 in the class's inheritance hierarchy and methods that can be invoked on 319 other objects. The Response For Class metric is defined to be size of the 320 response set for the class. A class which provides a larger response set is 321 considered to be more complex than one with a smaller response set. 322 <p/> 323 One reason for this is that if a method call on a class can result in a large 324 number of different method calls on the target and other classes, then it 325 can be harder to test the behavior of the class and debug problems. It will 326 typically require a deeper understanding of the potential interactions that 327 objects of the class can have with the rest of the system. 328 <p/> 329 RFC is defined as the sum of NLM and NRM for the class. The local methods 330 include all of the public, protected, package and private methods, but not 331 methods declared only in a superclass. 332 333 <a name="DAC"/> 334 <h3>Data Abstraction Coupling - DAC</h3> 335 336 DAC is defined for classes and interfaces. It counts the number of reference 337 types that are used in the field declarations of the class or interface. The 338 component types of arrays are also counted. Any field with a type that is 339 either a supertype or a subtype of the class is not counted. 340 341 <a name="FANOUT"/> 342 <h3>Fan Out - FANOUT</h3> 343 344 FANOUT is defined for classes and interfaces, constructors and methods. It 345 counts the number of reference types that are used in: 346 <ul> 347 <li>field declarations;</li> 348 <li>formal parameters and return types;</li> 349 <li>throws declarations;</li> 350 <li>local variables.</li> 351 </ul> 352 353 The component types of arrays are also counted. Any type that is either a 354 supertype or a subtype of the class is not counted. 355 356 <a name="CBO"/> 357 <h3>Coupling Between Objects - CBO</h3> 358 359 When one object or class uses another object or class they are said to be 360 coupled. One major source of coupling is that between a superclass and a 361 subclass. A coupling is also introduced when a method or field in another 362 class is accessed, or when an object of another class is passed into or out 363 of a method invocation. Coupling Between Objects is a measure of the 364 non-inheritance coupling between two objects. 365 <p/> 366 A high value of coupling reduces the modularity of the class and makes 367 reuse more difficult. The more independent a class is the more likely it is 368 that it will be possible to reuse it in another part of the system. When a 369 class is coupled to another class it becomes sensitive to changes in that 370 class, thereby making maintenance for difficult. In addition, a class that is 371 overly dependent on other classes can be difficult to understand and test in 372 isolation. 373 <p/> 374 CBO is defined for classes and interfaces, constructors and methods. It 375 counts the number of reference types that are used in: 376 <ul> 377 <li>field declarations</li> 378 <li>formal parameters and return types</li> 379 <li>throws declarations</li> 380 <li>local variables</li> 381 </ul> 382 383 It also counts: 384 <ul> 385 <li>types from which field and method selections are made</li> 386 </ul> 387 388 The component types of arrays are also counted. Any type that is either a 389 supertype or a subtype of the class is not counted. 390 391 <a name="LCOM"/> 392 <h3>Lack of Cohesion Of Methods - LCOM</h3> 393 394 The cohesion of a class is the degree to which its methods are related to 395 each other. It is determined by examining the pattern of state variable 396 accesses within the set of methods. If all the methods access the same state 397 variables then they have high cohesion; if they access disjoint sets of 398 variables then the cohesion is low. An extreme example of low cohesion 399 would be if none of the methods accessed any of the state variables. 400 401 If a class exhibits low method cohesion it indicates that the design of the 402 class has probably been partitioned incorrectly, and could benefit by being 403 split into more classes with individually higher cohesion. On the other 404 hand, a high value of cohesion (a low lack of cohesion) implies that the 405 class is well designed. A cohesive class will tend to provide a high degree 406 of encapsulation, whereas a lack of cohesion decreases encapsulation and 407 increases complexity. 408 <p/> 409 Another form of cohesion that is useful for Java programs is cohesion 410 between nested and enclosing classes. A nested class that has very low 411 cohesion with its enclosing class would probably better designed as a peer 412 class rather than a nested class. 413 <p/> 414 LCOM is defined for classes. Operationally, LCOM takes each pair of 415 methods in the class and determines the set of fields they each access. If 416 they have disjoint sets of field accesses increase the count P by one. If they 417 share at least one field access then increase Q by one. After considering 418 each pair of methods, 419 LCOM = (P > Q) ? (P - Q) : 0 420 <p/> 421 Indirect access to fields via local methods can be considered by setting a 422 metric configuration parameter. 423 424 <a name="NOC"/> 425 <h3>Number Of Classes - NOC</h3> 426 427 The overall size of the system can be estimated by calculating the number 428 of classes it contains. A large system with more classes is more complex 429 than a smaller one because the number of potential interactions between 430 objects is higher. This reduces the comprehensibility of the system which 431 in turn makes it harder to test, debug and maintain. 432 <p/> 433 If the number of classes in the system can be projected during the initial 434 design phase of the project it can serve as a base for estimating the total 435 effort and cost of developing, debugging and maintaining the system. 436 <p/> 437 The NOC metric can also usefully be applied at the package and class level 438 as well as the total system. 439 <p/> 440 NOCL is defined for class and interfaces. It counts the number of classes or 441 interfaces that are declared. This is usually 1, but nested class declarations 442 will increase this number. 443 </body> 444 </html> 445 </xsl:template> 446 447 <!-- this is the stylesheet css to use for nearly everything --> 448 <xsl:template name="stylesheet.css"> 449 .bannercell { 450 border: 0px; 451 padding: 0px; 452 } 453 body { 454 margin-left: 10; 455 margin-right: 10; 456 font:normal 80% arial,helvetica,sanserif; 457 background-color:#FFFFFF; 458 color:#000000; 459 } 460 .a td { 461 background: #efefef; 462 } 463 .b td { 464 background: #fff; 465 } 466 th, td { 467 text-align: left; 468 vertical-align: top; 469 } 470 th { 471 font-weight:bold; 472 background: #ccc; 473 color: black; 474 } 475 table, th, td { 476 font-size:100%; 477 border: none 478 } 479 table.log tr td, tr th { 480 481 } 482 h2 { 483 font-weight:bold; 484 font-size:140%; 485 margin-bottom: 5; 486 } 487 h3 { 488 font-size:100%; 489 font-weight:bold; 490 background: #525D76; 491 color: white; 492 text-decoration: none; 493 padding: 5px; 494 margin-right: 2px; 495 margin-left: 2px; 496 margin-bottom: 0; 497 } 498 .Error { 499 font-weight:bold; color:red; 500 } 501 502 </xsl:template> 503 504 <!-- print the metrics of the class --> 505 <xsl:template match="class" mode="class.details"> 506 <!--xsl:variable name="package.name" select="(ancestor::package)[last()]/@name"/--> 507 <xsl:variable name="package.name" select="@package"/> 508 <HTML> 509 <HEAD> 510 <xsl:call-template name="create.stylesheet.link"> 511 <xsl:with-param name="package.name" select="$package.name"/> 512 </xsl:call-template> 513 </HEAD> 514 <BODY> 515 <xsl:call-template name="pageHeader"/> 516 517 <H3>Class <xsl:if test="not($package.name = 'unnamed package')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3> 518 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 519 <xsl:call-template name="all.metrics.header"/> 520 <xsl:apply-templates select="." mode="print.metrics"/> 521 </table> 522 523 <H3>Methods</H3> 524 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 525 <xsl:call-template name="method.metrics.header"/> 526 <xsl:apply-templates select="method" mode="print.metrics"/> 527 </table> 528 529 <xsl:call-template name="pageFooter"/> 530 </BODY> 531 </HTML> 532 </xsl:template> 533 534 535 <!-- list of classes in a package --> 536 <xsl:template match="package" mode="classes.list"> 537 <HTML> 538 <HEAD> 539 <xsl:call-template name="create.stylesheet.link"> 540 <xsl:with-param name="package.name" select="@name"/> 541 </xsl:call-template> 542 </HEAD> 543 <BODY> 544 <table width="100%"> 545 <tr> 546 <td nowrap="nowrap"> 547 <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="@name"/></a></H2> 548 </td> 549 </tr> 550 </table> 551 552 <H2>Classes</H2> 553 <TABLE WIDTH="100%"> 554 <!-- xalan-nodeset:nodeset for Xalan 1.2.2 --> 555 <xsl:for-each select="$doctree/classes/class[@package = current()/@name]"> 556 <xsl:sort select="@name"/> 557 <tr> 558 <td nowrap="nowrap"> 559 <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a> 560 </td> 561 </tr> 562 </xsl:for-each> 563 </TABLE> 564 </BODY> 565 </HTML> 566 </xsl:template> 567 568 569 <!-- 570 Creates an all-classes.html file that contains a link to all package-summary.html 571 on each class. 572 --> 573 <xsl:template match="metrics" mode="all.classes"> 574 <html> 575 <head> 576 <xsl:call-template name="create.stylesheet.link"> 577 <xsl:with-param name="package.name" select="''"/> 578 </xsl:call-template> 579 </head> 580 <body> 581 <h2>Classes</h2> 582 <table width="100%"> 583 <xsl:for-each select="$doctree/classes/class"> 584 <xsl:sort select="@name"/> 585 <xsl:apply-templates select="." mode="all.classes"/> 586 </xsl:for-each> 587 </table> 588 </body> 589 </html> 590 </xsl:template> 591 592 <xsl:template match="class" mode="all.classes"> 593 <xsl:variable name="package.name" select="@package"/> 594 <xsl:variable name="class.name" select="@name"/> 595 <tr> 596 <td nowrap="nowrap"> 597 <a target="classFrame"> 598 <xsl:attribute name="href"> 599 <xsl:if test="not($package.name='unnamed package')"> 600 <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text> 601 </xsl:if> 602 <xsl:value-of select="$class.name"/><xsl:text>.html</xsl:text> 603 </xsl:attribute> 604 <xsl:value-of select="$class.name"/> 605 </a> 606 </td> 607 </tr> 608 </xsl:template> 609 610 <!-- 611 Creates an html file that contains a link to all package-summary.html files on 612 each package existing on testsuites. 613 @bug there will be a problem here, I don't know yet how to handle unnamed package :( 614 --> 615 <xsl:template match="metrics" mode="all.packages"> 616 <html> 617 <head> 618 <xsl:call-template name="create.stylesheet.link"> 619 <xsl:with-param name="package.name" select="./package/@name"/> 620 </xsl:call-template> 621 </head> 622 <body> 623 <h2><a href="overview-summary.html" target="classFrame">Home</a></h2> 624 <h2>Packages</h2> 625 <table width="100%"> 626 <xsl:apply-templates select=".//package[not(./@name = 'unnamed package')]" mode="all.packages"> 627 <xsl:sort select="@name"/> 628 </xsl:apply-templates> 629 </table> 630 </body> 631 </html> 632 </xsl:template> 633 634 <xsl:template match="package" mode="all.packages"> 635 <tr> 636 <td nowrap="nowrap"> 637 <a href="{translate(@name,'.','/')}/package-summary.html" target="classFrame"> 638 <xsl:value-of select="@name"/> 639 </a> 640 </td> 641 </tr> 642 </xsl:template> 643 644 645 <xsl:template match="metrics" mode="overview.packages"> 646 <html> 647 <head> 648 <xsl:call-template name="create.stylesheet.link"> 649 <xsl:with-param name="package.name" select="''"/> 650 </xsl:call-template> 651 </head> 652 <body onload="open('allclasses-frame.html','classListFrame')"> 653 <xsl:call-template name="pageHeader"/> 654 <h3>Summary</h3> 655 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 656 <tr> 657 <th><a href="metrics-reference.html#V(G)">V(G)</a></th> 658 <th><a href="metrics-reference.html#LOC">LOC</a></th> 659 <th><a href="metrics-reference.html#DIT">DIT</a></th> 660 <th><a href="metrics-reference.html#NOA">NOA</a></th> 661 <th><a href="metrics-reference.html#NRM">NRM</a></th> 662 <th><a href="metrics-reference.html#NLM">NLM</a></th> 663 <th><a href="metrics-reference.html#WMC">WMC</a></th> 664 <th><a href="metrics-reference.html#RFC">RFC</a></th> 665 <th><a href="metrics-reference.html#DAC">DAC</a></th> 666 <th><a href="metrics-reference.html#FANOUT">FANOUT</a></th> 667 <th><a href="metrics-reference.html#CBO">CBO</a></th> 668 <th><a href="metrics-reference.html#LCOM">LCOM</a></th> 669 <th><a href="metrics-reference.html#NOCL">NOCL</a></th> 670 </tr> 671 <xsl:apply-templates select="." mode="print.metrics"/> 672 </table> 673 <table border="0" width="100%"> 674 <tr> 675 <td style="text-align: justify;"> 676 Note: Metrics evaluate the quality of software by analyzing the program source and quantifying 677 various kind of complexity. Complexity is a common source of problems and defects in software. 678 High complexity makes it more difficult to develop, understand, maintain, extend, test and debug 679 a program. 680 <p/> 681 The primary use of metrics is to focus your attention on those parts of code that potentially are 682 complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial 683 actions. 684 For additional information about metrics and their meaning, please consult 685 Metamata Metrics manual. 686 </td> 687 </tr> 688 </table> 689 690 <h3>Packages</h3> 691 <table border="0" cellpadding="5" cellspacing="2" width="100%"> 692 <xsl:call-template name="all.metrics.header"/> 693 <xsl:for-each select=".//package[not(@name = 'unnamed package')]"> 694 <xsl:sort select="@name" order="ascending"/> 695 <xsl:apply-templates select="." mode="print.metrics"/> 696 </xsl:for-each> 697 </table> 698 <!-- @bug there could some classes at this level (classes in unnamed package) --> 699 <xsl:call-template name="pageFooter"/> 700 </body> 701 </html> 702 </xsl:template> 703 704 <xsl:template match="package" mode="package.summary"> 705 <HTML> 706 <HEAD> 707 <xsl:call-template name="create.stylesheet.link"> 708 <xsl:with-param name="package.name" select="@name"/> 709 </xsl:call-template> 710 </HEAD> 711 <body onload="open('package-frame.html','classListFrame')"> 712 <xsl:call-template name="pageHeader"/> 713 <!-- create an anchor to this package name --> 714 <h3>Package <xsl:value-of select="@name"/></h3> 715 716 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 717 <xsl:call-template name="all.metrics.header"/> 718 <xsl:apply-templates select="." mode="print.metrics"/> 719 </table> 720 721 <table border="0" width="100%"> 722 <tr> 723 <td style="text-align: justify;"> 724 Note: Metrics evaluate the quality of software by analyzing the program source and quantifying 725 various kind of complexity. Complexity is a common source of problems and defects in software. 726 High complexity makes it more difficult to develop, understand, maintain, extend, test and debug 727 a program. 728 <p/> 729 The primary use of metrics is to focus your attention on those parts of code that potentially are 730 complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial 731 actions. 732 For additional information about metrics and their meaning, please consult 733 Metamata Metrics manual. 734 </td> 735 </tr> 736 </table> 737 738 <xsl:variable name="classes-in-package" select="$doctree/classes/class[@package = current()/@name]"/> 739 <xsl:if test="count($classes-in-package) > 0"> 740 <H3>Classes</H3> 741 <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> 742 <xsl:call-template name="all.metrics.header"/> 743 <xsl:for-each select="$classes-in-package"> 744 <xsl:sort select="@name"/> 745 <xsl:apply-templates select="." mode="print.metrics"/> 746 </xsl:for-each> 747 </table> 748 </xsl:if> 749 750 <xsl:call-template name="pageFooter"/> 751 </body> 752 </HTML> 753 </xsl:template> 754 755 756 <!-- 757 transform string like a.b.c to ../../../ 758 @param path the path to transform into a descending directory path 759 --> 760 <xsl:template name="path"> 761 <xsl:param name="path"/> 762 <xsl:if test="contains($path,'.')"> 763 <xsl:text>../</xsl:text> 764 <xsl:call-template name="path"> 765 <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param> 766 </xsl:call-template> 767 </xsl:if> 768 <xsl:if test="not(contains($path,'.')) and not($path = '')"> 769 <xsl:text>../</xsl:text> 770 </xsl:if> 771 </xsl:template> 772 773 774 <!-- create the link to the stylesheet based on the package name --> 775 <xsl:template name="create.stylesheet.link"> 776 <xsl:param name="package.name"/> 777 <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> 778 </xsl:template> 779 780 781 <!-- Page Header --> 782 <xsl:template name="pageHeader"> 783 784 <!-- jakarta logo --> 785 <table border="0" cellpadding="0" cellspacing="0" width="100%"> 786 <tr> 787 <td class="bannercell" rowspan="2"> 788 <a href="http://jakarta.apache.org/"> 789 <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/> 790 </a> 791 </td> 792 <td style="text-align:right"><h2>Source Code Metrics</h2></td> 793 </tr> 794 <tr> 795 <td style="text-align:right">Designed for use with <a href='http://www.webgain.com/products/quality_analyzer/'>Webgain QA/Metamata Metrics</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td> 796 </tr> 797 </table> 798 <hr size="1"/> 799 </xsl:template> 800 801 <!-- Page Footer --> 802 <xsl:template name="pageFooter"> 803 </xsl:template> 804 805 <!-- class header --> 806 <xsl:template name="all.metrics.header"> 807 <tr> 808 <th width="80%">Name</th> 809 <th nowrap="nowrap">V(G)</th> 810 <th>LOC</th> 811 <th>DIT</th> 812 <th>NOA</th> 813 <th>NRM</th> 814 <th>NLM</th> 815 <th>WMC</th> 816 <th>RFC</th> 817 <th>DAC</th> 818 <th>FANOUT</th> 819 <th>CBO</th> 820 <th>LCOM</th> 821 <th>NOCL</th> 822 </tr> 823 </xsl:template> 824 825 <!-- method header --> 826 <xsl:template name="method.metrics.header"> 827 <tr> 828 <th width="80%">Name</th> 829 <th nowrap="nowrap">V(G)</th> 830 <th>LOC</th> 831 <th>FANOUT</th> 832 <th>CBO</th> 833 </tr> 834 </xsl:template> 835 836 <!-- method information --> 837 <xsl:template match="method" mode="print.metrics"> 838 <tr> 839 <xsl:call-template name="alternate-row"/> 840 <td><xsl:apply-templates select="@name"/></td> 841 <td><xsl:apply-templates select="@vg"/></td> 842 <td><xsl:apply-templates select="@loc"/></td> 843 <td><xsl:apply-templates select="@fanout"/></td> 844 <td><xsl:apply-templates select="@cbo"/></td> 845 </tr> 846 </xsl:template> 847 848 <!-- class information --> 849 <xsl:template match="class" mode="print.metrics"> 850 <tr> 851 <xsl:call-template name="alternate-row"/> 852 <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td> 853 <td><xsl:apply-templates select="@vg"/></td> 854 <td><xsl:apply-templates select="@loc"/></td> 855 <td><xsl:apply-templates select="@dit"/></td> 856 <td><xsl:apply-templates select="@noa"/></td> 857 <td><xsl:apply-templates select="@nrm"/></td> 858 <td><xsl:apply-templates select="@nlm"/></td> 859 <td><xsl:apply-templates select="@wmc"/></td> 860 <td><xsl:apply-templates select="@rfc"/></td> 861 <td><xsl:apply-templates select="@dac"/></td> 862 <td><xsl:apply-templates select="@fanout"/></td> 863 <td><xsl:apply-templates select="@cbo"/></td> 864 <td><xsl:apply-templates select="@lcom"/></td> 865 <td><xsl:apply-templates select="@nocl"/></td> 866 </tr> 867 </xsl:template> 868 869 <xsl:template match="file|package" mode="print.metrics"> 870 <tr> 871 <xsl:call-template name="alternate-row"/> 872 <td> 873 <a href="{translate(@name,'.','/')}/package-summary.html" target="classFrame"> 874 <xsl:value-of select="@name"/> 875 </a> 876 </td> 877 <td><xsl:apply-templates select="@vg"/></td> 878 <td><xsl:apply-templates select="@loc"/></td> 879 <td><xsl:apply-templates select="@dit"/></td> 880 <td><xsl:apply-templates select="@noa"/></td> 881 <td><xsl:apply-templates select="@nrm"/></td> 882 <td><xsl:apply-templates select="@nlm"/></td> 883 <td><xsl:apply-templates select="@wmc"/></td> 884 <td><xsl:apply-templates select="@rfc"/></td> 885 <td><xsl:apply-templates select="@dac"/></td> 886 <td><xsl:apply-templates select="@fanout"/></td> 887 <td><xsl:apply-templates select="@cbo"/></td> 888 <td><xsl:apply-templates select="@lcom"/></td> 889 <td><xsl:apply-templates select="@nocl"/></td> 890 </tr> 891 </xsl:template> 892 893 <xsl:template match="metrics" mode="print.metrics"> 894 <tr> 895 <xsl:call-template name="alternate-row"/> 896 <!-- the global metrics is the top package metrics --> 897 <td><xsl:apply-templates select="./package/@vg"/></td> 898 <td><xsl:apply-templates select="./package/@loc"/></td> 899 <td><xsl:apply-templates select="./package/@dit"/></td> 900 <td><xsl:apply-templates select="./package/@noa"/></td> 901 <td><xsl:apply-templates select="./package/@nrm"/></td> 902 <td><xsl:apply-templates select="./package/@nlm"/></td> 903 <td><xsl:apply-templates select="./package/@wmc"/></td> 904 <td><xsl:apply-templates select="./package/@rfc"/></td> 905 <td><xsl:apply-templates select="./package/@dac"/></td> 906 <td><xsl:apply-templates select="./package/@fanout"/></td> 907 <td><xsl:apply-templates select="./package/@cbo"/></td> 908 <td><xsl:apply-templates select="./package/@lcom"/></td> 909 <td><xsl:apply-templates select="./package/@nocl"/></td> 910 </tr> 911 </xsl:template> 912 913 <!-- alternated row style --> 914 <xsl:template name="alternate-row"> 915 <xsl:attribute name="class"> 916 <xsl:if test="position() mod 2 = 1">a</xsl:if> 917 <xsl:if test="position() mod 2 = 0">b</xsl:if> 918 </xsl:attribute> 919 </xsl:template> 920 921 922 <!-- how to display the metrics with their max value --> 923 <!-- @todo the max values must be external to the xsl --> 924 925 <xsl:template match="@vg"> 926 <xsl:call-template name="display-value"> 927 <xsl:with-param name="value" select="current()"/> 928 <xsl:with-param name="max" select="$vg.max"/> 929 </xsl:call-template> 930 </xsl:template> 931 932 <xsl:template match="@loc"> 933 <xsl:call-template name="display-value"> 934 <xsl:with-param name="value" select="current()"/> 935 <xsl:with-param name="max" select="$loc.max"/> 936 </xsl:call-template> 937 </xsl:template> 938 939 <xsl:template match="@dit"> 940 <xsl:call-template name="display-value"> 941 <xsl:with-param name="value" select="current()"/> 942 <xsl:with-param name="max" select="$dit.max"/> 943 </xsl:call-template> 944 </xsl:template> 945 946 <xsl:template match="@noa"> 947 <xsl:call-template name="display-value"> 948 <xsl:with-param name="value" select="current()"/> 949 <xsl:with-param name="max" select="$noa.max"/> 950 </xsl:call-template> 951 </xsl:template> 952 953 <xsl:template match="@nrm"> 954 <xsl:call-template name="display-value"> 955 <xsl:with-param name="value" select="current()"/> 956 <xsl:with-param name="max" select="$nrm.max"/> 957 </xsl:call-template> 958 </xsl:template> 959 960 <xsl:template match="@nlm"> 961 <xsl:call-template name="display-value"> 962 <xsl:with-param name="value" select="current()"/> 963 <xsl:with-param name="max" select="$nlm.max"/> 964 </xsl:call-template> 965 </xsl:template> 966 967 <xsl:template match="@wmc"> 968 <xsl:call-template name="display-value"> 969 <xsl:with-param name="value" select="current()"/> 970 <xsl:with-param name="max" select="$wmc.max"/> 971 </xsl:call-template> 972 </xsl:template> 973 974 <xsl:template match="@rfc"> 975 <xsl:call-template name="display-value"> 976 <xsl:with-param name="value" select="current()"/> 977 <xsl:with-param name="max" select="$rfc.max"/> 978 </xsl:call-template> 979 </xsl:template> 980 981 <xsl:template match="@dac"> 982 <xsl:call-template name="display-value"> 983 <xsl:with-param name="value" select="current()"/> 984 <xsl:with-param name="max" select="$dac.max"/> 985 </xsl:call-template> 986 </xsl:template> 987 988 <xsl:template match="@fanout"> 989 <xsl:call-template name="display-value"> 990 <xsl:with-param name="value" select="current()"/> 991 <xsl:with-param name="max" select="$fanout.max"/> 992 </xsl:call-template> 993 </xsl:template> 994 995 <xsl:template match="@cbo"> 996 <xsl:call-template name="display-value"> 997 <xsl:with-param name="value" select="current()"/> 998 <xsl:with-param name="max" select="$cbo.max"/> 999 </xsl:call-template> 1000 </xsl:template> 1001 1002 <xsl:template match="@lcom"> 1003 <xsl:call-template name="display-value"> 1004 <xsl:with-param name="value" select="current()"/> 1005 <xsl:with-param name="max" select="$lcom.max"/> 1006 </xsl:call-template> 1007 </xsl:template> 1008 1009 <xsl:template match="@nocl"> 1010 <xsl:call-template name="display-value"> 1011 <xsl:with-param name="value" select="current()"/> 1012 <xsl:with-param name="max" select="$nocl.max"/> 1013 </xsl:call-template> 1014 </xsl:template> 1015 1016 <xsl:template name="display-value"> 1017 <xsl:param name="value"/> 1018 <xsl:param name="max"/> 1019 <xsl:if test="$value > $max"> 1020 <xsl:attribute name="class">Error</xsl:attribute> 1021 </xsl:if> 1022 <xsl:value-of select="$value"/> 1023 </xsl:template> 1024 1025 </xsl:stylesheet> 1026 1027