<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
 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.    
-->

<!-- Build file for Velocity -->

<!-- This project has its basedir set to the root directory   -->
<!-- of the velocity distribution. This is necessary so that  -->
<!-- all the code that uses relative directory references     -->
<!-- (like the tests) can be run in the same way when using   -->
<!-- the ant based build and the maven based build.           -->
<!-- *** DO NOT CHANGE THIS SETTING LIGHTLY! ***              -->

<project name="Apache Velocity" default="world" basedir=".."
  xmlns:artifact="urn:maven-artifact-ant"
  xmlns:bundlor="antlib:com.springsource.bundlor.ant">

  <path id="basedir-os">
    <pathelement location="${basedir}" />
  </path>
  <!-- This is the relative base dir. This must be the root of the   -->
  <!-- Velocity distribution. All relative pathes are prefixed with  -->
  <!-- velocity.dir                                                  -->
  <pathconvert property="velocity.dir" refid="basedir-os" targetos="unix"/>

  <!-- Give user a chance to override without editing this file
       (and without typing -D each time it compiles it -->
  <property file="${user.home}/.ant.properties" />
  <property file="${user.home}/build.properties" />
  <property file=".ant.properties" />

  <!-- This file contains all the defaults for building Velocity -->
  <property file="build/build.properties" />

  <property name="parserjj.file"  value="${build.parser}/Parser.jj" />
  <property name="parserjjt.file" value="${src.parser.dir}/Parser.jjt" />

  <!-- =================================================================== -->
  <!-- prints the targets available in this build file                     -->
  <!-- =================================================================== -->
  <target name="help">

    <echo>
  ****************************************************************************
  **
  **  help is no longer supported. Please run 'ant -projecthelp'
  **
  ***************************************************************************
    </echo>
  </target>

  <target name="world" depends="jar,test,javadocs,docs,env"
          description="Build the Velocity Jar and Documentation"/>

  <!-- =================================================================== -->
  <!-- prints the environment                                              -->
  <!-- =================================================================== -->
  <target name="env" description="Prints build parameters">
    <echo>
  Global settings:
    java.home = ${java.home}
    user.home = ${user.home}
    java.class.path = ${java.class.path}

  Velocity settings:
    Version:     ${version}
    Debug:       ${debug}
    Optimize:    ${optimize}
    Deprecation: ${deprecation}

  Target settings (relative to build tree root):
    Velocity Source:       ${build.src}
    Velocity Classes:      ${build.dest}
    Velocity API Docs:     ${build.javadoc}
    Velocity Docs:         ${build.docs}
    Velocity Test Reports: ${build.test.reports}
    </echo>
  </target>

  <!-- =================================================================== -->
  <!-- Prepares the build directory                                        -->
  <!-- =================================================================== -->
  <target name="prepare" depends="basic-prepare,prepare-jdbc,prepare-jdk14"/>

  <!-- =================================================================== -->
  <!-- sets up the build trees for sources and tests                       -->
  <!-- =================================================================== -->
  <target name="basic-prepare">
    <tstamp>
      <format property="build.time" pattern="yyyy-MM-dd HH:mm:ss" />
      <format property="build.year" pattern="yyyy"/>
    </tstamp>
    <filter token="build.year" value="${build.year}"/>
    <filter token="build.version" value="${version}"/>
    <filter token="build.time" value="${build.time}"/>

    <mkdir dir="${build.dir}"/>
    <mkdir dir="${build.dest}"/>
    <mkdir dir="${build.src}"/>
    <mkdir dir="${build.test.src}"/>
    <mkdir dir="${build.test.dest}"/>

    <copy todir="${build.src}" filtering="yes">
      <fileset dir="${src.java.dir}">
        <include name="**/*.java"/>
        <exclude name="**/DataSourceResourceLoader.java"/>
        <exclude name="**/JdkLogChute.java"/>
      </fileset>
    </copy>

    <filter token="test.dir" value="${test.dir}"/>
    <filter token="build.test" value="${build.test}"/>

    <copy todir="${build.test.src}" filtering="yes">
      <fileset dir="${test.java.dir}">
        <include name="**/*.java"/>
        <exclude name="**/WrappedExceptionTestCase.java"/>
        <exclude name="**/sql/*.java"/>
      </fileset>
    </copy>
  </target>

  <!-- =================================================================== -->
  <!-- sets up the build environment (classpath and libs)                  -->
  <!-- =================================================================== -->
  <target name="build-prepare">
    <ant antfile="${velocity.build.dir}/download.xml" target="build-download" />

    <!-- Build classpath -->
    <path id="velocity.build.classpath">
      <fileset dir="${build.lib}">
        <include name="**/*.jar"/>
      </fileset>
    </path>

    <!-- Test classpath, contains dependencies needed only for Testing -->
    <path id="velocity.test.classpath">
      <fileset dir="${build.test.lib}">
        <include name="**/*.jar"/>
      </fileset>
    </path>

    <path id="velocity.run.classpath">
      <path refid="velocity.build.classpath"/>
      <pathelement location="${build.dir}/${final.name}.jar"/>
    </path>
  </target>

  <!-- =================================================================== -->
  <!-- checks for the existence/non-existence of various java features     -->
  <!--                                                                     -->
  <!-- currently checks for                                                -->
  <!--  * javax.sql.Datasource (JDK1.4+, JDK1.3+JDBC2.0, J2EE 1.3+)        -->
  <!--  * java.util.logging.Logger (JDK 1.4+)                              -->
  <!-- =================================================================== -->

  <target name="prepare-jdbc" depends="check-jdbc,check-jdbc-true,check-jdbc-false"/>
  <target name="prepare-jdk14" depends="check-jdk14,check-jdk14-true,check-jdk14-false"/>

  <target name="check-jdbc" depends="build-prepare">
    <!--  note: check to see if required class is available.  -->
    <!-- might be j2ee.jar, jdbc2_0-stdext.jar, or simply JDK 1.4+ -->
    <available classname="javax.sql.DataSource"
               property="jdbc.present">
      <classpath refid="velocity.build.classpath"/>
    </available>
  </target>

  <target name="check-jdbc-true" if="jdbc.present">
    <copy todir="${build.src}" filtering="yes">
      <fileset dir="${src.java.dir}">
        <include name="**/DataSourceResourceLoader.java"/>
      </fileset>
    </copy>
    <copy todir="${build.test.src}" filtering="yes">
      <fileset dir="${test.java.dir}">
        <include name="**/sql/*.java"/>
      </fileset>
    </copy>
  </target>

  <target name="check-jdbc-false" unless="jdbc.present">
    <echo level="warning">
  ********************************************************
  **
  ** The javax.sql.Datasource class has not been found on
  ** your classpath. This means that your newly built
  ** Velocity jar will not contain the JDBC based resource
  ** loaders. If this is a problem, please use a JDK for
  ** building that contains the javax.sql.Datasource class.
  **
  ********************************************************
    </echo>
  </target>

  <target name="check-jdk14" depends="build-prepare">
     <available classname="java.util.logging.Logger"
               property="jdk14.present">
      <classpath refid="velocity.build.classpath"/>
    </available>
  </target>

  <target name="check-jdk14-true" if="jdk14.present">
    <copy todir="${build.src}" filtering="yes">
      <fileset dir="${src.java.dir}">
        <include name="**/JdkLogChute.java"/>
      </fileset>
    </copy>
    <copy todir="${build.test.src}" filtering="yes">
      <fileset dir="${test.java.dir}">
        <include name="**/WrappedExceptionTestCase.java"/>
      </fileset>
    </copy>
  </target>

  <target name="check-jdk14-false" unless="jdk14.present">
    <echo level="warning">
  ********************************************************
  **
  ** The java.util.logging.Logger class has not been found on your
  ** classpath. This means that your newly built Velocity jar will
  ** not contain JDK 1.4 compatible logging code. If this is a
  ** problem, please use a 1.4 or newer JDK for building.
  **
  ********************************************************
    </echo>
  </target>

  <!-- =================================================================== -->
  <!-- Compiles the source tree and the tests                              -->
  <!-- =================================================================== -->
  <target name="compile" depends="compile-src,compile-test"/>

  <target name="compile-src" depends="prepare,build-prepare,check-jdbc,check-jdk14"
          description="Compiles the Velocity source">
    <javac srcdir="${build.src}"
      destdir="${build.dest}"
      encoding="UTF-8"
      debug="${debug}"
      target="${javac.target}"
      source="${javac.source}"
      deprecation="${deprecation}"
      optimize="${optimize}"
      classpathref="velocity.build.classpath"/>

    <copy todir="${build.dest}" filtering="yes">
      <fileset dir="${src.java.dir}">
        <include name="**/*.properties"/>
      </fileset>
    </copy>

  </target>

  <target name="compile-test" depends="prepare,build-prepare,compile-src"
          description="Compiles the Velocity test classes">
    <javac srcdir="${build.test.src}"
      destdir="${build.test.dest}"
      encoding="UTF-8"
      debug="${debug}"
      deprecation="${deprecation}"
      optimize="${optimize}">

      <!-- Don't use the run classpath, build using the exploded class tree -->
      <classpath>
        <path refid="velocity.build.classpath"/>
        <path refid="velocity.test.classpath" />
        <pathelement location="${build.dest}"/>
      </classpath>
    </javac>

    <copy todir="${build.test.dest}" filtering="yes">
      <fileset dir="${test.java.dir}">
        <include name="**/*.properties"/>
      </fileset>
    </copy>
  </target>

  <!-- =================================================================== -->
  <!-- rebuilds the JJTree/JavaCC based parser                             -->
  <!-- =================================================================== -->
  <target name="parser" depends="parser-check,jjtree,javacc,javacc-cleanup"
          description="Rebuilds the JJTree/JavaCC based parser" />

  <target name="parser-check">
    <condition property="javacc-home-unset">
      <equals arg1="${javacc.home}" arg2="*unset*" />
    </condition>

    <fail if="javacc-home-unset">
      Could not run javacc:
  ***********************************************************
  ** You have not configured your JavaCC installation
  ** location in the javacc.home property.
  ***********************************************************
    </fail>

    <condition property="parser-task-runnable">
      <and>
        <available file="${javacc.home}" type="dir"/>

        <!-- specify ant versions in the negative, to allow future upgrades-->
        <not>
          <or>
            <contains string="${ant.version}" substring="1.2"/>
            <contains string="${ant.version}" substring="1.3"/>
            <contains string="${ant.version}" substring="1.4"/>
            <contains string="${ant.version}" substring="1.5"/>
          </or>
        </not>
      </and>
    </condition>

    <fail unless="parser-task-runnable">
      Could not run javacc:
  ***********************************************************
  **
  ** JavaCC 3.2 or later must be installed at ${javacc.home}.
  ** Ant must be at least version 1.6.x.
  **
  ***********************************************************
    </fail>

    <echo>
  ***********************************************************
  ** Creating Parser.jj and Parser.java in source tree.
  **
  ** Note: ASTNode files generated by jjtree are
  ** not generated with this task.  To create new ASTNode files,
  ** run jjtree manually then copy the relevant files into
  ** the runtime/parser/node directory (deleting all other
  ** generated files).
  **
  ***********************************************************
    </echo>
<!--  uncomment if generating the parser outside the source tree
    <mkdir dir="${build.parser}"/>
    <copy todir="${build.parser}" filtering="no">
      <fileset dir="${build.src}/org/apache/velocity/runtime/parser">
        <include name="**/*"/>
      </fileset>
    </copy>
-->
  </target>

  <target name="jjtree" depends="parser-check">
    <delete file="${parserjj.file}" />
    <jjtree
      target="${parserjjt.file}"
      outputdirectory="${build.parser}"
      javacchome="${javacc.home}"
      buildnodefiles="false" />
  </target>

  <target name="javacc" depends="parser-check">
    <javacc target="${parserjj.file}"
            outputdirectory="${build.parser}"
            javacchome="${javacc.home}" />
    <replace file="${src.java.dir}/org/apache/velocity/runtime/parser/ParserTokenManager.java" 
             token="StringBuffer" 
             value="StrBuilder"/>        
  </target>

   <target name="javacc-cleanup" depends="parser-check">   
       <delete>
           <fileset dir="${src.java.dir}/org/apache/velocity/runtime/parser/">  
               <include name="Node.java"/>
               <include name="ParserVisitor.java"/>
           </fileset>
       </delete>
   </target>

  <!-- ================================================================ -->
  <!--   Gets the classes we need from the various support jars         -->
  <!-- ================================================================ -->
  <target name="build-dependency-classes">
    <mkdir dir="${build.deps}"/>
    <unzip src="${jar.commons-collections.dir}/${jar.commons-collections.name}-${jar.commons-collections.version}.jar" dest="${build.deps}">
    <!--  we only want a few files from commons collections -->
      <patternset>
        <include name="org/apache/commons/collections/BoundedMap.class" />
        <include name="org/apache/commons/collections/ExtendedProperties*.class" />
        <include name="org/apache/commons/collections/IterableMap.class" />
        <include name="org/apache/commons/collections/iterators/AbstractEmptyIterator.class" />
        <include name="org/apache/commons/collections/iterators/EmptyIterator.class" />
        <include name="org/apache/commons/collections/iterators/EmptyMapIterator.class" />
        <include name="org/apache/commons/collections/iterators/EmptyOrderedIterator.class" />
        <include name="org/apache/commons/collections/iterators/EmptyOrderedMapIterator.class" />
        <include name="org/apache/commons/collections/KeyValue.class" />
        <include name="org/apache/commons/collections/map/AbstractHashedMap*.class" />
        <include name="org/apache/commons/collections/map/AbstractLinkedMap*.class" />
        <include name="org/apache/commons/collections/map/LRUMap.class" />
        <include name="org/apache/commons/collections/MapIterator.class" />
        <include name="org/apache/commons/collections/OrderedMap.class" />
        <include name="org/apache/commons/collections/OrderedMapIterator.class" />
        <include name="org/apache/commons/collections/OrderedIterator.class" />
        <include name="org/apache/commons/collections/ResettableIterator.class" />
      </patternset>
    </unzip>

    <unzip src="${jar.oro.dir}/${jar.oro.name}-${jar.oro.version}.jar"  dest="${build.deps}"/>
    <unzip src="${jar.commons-lang.dir}/${jar.commons-lang.name}-${jar.commons-lang.version}.jar" dest="${build.deps}"/>
    <delete dir="${build.deps}/META-INF" quiet="true"/>
  </target>

  <target name="clean-dependency-classes">
    <delete dir="${build.deps}" quiet="true"/>
    <mkdir dir="${build.deps}"/>
  </target>

  <!-- =================================================================== -->
  <!-- Compiles the source directory and creates a .jar file               -->
  <!-- including the Oro and logkit dependencies for convenience           -->
  <!-- =================================================================== -->
  <target name="jar-dep" depends="compile-src,build-dependency-classes"
          description="Builds the Velocity Jar file including all dependencies">
    <property name="jarname" value="${project}-${version}-dep" />
    <property name="bundlename" value="${project}-dep" />
    <property name="bundleimport" value="${dep.import}" />
    <property name="bundleexport" value="${dep.export}" />
    <antcall target="build-jar" />
  </target>

  <!-- =================================================================== -->
  <!-- Compiles the source directory and creates a .jar file               -->
  <!-- =================================================================== -->
  <target name="jar" depends="compile-src,clean-dependency-classes"
          description="Builds the Velocity Jar file">
    <property name="jarname" value="${final.name}" />
    <property name="bundlename" value="${project}" />
    <property name="bundleimport" value="${import}" />
    <property name="bundleexport" value="${export}" />
    <antcall target="build-jar" />
  </target>

  <!-- =================================================================== -->
  <!-- build the jar file. Don't call this target directly, it relies on   -->
  <!-- the jar contents and ${jarname} being setup by jar or jar-dep       -->
  <!-- =================================================================== -->
  <target name="build-jar">
    <jar jarfile="${build.dir}/${jarname}.jar">

      <metainf dir="${velocity.dir}">
        <include name="LICENSE"/>
        <include name="NOTICE"/>
      </metainf>

      <fileset dir="${build.dest}"/>
      <fileset dir="${build.deps}"/>
      <manifest>
        <attribute name="Created-By" value="Apache Ant"/>
        <attribute name="Package" value="org.apache.velocity"/>
        <attribute name="Build-Jdk" value="${java.version}"/>
        <attribute name="Extension-Name" value="${project}"/>
        <attribute name="Specification-Title" value="Velocity is a Java-based template engine" />
        <attribute name="Specification-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Title" value="org.apache.velocity"/>
        <attribute name="Implementation-Vendor-Id" value="org.apache"/>
        <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Version" value="${version}"/>
        <attribute name="Bundle-ManifestVersion" value="2"/>
        <attribute name="Bundle-Name" value="${ant.project.name}"/>
        <attribute name="Bundle-Vendor" value="Apache Software Foundation"/>
        <attribute name="Bundle-SymbolicName" value="org.apache.${bundlename}"/>
        <attribute name="Bundle-Version" value="${version}"/>
        <attribute name="Import-Package" value="${bundleimport}"/>
        <attribute name="Export-Package" value="${bundleexport}"/>
      </manifest>
    </jar>
    <antcall target="bundlor"/>
    <checksum file="${build.dir}/${jarname}.jar" algorithm="md5" property="checksum.jar.md5"/>
    <checksum file="${build.dir}/${jarname}.jar" algorithm="sha1" property="checksum.jar.sha1"/>
    <echo message="${checksum.jar.md5} *${jarname}.jar" file="${build.dir}/${jarname}.jar.md5" />
    <echo message="${checksum.jar.sha1} *${jarname}.jar" file="${build.dir}/${jarname}.jar.sha1" />
  </target>

  <target name="bundlor" if="build.osgi">
    <echo>
    This build will be made ready for use with OSGi,
    so long as you configure the "bundlor.home" property.
    You can download Bundlor from: http://www.springsource.org/bundlor
    Or you can disable this part of the build by
    setting "no.osgi" to true in your properties. (Do not do this for releases!)
    </echo>
    <taskdef resource="com/springsource/bundlor/ant/antlib.xml"
        uri="antlib:com.springsource.bundlor.ant">
      <classpath id="bundlor.classpath">
        <fileset dir="${bundlor.home}/dist"/>
        <fileset dir="${bundlor.home}/lib"/>
      </classpath>
    </taskdef>
    <bundlor:bundlor
        inputPath="${build.dir}/${jarname}.jar"
        outputPath="${build.dir}/${jarname}.jar"
        bundleVersion="${version}">
      <property name="name" value="${ant.project.name}" />
      <property name="bundlename" value="org.apache.${bundlename}" />
      <manifestTemplate>
      </manifestTemplate>
    </bundlor:bundlor>
  </target>

  <target name="use-osgi" unless="no.osgi">
    <property name="build.osgi" value="true"/>
  </target>

  <target name="if-no-osgi" unless="build.osgi">
    <echo>
    This build is not be ready for use with OSGi,
    unless you add the "build.osgi" property and configure
    the "bundlor.home" property to point to the Bundlor resources.
    You can download Bundlor from: http://www.springsource.org/bundlor
    </echo>
  </target>

  <!-- ================================================================== -->
  <!-- jars the source                                                    -->
  <!-- ================================================================== -->
  <target name="jar-src"
          depends="prepare"
          description="Builds the Velocity Source Jar File">
    <jar jarfile="${build.dir}/${final.name}-sources.jar">
      <metainf dir="${velocity.dir}">
        <include name="LICENSE"/>
        <include name="NOTICE"/>
      </metainf>

      <fileset dir="${build.src}"/>
      <manifest>
        <attribute name="Created-By" value="Apache Ant"/>
        <attribute name="Specification-Title" value="Velocity is a Java-based template engine" />
        <attribute name="Specification-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Title" value="org.apache.velocity"/>
        <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Vendor-Id" value="org.apache"/>
        <attribute name="Implementation-Version" value="${version}"/>
      </manifest>
    </jar>
    <checksum file="${build.dir}/${final.name}-sources.jar" algorithm="md5" property="checksum.jar-src.md5"/>
    <checksum file="${build.dir}/${final.name}-sources.jar" algorithm="sha1" property="checksum.jar-src.sha1"/>
    <echo message="${checksum.jar-src.md5} *${final.name}-sources.jar" file="${build.dir}/${final.name}-sources.jar.md5" />
    <echo message="${checksum.jar-src.sha1} *${final.name}-sources.jar" file="${build.dir}/${final.name}-sources.jar.sha1" />
  </target>

  <!-- =================================================================== -->
  <!-- Compiles the example code                                           -->
  <!-- =================================================================== -->
  <target name="examples" depends="build-prepare,jar"
          description="Compiles the Velocity Example code">

    <echo>
      **************************************************************
      ** Building the examples :
      **   examples/app_example1 : application example
      **   examples/app_example2 : application example
      **   examples/context_example : example context implementations
      **   examples/logger_example : how to make an external logger
      **   examples/xmlapp_example : how to access XML data in a template
      **   examples/event_example : how to use Velocity's event handlers
      **************************************************************
    </echo>

    <javac srcdir="${example.dir}/app_example1
                  :${example.dir}/app_example2
                  :${example.dir}/context_example
                  :${example.dir}/logger_example
                  :${example.dir}/xmlapp_example
                  :${example.dir}/event_example"
      encoding="UTF-8"
      debug="${debug}"
      deprecation="${deprecation}"
      optimize="${optimize}"
      classpathref="velocity.run.classpath"/>
  </target>

  <target name="examples-clean" depends="examples-clean-anakia">
    <delete quiet="true">
      <fileset dir="${example.dir}" includes="**/*.class">
        <include name="**/*.log"/>
      </fileset>
    </delete>
  </target>

  <target name="examples-clean-anakia">
    <delete dir="${example.dir}/anakia/docs" quiet="true"/>
  </target>

  <!-- =================================================================== -->
  <!-- Creates the API documentation                                       -->
  <!-- =================================================================== -->
  <target name="javadocs" depends="prepare,build-prepare"
          description="Creates the Javadoc API documentation">

    <mkdir dir="${build.javadoc}"/>

    <javadoc sourcepath="${build.src}"
             packagenames="org.apache.velocity.*"
             destdir="${build.javadoc}"
             author="true"
             private="false"
             version="true"
             use="true"
             windowtitle="${name} ${version} API"
             doctitle="${name} ${version} API"
             encoding="UTF-8"
             docencoding="UTF-8"
             bottom="Copyright &#169; 2000-${build.year} &lt;a href=&quot;http://www.apache.org/&quot;&gt;Apache Software Foundation&lt;/a&gt;. All Rights Reserved."
             classpathref="velocity.build.classpath">

      <link href="${javadocs.ref.jsdk}"/>
      <link href="http://www.jdom.org/docs/apidocs"/>
      <link href="http://logging.apache.org/log4j/docs/api"/>
      <link href="http://excalibur.apache.org/apidocs"/>
      <link href="http://tomcat.apache.org/tomcat-4.1-doc/servletapi"/>
      <link href="http://jakarta.apache.org/oro/api"/>
      <link href="http://jakarta.apache.org/commons/lang/api-release"/>
      <link href="http://jakarta.apache.org/commons/collections/api-release"/>
    </javadoc>

    <jar jarfile="${build.dir}/${final.name}-javadoc.jar">
      <fileset dir="${build.javadoc}"/>
      <manifest>
        <attribute name="Created-By" value="Apache Ant"/>
        <attribute name="Specification-Title" value="Velocity is a Java-based template engine" />
        <attribute name="Specification-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Title" value="org.apache.velocity"/>
        <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
        <attribute name="Implementation-Vendor-Id" value="org.apache"/>
        <attribute name="Implementation-Version" value="${version}"/>
      </manifest>
    </jar>

    <checksum file="${build.dir}/${final.name}-javadoc.jar" algorithm="md5" property="checksum.jar-javadoc.md5"/>
    <checksum file="${build.dir}/${final.name}-javadoc.jar" algorithm="sha1" property="checksum.jar-javadoc.sha1"/>
    <echo message="${checksum.jar-javadoc.md5} *${final.name}-javadoc.jar" file="${build.dir}/${final.name}-javadoc.jar.md5" />
    <echo message="${checksum.jar-javadoc.sha1} *${final.name}-javadoc.jar" file="${build.dir}/${final.name}-javadoc.jar.sha1" />
  </target>

  <target name="javadocs-clean">
    <delete dir="${build.javadoc}" quiet="true"/>
  </target>

  <!-- =================================================================== -->
  <!-- Prepares the Maven POM file for "release" target                    -->
  <!-- =================================================================== -->
  <target name="pom" description="Gets the POM ready to be distributed">
    <!-- Create a distribution ready POM -->
    <copy file="pom.xml" tofile="${build.dir}/${final.name}.pom"/>

    <!-- Create checksums for the binary distribution files -->
    <checksum file="${build.dir}/${final.name}.pom" algorithm="md5" fileext=".md5"/>
    <checksum file="${build.dir}/${final.name}.pom" algorithm="sha1" fileext=".sha1"/>
  </target>

  <!-- =================================================================== -->
  <!-- Prepare Maven environment                                           -->
  <!-- =================================================================== -->

  <target name="maven-prepare">
    <ant antfile="${velocity.build.dir}/download.xml" target="build-download" />

    <path id="maven-ant-tasks.classpath" path="${build.lib}/maven-ant-tasks-${jar.maven.ant.version}.jar"/>
    <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
               uri="urn:maven-artifact-ant"
               classpathref="maven-ant-tasks.classpath"/>

    <artifact:install-provider artifactId="wagon-ssh" version="${wagon-ssh.version}"/>

    <artifact:pom file="${maven.pom}" id="maven.project"/>
  </target>

  <!-- =================================================================== -->
  <!-- Install Maven artifacts                                             -->
  <!-- =================================================================== -->
  <target name="maven-install" depends="maven-prepare,release" 
    description="Installs the Maven artifacts in local repository">

    <artifact:install file="${build.dir}/${project}-${version}.jar" >
      <pom refid="maven.project"/>
      <attach file="${build.dir}/${project}-${version}-sources.jar" type="jar" classifier="sources"/>
      <attach file="${build.dir}/${project}-${version}-dep.jar" type="jar" classifier="dep"/>
      <attach file="${build.dir}/${project}-${version}-javadoc.jar" type="jar" classifier="javadoc"/>
    </artifact:install>
  </target>

  <!-- =================================================================== -->
  <!-- Deploy Maven artifacts  - custom repository                        -->
  <!-- =================================================================== -->
  <target name="maven-deploy-custom-repository" depends="maven-prepare" if="maven.remote.repository"
    description="Deploys the Maven artifacts in local repository">

    <echo>Deploying to ${maven.remote.repository}</echo>

    <artifact:deploy file="${build.dir}/${project}-${version}.jar" >
        <remoteRepository id="velocity.custom.repository" url="${maven.remote.repository}"/>
        <pom refid="maven.project"/>
        <attach file="${build.dir}/${project}-${version}-sources.jar" type="jar" classifier="sources"/>
        <attach file="${build.dir}/${project}-${version}-dep.jar" type="jar" classifier="dep"/>
        <attach file="${build.dir}/${project}-${version}-javadoc.jar" type="jar" classifier="javadoc"/>
    </artifact:deploy>
  </target>

  <!-- =================================================================== -->
  <!-- Deploy Maven artifacts - Apache Maven repository                   -->
  <!-- =================================================================== -->
  <target name="maven-deploy-apache-repository" depends="maven-prepare" unless="maven.remote.repository"
    description="Deploys the Maven artifacts in apache repository">

    <echo>Deploying to Apache Maven repository</echo>

    <artifact:deploy file="${build.dir}/${project}-${version}.jar" >
        <pom refid="maven.project"/>
        <attach file="${build.dir}/${project}-${version}-sources.jar" type="jar" classifier="sources"/>
        <attach file="${build.dir}/${project}-${version}-dep.jar" type="jar" classifier="dep"/>
        <attach file="${build.dir}/${project}-${version}-javadoc.jar" type="jar" classifier="javadoc"/>
    </artifact:deploy>
  </target>

  <target name="maven-deploy"
    depends="maven-prepare,release,maven-deploy-custom-repository,maven-deploy-apache-repository"
    description="Deployes the Maven artifacts in local repository or apache repository">
  </target>

  <!-- =================================================================== -->
  <!-- Package                                                             -->
  <!-- =================================================================== -->
  <target name="build-package-tree" depends="clean">

    <!--
     Don't move these ant calls into depends! If you do so, either jar
     or jar-dep or docs (via its depends on jar) will set the jarname
     property and as it is immutable, you will no longer be able to
     build both jars in one go. Using antcall executes these targets
     as subtasks and this property setting will not propagate back
     into the main ant build

    -->
    <antcall target="jar" />
    <antcall target="jar-dep" />
    <antcall target="jar-src" />
    <antcall target="docs" />
    <antcall target="javadocs" />

    <mkdir dir="${dist.dir}"/>
    <mkdir dir="${dist.dir}/src/java"/>

    <!-- use original to get pre-filtered text -->
    <copy todir="${dist.dir}/src/java/">
      <fileset dir="${src.java.dir}" />
    </copy>

    <!-- use original to get pre-filtered text -->
    <copy todir="${dist.dir}/src/test/">
      <fileset dir="${test.java.dir}" />
    </copy>

    <!-- use original to get pre-filtered text -->
    <copy todir="${dist.dir}/src/parser/">
      <fileset dir="${src.parser.dir}" />
    </copy>

    <copy todir="${dist.dir}/lib">
      <fileset dir="${build.lib}" />
    </copy>

    <copy todir="${dist.dir}/lib/test">
      <fileset dir="${build.test.lib}" />
    </copy>

    <copy todir="${dist.dir}/build">
      <fileset dir="${velocity.dir}/build">
        <include name="**"/>
        <exclude name="velocity.log"/>
      </fileset>
    </copy>

    <!-- Copy docs, exclude API docs -->
    <copy todir="${dist.dir}/docs">
      <fileset dir="${build.docs}">
        <include name="**"/>
        <exclude name="docs/api/**"/>
      </fileset>
    </copy>

    <!-- Add freshly built Java docs -->
    <copy todir="${dist.dir}/docs/api">
      <fileset dir="${build.javadoc}">
        <include name="**"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}/examples">
      <fileset dir="${example.dir}">
        <include name="**"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}/src">
      <fileset dir="${velocity.dir}/src">
        <include name="**"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}/test">
      <fileset dir="${velocity.dir}/test">
        <include name="**"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}/xdocs">
      <fileset dir="${xdocs.dir}">
        <include name="**"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}">
      <fileset dir="${velocity.dir}">
        <include name="LICENSE" />
        <include name="NOTICE" />
        <include name="README.txt" />
        <include name="CONTRIBUTORS" />
        <include name="WHY_TWO_JARS.txt" />
      </fileset>
    </copy>

    <copy
      file="${build.dir}/${final.name}.jar"
      tofile="${dist.dir}/${final.name}.jar"
    />

    <copy
      file="${build.dir}/${project}-${version}-dep.jar"
      tofile="${dist.dir}/${project}-${version}-dep.jar"
    />
  </target>

  <!-- ================================================================== -->
  <!-- Packages the distribution with ZIP                                 -->
  <!-- ================================================================== -->
  <target name="package-zip"
          depends="build-package-tree">

    <!-- .zip built for Windows -->
    <fixcrlf srcdir="${dist.dir}" eol="crlf" eof="asis" encoding="ISO-8859-1">
      <include name="**/*.html" />
      <include name="**/*.java" />
      <include name="**/*.properties" />
      <include name="**/*.txt" />
      <include name="**/*.wm" />
      <include name="**/*.xml" />
    </fixcrlf>

    <delete file="${build.dir}/${final.name}.zip" quiet="true"/>
    <zip zipfile="${build.dir}/${final.name}.zip" basedir="${dist.root}"
         includes="**/${final.name}/**"/>

    <checksum file="${build.dir}/${final.name}.zip" algorithm="md5" property="checksum.zip.md5"/>
    <checksum file="${build.dir}/${final.name}.zip" algorithm="sha1" property="checksum.zip.sha1"/>
    <echo message="${checksum.zip.md5} *${final.name}.zip" file="${build.dir}/${final.name}.zip.md5" />
    <echo message="${checksum.zip.sha1} *${final.name}.zip" file="${build.dir}/${final.name}.zip.sha1" />
  </target>

  <!-- ================================================================== -->
  <!-- Packages the distribution with TAR-GZIP                            -->
  <!-- ================================================================== -->
  <target name="package-tgz"
          depends="build-package-tree">

    <!-- .tar.gz built for Unix -->
    <fixcrlf srcdir="${dist.dir}" eol="lf" eof="remove" encoding="ISO-8859-1">
      <include name="**/*.html" />
      <include name="**/*.java" />
      <include name="**/*.properties" />
      <include name="**/*.txt" />
      <include name="**/*.wm" />
      <include name="**/*.xml" />
    </fixcrlf>

    <delete file="${build.dir}/${final.name}.tar.gz" quiet="true"/>
    <tar tarfile="${build.dir}/${final.name}.tar.gz" basedir="${dist.root}"
         includes="**/${final.name}/**" longfile="gnu" compression="gzip" />

    <checksum file="${build.dir}/${final.name}.tar.gz" algorithm="md5" property="checksum.tgz.md5"/>
    <checksum file="${build.dir}/${final.name}.tar.gz" algorithm="sha1" property="checksum.tgz.sha1"/>
    <echo message="${checksum.tgz.md5} *${final.name}.tar.gz" file="${build.dir}/${final.name}.tar.gz.md5" />
    <echo message="${checksum.tgz.sha1} *${final.name}.tar.gz" file="${build.dir}/${final.name}.tar.gz.sha1" />
  </target>

  <target name="release.howto">
    <echo>
                         ***** RELEASE INSTRUCTIONS *****

    * Be sure you can answer "yes" to the following:

        * Was your local code up to date and free of modifications or extra files?

        * Was the version number correct in both build.properties and pom.xml?

        * For a final release, the distributionManagement.site.url value
          in the pom.xml should be:
            scpexe://people.apache.org/www/velocity.apache.org/engine/releases/velocity-${version}
          and for alpha or beta releases it should be:
            scpexe://people.apache.org/www/velocity.apache.org/engine/devel/

        * Do all new files have the Apache License? (use "ant rat" to double-check)

        * Is ${build.src}/changes/changes.xml up to date?
          Feel free to set an estimated release date for this version in that file;
          it can be corrected later if the release is delayed.

        * Is ${build.src}/site/apt/upgrading.apt up to date for this release?

        * Is the ${velocity.dir}/README.txt up to date for this release?

        * If a final release, update the "Where do I get releases?" section of
            ${build.dir}/xdocs/docs/index.xml
          to show the latest stable version number.

    * Write down the current svn revision so you don't have to look it up
      later when you make the tag for this release (post-vote).

    * Go to ${build.dir} and sign all the jar, zip, tar.gz and pom files
      with your personal PGP key using a script like this:
        #! /bin/bash
        for i in *.tar.gz *.zip *jar; do
          gpg --armor --output $i.asc --detach-sig $i
        done


    * SSH into people.apache.org and make sure that this directory exists:
        ${publish.dir}

    * If you haven't done it before, ensure that your PGP key is appended to
        /www/www.apache.org/dist/velocity/KEYS
      Some instructions for that are at the top of that file.

    * Call "ant publish"
    
    * Review http://wiki.apache.org/velocity/ReleaseProcess for more details.
    </echo>        
  </target>

  <!-- ================================================================== -->
  <!-- Internal targets for Release Manager to ensure that the right      -->
  <!-- JDK is used for building the release.                              -->
  <!-- ================================================================== -->
  <target name="release"
    description="Build the packages as release manager, does additional checks over the package target"
    depends="package-java-check, clean, package, pom, release.howto"/>

  <!-- ================================================================== -->
  <!-- Packages the distribution with ZIP and TAR-GZIP                    -->
  <!-- ================================================================== -->
  <target name="package"
          depends="package-zip,package-tgz"
          description="Generates the Velocity distribution files">
  </target>

  <target name="package-java-check">
      <condition property="correct-java-version">
        <equals arg1="${ant.java.version}" arg2="${dist.required.java.version}"/>
      </condition>
  
      <fail unless="correct-java-version">
        Could not run create distribution package:
    ***********************************************************
    **
    ** In order to create a distribution package, you must be
    ** using Java version ${dist.required.java.version} instead
    ** of Java version ${java.version}
    **
    ***********************************************************
      </fail>

      <echo>
    ***********************************************************
    **
    ** Creating a distribution package.  Compiling with 
    ** Java version ${java.version}
    **
    ***********************************************************
      </echo>

  </target>
  
  <!-- ======================================================================= -->
  <!-- Cleans up the build directory. Leave Libs unharmed to avoid re-download -->
  <!-- ======================================================================= -->
  <target name="clean" depends="examples-clean"
          description="Cleans all generated files except downloaded libs">
    <delete includeEmptyDirs="true" quiet="true">
      <fileset dir="${build.dir}" defaultexcludes="no">
        <exclude name="lib/**" />
        <exclude name="test-lib/**" />
      </fileset>
    </delete>
  </target>

  <!-- =================================================================== -->
  <!-- Really cleans up the build directory                                -->
  <!-- =================================================================== -->
  <target name="real-clean" depends="examples-clean"
          description="Cleans all generated files">
    <delete includeEmptyDirs="true" quiet="true" dir="${build.dir}" />
  </target>

  <!-- =================================================================== -->
  <!-- Make HTML version of Velocity documentation                         -->
  <!-- =================================================================== -->

  <target name="docs" depends="build-prepare,jar"
          description="Generates the Velocity HTML documentation">

    <taskdef name="anakia"
             classname="org.apache.velocity.anakia.AnakiaTask"
             classpathref="velocity.run.classpath"/>

    <echo>
  #######################################################
  #
  #  Now using Anakia to transform the XML documentation
  #  to HTML.
  #
  #  using project file: ${docs.project}
  #
  #  Note: set property "docs.project" to "project.xml"
  #  for distribution and "project-website.xml" for
  #  website.
  #######################################################
    </echo>

    <anakia basedir="${xdocs.dir}/docs" destdir="${build.docs}"
         extension=".html" style="site.vsl"
         projectFile="../stylesheets/${docs.project}"
         includes="**/*.xml"
         lastModifiedCheck="true"
         templatePath="${xdocs.dir}/stylesheets">
    </anakia>

    <copy todir="${build.docs}/images" filtering="no">
        <fileset dir="${xdocs.dir}/images">
            <include name="**/*.gif"/>
            <include name="**/*.jpeg"/>
            <include name="**/*.jpg"/>
            <include name="**/*.png"/>
        </fileset>
    </copy>

    <copy todir="${build.docs}" filtering="no">
        <fileset dir="${xdocs.dir}">
            <include name="**/*.css"/>
            <include name="**/.htaccess"/>
        </fileset>
    </copy>

  </target>


  <!-- =================================================================== -->
  <!-- Cleans up the docs directory                                       -->
  <!-- =================================================================== -->
  <target name="docs-clean">
    <delete dir="${build.docs}" quiet="true"/>
  </target>


 <!-- ========== Publish Targets ======================================== -->

  <target name="publish.check">
    <condition property="release.signed">
      <and>
        <available file="${build.dir}/${final.name}.tar.gz.asc"/>
        <available file="${build.dir}/${final.name}.zip.asc"/>
        <available file="${build.dir}/${final.name}.jar.asc"/>
        <available file="${build.dir}/${final.name}.pom.asc"/>
        <available file="${build.dir}/${project}-${version}-dep.jar.asc"/>
        <available file="${build.dir}/${final.name}-sources.jar.asc"/>
        <available file="${build.dir}/${final.name}-javadoc.jar.asc"/>
      </and>
    </condition>
  </target>

  <target name="publish.sigs" unless="release.signed"
          depends="publish.check">
    <echo>
    !!NOT READY TO PUBLISH!!
    You must first execute "release" target, then sign the distribution
    files with your pgp key (creating the needed '.asc'signature files).
    To override this (only when uploading development snapshots not meant
    for public release), add the property "release.signed=true" to your
    build.properties.
    You may also need to add the Jsch jar to Ant's classpath to enable the
    optional 'scp' task.
    </echo>
  </target>

  <target name="publish.user" unless="username">
    <input message="Type your username and hit enter:" addproperty="username"/>
  </target>

  <target name="publish.pass" unless="password">
    <input message="Type your password and hit enter:" addproperty="password"/>
  </target>

  <target name="publish.auth" if="release.signed"
          depends="publish.user,publish.pass">
    <condition property="have.auth">
      <and>
        <isset property="username"/>
        <isset property="password"/>
      </and>
    </condition>
  </target>

  <target name="prepare.publish" 
          depends="publish.sigs,publish.auth">
    <condition property="ready">
      <and>
        <isset property="release.signed"/>
        <isset property="have.auth"/>
      </and>
    </condition>
  </target>

  <target name="publish.upload" depends="prepare.publish" if="ready">
    <echo>
    Uploading distribution files from
      ${build.dir}
    to
      ${username}:${password}@${publish.server}:${publish.dir}
    </echo>
    <scp todir="${username}:${password}@${publish.server}:${publish.dir}"
      verbose="true" failonerror="true" trust="yes">
      <fileset dir="${build.dir}">
        <include name="*.tar.gz"/>
        <include name="*.zip"/>
        <include name="*.jar"/>
        <include name="*.md5"/>
        <include name="*.sha1"/>
        <include name="*.asc"/>
        <include name="*.pom"/>
      </fileset>
    </scp>
  </target>

  <target name="publish.howto">
    <echo>
                         ***** RELEASE INSTRUCTIONS *****

    * SSH to ${publish.server} and verify the checksums and signatures of the uploaded
      files with a script like:
          #!/bin/csh
          foreach fn ( *.tar.gz *.zip *.jar *.pom )
            echo Verifying $fn...
            echo GPG signature should be "Good"
            gpg --verify $fn.asc
            echo MD5s should be identical
            cat $fn.md5
            md5 -q $fn
            echo SHA1s should be identical
            cat $fn.sha1
            sha1 -q $fn
            echo
          end

    * Announce the availability of an Engine ${version} test build on dev@velocity.apache.org.
    
    * Allow a few days for people to test the test build.

    * Call for a release vote on private@velocity.apache.org and dev@velocity.apache.org

    * Once the release vote has passed, these files should all be copied to
        /www/www.apache.org/dist/velocity/engine/${version}
      and the non-dep jar, source jar, javadoc jar, pom and respective md5, sha1 and asc files should be copied into 
        /www/people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/velocity/velocity/${version}/

    * Remove older releases of the same grade as this one (alpha, beta, final) from
        /www/www.apache.org/dist/velocity/engine

    * Tag the release in SVN with a command such as:
        svn copy -m "Release Engine ${version}" -r [revision #] \
           https://svn.apache.org/repos/asf/velocity/engine/trunk \
           https://svn.apache.org/repos/asf/velocity/engine/tags/${version}

    * Go to ${velocity.dir} and run "mvn site" then "mvn site:deploy"
      to publish the documentation for this release on the website

    * Wait a day or so for the mirrors and maven repos to sync up.

    * Update the main website (velocity-site project) with the release info:

       * Add this ${version} release to news.xml, download.xml, doap_engine.rdf and
         the "Release status" section of index.xml

       * Check those changes into SVN

       * Email Henning to have him update and build the site from velocity.zones.apache.org
         (or get velocity-site to work for other people besides Henning)

    * Wait a few hours for the site to sync up.

    * Send an announcement email from your apache.org address to all Velocity lists
      and also to announce@apache.org.
    
    * Review http://wiki.apache.org/velocity/ReleaseProcess for more details.
    </echo>
  </target>

  <!-- =================================================================== -->
  <!-- Uploads the distribution files after checking that they're ready.   -->
  <!-- =================================================================== -->
  <target name="publish" depends="publish.upload,publish.howto" if="ready"
      description="Uploads distribution files and provides instructions"/>

  <!-- =================================================================== -->
  <!-- JUnit Tests for Velocity                                            -->
  <!-- =================================================================== -->
  <target name="test-main" depends="build-prepare,compile-test"
          description="Run the Velocity testcases">

    <!-- Require ant 1.7+ for Junit compatibility -->
	<fail message="You are currently using ${ant.version}">
			<condition>
				<or>
				<contains string="${ant.version}" substring="1.2"/>
				<contains string="${ant.version}" substring="1.3"/>
				<contains string="${ant.version}" substring="1.4"/>
				<contains string="${ant.version}" substring="1.5"/>
				<contains string="${ant.version}" substring="1.6"/>
			</or>
		</condition>
	      Could not run junit tests:
	  ***********************************************************
	  **
	  ** Ant must be at least version 1.7
	  **
	  ***********************************************************
  	</fail>

    <mkdir dir="${build.test.reports}"/>
    <junit dir="${velocity.dir}"
           fork="true"
           printSummary="yes"
           haltonerror="${test.haltonerror}"
           haltonfailure="${test.haltonfailure}"
           showoutput="true"
           >

      <!-- Don't use the run classpath, test using the exploded class tree -->
      <classpath>
        <path refid="velocity.build.classpath" />
        <path refid="velocity.test.classpath" />
        <pathelement path="${build.dest}"/>
        <pathelement path="${build.test.dest}"/>
      </classpath>

      <formatter type="plain"/>

      <test name="${testcase}" if="testcase" todir="${build.test.reports}"/>
      <sysproperty key="testcase" value="${testcase}"/>
      <batchtest todir="${build.test.reports}" unless="testcase">
        <fileset dir="${build.test.src}">
          <include name="**/*TestCase.java"></include>

          <exclude name="**/BaseTestCase.java"></exclude>

          <exclude name="**/TexenTestCase.java"></exclude>
          <exclude name="**/TexenClasspathTestCase.java"></exclude>
          <exclude name="**/AnakiaTestCase.java"></exclude>
          <exclude name="**/MultiLoaderTestCase.java"></exclude>
          <exclude name="**/ClasspathResourceTestCase.java"></exclude>
        </fileset>
      </batchtest>
    </junit>
  </target>
  
  <target name="test" depends="test-main, test-legacy"/>
  
  <target name="test-legacy" unless="testcase">
    <!-- Run the legacy tests for anakia, texen... -->
    <ant antfile="${velocity.build.dir}/testcases.xml"
         target="test-all"/>
  </target>

  <target name="test-clean">
    <delete dir="${build.test.dest}" quiet="true"/>
    <delete dir="${build.test}" quiet="true"/>
    <delete dir="${build.test.reports}" quiet="true"/>

   <ant antfile="${velocity.build.dir}/testcases.xml"
        target="test-clean"/>
  </target>


  <!-- =================================================================== -->
  <!-- Analyze code with Apache RAT                                        -->
  <!-- =================================================================== -->
  <target name="rat" depends="package-tgz"
    description="Runs Apache RAT against the source code.">
    <!-- TODO: download RAT and deps -->
    <echo>
      NOTE: At this time, you must add Apache RAT, Apache RAT AntTasks
      Commons-Lang, Commons-Collections and Commons-CLI to Ant's lib directory
      to use this.
    </echo>
    <mkdir dir="${build.test.reports}"/>
    <typedef resource="org/apache/rat/anttasks/antlib.xml" uri="antlib:rat.anttasks"/>
    <rat:report xmlns:rat="antlib:org.apache.rat.anttasks"
      reportFile="${build.test.reports}/rat-report.txt">
      <tarfileset>
        <gzipresource>
          <file file="${build.dir}/${final.name}.tar.gz"/>
        </gzipresource>
      </tarfileset>
    </rat:report>
    <echo>Your RAT report is here: ${build.test.reports}/rat-report.txt</echo>
  </target>


  <!-- =================================================================== -->
  <!-- Analyze code with FindBugs                                          -->
  <!-- =================================================================== -->
  <target name="findbugs" depends="jar">
    <echo>Working with FindBugs at: ${findbugs.home}</echo>
    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
      <classpath>
        <fileset dir="${findbugs.home}/lib">
          <include name="findbugs-ant.jar"/>
        </fileset>
      </classpath>
    </taskdef>
    <echo>Analyzing ${build.dir}/${final.name}.jar built from ${build.src}</echo>
    <findbugs home="${findbugs.home}"
              output="html"
              jvmargs="-Xmx400m"
              outputFile="${build.test.reports}\findbugs-report.html"
              reportLevel="low"
              effort="max"
              excludeFilter="${velocity.build.dir}/findbugs-exclude.xml"
              failOnError="true">
      <auxClasspath>
        <fileset dir="${build.lib}">
          <include name="**/*.jar"/>
        </fileset>
      </auxClasspath>
      <sourcePath path="${build.src}" />
      <class location="${build.dir}/${final.name}.jar" />
    </findbugs>
  </target>


  <!-- =================================================================== -->
  <!-- Analyze code with PMD                                               -->
  <!-- =================================================================== -->
  <target name="pmd" depends="compile">
    <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask">
      <classpath>
        <fileset dir="${pmd.home}/lib">
          <include name="*.jar"/>
        </fileset>
      </classpath>
    </taskdef>
    <echo>Analyzing ${build.src}...</echo>
    <pmd shortFilenames="true"
         failonerror="true">
<!-- To minimize noise keep rulesets that you are done checking here...
-->
      <ruleset>unusedcode</ruleset>
      <ruleset>imports</ruleset>
<!-- ... and rulesets you're not ready to check here.
      <ruleset>braces</ruleset>
      <ruleset>basic</ruleset>
      <ruleset>strings</ruleset>
      <ruleset>design</ruleset>
      <ruleset>codesize</ruleset>
-->
      <formatter type="html"
                 toFile="${build.test.reports}\pmd_report.html"/>
      <fileset dir="${build.src}">
        <include name="**/*.java"/>
      </fileset>
    </pmd>
    <echo>Generated report is at ${build.test.reports}\pmd_report.html</echo>
  </target>
</project>
