﻿<?xml version="1.0" encoding="UTF-8"?>
<project name="Project.Code.Analysis" basedir="." default="findbugs-all">
    <description>
        Code Analysis build - targets for running Findbugs, PMD, Clover, and CPD.
    </description>

    <property file="build.properties"/>

    <!--
      FINDBUGS
	  source.dir and classes.dir MUST be absolute paths
    -->
    <!-- run all of the findbugs targets -->
    <target name="findbugs-all" depends="findbugs-dependents, findbugs-persistence, findbugs-ejb, findbugs-web"
    	description="Create a Findbugs report for the whole project">
    </target>
    
    <target name="findbugs-dependents" description="Create a Findbugs report for the Dependents project">
        <ant antfile="${common.build}" target="FindBugsJ2EE">
            <property name="project.name" value="${dependents.project}"/>
            <property name="source.dir" value="${root.dir}/${dependents.project.source}"/>
            <property name="classes.dir" value="${root.dir}/${dependents.project.classes}"/>
            <property name="report.dir" value="${project.report.dir}/findbugs/dependents"/>
        </ant>
    </target>

    <target name="findbugs-persistence" description="Create a Findbugs report for the Persistence project">
        <ant antfile="${common.build}" target="FindBugsJ2EE">
            <property name="project.name" value="${persistence.project}"/>
            <property name="source.dir" value="${root.dir}/${persistence.project.source}"/>
            <property name="classes.dir" value="${root.dir}/${persistence.project.classes}"/>
            <property name="report.dir" value="${project.report.dir}/findbugs/persistence"/>
        </ant>
    </target>

    <target name="findbugs-ejb" description="Create a Findbugs report for the EJB project">
        <ant antfile="${common.build}" target="FindBugsJ2EE">
            <property name="project.name" value="${ejb.project}"/>
            <property name="source.dir" value="${root.dir}/${ejb.project.source}"/>
            <property name="classes.dir" value="${root.dir}/${ejb.project.classes}"/>
            <property name="report.dir" value="${project.report.dir}/findbugs/ejb"/>
        </ant>
    </target>

    <target name="findbugs-web" description="Create a Findbugs report for the Web project">
        <ant antfile="${common.build}" target="FindBugsJ2EE">
            <property name="project.name" value="${web.project}"/>
            <property name="source.dir" value="${root.dir}/${web.project.source}"/>
            <property name="classes.dir" value="${root.dir}/${web.project.classes}"/>
            <property name="report.dir" value="${project.report.dir}/findbugs/web"/>
        </ant>
    </target>

    <!--
      PMD
    -->
    <target name="pmd" description="Create a PMD report for a given package/class; eg: -Dpmd=ProjectWeb/src/com/deaded">
        <ant antfile="${common.build}" target="pmd">
            <property name="source.dir" value="${root.dir}${pmd}" />
            <property name="report.dir" value="${project.report.dir}"/>
        </ant>
    </target>

    <!-- run all of the findbugs targets -->
    <target name="pmd-all" depends="pmd-dependents, pmd-persistence, pmd-ejb, pmd-web"
    	description="Create a PMD report for the whole project">
    </target>
    
    <target name="pmd-dependents" description="Create a PMD report for the Dependents project">
        <ant antfile="${common.build}" target="pmd">
            <property name="source.dir" value="${root.dir}/${dependents.project.source}"/>
            <property name="report.dir" value="${project.report.dir}/pmd/dependents"/>
        </ant>
    </target>

    <target name="pmd-persistence" description="Create a PMD report for the Persistence project">
        <ant antfile="${common.build}" target="pmd">
            <property name="source.dir" value="${root.dir}/${persistence.project.source}"/>
            <property name="report.dir" value="${project.report.dir}/pmd/persistence"/>
        </ant>
    </target>

    <target name="pmd-ejb" description="Create a PMD report for the EJB project">
        <ant antfile="${common.build}" target="pmd">
            <property name="source.dir" value="${root.dir}/${ejb.project.source}"/>
            <property name="report.dir" value="${project.report.dir}/pmd/ejb"/>
        </ant>
    </target>

    <target name="pmd-web" description="Create a PMD report for the Web project">
        <ant antfile="${common.build}" target="pmd">
            <property name="source.dir" value="${root.dir}/${web.project.source}"/>
            <property name="report.dir" value="${project.report.dir}/pmd/web"/>
        </ant>
    </target>

    <!--
      CPD
    -->
    <target name="cpd" description="Create a CPD report for a given package/class; eg: -Dcpd=ProjectWeb/src/com/deaded">
        <ant antfile="${common.build}" target="cpd">
            <property name="source.dir" value="${root.dir}${cpd}" />
            <property name="report.dir" value="${project.report.dir}"/>
        </ant>
    </target>

    <!--
        Clover Code Coverage
    -->
    <target name="clover.init" description="init task called by other Clover targets">
        <!-- Set up the task to get the classpath from this environment -->
        <taskdef name="getclasspath" classname="com.deaded.ant.J2EEClasspathTask"
            classpath="Z:\vob_devtools\ant\lib\commonAntTasks.jar"/>

        <getclasspath ProjectName="${test.project}" RootDir="${root.dir}"
            ProjectClasspathProperty="test.classpath"/> 
        <getclasspath ProjectName="${web.project}" RootDir="${root.dir}"
            ProjectClasspathProperty="web.classpath"/> 
        <getclasspath ProjectName="${dependents.project}" RootDir="${root.dir}"
            ProjectClasspathProperty="dependents.classpath"/> 
        <getclasspath ProjectName="${persistence.project}" RootDir="${root.dir}"
            ProjectClasspathProperty="persistence.classpath"/> 
        <getclasspath ProjectName="${ejb.project}" RootDir="${root.dir}"
            ProjectClasspathProperty="ejb.classpath"/> 

        <property name="project.classpath" 
            value="${dependents.classpath};${persistence.classpath};${ejb.classpath};${web.classpath}"/>

        <path id="clover.classpath">	    
            <pathelement path = "${test.classpath}"/> 
            <pathelement path = "${clover.jar}"/>
            <pathelement path = "${project.classpath}"/>
            <pathelement path = "${clover.classes.dir}"/> 
        </path>

        <taskdef resource="clovertasks" classpathref="clover.classpath"/>
        <typedef resource="clovertypes" classpathref="clover.classpath"/>
    </target>

    <target name="with.clover" depends="clover.init" description="sets the compiler to use after Clover has been run - called from other Clover targets">
        <clover-setup initstring="${clover.initstring}" enabled="true" 
            flushpolicy="interval" flushinterval="5000"
            clovercompiler="org.eclipse.jdt.core.JDTCompilerAdapter">
        </clover-setup>
    </target>
    
    <target name="clover.report" depends="with.clover" description="Create the Clover code coverage report">
        <clover-report>
            <current outfile="${clover.report.dir}\clover_html" span="1d">
                <format type="html" orderBy="ElementsCoveredAsc"/>
            </current>
        </clover-report>
    </target>

    <!-- assume that projects are compiled with projectBuild first -->
    <!-- clean .class files before compiling with Clover.  This is so that all
         other compiled resources are in place and don't have to be dealt with
         by hand -->
    <!-- run all of the findbugs targets -->
    <target name="clover.compile.all" depends="clover.compile.dependents, clover.compile.persistence, clover.compile.ejb, clover.compile.web"
    	description="Clover compile the whole project">
    </target>

    <target name="clover.compile.dependents" depends="with.clover" description="Clover compile the Dependents project">
        <delete>
          <fileset dir="${root.dir}/${dependents.project.classes}" includes="**/*.class"/>            
        </delete>

        <mkdir dir="${root.dir}/${dependents.project.classes}"/>
        <javac destdir="${root.dir}/${dependents.project.classes}">
            <src path="${root.dir}/${dependents.project.source}"/>
            <include name="**/*.java"/>
            <classpath refid="clover.classpath"/>
        </javac>
    </target>

    <target name="clover.compile.persistence" depends="with.clover" description="Clover compile the Persistence project">
        <delete>
          <fileset dir="${root.dir}/${persistence.project.classes}">
            <include name="**/*.class"/>
            <exclude name="**/xmlbinding/**"/>
          </fileset>
        </delete>
        <mkdir dir="${root.dir}/${persistence.project.classes}"/>
        <javac destdir="${root.dir}/${persistence.project.classes}">
            <src path="${root.dir}/${persistence.project.source}"/>
            <include name="**/*.java"/>
            <classpath refid="clover.classpath"/>
        </javac>
    </target>

    <target name="clover.compile.ejb" depends="with.clover" description="Clover compile the EJB project">
        <delete>
          <fileset dir="${root.dir}/${ejb.project.classes}">
            <include name="**/*.class"/>
            <exclude name="**/com/ibm/**"/>
            <exclude name="**/org/omg/**"/>
            <exclude name="**/_*.class"/>
            <exclude name="**/EJS*.class"/>
          </fileset>
        </delete>
        <mkdir dir="${root.dir}/${ejb.project.classes}"/>
        <javac destdir="${root.dir}/${ejb.project.classes}">
            <src path="${root.dir}/${ejb.project.source}"/>
            <include name="**/*.java"/>
            <classpath refid="clover.classpath"/>
        </javac>
    </target>

    <target name="clover.compile.web" depends="with.clover" description="Clover compile the Web project">
        <delete>
          <fileset dir="${root.dir}/${web.project.classes}" includes="**/*.class"/>            
        </delete>
        <mkdir dir="${root.dir}/${web.project.classes}"/>
        <javac destdir="${root.dir}/${web.project.classes}">
            <src path="${root.dir}/${web.project.source}"/>
            <include name="**/*.java"/>
            <classpath refid="clover.classpath"/>
        </javac>
    </target>

    <target name="source.code.metrics" description="Create a JavaNCSS metrics report">
        <ant antfile="${common.build}" target="javancss">
			<property name="report.dir" value="${project.report.dir}"/>
            <property name="source.dir" value="${root.dir}"/>
        </ant>
    </target>
</project>