<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="html" indent="yes"/>
    <xsl:decimal-format decimal-separator="." grouping-separator=","/>

    <xsl:key name="files" match="file" use="@name"/>

    <!-- Checkstyle XML Style Sheet by Stephane Bailliez <sbailliez@apache.org>         -->
    <!-- Part of the Checkstyle distribution found at http://checkstyle.sourceforge.net -->
    <!-- Usage (generates checkstyle_report.html):                                      -->
    <!--    <checkstyle failonviolation="false" config="${check.config}">               -->
    <!--      <fileset dir="${src.dir}" includes="**/*.java"/>                          -->
    <!--      <formatter type="xml" toFile="${doc.dir}/checkstyle_report.xml"/>         -->
    <!--    </checkstyle>                                                               -->
    <!--    <style basedir="${doc.dir}" destdir="${doc.dir}"                            -->
    <!--            includes="checkstyle_report.xml"                                    -->
    <!--            style="${doc.dir}/checkstyle-noframes-sorted.xsl"/>                 -->

    <xsl:template match="checkstyle">
        <html>
            <head>
                <style type="text/css">
                    .bannercell {
                    border: 0px;
                    padding: 0px;
                    }
                    body {
                    margin-left: 10;
                    margin-right: 10;
                    font:normal 80% arial,helvetica,sanserif;
                    background-color:#FFFFFF;
                    color:#000000;
                    }
                    .a td {
                    background: #efefef;
                    }
                    .b td {
                    background: #fff;
                    }
                    th, td {
                    text-align: left;
                    vertical-align: top;
                    }
                    th {
                    font-weight:bold;
                    background: #ccc;
                    color: black;
                    }
                    table, th, td {
                    font-size:100%;
                    border: none
                    }
                    table.log tr td, tr th {

                    }
                    h2 {
                    font-weight:bold;
                    font-size:140%;
                    margin-bottom: 5;
                    }
                    h3 {
                    font-size:100%;
                    font-weight:bold;
                    background: #525D76;
                    color: white;
                    text-decoration: none;
                    padding: 5px;
                    margin-right: 2px;
                    margin-left: 2px;
                    margin-bottom: 0;
                    }
                </style>
            </head>
            <body>
                <a name="top"></a>
                <!-- jakarta logo -->
                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tr>
                        <td class="bannercell" rowspan="2">
                            <!--a href="http://jakarta.apache.org/">
                            <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
                            </a-->
                        </td>
                        <td class="text-align:right">
                            <h2>CheckStyle Audit</h2>
                        </td>
                    </tr>
                    <tr>
                        <td class="text-align:right">Designed for use with
                            <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a>
                            and<a href='http://jakarta.apache.org'>Ant</a>.
                        </td>
                    </tr>
                </table>
                <hr size="1"/>

                <!-- Summary part -->
                <xsl:apply-templates select="." mode="summary"/>
                <hr size="1" width="100%" align="left"/>

                <!-- Package List part -->
                <xsl:apply-templates select="." mode="filelist"/>
                <hr size="1" width="100%" align="left"/>

                <!-- For each package create its part -->
                <xsl:apply-templates
                        select="file[@name and generate-id(.) = generate-id(key('files', @name))]"/>

                <hr size="1" width="100%" align="left"/>


            </body>
        </html>
    </xsl:template>


    <xsl:template match="checkstyle" mode="filelist">
        <h3>Files</h3>
        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
            <tr>
                <th>Name</th>
                <th>Errors</th>
            </tr>
            <xsl:for-each
                    select="file[@name and generate-id(.) = generate-id(key('files', @name))]">
                <xsl:sort data-type="number" order="descending"
                          select="count(key('files', @name)/error)"/>
                <xsl:variable name="errorCount" select="count(error)"/>
                <tr>
                    <xsl:call-template name="alternated-row"/>
                    <td>
                        <a href="#f-{@name}">
                            <xsl:value-of select="@name"/>
                        </a>
                    </td>
                    <td>
                        <xsl:value-of select="$errorCount"/>
                    </td>
                </tr>
            </xsl:for-each>
        </table>
    </xsl:template>


    <xsl:template match="file">
        <a name="f-{@name}"></a>
        <h3>File
            <xsl:value-of select="@name"/>
        </h3>

        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
            <tr>
                <th>Error Description</th>
                <th>Line</th>
            </tr>
            <xsl:for-each select="key('files', @name)/error">
                <xsl:sort data-type="number" order="ascending" select="@line"/>
                <tr>
                    <xsl:call-template name="alternated-row"/>
                    <td>
                        <xsl:value-of select="@message"/>
                    </td>
                    <td>
                        <xsl:value-of select="@line"/>
                    </td>
                </tr>
            </xsl:for-each>
        </table>
        <a href="#top">Back to top</a>
    </xsl:template>


    <xsl:template match="checkstyle" mode="summary">
        <h3>Summary</h3>
        <xsl:variable name="fileCount"
                      select="count(file[@name and generate-id(.) = generate-id(key('files', @name))])"/>
        <xsl:variable name="errorCount" select="count(file/error)"/>
        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
            <tr>
                <th>Files</th>
                <th>Errors</th>
            </tr>
            <tr>
                <xsl:call-template name="alternated-row"/>
                <td>
                    <xsl:value-of select="$fileCount"/>
                </td>
                <td>
                    <xsl:value-of select="$errorCount"/>
                </td>
            </tr>
        </table>
    </xsl:template>

    <xsl:template name="alternated-row">
        <xsl:attribute name="class">
            <xsl:if test="position() mod 2 = 1">a</xsl:if>
            <xsl:if test="position() mod 2 = 0">b</xsl:if>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>


