<?xml version="1.0"?>

<!-- 
/*
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * Licensed 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.
 */
 -->

<!--
  =============================================================================
    Checkstyle plugin for Maven.
  =============================================================================
-->
<project
  xmlns:j="jelly:core"
  xmlns:ant="jelly:ant"
  xmlns:util="jelly:util"
  xmlns:doc="doc">

  <!--
     ========================================================================
       Default goal.
     ========================================================================
  -->
  <goal name="checkstyle" description="Perform checkstyle checks"
      prereqs="checkstyle:report"/>

  <!--
     ========================================================================
       Initializations.
     ========================================================================
  -->
  <goal name="checkstyle:init">

    <j:if test="${sourcesPresent == 'true'}">

      <!-- If an explicit config file or URL is set then use that. If one isn't 
      	   then we will look for the maven.checkstyle.format property and
      	   load the predefined config set. -->
      <j:set var="checkstylePropertiesX" value="${maven.checkstyle.properties}X"/>
      <j:set var="checkstylePropertiesURLX" value="${maven.checkstyle.propertiesURL}X"/>
      <j:choose>
        <j:when test="${checkstylePropertiesX != 'X'}">
          <j:set
            var="checkstyleProperties"
            value="file:${maven.checkstyle.properties}"/>
          <util:replace oldChar="\\" newChar="/" value="${checkstyleProperties}" var="checkstyleProperties" />
        </j:when>
        <j:when test="${checkstylePropertiesURLX != 'X'}">
          <j:set
            var="checkstyleProperties"
            value="${maven.checkstyle.propertiesURL}"/>
        </j:when>
        <j:otherwise>
          <j:set
            var="checkstyleProperties"
            value="file:${plugin.resources}/${maven.checkstyle.format}_checks.xml"/>
          <util:replace oldChar="\\" newChar="/" value="${checkstyleProperties}" var="checkstyleProperties" />
        </j:otherwise>
      </j:choose>

      <ant:taskdef name="checkstyle"
        classname="com.puppycrawl.tools.checkstyle.CheckStyleTask">
        <ant:classpath>
          <ant:pathelement location="${plugin.getDependencyPath('checkstyle:checkstyle')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('checkstyle:checkstyle-optional')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('antlr:antlr')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('regexp:regexp')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('commons-beanutils:commons-beanutils')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('commons-collections:commons-collections')}"/>
          <ant:pathelement location="${plugin.getDependencyPath('commons-logging:commons-logging')}"/>
          <ant:path refid="maven.dependency.classpath"/>
          <ant:pathelement path="${maven.build.dest}"/>
        </ant:classpath>
      </ant:taskdef>

    </j:if>

  </goal>

  <!--
     ========================================================================
       Generate a checkstyle report by running checkstyle on the project
       source code.
     ========================================================================
  -->
  <goal name="checkstyle:report"
    description="Perform checkstyle checks"
    prereqs="checkstyle:init">

    <j:if test="${sourcesPresent == 'true'}">

      <util:file var="headerFile" name="${maven.checkstyle.header.file}"/>
      <j:if test="${!headerFile.exists()}">
        <ant:echo>
      =================================================================
      =                          W A R N I N G                        =
      =================================================================
      =  Your project doesn't contain a header file specified as:     =
      =  ${maven.checkstyle.header.file}
      =  Checkstyle needs it to check the existence of the License in =
      =  your source files. If it can't find this file, it throws an  =
      =  error.                                                       =
      =  A temporary solution is to create an empty LICENSE.txt file. =
      =  Though, we recommend that you edit this License.             =
      =================================================================
        </ant:echo>
        <j:if test="${!maven.build.dir.exists()}">
          <ant:mkdir dir="${maven.build.dir}"/>
        </j:if>
        <j:set var="maven.checkstyle.header.file" value="${maven.build.dir}/LICENSE_DUMMY.txt" />
        <j:file name="${maven.checkstyle.header.file}" />
      </j:if>

      <attainGoal name="checkstyle:run"/>
    </j:if>
    
  </goal>

  <goal name="checkstyle:run">

    <!-- Create the directory for the checkstyle cache in case it doesn't 
         exist already -->
    <ant:dirname property="maven.checkstyle.cache.dir" 
      file="${maven.checkstyle.cache.file}"/>
    <ant:mkdir dir="${maven.checkstyle.cache.dir}"/>

    <ant:echo>Using ${checkstyleProperties} for checkstyle ...</ant:echo>

    <ant:checkstyle
      configURL="${checkstyleProperties}"
      failOnViolation="${maven.checkstyle.fail.on.violation}">

      <property key="checkstyle.header.file" 
        file="${maven.checkstyle.header.file}"/>
      <property key="checkstyle.cache.file" 
        file="${maven.checkstyle.cache.file}"/>

      <util:tokenize var="sources.dirs" delim="${path.separator}">${context.getAntProject().getReferences().get('maven.compile.src.set')}</util:tokenize>
      <j:forEach var="dir" items="${sources.dirs}">
        <ant:fileset dir="${dir}"
	        includes="${maven.checkstyle.includes}"
	        excludes="${maven.checkstyle.excludes}">
          <!-- handle source modifications -->
  	      <j:if test="${pom.build.sourceModifications!=null &amp;&amp; !pom.build.sourceModifications.isEmpty()}">
            <j:forEach var="sm" items="${pom.build.sourceModifications}">
              <ant:available property="classPresent" classname="${sm.className}"/>
              <j:if test="${classPresent != 'true'}">
                <j:forEach var="exclude" items="${sm.excludes}">
                  <ant:exclude name="${exclude}"/>
                </j:forEach> <!-- end sourceModification exclude -->
                <j:forEach var="include" items="${sm.includes}">
                  <ant:include name="${include}"/>
                </j:forEach> <!-- end sourceModification include -->
              </j:if>
            </j:forEach> 
          </j:if> <!-- end sourceModification -->
        </ant:fileset>
      </j:forEach>

      <ant:classpath>
          <ant:path refid="maven.dependency.classpath"/>
          <ant:pathelement path="${maven.build.dest}"/>
      </ant:classpath>

      <ant:formatter type="xml"
        toFile="${maven.build.dir}/checkstyle-raw-report.xml"/>

      <j:choose>
        <j:when test="${maven.checkstyle.usefile}">
          <ant:formatter type="plain" 
            toFile="${maven.build.dir}/checkstyle-raw-report.txt"/>
        </j:when>
        <j:otherwise>
          <ant:formatter type="plain"/>
        </j:otherwise>
      </j:choose>

    </ant:checkstyle>
      
    <doc:jsl
      input="${maven.build.dir}/checkstyle-raw-report.xml"
      output="checkstyle-report.xml"
      stylesheet="${plugin.resources}/checkstyle.jsl"
      encoding="${maven.docs.outputencoding}"
      outputMode="xml"
      prettyPrint="true"/>

    <!-- Generate a RSS feed of the checktyle errors -->
    <doc:jsl
      input="${maven.build.dir}/checkstyle-raw-report.xml"
      output="checkstyle.rss"
      stylesheet="${plugin.resources}/checkstyle2rss.jsl"
      encoding="${maven.docs.outputencoding}"
      outputMode="xml"
      prettyPrint="true"/>

    <!-- Copy the RSS XML logo -->
    <mkdir dir="${maven.docs.dest}/images"/>
    <copy todir="${maven.docs.dest}/images" file="${plugin.resources}/images/rss.png"/>

  </goal>

  <!--
     ========================================================================
       Register a Checkstyle report to the "site" plugin.
     ========================================================================
  -->
  <goal name="maven-checkstyle-plugin:register">
    <j:if test="${sourcesPresent == 'true'}">
      <doc:registerReport 
        name="Checkstyle" 
        pluginName="checkstyle"
        link="checkstyle-report"
        description="Report on coding style conventions."/>
    </j:if>
  </goal>
  
  <!--
     ========================================================================
       Deregister a Checkstyle report to the "site" plugin.
     ========================================================================
  -->
  <goal name="maven-checkstyle-plugin:deregister">
    <j:if test="${sourcesPresent == 'true'}">
      <doc:deregisterReport name="Checkstyle"/>
    </j:if>
  </goal>

</project>

