<?xml version="1.0"?>
<!-- TODO
Check where PMD and CheckStyle overlap
-->


<!--
This contains any tasks that require a version of ANT that is higher than the ones
supported by WSAD.  WSAD 4 contains ANT 1.3 and WSAD 5 contains ANT 1.4.1.
Running an external version of ANT gives us the flexibility to upgrade the externally 
used ANT at will when a new version comes out or if new or improved tasks come out that 
we would like to use, but need a higher ANT version or dependent libraries.

These tasks are kept here and called from the build.xml file to help keep the
build scripts easy to read.  It also cuts down on the number of tasks available
from the build.xml (as a task would be needed to run a newer ANT and then to give
it the target to run as well...of course the target would have to exist.
-->

<!-- NOTE: reports with timestamps might be useful -->
<project name="Common External ANT Script" default="depend">

    <!-- 3rd party lib location -->
    <property name = "3rdparty.dir" value = "Z:\vob_devtools\ant\3rd-party"/>

    <!-- task(s) related -->
    <!-- JDepend -->
    <property name = "jdepend.report.dir"    value = "${report.dir}\jdepend"/>
    <property name = "jdepend.report"        value = "jdepend-report"/>
    <property name = "jdepend.xsl"           value = "${ext.ant.home}\etc\jdepend.xsl"/>
    <property name = "jdepend2dot.xsl"       value = "${ext.ant.home}\etc\jdepend2dot.xsl"/>
    <!-- CheckStyle -->
    <property name = "checkstyle.report.dir" value = "${report.dir}\checkstyle"/>
    <property name = "checkstyle.report"     value = "checkstyle-report"/>
    <property name = "checkstyle.xsl"        value = "${3rdparty.dir}\checkstyle-3.0\contrib\checkstyle-noframes.xsl"/>
    <property name = "checkstyle.config"     value = "${3rdparty.dir}\checkstyle-3.0\docs\checkstyle_checks.xml"/>
    <!-- PMD -->
    <property name = "pmd.report.dir"        value = "${report.dir}\pmd"/>
    <property name = "pmd.report"            value = "pmd-report"/>
    <property name = "pmd.xsl"               value = "Z:\vob_devtools\ant\etc\xsl\pmd.xsl"/>
    <property name = "pmd.version"           value = "pmd-3.2"/>
    <property name = "pmd.rulesets"          value = "${3rdparty.dir}\${pmd.version}\rulesets\rulesets.xml"/>
    <!-- JavaNCSS -->
    <property name = "javancss.report.dir"   value = "${report.dir}\javancss"/>
    <property name = "javancss.report"       value = "javancss-report"/>
    <property name = "javancss.xsl"          value = "${3rdparty.dir}\javancss21.41\xslt\javancss2html.xsl"/>
    <!-- JUnit -->
    <property name = "junit.report.dir"      value = "${report.dir}\junit"/>
    <!-- Clover -->
    <property name = "clover.jar"            value = "${3rdparty.dir}\clover-1.3.2\lib\clover.jar"/>
    <property name = "clover.db.dir"         value = "C:\temp\cloverdb"/>
    <property name = "clover.db.file"        value = "clover.db"/>
    <property name = "clover.initstring"     value = "${clover.db.dir}\${clover.db.file}"/>
    <property name = "clover.report.dir"     value = "${report.dir}\clover"/>
    <!-- FindBugs -->
    <property name = "findbugs.home"         value = "${3rdparty.dir}\findbugs-0.9.1"/>
    <property name = "findbugs.report.dir"   value = "${report.dir}\findbugs"/>
    <!-- xmltask -->
    <property name = "xmltask.version"       value = "xmltask-v1.10.4"/>
    <property name = "xmltask.folder"        value = "xmltask-1.10.4"/>
    <property name = "xmltask.home"          value = "${3rdparty.dir}\${xmltask.folder}"/>
    <property name = "xmltask.jar"           value = "${xmltask.version}.jar"/>
    <property name = "xmltask.classpath"     value = "${xmltask.home}\${xmltask.jar}"/>
    <!-- local dtds -->
    <property name = "dtd.dir"               value = "${3rdparty.dir}\dtds"/>

    <!-- values that must exist, but can be overidden by calling scripts -->
    <property name = "src.root.dir"          value = "${root.dir}"/>

    <target name="init">
        <mkdir dir="${report.dir}"/>
    </target>

    <target name="update.manifest">
        <manifest file="${root.dir}/Manifest.mf">
            <section name="version">
                <attribute name="Company" value="DeadEd.com"/>
                <attribute name="Package" value="${package.name}"/>
                <attribute name="Version" value="${manifest.version}"/>
            </section>
        </manifest>
    </target>

    <!-- pre-pend text to a file -->
    <!-- prerequisites: text.to.prepend, file.to.prepend -->
    <target name="prepend.text.to.file">
        <dirname property="prepend.dir" file="${file.to.prepend}"/>
        <copy file="${file.to.prepend}" tofile="${prepend.dir}/temp.txt"/>
        <concat destfile="${file.to.prepend}">${text.to.prepend}</concat>
        <concat destfile="${file.to.prepend}" append="true">
            <fileset file="${prepend.dir}/temp.txt"/>
        </concat>
        <delete>
            <fileset dir="${prepend.dir}" includes="temp.txt"/>
        </delete>
    </target>

    <!-- guide transform -->
    <target name="guide.transformer">
        <style basedir="${gt.basedir}"
            destdir="${gt.destdir}"
            extension="${gt.extension}"
            style="${gt.stylesheet}"
                force="true"/>
    </target>

    <!-- JDepend - a general JDepend call -->
    <target name="jdepend" depends="init">
        <mkdir dir="${jdepend.report.dir}"/>
        <jdepend format="xml" outputfile="${jdepend.report.dir}\${jdepend.report}.xml">
            <sourcespath>
                <pathelement location="${source.dir}"/>
                <pathelement location="${classes.dir}"/>
            </sourcespath>
        </jdepend>
        <style in="${jdepend.report.dir}\${jdepend.report}.xml" out="${jdepend.report.dir}\${jdepend.report}.html"
            style="${jdepend.xsl}"/>

        <delete>
            <fileset dir="${jdepend.report.dir}" includes="*.xml"/>
        </delete>
    </target>

    <!-- JDepend - new component line JDepend call using the JDependHelper task -->
    <target name="jdepend-for-graphviz" depends="init">
        <mkdir dir="${jdepend.report.dir}"/>

        <jdepend format="xml" outputfile="${jdepend.report.dir}\${jdepend.report}.xml">
            <sourcespath>
                <pathelement location="${source.dir}"/>
                <pathelement location="${classes.dir}"/>
            </sourcespath>
        </jdepend>

        <!-- create the HTML report -->
        <style in="${jdepend.report.dir}\${jdepend.report}.xml" out="${jdepend.report.dir}\${jdepend.report}.html"
            style="${jdepend.xsl}"/>

        <!-- create the dot file -->
        <style in="${jdepend.report.dir}\${jdepend.report}.xml" out="${jdepend.report.dir}\${jdepend.report}.dot"
            style="${jdepend2dot.xsl}"/>

        <taskdef name="jdepend-helper" classname="com.deaded.ant.JDependHelperTask"
            classpath="Z:\vob_devtools\ant\lib\commonAntTasks.jar"/>

        <!-- modify the dot file with the JDepend Helper task to produce a component dependency graph -->
        <jdepend-helper inputFile="${jdepend.report.dir}\${jdepend.report}.dot"
            outputFile="${jdepend.report.dir}\${jdepend.report}-components.dot"
            propertyFile="Z:\vob_devtools\ant\lib\JDependHelper.properties"
            diagramType="component"/>

        <!-- modify the dot file with the JDepend Helper task to produce a package dependency graph (showing which 
             component each package belongs to -->
        <jdepend-helper inputFile="${jdepend.report.dir}\${jdepend.report}.dot"
            outputFile="${jdepend.report.dir}\${jdepend.report}-packages.dot"
            propertyFile="Z:\vob_devtools\ant\lib\JDependHelper.properties"
            diagramType="package"/>

        <!-- clean up -->
        <delete>
            <fileset dir="${jdepend.report.dir}" includes="*.xml"/>
        </delete>
    </target>

    <!-- Checkstyle -->
    <target name="checkstyle" depends="init">
        <mkdir dir="${checkstyle.report.dir}"/>
        <taskdef name="checkstyle" classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"
            classpath="${3rdparty.dir}\checkstyle-3.0\checkstyle-all-3.0.jar"/>

        <checkstyle config="${checkstyle.config}" failOnViolation="false">
            <fileset dir="${source.dir}" includes="**/*.java"/>
            <formatter type="xml" toFile="${checkstyle.report.dir}\${checkstyle.report}.xml"/>
        </checkstyle>

        <style basedir="${checkstyle.report.dir}" in="${checkstyle.report.dir}\${checkstyle.report}.xml"
            out="${checkstyle.report.dir}\${checkstyle.report}.html"
            style="${checkstyle.xsl}"/>

        <delete>
            <fileset dir="${checkstyle.report.dir}" includes="*.xml"/>
        </delete>
    </target>

    <!-- PMD -->
    <target name="pmd" depends="init, run.pmd, pmd.check.ok">
    </target>

    <target name="run.pmd">
        <delete dir="${pmd.report.dir}"/>
        <mkdir dir="${pmd.report.dir}"/>
        <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" 
            classpath="${3rdparty.dir}\${pmd.version}\lib\${pmd.version}.jar;${3rdparty.dir}\${pmd.version}\lib\jaxen-core-1.0-fcs.jar;${3rdparty.dir}\${pmd.version}\lib\saxpath-1.0-fcs.jar;${3rdparty.dir}\${pmd.version}\lib\xercesImpl-2.6.2.jar;${3rdparty.dir}\${pmd.version}\lib\xmlParserAPIs-2.6.2.jar"/>

        <pmd rulesetfiles="${pmd.rulesets}">
            <formatter type="xml" toFile="${pmd.report.dir}\${pmd.report}.xml"/>

            <fileset dir="${source.dir}" includes="**/*.java" excludes="**/xmlbinding/**,**/_*/**,**/EJSRemote*/**,**/EJSStateless*/**,org/omg/**,com/ibm/**"/>
        </pmd>
        <available file="${pmd.report.dir}\${pmd.report}.xml" property="pmd.ok"/>
    </target>

    <target name="pmd.check.ok" if="pmd.ok">
        <style in="${pmd.report.dir}\${pmd.report}.xml" out="${pmd.report.dir}\${pmd.report}.html"
            style="${pmd.xsl}"/>

        <delete>
            <fileset dir="${pmd.report.dir}" includes="*.xml"/>
        </delete>
    </target>

    <!-- CPD: Copy / Paste Detection (from PMD) -->
    <target name="cpd" depends="init">
        <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpath="${3rdparty.dir}\${pmd.version}\lib\${pmd.version}.jar;${3rdparty.dir}\${pmd.version}\lib\jaxen-core-1.0-fcs.jar;${3rdparty.dir}\${pmd.version}\lib\saxpath-1.0-fcs.jar"/>
        <cpd minimumTokenCount="100" outputFile="${report.dir}/cpd.txt">
            <fileset dir="${source.dir}">
                <include name="**/*.java"/>
            </fileset>
        </cpd>
    </target>

    <!-- Java NCSS -->
    <target name="javancss" depends="init">
        <mkdir dir="${javancss.report.dir}"/>
        <taskdef name="javancss" classname="javancss.JavancssAntTask"
            classpath="${3rdparty.dir}\javancss21.41\lib\javancss.jar;${3rdparty.dir}\javancss21.41\lib\ccl.jar;${3rdparty.dir}\javancss21.41\lib\jhbasic.jar"/>

        <javancss srcdir="${source.dir}" generateReport="true" includes="**/*.java"
            outputfile="${javancss.report.dir}\${javancss.report}.xml" format="xml"/>

        <style basedir="${javancss.report.dir}" in="${javancss.report.dir}\${javancss.report}.xml"
            out="${javancss.report.dir}\${javancss.report}.html" style="${javancss.xsl}"/>

        <delete>
            <fileset dir="${javancss.report.dir}" includes="*.xml"/>
        </delete>
    </target>

    <!-- JUnit -->
    <target name="junit" depends="init, run.junit, check.junit.fail, junit.report">
    </target>

    <target name="run.junit">
        <mkdir dir="${junit.report.dir}"/>
        <junit printsummary="yes" failureproperty="junit.failed">
            <classpath>
                <pathelement location="${test.source.dir}"/>
                <pathelement path="${classes.dir}"/>
                <pathelement path = "${project.classpath}"/>
            </classpath>

            <formatter type="xml"/>

            <batchtest fork="yes" todir="${junit.report.dir}">
                <fileset dir="${test.source.dir}">
                    <include name="**/*Test.java"/>
                    <exclude name="**/*TestCase.java"/>
                    <exclude name="**/AllTests.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>

    <target name="junit.report" unless="junit.failed">
        <junitreport todir="${junit.report.dir}">
            <fileset dir="${junit.report.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${junit.report.dir}"/>
        </junitreport>
    </target>

    <target name="check.junit.fail" if="junit.failed">
        <echo file="${report.dir}/junitfailed.txt">Ooops</echo>
        <fail>JUnit test failed</fail>
    </target>

    <!-- Clover -->
    <target name="clover">
        <delete dir="${clover.db.dir}"/>
        <mkdir dir="${clover.db.dir}"/>

        <path id="clover.classpath">
            <pathelement path = "${clover.jar}"/>
            <pathelement path = "${project.classpath}"/>
            <pathelement path = "${classes.dir}"/>
        </path>

        <taskdef resource="clovertasks"/>
        <typedef resource="clovertypes"/>

        <clover-setup initstring="${clover.initstring}" enabled="true" flushpolicy="interval" flushinterval="200">
            <files>
                <exclude name="**/*Test.java"/>
                <exclude name="**/*TestCase.java"/>
                <exclude name="**/AllTests.java"/>
            </files>
        </clover-setup>

        <mkdir dir="${classes.dir}"/>
        <javac fork="yes" destdir="${classes.dir}" debug="on" deprecation="on">
            <src path="${source.dir}"/>
            <src path="${test.source.dir}"/>
            <include name="**/*.java"/>
            <classpath refid="clover.classpath"/>
        </javac>

        <java classname="com.deaded.AllTests" fork="yes" dir="${source.dir}">
            <classpath>
                <pathelement location="${classes.dir}"/>
            </classpath>
            <classpath refid="clover.classpath"/>
        </java>

        <clover-report>
            <Current outfile="${clover.report.dir}" title="${html.title}">
                <format type="html" orderBy="ElementsCoveredAsc"/>
            </Current>
        </clover-report>
    </target>

    <!-- FindBugs -->
    <target name="FindBugs">
        <delete dir="${findbugs.report.dir}"/>
        <mkdir dir="${findbugs.report.dir}"/>
        <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
            classpath="${findbugs.home}\lib\findbugs-ant.jar;${findbugs.home}\lib\findbugs.jar;${findbugs.home}\lib\dom4j-full.jar"/>
        
        <findbugs home="${findbugs.home}" output="html" 
            outputFile="${findbugs.report.dir}/findbugs.html"
            reportLevel="low" workHard="true" conserveSpace="true" jvmargs="-Xmx512m"
            excludeFilter="${findbugs.home}/excludes.xml">

            <auxClasspath path="${project.classpath}"/>
            <sourcePath path="${source.dir}"/>
            <class location="${classes.dir}"/>
        </findbugs>
    </target>
    
    <target name="xmltask.replace.text">
        <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${xmltask.classpath}"/>

        <xmlcatalog id="dtds">
          <dtd publicId="-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
              location="${dtd.dir}/application_1_3.dtd"/>
        </xmlcatalog>

        <xmltask source="${xml.source}" dest="${xml.dest}" report="true" preserveType="true" encoding="UTF-8">
          <replace path="${xml.xpath}" withText="${xml.replace.text}"/>
          <xmlcatalog refid="dtds"/>
        </xmltask>
    </target>

    <target name="xmltask.attr.value">
        <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="${xmltask.classpath}"/>        

	<xmlcatalog id="dtds">
          <dtd publicId="-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
              location="${dtd.dir}/application_1_3.dtd"/>
        </xmlcatalog>

        <xmltask source="${xml.source}" dest="${xml.dest}" report="true" preserveType="true" encoding="UTF-8">
          <attr path="${xml.xpath}" attr="${xml.attr}" value="${xml.value}" />
          <xmlcatalog refid="dtds"/>
        </xmltask>
    </target>

    <!-- JAXB -->
    <target name="jaxb">
        <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"/>

        <xjc package="${jaxb.package}" schema="${jaxb.schema}" target="${jaxb.target}"/>
   </target>

    <target name="jaxb-with-classpath">
        <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"/>

        <xjc package="${jaxb.package}" schema="${jaxb.schema}" target="${jaxb.target}" extension="true">
	  <classpath>
            <pathelement path="${jaxb.classpath}"/>
          </classpath>
	</xjc>
   </target>
   
	<!-- Compiles JAXB bindings without globally enforced package -->
   <target name="jaxb-with-classpath-nopackage">
        <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"/>

        <xjc schema="${jaxb.schema}" target="${jaxb.target}" extension="true">
	  <classpath>
            <pathelement path="${jaxb.classpath}"/>
          </classpath>
	</xjc>
   </target>

</project>