<?xml version='1.0'?>
<!--
   Copyright (C) 2002-2005 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of version 2 of the GNU General Public License as 
   published by the Free Software Foundation.

   There are special exceptions to the terms and conditions of the GPL 
   as it is applied to this software. View the full text of the 
   exception in file EXCEPTIONS-CONNECTOR-J in the directory of this 
   software distribution.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-->

<!-- version $Id: build.xml 6555 2007-09-04 21:19:51Z mmatthews $ -->

<project name="MySQL Connector/J" default="dist" basedir=".">
	<property name="major_version" value="5"/>
	<property name="minor_version" value="0"/>
	<property name="subminor_version" value="8"/>
	<property name="version_status" value=""/>

	<property name="version" value="${major_version}.${minor_version}.${subminor_version}${version_status}"/>
	<property name="prodName" value="mysql-connector-java"/>
	<property name="extra.version" value=""/>
	<property name="full.version" value="${version}${extra.version}"/>
	<property name="fullProdName" value="${prodName}-${version}${extra.version}"/>
	<property name="sourceDir" value="./src"/>
	<property name="buildDir" value="./build"/>
	<property name="distDir" value="./dist"/>
	<property name="junit.results" value="${buildDir}/junit"/>
	<property name="debug.enable" value="on" />

	<!-- 
	
	     The following property is needed for building the docs. It's
	     set to the defaults for my development environment, but can be passed
	     on the command line to ant via -D switches. 
	-->

	<property name="com.mysql.jdbc.docs.sourceDir" value="/home/mmatthew/work/docs/prebuilt"/>

	<taskdef resource="net/sf/antcontrib/antlib.xml">
		<classpath>
			<pathelement location="${sourceDir}/lib/ant-contrib.jar"/>
		</classpath>
	</taskdef>

	<path id="built.driver.only.classpath">
		<pathelement location="${buildDir}/${fullProdName}" />
	</path>

	<path id="project.build.classpath">
		<fileset dir="${buildDir}/${fullProdName}/lib-nodist">
			<include name="**/*.jar"/>
		</fileset>

		<fileset dir="${buildDir}/${fullProdName}/lib">
			<include name="**/*.jar"/>
		</fileset>

		<pathelement location="${buildDir}/${fullProdName}" />
	</path>

	<target name="init" depends="-init-copy, -init-no-crypto">
		<!-- If we're building under cruise control, update ourself -->
		
		<if>
			<isset property="cctimestamp" />
			<then>
				<exec executable="svn">
					<arg line="up" />
				</exec>
			</then>
		</if>

		<!-- We need the following for source distributions as there we
             can't dynamically alter the classpath, and not having this
		     directory present causes the build to fail -->

		<mkdir dir="${buildDir}/${fullProdName}/lib-nodist" />

		<available file="${com.mysql.jdbc.docs.sourceDir}" property="com.mysql.jdbc.docs.sourcesPresent" />

		<available classname="com.mchange.v2.c3p0.QueryConnectionTester" 
			classpathref="project.build.classpath" 
			property="com.mysql.jdbc.c3p0Present" />

		<available classname="org.apache.log4j.Logger" 
			classpathref="project.build.classpath" 
			property="com.mysql.jdbc.log4jPresent" />

		<available classname="org.jboss.resource.adapter.jdbc.ValidConnectionChecker" 
			classpathref="project.build.classpath" 
			property="com.mysql.jdbc.jbossPresent" />
	</target>

	<target name="-init-copy" depends="clean">
		<tstamp/>

		<filter token="VERSION" value="${version}"/>

		<mkdir dir="${buildDir}" />
		
		<exec executable="svn" 
			output="${buildDir}/svn.properties" 
			failifexecutionfails="false"
			failonerror="false">
			  <arg value="info" />
		</exec>
		    
		<property prefix="svn" file="${buildDir}/svn.properties"/>
		
		<copy todir="${buildDir}/${fullProdName}" filtering="true">
			<fileset dir="${sourceDir}/" excludes="**/CVS">
				<patternset id="classjar" >
					<exclude name="**/*.class*"/>
					<exclude name="**/*.jar"/>
				</patternset>
			</fileset>

			<filterset>
				<filter token="MYSQL_CJ_MAJOR_VERSION" value="${major_version}"/>
				<filter token="MYSQL_CJ_MINOR_VERSION" value="${minor_version}"/>
				<filter token="MYSQL_CJ_SUBMINOR_VERSION" value="${subminor_version}"/>
				<filter token="MYSQL_CJ_VERSION_STATUS" value="${version_status}"/>
				<filter token="MYSQL_CJ_VERSION" value="${version}"/>
				<filter token="MYSQL_CJ_REVISION" value="${svn.Revision}" />
				<filter token="MYSQL_CJ_FULL_PROD_NAME" value="${fullProdName}"/>
			</filterset>
		</copy>

		<copy todir="${buildDir}/${fullProdName}" filtering="false">
			<fileset dir="${sourceDir}" excludes="**/CVS">
				<patternset id="dojar" >
					<include name="**/*.jar*"/>
				</patternset>
			</fileset>
		</copy>
	</target>

	<target name="-init-no-crypto" depends="-init-copy" if="com.mysql.jdbc.noCryptoBuild">
		<copy file="${sourceDir}//lib-nodist/ExportControlledNoCrypto.notjava"
			toFile="${buildDir}/${fullProdName}/com/mysql/jdbc/ExportControlled.java"
			overwrite="true"/>
	</target>

	<!-- 
		This is the target we use to make MySQL AB GPL-licensed and binaries 
		as well as commercially-licensed binaries that include source files.
	-->

	<target name="full-package" description="Builds driver, binary .jar file, docs and packages (.zip, .tar.gz) suitable for distribution that _do_ contain sources" 
		depends="full-dist, -make-packages, -create-archives"/>

	<!-- This is the target we use to make MySQL AB Commercially-licensed binaries -->

	<target name="full-package-no-sources" description="Builds driver, binary .jar file, docs and packages (.zip, .tar.gz) suitable for distribution that do _not_ contain sources"
			depends="full-dist, -make-packages, -remove-sources, -create-archives"/>

	<target name="full-dist" description="Builds driver, binary .jar file and docs, basically a distribution 'image'"
		depends="-dist-trace, dist, -bundle-docs"/>

	<target name="package" depends="dist, -make-packages, -create-archives"/>

	<target name="-remove-sources">
		<echo>Removing sources from ${distDir}/toArchive</echo>
		<delete>
			<fileset dir="${distDir}/toArchive">
				<include name="**/*.java"/>
			</fileset>
		</delete>

		<delete dir="${distDir}/toArchive/${fullProdName}/src"/>
	</target>

	<target name="-create-archives" depends="-make-packages">
		<tar destfile="${distDir}/${fullProdName}.tar.gz"
			compression="gzip" longfile="gnu">
			<tarfileset dir="${toPackage}">
				<patternset refid="non.test.sources" />
			</tarfileset>
		</tar>

		<checksum file="${distDir}/${fullProdName}.tar.gz" forceOverwrite="yes" fileext=".md5"/>

		<delete file="${distDir}/${fullProdName}.zip"/>

		<zip zipfile="${distDir}/${fullProdName}.zip">
			<fileset dir="${toPackage}">
				<patternset refid="non.test.sources" />
			</fileset>
		</zip>

		<checksum file="${distDir}/${fullProdName}.zip" forceOverwrite="yes" fileext=".md5"/>
		
		<if>
			<isset property="com.mysql.jdbc.commercialBuild"/>
			<then>
				<echo message="Not building maven bundle for commercial build" />
			</then>
			<else>
				<!-- Build a Maven bundle for upload to their repository -->
				
				<checksum file="${distDir}/${fullProdName}.zip" forceOverwrite="yes" fileext=".md5"/>
				
				<tempfile destdir="${buildDir}" prefix="maven-bundle-" property="mavenUploadDir" />
				
				<mkdir dir="${mavenUploadDir}" />
				
				<copy file="${buildDir}/${fullProdName}/${fullProdName}-bin.jar"
				  	toFile="${mavenUploadDir}/${fullProdName}.jar" />
				
				<copy file="${buildDir}/${fullProdName}/doc/sources/pom.xml"
					toDir="${mavenUploadDir}" filtering="true">
				</copy>
				
				<copy file="./COPYING"
					toDir="${mavenUploadDir}" />
				
				<copy file="./EXCEPTIONS-CONNECTOR-J"
							toDir="${mavenUploadDir}" />
				
				<jar jarfile="${distDir}/${fullProdName}.bundle.jar" 
							basedir="${mavenUploadDir}" />
			</else>
		</if>
	</target>

	<target name="-make-packages" depends="dist">
		<property name="toPackage" value="${distDir}/toArchive"/>
		<property name="packageDest" value = "${toPackage}/${fullProdName}"/>

		<delete dir="${toPackage}" />
		<mkdir dir="${toPackage}"/>
		<mkdir dir="${packageDest}"/>

		<delete file="${distDir}/${fullProdName}.tar.gz"/>

		<patternset id="non.test.sources" >
			<exclude name="**/*.nb*"/>
			<exclude name="**/*.bak"/>
			<exclude name="**/*.*~"/>
			<exclude name="**/lib-nodist/*"/>
			<exclude name="**/lib-coverage/*"/>
			<exclude name="**/clover/*"/>
			<exclude name="**/checkstyle/*"/>
			<exclude name="**/.*"/>
		</patternset>

		<copy todir="${packageDest}">
			<fileset dir="${buildDir}/${fullProdName}"
				includes="debug/*, docs/**, *.jar" excludes="docs/sources">
				<patternset refid="non.test.sources"/>
			</fileset>

			<fileset dir="." includes="src/com/**, src/doc/**, src/lib/*, src/org/**, src/testsuite/**, build.xml, CHANGES, COPYING, EXCEPTIONS-CONNECTOR-J, README">
				<patternset refid="non.test.sources"/>
			</fileset>
		</copy>

		<!-- Fix CRLF for various platforms -->
		<copy file="${packageDest}/README" tofile="${packageDest}/README.txt"/>
		<copy file="${packageDest}/docs/README.txt" tofile="${packageDest}/docs/README"/>

		<!-- For Windows-y platforms -->

		<fixcrlf srcdir="${packageDest}"
			tab="remove" tablength="8"
			eol="crlf" includes="**/README.txt"/>

		<!-- For Unix-y platforms -->

		<fixcrlf srcdir="${packageDest}"
					tab="remove" tablength="8"
					eol="lf" includes="**/README"/>

		<if>
			<isset property="com.mysql.jdbc.commercialBuild"/>
			<then>
				<!-- These are the GPL and FLOSS exceptions. They don't get shipped with
									 commercial builds -->

				<delete file="${packageDest}/COPYING"/>
				<delete file="${packageDest}/EXCEPTIONS-CONNECTOR-J"/>

				<!-- Pull in the commercial license itself -->

				<copy file="${sourceDir}/lib-nodist/LICENSE.mysql" toDir="${packageDest}"/>

				<loadfile property="commercialLicenseText"
					srcFile="${sourceDir}/lib-nodist/commercialLicense.txt"/>
				<replaceregexp 
					match="Copyright.*1307.[^replaceregexp]*USA"
					replace="${commercialLicenseText}"
					flags="s">
					<fileset dir="${packageDest}" includes="**/*"/>
				</replaceregexp>
			</then>
		</if>
	</target>

	<target name="dist" depends="init, compile">

		<delete file="${buildDir}/${fullProdName}-bin.jar" />
		<delete file="${distDir}/${fullProdName}.jar" />

		<mkdir dir="${distDir}" />
		<mkdir dir="${buildDir}/META-INF" />

		<!-- JDBC-4.0 support of service provider mechanism -->

		<mkdir dir="${buildDir}/META-INF/services/" />
		<echo file="${buildDir}/META-INF/services/java.sql.Driver"
			message="com.mysql.jdbc.Driver" />

		<manifest file="${buildDir}/META-INF/MANIFEST.MF">
			<attribute name="Built-By" value="${user.name}" />

			<section name="common">
				<attribute name="Specification-Title" value="JDBC" />
				<attribute name="Specification-Version" value="3.0" />
				<attribute name="Specification-Vendor" value="Sun Microsystems Inc." />
				<attribute name="Implementation-Title" value="MySQL Connector/J" />
				<attribute name="Implementation-Version" value="${full.version}" />
				<attribute name="Implementation-Vendor-Id" value="com.mysql" />
				<attribute name="Implementation-Vendor" value="MySQL AB" />
			</section>
		</manifest>

		<jar jarfile="${buildDir}/${fullProdName}/${fullProdName}-bin.jar" 
			basedir="${buildDir}/${fullProdName}" 
			includes="**/*.class,**/*.properties*,COPYING,README" 
			excludes="testsuite/**" 
			index="true" 
			manifest="${buildDir}/META-INF/MANIFEST.MF"/>
	</target>

	<target name="-dist-trace" depends="init, compile-driver-trace">

		<delete file="${buildDir}/${fullProdName}-bin-g.jar"/>

		<mkdir dir="${distDir}" />
		<mkdir dir="${buildDir}/${fullProdName}/debug"/>

		<manifest file="${buildDir}/MANIFEST.MF">
			<attribute name="Built-By" value="${user.name}" />

			<section name="common">
				<attribute name="Specification-Title" value="JDBC" />
				<attribute name="Specification-Version" value="3.0" />
				<attribute name="Specification-Vendor" value="Sun Microsystems Inc." />
				<attribute name="Implementation-Title" value="MySQL Connector/J (trace/debug enabled)" />
				<attribute name="Implementation-Version" value="${full-version} (trace/debug-enabled)" />
				<attribute name="Implementation-Vendor" value="MySQL AB" />
			</section>
		</manifest>

		<jar jarfile="${buildDir}/${fullProdName}/debug/${fullProdName}-bin-g.jar"
				basedir="${buildDir}/${fullProdName}"
				includes="**/*.class,**/*.properties*,COPYING,README"
				excludes="testsuite/**"
				index="true"
				manifest="${buildDir}/MANIFEST.MF"
			/>
	</target>

	<target name="-bundle-docs" depends="init">
		<copy file="${com.mysql.jdbc.docs.sourceDir}/en/html/connector-j.html"
		  	todir="${buildDir}/${fullProdName}/docs"
		  	failonerror="true"/>
		<copy file="${com.mysql.jdbc.docs.sourceDir}/en/pdf/connector-j.pdf"
			todir="${buildDir}/${fullProdName}/docs"
			failonerror="true"/>
		<copy file="${com.mysql.jdbc.docs.sourceDir}/en/txt/connector-j.txt"
			tofile="${buildDir}/${fullProdName}/docs/README.txt"
			failonerror="true"/>
		<copy todir="${buildDir}/${fullProdName}/docs/release-test-output" failonerror="false">
			<fileset dir="${com.mysql.jdbc.docs.sourceDir}/release-test-output" excludes="**/CVS">
			</fileset>
		</copy>
	</target>

	<target name="test-all-multi" depends="compile">
		<delete dir="${buildDir}/junit" />
		<antcall target="test-multijvm" />
		<antcall target="test-compliance-multijvm" />
		
		<fail message="Tests failed. Check logs and/or reports in ${buildDir}/junit." 
			if="tests.compliance.failed"/>
	</target>

	<!-- Runs compliance testsuite against multiple JVMs and server configs -->

	<target name="test-multijvm" depends="compile">
		<for list="1,2,3,4,5,6,7,8" param="jvm.number">
			<sequential>
				<if>
					<isset property="com.mysql.jdbc.testsuite.jvm.@{jvm.number}"/>
					<then>
						<for list="1,2,3,4,5,6,7,8" param="url.number">
							<sequential>
								<if>
									<isset property="com.mysql.jdbc.testsuite.url.@{url.number}"/>
									<then>
										<make-output-hier 
										jdbcUrl="${com.mysql.jdbc.testsuite.url.@{url.number}}" 
										junitOutput="${junit.results}" 
										jvm="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}" 
										unitOrCompliance="unit" />

										<property name="test.multi.junitOut.@{url.number}" value="eraseMe" />
										<var name="test.multi.junitOut.@{url.number}" unset="true" />

										<loadfile srcfile="${junit.results}/hier" 
										property="test.multi.junitOut.@{url.number}" />

										<antcall target="test">
											<param name="com.mysql.jdbc.testsuite.url" value="${com.mysql.jdbc.testsuite.url.@{url.number}}" />
											<param name="test.result.prefix" value="/${test.multi.junitOut.@{url.number}}" />
											<param name="com.mysql.jdbc.testsuite.jvm" value="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}"/>
										</antcall>
									</then>
								</if>
							</sequential>
						</for>
					</then>
				</if>
			</sequential>
		</for>
	</target>

	<target name="-set-test-result-prefix" unless="${test.result.prefix}">
		<property name="test.result.prefix" value=""/>
	</target>

	<target name="test" depends="compile, -set-test-result-prefix">
		<property name="com.mysql.jdbc.testsuite.jvm" value="java"/>
		<mkdir dir="${junit.results}"/>
		<echo message="Running unit tests against ${com.mysql.jdbc.testsuite.url} with jvm ${com.mysql.jdbc.testsuite.jvm}"/>

		<property name="junit.unitregress.results" value="${junit.results}/${test.result.prefix}/unitregress" />

		<mkdir dir="${junit.results}/${test.result.prefix}"/>
		<mkdir dir="${junit.unitregress.results}"/>

		<mkdir dir="${junit.unitregress.results}/report"/>

		<junit printSummary="yes" 
			fork="on" 
			forkmode="once"
			jvm="${com.mysql.jdbc.testsuite.jvm}"
			errorProperty="tests.failed"
			failureProperty="tests.failed">
			<jvmarg value="-Xmx256m" />

			<!-- For java.sql.SavePoint on old JVMs -->

			<jvmarg value="-Xverify:none" />

			<sysproperty key="com.mysql.jdbc.testsuite.url" value="${com.mysql.jdbc.testsuite.url}"/>

			<classpath>
				<fileset dir="${sourceDir}/lib-nodist">
					<include name="**/*.jar"/>
				</fileset>
				<fileset dir="${buildDir}/${fullProdName}/lib">
					<include name="**/*.jar"/>
				</fileset>
				<pathelement location="${buildDir}/${fullProdName}" />
				<pathelement path="${java.class.path}" />
			</classpath>

			<formatter type="xml"/>

			<batchtest todir="${junit.unitregress.results}" >
				<fileset dir="${buildDir}/${fullProdName}">
					<include name="**/*Test.java" />
					<exclude name="**/perf/*.java"/>
				</fileset>
			</batchtest>
		</junit>

		<junitreport todir="${junit.unitregress.results}/report">
			<fileset dir="${junit.unitregress.results}">
				<include name="**/TEST-*.xml"/>
			</fileset>
			<report format="frames" todir="${junit.unitregress.results}/report"/>
		</junitreport>

		<!-- Don't fail the build if we're doing multi-tests -->
		<if>
			<equals arg1="${test.result.prefix}" arg2="" />
			<then>
				<fail message="Tests failed. Check logs and/or reports in ${junit.results}." if="tests.failed"/>
			</then>
			<else>
				<echo message="Not checking test failures because we're doing a multi-test..." />
			</else>
		</if>

	</target>

	<!-- Runs compliance testsuite against multiple JVMs and server configs -->

	<target name="test-compliance-multijvm" depends="compile">
		<for list="1,2,3,4,5,6,7,8" param="jvm.number">
			<sequential>
				<if>
					<isset property="com.mysql.jdbc.testsuite.jvm.@{jvm.number}"/>
					<then>
						<for list="1,2,3,4,5,6,7,8" param="url.number">
							<sequential>
								<if>
									<isset property="com.mysql.jdbc.compliance.url.@{url.number}"/>
									<then>
										<make-output-hier 
											jdbcUrl="${com.mysql.jdbc.compliance.url.@{url.number}}" 
											junitOutput="${junit.results}"
											jvm="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}" 
											unitOrCompliance="compliance"/>

										<property name="test.compliance.multi.junitOut.@{url.number}" value="eraseMe" />
										<var name="test.compliance.multi.junitOut.@{url.number}" unset="true" />

										<loadfile srcfile="${junit.results}/hier" property="test.compliance.multi.junitOut.@{url.number}" />

										<antcall target="test-compliance">
											<param name="com.mysql.jdbc.compliance.url" value="${com.mysql.jdbc.compliance.url.@{url.number}}"/>
											<param name="com.mysql.jdbc.testsuite.jvm" value="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}"/>
											<param name="test.result.prefix" value="/${test.compliance.multi.junitOut.@{url.number}}"/>
										</antcall>
									</then>
								</if>
							</sequential>
						</for>
					</then>
				</if>
			</sequential>
		</for>
	</target>

	<!-- 
	
		Tests for JDBC compliance. The JDBC compliance testsuite
	    is not shipped with MySQL Connector/J as it is not licensible
	    except from Sun.
	     
	    The properties com.mysql.jdbc.compliance.url and
	    jdbc-compliance-location must be set
	    prior to running this test. 
	     
	-->

	<target name="test-compliance" depends="compile">
		<property name="com.mysql.jdbc.test.jvm" value="java"/>
		<mkdir dir="${junit.results}"/>
		<echo message="Running compliance tests against ${com.mysql.jdbc.compliance.url} with jvm ${com.mysql.jdbc.testsuite.jvm}"/>

		<property name="junit.compliance.results" 
			value="${junit.results}/${test.result.prefix}/compliance"/>

		<mkdir dir="${junit.results}/${test.result.prefix}"/>
		<mkdir dir="${junit.compliance.results}"/>
		<mkdir dir="${junit.compliance.results}/report"/>

		<junit fork="on" forkmode="once"
		    printsummary="yes" jvm="${com.mysql.jdbc.testsuite.jvm}"
			errorProperty="tests.compliance.failed"
			failureProperty="tests.compliance.failed">
			<jvmarg value="-Xmx256m"/>

			<!-- For java.sql.SavePoint on old JVMs -->

			<jvmarg value="-Xverify:none"/>

			<sysproperty key="com.mysql.jdbc.compliance.url" value="${com.mysql.jdbc.compliance.url}"/>

			<classpath>
				<pathelement location="${buildDir}/${fullProdName}"/>
				<fileset dir="${sourceDir}/lib-nodist">
					<include name="**/*.jar"/>
				</fileset>
				<fileset dir="${buildDir}/${fullProdName}/lib">
					<include name="**/*.jar"/>
				</fileset>
				<pathelement path="${java.class.path}" />
				<pathelement location="${jdbc-compliance-location}"/>
			</classpath>

			<formatter type="xml"/>

			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.BatchUpdateTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ConnectionTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.DatabaseMetaDataTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.EscapeSyntaxTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.PreparedStatementTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ResultSetMetadataTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ResultSetTest"/>
			<test todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.StatementTest"/>
		</junit>

		<junitreport todir="${junit.compliance.results}/report">
			<fileset dir="${junit.compliance.results}">
				<include name="**/TEST-*.xml"/>
			</fileset>
			<report format="frames" todir="${junit.compliance.results}/report"/>
		</junitreport>

		<!-- Don't fail the build if we're doing multi-tests -->
		<if>
			<equals arg1="${test.result.prefix}" arg2="" />
			<then>
				<fail message="Tests failed. Check logs and/or reports in ${junit.compliance.results}." if="tests.compliance.failed"/>
			</then>
			<else>
				<echo message="Not checking test failures because we're doing a multi-test..." />
			</else>
		</if>

	</target>

	<target name="compile" depends="init, compile-driver, compile-testsuite, compile.integration">
	</target>

	<target name="compile-trace" depends="init, compile-driver-trace">
	</target>

	<!-- Compiles the driver itself -->

	<target name="compile-driver" depends="init, -clean-output">
		<javac srcdir="${buildDir}/${fullProdName}" 
			destdir="${buildDir}/${fullProdName}" 
			deprecation="off" 
			debug="${debug.enable}" 
			excludes="testsuite/**, 
			   com/mysql/jdbc/integration/**,
			   com/mysql/jdbc/log/Log4JLogger.java">
			<classpath refid="project.build.classpath" />
		</javac>
	</target>

	<!-- Compiles a version of the driver with AspectJ tracing -->

	<target name="compile-driver-trace" depends="init">
		<taskdef 
			      resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
			<classpath>
				<pathelement location="${sourceDir}/lib/aspectjtools.jar"/>
			</classpath>
		</taskdef>


		<iajc destDir="${buildDir}/${fullProdName}">
			<sourceroots>
				<pathelement location="${buildDir}/${fullProdName}/org"/>
				<pathelement location="${buildDir}/${fullProdName}/com"/>
			</sourceroots>
			<classpath refid="project.build.classpath"/>
			<classpath>
				<pathelement location="${sourceDir}/lib/aspectjtools.jar"/>
			</classpath>
		</iajc>
	</target>

	<!-- Compiles integration 'helpers' for third-party software -->
	<target name="compile.integration" 
		depends="compile-driver, 
				 compile-integration-c3p0, 
		         compile-integration-jboss,
				 compile-integration-log4j"/>

	<target name="compile-integration-c3p0" 
		depends="compile-driver"
		if="com.mysql.jdbc.c3p0Present">
		<javac srcdir="${buildDir}/${fullProdName}" 
				destdir="${buildDir}/${fullProdName}" 
				deprecation="off" 
				debug="${debug.enable}" 
				includes="com/mysql/jdbc/integration/c3p0/**">
			<classpath refid="project.build.classpath" />
		</javac>
	</target>

	<target name="compile-integration-jboss" 
			depends="compile-driver"
			if="com.mysql.jdbc.jbossPresent">
		<javac srcdir="${buildDir}/${fullProdName}" 
					destdir="${buildDir}/${fullProdName}" 
					deprecation="off" 
					debug="${debug.enable}" 
					includes="com/mysql/jdbc/integration/jboss/**">
			<classpath refid="project.build.classpath" />
		</javac>
	</target>

	<target name="compile-integration-log4j" 
			depends="compile-driver"
			if="com.mysql.jdbc.log4jPresent">
		<javac srcdir="${buildDir}/${fullProdName}" 
				destdir="${buildDir}/${fullProdName}" 
				deprecation="off" 
				debug="${debug.enable}" 
				includes="com/mysql/jdbc/log/Log4JLogger.java">
			<classpath refid="project.build.classpath" />
		</javac>
	</target>

	<!-- Compiles the JUnit testsuite -->

	<target name="compile-testsuite" depends="init, compile-driver">
		<javac 
			srcdir="${buildDir}/${fullProdName}" 
			destdir="${buildDir}/${fullProdName}" 
			deprecation="off" 
			debug="${debug.enable}"
			includes="testsuite/**"
			excludes="testsuite/requiresNonRedists/**">
			<classpath refid="project.build.classpath"/>
		</javac>
	</target>

	<target name="real-clean">
		<delete dir="${buildDir}"/>
		<delete>
			<fileset dir="${distDir}" 
				includes="${fullProdName}.zip,${fullProdName}.tar.gz"/>
		</delete>
	</target>

	<target name="clean" unless="com.mysql.jdbc.noCleanBetweenCompiles">
		<delete dir="${buildDir}"/>
	</target>

	<target name="-clean-output" unless="com.mysql.jdbc.noCleanBetweenCompiles">
		<delete>
			<fileset dir="${buildDir}" 
						includes="**/*.class"/>
		</delete>
	</target>

	<target name="docs-generate-properties-table" depends="compile-driver">
		<tempfile property="properties-xml" suffix=".xml" />

		<java classname="com.mysql.jdbc.util.PropertiesDocGenerator"
			output="${properties-xml}" classpath="${buildDir}/${fullProdName}"/>
		<tempfile property="docsPropXslTempfile" suffix="xsl"/>
		<copy file="${buildDir}/${fullProdName}/doc/sources/connPropsToDocbook.xsl" tofile="${docsPropXslTempfile}"/>

		<style in="${properties-xml}" style="${docsPropXslTempfile}"
		       out="${buildDir}/${fullProdName}/docs/sources/connPropsDocBook.xml"/>
		<delete file="${properties-xml}"/>
		<delete file="${docsPropXslTempfile}"/>
	</target>

	<target name="docs-generate-error-mapping-table" depends="compile-driver">
		<tempfile property="errorsMapping-xml" suffix=".xml" />

		<java classname="com.mysql.jdbc.util.ErrorMappingsDocGenerator"
				output="${errorsMapping-xml}" classpath="${buildDir}/${fullProdName}"/>
		<tempfile property="docsErrorXslTempfile" suffix="xsl"/>
		<copy file="${buildDir}/${fullProdName}/doc/sources/errorMapToDocbook.xsl" tofile="${docsErrorXslTempfile}"/>

		<style in="${errorsMapping-xml}" style="${docsErrorXslTempfile}"
			       out="${buildDir}/${fullProdName}/docs/sources/errorMappingDocBook.xml"/>
		<delete file="${docsErrorXslTempfile}"/>
	</target>

	<!-- 
	     Targets below this point are for code coverage and depend on
	     the 'Emma' project which you can download from 
	     http://emma.sourceforge.net/
	-->

	<target name="emma" description="turns on EMMA instrumentation/reporting" >
		<!-- directory that contains emma.jar and emma_ant.jar: -->
		<property name="emma.dir" value="${sourceDir}/lib-coverage" />

		<path id="emma.lib" >
			<pathelement location="${emma.dir}/emma.jar" />
			<pathelement location="${emma.dir}/emma_ant.jar" />
		</path>

		<taskdef resource="emma_ant.properties" classpathref="emma.lib" />

		<property name="emma.enabled" value="true" />
		<property name="emma.coverage.dir" value="${buildDir}/${fullProdName}-coverage" />
	</target>

	<target name="instrument" depends="init, compile" 
		description="runs the examples" >

		<emma enabled="${emma.enabled}" >
			<instr instrpathref="built.driver.only.classpath"
	             destdir="${buildDir}/${fullProdName}"	
	             metadatafile="${emma.coverage.dir}/metadata.emma"
	             merge="true"
	      		 mode="overwrite">
				<filter excludes="*Test*" />
				<filter excludes="org.junit.*" />
			</instr>
		</emma>

	</target>

	<target name="test-emma-report" depends="test-coverage, test-coverage-compliance">
		<emma enabled="${emma.enabled}" >
			<report sourcepath="${buildDir}/${fullProdName}" >
				<fileset dir="${emma.coverage.dir}" >
					<include name="*.emma" />
				</fileset>

				<txt outfile="${emma.coverage.dir}/coverage.txt" />
				<html outfile="${emma.coverage.dir}/coverage.html" />
			</report>
		</emma>
	</target>

	<target name="test-coverage-all-report" depends="test-coverage-multijvm, test-coverage-compliance-multijvm">
		<emma enabled="${emma.enabled}" >
			<report sourcepath="${buildDir}/${fullProdName}" >
				<fileset dir="${emma.coverage.dir}" >
					<include name="*.emma" />
				</fileset>

				<txt outfile="${emma.coverage.dir}/coverage.txt" />
				<html outfile="${emma.coverage.dir}/coverage.html" />
			</report>
		</emma>
	</target>


	<target name="test-coverage" depends="instrument">
		<property name="com.mysql.jdbc.testsuite.jvm" value="java"/>
		<mkdir dir="${junit.results}"/>
		<echo message="Running unit tests against ${com.mysql.jdbc.testsuite.url} with jvm ${com.mysql.jdbc.testsuite.jvm}"/>

		<property name="junit.unitregress.results" value="${junit.results}/${test.result.prefix}/unitregress" />

		<mkdir dir="${junit.results}/${test.result.prefix}"/>
		<mkdir dir="${junit.unitregress.results}"/>

		<mkdir dir="${junit.unitregress.results}/report"/>

		<junit printSummary="yes" fork="on" jvm="${com.mysql.jdbc.testsuite.jvm}">
			<jvmarg value="-Xmx256m" />
			<jvmarg value="-Xverify:none" />
			<!-- For java.sql.SavePoint on old JVMs -->
			<jvmarg value="-Demma.coverage.out.file=${emma.coverage.dir}/coverage.emma" />
			<jvmarg value="-Demma.coverage.out.merge=true" />
			<sysproperty key="com.mysql.jdbc.testsuite.url" value="${com.mysql.jdbc.testsuite.url}"/>
			<classpath>
				<fileset dir="${sourceDir}/lib-nodist">
					<include name="**/*.jar"/>
				</fileset>
				<fileset dir="${buildDir}/${fullProdName}/lib">
					<include name="**/*.jar"/>
				</fileset>
				<pathelement location="${buildDir}/${fullProdName}" />
				<pathelement path="${java.class.path}" />
				<pathelement location="${emma.dir}/emma.jar" />
				<pathelement location="${emma.dir}/emma_ant.jar" />
			</classpath>

			<formatter type="xml"/>

			<batchtest fork="yes" todir="${junit.unitregress.results}">
				<fileset dir="${buildDir}/${fullProdName}">
					<include name="**/*Test.java" />
					<exclude name="**/perf/*.java"/>
				</fileset>
			</batchtest>
		</junit>


		<junitreport todir="${junit.unitregress.results}/report">
			<fileset dir="${junit.unitregress.results}">
				<include name="**/TEST-*.xml"/>
			</fileset>
			<report format="frames" todir="${junit.unitregress.results}/report"/>
		</junitreport>
	</target>

	<target name="test-coverage-compliance" depends="instrument">
		<property name="com.mysql.jdbc.test.jvm" value="java"/>
		<mkdir dir="${junit.results}"/>
		<echo message="Running compliance tests against ${com.mysql.jdbc.compliance.url} with jvm ${com.mysql.jdbc.testsuite.jvm}"/>

		<property name="junit.compliance.results" 
			value="${junit.results}/${test.result.prefix}/compliance"/>

		<mkdir dir="${junit.results}/${test.result.prefix}"/>
		<mkdir dir="${junit.compliance.results}"/>
		<mkdir dir="${junit.compliance.results}/report"/>

		<junit printsummary="yes" jvm="${com.mysql.jdbc.testsuite.jvm}">
			<jvmarg value="-Xmx256m"/>
			<jvmarg value="-Xverify:none"/>
			<!-- For java.sql.SavePoint on old JVMs -->
			<jvmarg value="-Demma.coverage.out.file=${emma.coverage.dir}/coverage.emma" />
			<jvmarg value="-Demma.coverage.out.merge=true" />
			<sysproperty key="com.mysql.jdbc.compliance.url" value="${com.mysql.jdbc.compliance.url}"/>
			<classpath>
				<pathelement location="${buildDir}/${fullProdName}"/>
				<fileset dir="${sourceDir}/lib-nodist">
					<include name="**/*.jar"/>
				</fileset>
				<fileset dir="${buildDir}/${fullProdName}/lib">
					<include name="**/*.jar"/>
				</fileset>
				<pathelement path="${java.class.path}" />
				<pathelement location="${jdbc-compliance-location}"/>
				<pathelement location="${emma.dir}/emma.jar" />
				<pathelement location="${emma.dir}/emma_ant.jar" />
			</classpath>

			<formatter type="xml"/>


			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.BatchUpdateTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ConnectionTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.DatabaseMetaDataTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.EscapeSyntaxTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.PreparedStatementTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ResultSetMetadataTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.ResultSetTest"/>
			<test fork="yes" todir="${junit.compliance.results}" 
		    		name="com.mysql.jdbc.compliance.tests.StatementTest"/>
		</junit>

		<junitreport todir="${junit.compliance.results}/report">
			<fileset dir="${junit.compliance.results}">
				<include name="**/TEST-*.xml"/>
			</fileset>
			<report format="frames" todir="${junit.compliance.results}/report"/>
		</junitreport>
	</target>

	<!-- Makes output directory hierarchy based on MySQL server version,
	     os information and jvm version -->

	<macrodef name="make-output-hier">
		<attribute name="jvm" />
		<attribute name="jdbcUrl" />
		<attribute name="unitOrCompliance" />
		<attribute name="junitOutput" />
		<sequential>
			<java fork="true" jvm="@{jvm}" classname="com.mysql.jdbc.util.VersionFSHierarchyMaker">

				<jvmarg value="-Xmx256m" />
				<jvmarg value="-Xverify:none" />
				<!-- For java.sql.SavePoint on old JVMs -->
				<jvmarg value="-Demma.coverage.out.file=${emma.coverage.dir}/coverage.emma" />
				<jvmarg value="-Demma.coverage.out.merge=true" />

				<sysproperty key="com.mysql.jdbc.testsuite.url" value="@{jdbcUrl}" />

				<classpath>
					<fileset dir="${sourceDir}/lib-nodist">
						<include name="**/*.jar" />
					</fileset>
					<fileset dir="${buildDir}/${fullProdName}/lib">
						<include name="**/*.jar" />
					</fileset>
					<pathelement location="${buildDir}/${fullProdName}" />
					<pathelement path="${java.class.path}" />
					<pathelement location="${emma.dir}/emma.jar" />
					<pathelement location="${emma.dir}/emma_ant.jar" />
				</classpath>
				<arg line="@{unitOrCompliance} @{junitOutput} @{junitOutput}/hier" />
			</java>
		</sequential>
	</macrodef>

	<!-- Runs compliance testsuite against multiple JVMs and 
	     server configs, and produces coverage reports -->

	<target name="test-coverage-multijvm" depends="instrument">
		<for list="1,2,3,4,5,6,7,8" param="jvm.number">
			<sequential>
				<if>
					<isset property="com.mysql.jdbc.testsuite.jvm.@{jvm.number}"/>
					<then>
						<for list="1,2,3,4,5,6,7,8" param="url.number">
							<sequential>
								<if>
									<isset property="com.mysql.jdbc.testsuite.url.@{url.number}"/>
									<then>
										<make-output-hier 
										jdbcUrl="${com.mysql.jdbc.testsuite.url.@{url.number}}" 
										junitOutput="${junit.results}" 
										jvm="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}" 
										unitOrCompliance="unit" />

										<property name="test.coverage.multi.junitOut.@{url.number}" value="eraseMe" />
										<var name="test.coverage.multi.junitOut.@{url.number}" unset="true" />

										<loadfile srcfile="${junit.results}/hier" 
										property="test.coverage.multi.junitOut.@{url.number}" />

										<antcall target="test-coverage">
											<param name="com.mysql.jdbc.testsuite.url" value="${com.mysql.jdbc.testsuite.url.@{url.number}}" />
											<param name="test.result.prefix" value="/${test.coverage.multi.junitOut.@{url.number}}" />
											<param name="com.mysql.jdbc.testsuite.jvm" value="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}"/>
										</antcall>
									</then>
								</if>
							</sequential>
						</for>
					</then>
				</if>
			</sequential>
		</for>
	</target>

	<!-- Runs compliance testsuite against multiple JVMs and server configs, collecting
	       coverage data -->

	<target name="test-coverage-compliance-multijvm" depends="instrument">
		<for list="1,2,3,4,5,6,7,8" param="jvm.number"  xmlns:ac="antlib:net.sf.antcontrib">
			<sequential>
				<if>
					<isset property="com.mysql.jdbc.testsuite.jvm.@{jvm.number}"/>
					<then>
						<for list="1,2,3,4,5,6,7,8" param="url.number">
							<sequential>
								<if>
									<isset property="com.mysql.jdbc.compliance.url.@{url.number}"/>
									<then>
										<make-output-hier 
											jdbcUrl="${com.mysql.jdbc.compliance.url.@{url.number}}" 
											junitOutput="${junit.results}"
											jvm="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}" 
											unitOrCompliance="compliance"/>

										<property name="test.coverage.compliance.multi.junitOut.@{url.number}" value="eraseMe" />
										<var name="test.coverage.compliance.multi.junitOut.@{url.number}" unset="true" />

										<loadfile srcfile="${junit.results}/hier" property="test.coverage.compliance.multi.junitOut.@{url.number}" />

										<antcall target="test-coverage-compliance">
											<param name="com.mysql.jdbc.compliance.url" value="${com.mysql.jdbc.compliance.url.@{url.number}}"/>
											<param name="com.mysql.jdbc.testsuite.jvm" value="${com.mysql.jdbc.testsuite.jvm.@{jvm.number}}"/>
											<param name="test.result.prefix" value="/${test.coverage.compliance.multi.junitOut.@{url.number}}"/>
										</antcall>
									</then>
								</if>
							</sequential>
						</for>
					</then>
				</if>
			</sequential>
		</for>
	</target>
</project>
