<?xml version="1.0" encoding="UTF-8" ?>
<project name="smartsprites.master" default="process">
  <dirname property="smartsprites.master.basedir" file="${ant.file.smartsprites.master}"/> 

  <property file="smartsprites.version" />
  <property file="build.properties" />
  
  <property name="etc.dir" location="etc" />
  <property name="tmp.dir" location="tmp" />
  <property name="dist.dir" location="${tmp.dir}/dist" />
  <property name="classes.production.dir" location="tmp/classes" />
  <property name="classes.test.dir" location="tmp/classes-test" />

  <!-- Report directories -->
  <property name="tests.report.dir" location="tmp/test-report" />
  <property name="coverage.report.dir" location="tmp/coverage-report" />
  <property name="findbugs.report.dir" location="tmp/findbugs-report" />
  <property name="duplication.report.dir" location="tmp/duplication-report" />

  <!-- Maven artifacts dir -->
  <property name="maven.repository.dir" location="${dist.dir}/maven2" />

  <!-- Import utility build scripts -->
  <import file="etc/maven/build.xml" />
  <import file="build-autonomous.xml" />

  <!-- Source files for coverage analysis -->
  <fileset id="src.coverage" dir="${basedir}">
    <include name="**/*.java" />
    <exclude name="**/amd/Quantize.java" />
  </fileset>
  <property name="clover.jar" location="${clover.home}/lib/clover.jar" />

  <target name="compile">
    <compile output="${classes.production.dir}" />
  </target>

  <target name="compile-test">
    <compile output="${classes.test.dir}" />
  </target>

  <macrodef name="compile">
    <attribute name="output" />
    
    <sequential>
      <mkdir dir="@{output}" />

      <javac destdir="@{output}" encoding="UTF-8" source="1.5" target="1.5"
             debug="true" debuglevel="lines,source">
        <classpath>
          <fileset dir="lib">
            <include name="**/*.jar" />
          </fileset>
        </classpath>
        <src path="src" />
        <src path="src-test" />
      </javac>
    </sequential>
  </macrodef>
  
  <target name="jar" depends="compile" description="Builds SmartSprites JAR file">
    <jar destfile="lib/smartsprites-${smartsprites.version}.jar">
      <fileset dir="tmp/classes">
        <exclude name="*Test.class" />
        <exclude name="**/test" />
        <exclude name="**/test/**" />
      </fileset>
      <fileset dir="src">
        <include name="**/smartsprites.xml" />
      </fileset>
    </jar>
  </target>

  <target name="test"
          description="Executes SmartSprites unit tests"
          depends="compile-test">
    <mkdir dir="${tests.report.dir}" />

    <junit fork="true" forkmode="once"
           printsummary="on"
           errorproperty="junit.error" failureproperty="junit.failure"
           dir="${basedir}">
      <classpath>
        <fileset dir="lib">
          <include name="**/*.jar" />
        </fileset>
        <pathelement location="${classes.test.dir}" />
        <path location="${clover.jar}" />
      </classpath>

      <formatter type="xml" />
      <batchtest fork="yes" todir="${tests.report.dir}">
        <fileset dir="src-test">
          <include name="**/*Test.java" />
        </fileset>
      </batchtest>
    </junit>

    <junitreport todir="${tests.report.dir}">
      <fileset dir="${tests.report.dir}">
        <include name="TEST-*.xml" />
      </fileset>
      <report format="frames" todir="${tests.report.dir}" />
    </junitreport>

    <condition property="tests.failed" value="true">
      <or>
        <isset property="junit.error" />
        <isset property="junit.failure" />
      </or>
    </condition>
    <fail message="Tests failed. See ${tests.report.dir} for report." if="tests.failed" />  
  </target>

  <target name="process"
          description="Performs CSS sprite processing"
          depends="jar, smartsprites.process" />

  <target name="dist"
          depends="jar"
          description="Builds SmartSprites distribution">
    <property file="smartsprites.version" />
    <property name="archive-prefix" value="smartsprites-${smartsprites.version}" />
    <mkdir dir="${dist.dir}" />

    <zip destfile="${dist.dir}/smartsprites-${smartsprites.version}.zip">
      <zipfileset dir="." prefix="${archive-prefix}">
        <include name="lib/*" />
        <exclude name="lib/compile-time" />
        <include name="test/**" />
        <include name="smartsprites.cmd" />
        <include name="smartsprites.LICENSE" />
        <include name="readme.txt" />
      </zipfileset>
      <zipfileset dir="." includes="build-autonomous.xml" fullpath="${archive-prefix}/build.xml" />
      <zipfileset dir="." includes="smartsprites.sh" prefix="${archive-prefix}" filemode="755" />
      <zipfileset dir="." includes="smartsprites.properties.example" fullpath="${archive-prefix}/smartsprites.properties" />
      <zipfileset dir="doc/website" prefix="${archive-prefix}/doc" />
      <zipfileset dir="lib/compile-time" includes="junit*" prefix="${archive-prefix}/lib" />
    </zip>
  </target>

  <target name="clean" description="Deletes all temporary files" depends="coverage.clean">
    <delete includeEmptyDirs="true" failonerror="false">
      <fileset dir="tmp">
        <exclude name="eclipse/**" />
      </fileset>
    </delete>
    <delete>
      <fileset dir="lib">
        <include name="smartsprites-*.jar" />
      </fileset>
    </delete>
  </target>

  <!--
       Code quality reports
    -->
  <target name="reports" depends="coverage, findbugs, duplication" 
          description="Generates SmartSprites code quality reports" />
  
  <!-- 
       Code coverage calculation.
    -->
  <target name="clover.tasks" if="clover.home">
    <taskdef resource="cloverlib.xml" classpath="${clover.jar}" />
  </target>

  <target name="with.clover" depends="clover.tasks" if="clover.home">
    <clover-setup>
      <fileset refid="src.coverage" />
    </clover-setup>
  </target>

  <target name="without.clover" depends="clover.tasks" if="clover.home">
    <clover-setup enabled="false" />
  </target>

  <target name="coverage" description="Generates SmartSprites unit test code coverage reports" if="clover.home"
          depends="with.clover, test, without.clover">
    <clover-report>
      <current outfile="${coverage.report.dir}" title="SmartSprites ${smartsprites.version} Unit Test Coverage Report">
        <format type="html" />
      </current>
    </clover-report>
    <clover-report>
      <current outfile="${coverage.report.dir}/coverage.xml" title="SmartSprites ${smartsprites.version} Unit Test Coverage Report">
        <format type="xml" />
      </current>
    </clover-report>
  </target>

  <target name="coverage.clean" depends="clover.tasks" if="clover.home">
    <clover-clean />
  </target>

  <!-- 
       FindBugs static analysis.
    -->
  <target name="findbugs" if="findbugs.home" description="Generates SmartSprites static code analysis report"
          depends="compile">
    <taskdef name="findbugs"
             classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
             classpath="${findbugs.home}/lib/findbugs-ant.jar" />
    <mkdir dir="${findbugs.report.dir}" />

    <!-- Delete some classes we don't want to have analyzed -->
    <delete>
      <fileset dir="${classes.production.dir}">
        <include name="**/amd/Quantize*.class" />
      </fileset>
    </delete>

    <fileset id="lib.contents" dir="${basedir}" includes="lib/**/*.jar" />
    <property name="lib.jars" refid="lib.contents" />

    <findbugs home="${findbugs.home}"
              jvmargs="-Xmx512m"
              excludeFilter="${etc.dir}/findbugs/excludes.xml"
              effort="max"
              output="xml:withMessages"
              outputFile="${findbugs.report.dir}/findbugs.xml">
      <auxClasspath path="${lib.jars}" />
      <class location="${classes.production.dir}" />
    </findbugs>

    <xslt in="${findbugs.report.dir}/findbugs.xml"
          style="${etc.dir}/findbugs/findbugs2html.xsl"
          out="${findbugs.report.dir}/index.html" />
  </target>

  <!-- 
       Code duplication detection.
    -->
  <target name="pmd.tasks" if="pmd.home">
    <path id="pmd.classpath"><fileset dir="${pmd.home}/lib" includes="*.jar" /></path>
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.classpath" />
  </target>

  <target name="duplication"
          depends="pmd.tasks"
          if="pmd.home"
          description="Generates SmartSprites code duplication report">
    <mkdir dir="${duplication.report.dir}" />
    <cpd minimumTokenCount="100"
         outputFile="${duplication.report.dir}/duplication.xml"
         format="xml"
         encoding="UTF-8">
      <fileset refid="src.coverage" />
    </cpd>
    <xslt in="${duplication.report.dir}/duplication.xml"
          style="${etc.dir}/cpd/cpd2html.xsl"
          out="${duplication.report.dir}/index.html" />
  </target>

  <!--
       Maven artifacts.
    -->
  <target name="maven" description="Builds SmartSprites Maven2 artifacts"
          depends="jar, smartsprites.maven.deploy" />
</project>


