<project name="VStar" default="dist" basedir=".">
	<description>
        Ant build file for VStar.
    </description>

	<!-- Cobertura task definition -->

	<property name="cobertura" value="${basedir}/extlib/cobertura-1.9.3" />

	<path id="cobertura.classpath">
		<fileset dir="${cobertura}">
			<include name="cobertura.jar" />
			<include name="lib/**/*.jar" />
		</fileset>
	</path>

	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

	<!-- Set global properties for this build -->

	<property name="src" location="src" />
	<property name="test" location="test" />
	<property name="src_build" location="src/build" />
	<property name="src_build_debug" location="src/build_debug" />
	<property name="test_build" location="test/build" />
	<property name="manifest_file" location="MANIFEST.MF" />
	<property name="dist" location="dist" />
	<property name="dist_debug" location="dist_debug" />
	<property name="extlib" location="extlib" />
	<property name="ui_resources" location="src/org/aavso/tools/vstar/ui/resources" />
	<property name="test_report" location="test_report" />
	<property name="instrumented" location="instrumented" />
	<property name="coverage_report" location="coverage_report" />
	<property name="jdepend_report" location="jdepend-report.txt" />

	<!-- Classpaths -->

	<path id="build.classpath">
		<fileset dir="${extlib}" includes="*.jar" excludes="junit*.jar" />
	</path>

	<path id="test.classpath">
		<fileset dir="${extlib}" includes="*.jar" />
		<pathelement location="${dist}/vstar.jar" />
		<pathelement path="${test_build}" />
	</path>

	<path id="coverage.classpath">
		<fileset dir="${extlib}" includes="*.jar" />
		<pathelement path="${src_build_debug}" />
		<pathelement path="${test_build}" />
	</path>

	<target name="init">
		<!-- Create the time stamp -->
		<tstamp />

		<!-- Create the build directory structure used by compile and test. -->
		<mkdir dir="${src_build}" />
		<mkdir dir="${src_build_debug}" />
		<mkdir dir="${test_build}" />
		<mkdir dir="${test_report}" />
	</target>

	<!-- Build targets -->

	<target name="compile_src" depends="init" description="Compile the source">
		<!-- Update svn revision -->
		<exec outputproperty="svn_revision" executable="svnversion">
			<arg value="-n" />
		</exec>
		<copy file="${ui_resources}/RevisionAccessor.java.template" tofile="${ui_resources}/RevisionAccessor.java" overwrite="true" />
		<replace file="${ui_resources}/RevisionAccessor.java" token="@revision@" value="${svn_revision}" />

		<!-- Compile source -->
		<javac compiler="modern" source="1.5" target="1.5" srcdir="${src}" destdir="${src_build}">
			<classpath refid="build.classpath" />
		</javac>
	</target>

	<target name="debug" depends="init, manifest" description="Compile the source">
		<!-- Compile source. -->
		<javac compiler="modern" source="1.5" target="1.5" srcdir="${src}" destdir="${src_build_debug}" debug="on" debuglevel="lines,vars,source">
			<classpath refid="build.classpath" />
		</javac>

		<mkdir dir="${dist_debug}" />

		<jar jarfile="${dist_debug}/vstar.jar" basedir="${src_build_debug}" manifest="${manifest_file}">
			<fileset dir="${ui_resources}" />
		</jar>

		<delete file="${manifest_file}" />
	</target>

	<target name="manifest" description="Creates a manifest file for VStar">
		<manifestclasspath property="jar.classpath" jarfile="${dist}/vstar.jar">
			<classpath refid="build.classpath" />
		</manifestclasspath>

		<manifest file="${manifest_file}">
			<attribute name="Manifest-Version" value="1.0" />
			<attribute name="Created-By" value="${user.name}" />
			<attribute name="Main-Class" value="org.aavso.tools.vstar.ui.VStar" />
			<attribute name="Class-Path" value="${jar.classpath}" />
		</manifest>
	</target>

	<target name="dist" depends="compile_src, manifest" description="Generate the distribution">
		<mkdir dir="${dist}" />

		<jar jarfile="${dist}/vstar.jar" basedir="${src_build}" manifest="${manifest_file}">
			<fileset dir="${ui_resources}" />
		</jar>

		<delete file="${manifest_file}" />
	</target>

	<!-- Run targets -->

	<target name="run" depends="dist" description="Run VStar GUI">
		<java fork="true" jar="${dist}/vstar.jar">
			<jvmarg value="-ea" />
		</java>
	</target>

	<target name="run_debug" depends="debug" description="Run debug VStar GUI">
		<java jar="${dist_debug}/vstar.jar" fork="true">
			<sysproperty key="DEBUG" value="true" />
			<arg value="-h" />
			<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y" />
			<jvmarg value="-ea" />
		</java>
	</target>

	<!-- Unit test targets -->

	<target name="compile_ut" depends="dist" description="Compile the test code">
		<javac srcdir="${test}" destdir="${test_build}">
			<classpath refid="test.classpath" />
		</javac>
	</target>

	<target name="test" depends="compile_ut" description="Run unit tests">

		<!-- Run the tests. -->

		<junit fork="yes" printsummary="withOutAndErr" showoutput="true">
			<formatter type="plain" />

			<jvmarg value="-ea" />

			<formatter type="plain" />

			<test name="${testcase}" todir="${test_report}" if="testcase" />

			<batchtest todir="${test_report}" unless="testcase">
				<fileset dir="${test}">
					<include name="**/*Test.java" />
				</fileset>
			</batchtest>

			<classpath refid="test.classpath" />
		</junit>

		<!-- Generate a summary report file to make it easier to spot failures. -->

		<concat destfile="${test_report}/summary.txt">
			<header filtering="no" trimleading="yes">
		          Test Summary
		          ============
		    </header>
			<path>
				<fileset dir="${test_report}" includes="TEST-*" />
			</path>
			<filterchain>
				<linecontains>
					<contains value="Tests run:" />
				</linecontains>
			</filterchain>
		</concat>
	</target>

	<!-- Test coverage targets -->

	<target name="coverage_instrument" description="Cobertura coverage instrumentation">
		<delete file="${basedir}/cobertura.ser" />

		<!-- Compile source as debug. -->
		<javac compiler="modern" source="1.5" target="1.5" srcdir="${src}" destdir="${src_build_debug}" debug="on" debuglevel="lines,vars,source">
			<classpath refid="build.classpath" />
		</javac>

		<!-- Compile UT code. -->
		<javac srcdir="${test}" destdir="${test_build}">
			<classpath refid="coverage.classpath" />
		</javac>

		<cobertura-instrument todir="${instrumented}">
			<fileset dir="${src_build_debug}">
				<include name="**/*.class" />
			</fileset>
		</cobertura-instrument>
	</target>

	<target name="test_coverage" depends="coverage_instrument" description="Collect coverage data from a UT run">
		<junit fork="yes" printsummary="withOutAndErr" showoutput="true">
			<!--
				Specify the name of the coverage data file to use.
				The value specified below is the default.
			-->
			<sysproperty key="net.sourceforge.cobertura.datafile" file="${basedir}/cobertura.ser" />

			<!--
				Note the classpath order: instrumented classes are before the
				original (uninstrumented) classes. This is important.
			-->
			<classpath location="${instrumented}" />
			<classpath refid="coverage.classpath" />

			<!--
				The instrumented classes reference classes used by the
				Cobertura runtime, so Cobertura and its dependencies
				must be on the classpath.
			-->
			<classpath refid="cobertura.classpath" />

			<jvmarg value="-ea" />

			<formatter type="plain" />

			<test name="${testcase}" todir="${test_report}" if="testcase" />

			<batchtest todir="${test_report}" unless="testcase">
				<fileset dir="${test}">
					<include name="**/*Test.java" />
				</fileset>
			</batchtest>
		</junit>
	</target>

	<target name="coverage_report" depends="test_coverage" description="Generate a UT coverage report">
		<cobertura-report format="html" destdir="${coverage_report}" srcdir="${src}" />
	</target>

	<!-- Code analysis targets -->
<!--
	<target name="jdepend" depends="compile_src" description="Dependency analysis">
		<jdepend outputfile="${jdepend_report}">
			<exclude name="java.*" />
			<exclude name="javax.*" />
			<classespath>
				<pathelement location="${dist}/vstar.jar" />
			</classespath>
			<classpath refid="build.classpath" />
		</jdepend>
	</target>
-->
	<!-- Clean targets -->

	<target name="clean" description="Clean up">
		<delete failonerror="false" includeemptydirs="true">
			<!-- Delete the build, dist, UT, coverage directory trees -->
			<fileset dir="${src_build}" includes="**/*" />
			<fileset dir="${src_build_debug}" includes="**/*" />
			<fileset dir="${test_build}" includes="**/*" />
			<fileset dir="${dist}" includes="**/*" />
			<fileset dir="${dist_debug}" includes="**/*" />
			<fileset dir="${test_report}" includes="**/*" />
			<fileset dir="${instrumented}" includes="**/*" />
			<fileset dir="${coverage_report}" includes="**/*" />
			<fileset dir="${basedir}" includes="cobertura.ser" />
			<fileset dir="${basedir}" includes="${jdepend_report}" />
		</delete>
	</target>
</project>

