source: local/greenstone3/linux-32bit/apache-ant-1.9.2/etc/mmetrics-frames.xsl@ 28109

Last change on this file since 28109 was 28109, checked in by davidb, 11 years ago

Shift to newer version of ant

File size: 36.9 KB
Line 
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:[email protected]"/>
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>&#10;</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>
179This metric was introduced in the 1970s to measure the amount of control
180flow complexity or branching complexity in a module such as a
181subroutine. It gives the number of paths that may be taken through the
182code, and was initially developed to give some measure of the cost of
183producing a test case for the module by executing each path.
184<p/>
185Methods with a high cyclomatic complexity tend to be more difficult to
186understand and maintain. In general the more complex the methods of an
187application, the more difficult it will be to test it, and this will adversely
188affect its reliability.
189<p/>
190V(G) is a measure of the control flow complexity of a method or
191constructor. It counts the number of branches in the body of the method,
192defined as:
193<ul>
194<li>while statements;</li>
195<li>if statements;</li>
196<li>for statements.</li>
197</ul>
198
199The metric can also be configured to count each case of a switch
200statement as well.
201
202<a name="LOC"/>
203<h3>Lines of Code - LOC</h3>
204
205This is perhaps the simplest of all the metrics to define and compute.
206Counting lines has a long history as a software metric dating from before
207the rise of structured programming, and it is still in widespread use today.
208The size of a method affects the ease with which it can be understood, its
209reusability and its maintainability. There are a variety of ways that the size
210can be calculated. These include counting all the lines of code, the number
211of statements, the blank lines of code, the lines of commentary, and the
212lines consisting only of syntax such as block delimiters.
213<p/>
214This metric can also be used for sizing other constructs as well, for
215example, the overall size of a Java class or package can be measured by
216counting the number of source lines it consists of.
217<p/>
218LOC can be used to determine the size of a compilation unit (source file),
219class or interface, method, constructor, or field. It can be configured to
220ignore:
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
230This metric calculates how far down the inheritance hierarchy a class is
231declared. In Java all classes have java.lang.Object as their ultimate
232superclass, which is defined to have a depth of 1. So a class that
233immediately extends java.lang.Object has a metric value of 2; any of its
234subclasses will have a value of 3, and so on.
235<p/>
236A class that is deep within the tree inherits more methods and state
237variables, thereby increasing its complexity and making it difficult to
238predict its behavior. It can be harder to understand a system with many
239inheritance layers.
240<p/>
241DIT 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
251The number of distinct state variables in a class serves as one measure of
252its complexity. The more state a class represents the more difficult it is to
253maintain invariants for it. It also hinders comprehensibility and reuse.
254<p/>
255In Java, state can be exposed to subclasses through protected fields, which
256entails that the subclass also be aware of and maintain any invariants. This
257interference with the class's data encapsulation can be a source of defects
258and hidden dependencies between the state variables.
259<p/>
260NOA is defined for classes and interfaces. It counts the number of fields
261declared in the class or interface.
262
263<a name="NRM"/>
264<h3>Number of Remote Methods - NRM</h3>
265
266NRM is defined for classes. A remote method call is defined as an
267invocation 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
274The value is the count of all the remote method calls in all of the methods
275and constructors of the class.
276
277<a name="NLM"/>
278<h3>Number of Local Methods - NLM</h3>
279
280NLM is defined for classes and interfaces. A local method is defined as a
281method that is declared in the class or interface. NLM can be configured to
282include the local methods of all of the class's superclasses. Methods with
283public, protected, package and private visibility can be independently
284counted by setting configuration parameters.
285
286<a name="WMC"/>
287<h3>Weighted Methods per Class - WMC</h3>
288
289If the number of methods in a class can be determined during the design
290and modeling phase of a project, it can be used as a predictor of how
291much time and effort is needed to develop, debug and maintain it. This
292metric can be further refined by incorporating a weighting for the
293complexity of each method. The usual weighting is given by the cyclomatic
294complexity of the method.
295<p/>
296The subclasses of a class inherit all of its public and protected methods,
297and possibly its package methods as well, so the number of methods a
298class has directly impacts the complexity of its subclasses. Classes with
299large numbers of methods are often specific to a particular application,
300reducing the ability to reuse them.
301<p/>
302The definition of WMC is based upon NLM, and it provides the same
303configuration parameters for counting inherited methods and of varying
304visibility. The main difference is that NLM always counts each method as 1,
305whereas 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
316The response set of a class is the set of all methods that can be invoked as
317a result of a message sent to an object of the class. This includes methods
318in the class's inheritance hierarchy and methods that can be invoked on
319other objects. The Response For Class metric is defined to be size of the
320response set for the class. A class which provides a larger response set is
321considered to be more complex than one with a smaller response set.
322<p/>
323One reason for this is that if a method call on a class can result in a large
324number of different method calls on the target and other classes, then it
325can be harder to test the behavior of the class and debug problems. It will
326typically require a deeper understanding of the potential interactions that
327objects of the class can have with the rest of the system.
328<p/>
329RFC is defined as the sum of NLM and NRM for the class. The local methods
330include all of the public, protected, package and private methods, but not
331methods declared only in a superclass.
332
333<a name="DAC"/>
334<h3>Data Abstraction Coupling - DAC</h3>
335
336DAC is defined for classes and interfaces. It counts the number of reference
337types that are used in the field declarations of the class or interface. The
338component types of arrays are also counted. Any field with a type that is
339either a supertype or a subtype of the class is not counted.
340
341<a name="FANOUT"/>
342<h3>Fan Out - FANOUT</h3>
343
344FANOUT is defined for classes and interfaces, constructors and methods. It
345counts 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
353The component types of arrays are also counted. Any type that is either a
354supertype or a subtype of the class is not counted.
355
356<a name="CBO"/>
357<h3>Coupling Between Objects - CBO</h3>
358
359When one object or class uses another object or class they are said to be
360coupled. One major source of coupling is that between a superclass and a
361subclass. A coupling is also introduced when a method or field in another
362class is accessed, or when an object of another class is passed into or out
363of a method invocation. Coupling Between Objects is a measure of the
364non-inheritance coupling between two objects.
365<p/>
366A high value of coupling reduces the modularity of the class and makes
367reuse more difficult. The more independent a class is the more likely it is
368that it will be possible to reuse it in another part of the system. When a
369class is coupled to another class it becomes sensitive to changes in that
370class, thereby making maintenance for difficult. In addition, a class that is
371overly dependent on other classes can be difficult to understand and test in
372isolation.
373<p/>
374CBO is defined for classes and interfaces, constructors and methods. It
375counts 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
383It also counts:
384<ul>
385<li>types from which field and method selections are made</li>
386</ul>
387
388The component types of arrays are also counted. Any type that is either a
389supertype or a subtype of the class is not counted.
390
391<a name="LCOM"/>
392<h3>Lack of Cohesion Of Methods - LCOM</h3>
393
394The cohesion of a class is the degree to which its methods are related to
395each other. It is determined by examining the pattern of state variable
396accesses within the set of methods. If all the methods access the same state
397variables then they have high cohesion; if they access disjoint sets of
398variables then the cohesion is low. An extreme example of low cohesion
399would be if none of the methods accessed any of the state variables.
400
401If a class exhibits low method cohesion it indicates that the design of the
402class has probably been partitioned incorrectly, and could benefit by being
403split into more classes with individually higher cohesion. On the other
404hand, a high value of cohesion (a low lack of cohesion) implies that the
405class is well designed. A cohesive class will tend to provide a high degree
406of encapsulation, whereas a lack of cohesion decreases encapsulation and
407increases complexity.
408<p/>
409Another form of cohesion that is useful for Java programs is cohesion
410between nested and enclosing classes. A nested class that has very low
411cohesion with its enclosing class would probably better designed as a peer
412class rather than a nested class.
413<p/>
414LCOM is defined for classes. Operationally, LCOM takes each pair of
415methods in the class and determines the set of fields they each access. If
416they have disjoint sets of field accesses increase the count P by one. If they
417share at least one field access then increase Q by one. After considering
418each pair of methods,
419LCOM = (P > Q) ? (P - Q) : 0
420<p/>
421Indirect access to fields via local methods can be considered by setting a
422metric configuration parameter.
423
424<a name="NOC"/>
425<h3>Number Of Classes - NOC</h3>
426
427The overall size of the system can be estimated by calculating the number
428of classes it contains. A large system with more classes is more complex
429than a smaller one because the number of potential interactions between
430objects is higher. This reduces the comprehensibility of the system which
431in turn makes it harder to test, debug and maintain.
432<p/>
433If the number of classes in the system can be projected during the initial
434design phase of the project it can serve as a base for estimating the total
435effort and cost of developing, debugging and maintaining the system.
436<p/>
437The NOC metric can also usefully be applied at the package and class level
438as well as the total system.
439<p/>
440NOCL is defined for class and interfaces. It counts the number of classes or
441interfaces that are declared. This is usually 1, but nested class declarations
442will 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) &gt; 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
Note: See TracBrowser for help on using the repository browser.