<!--
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
 -->

<!-- $Id$ -->

<!-- 
     Compiles DBCP unit tests and attempts to run them using the compiled dbcp jar
     specified in the "commons-dbcp.jar" property.  Set this property in build.properties
     along with commons-pool.jar and execute the "test" target to run the tests.
     
     If the jdk level is <= 1.5, JDBC 4 methods will commented out in the test 
     code before compilation of the tests.
-->

<project name="commons-dbcp" default="test" basedir=".">

   <target name="init">
      <tstamp/>

      <!-- read properties from the build.properties, if any -->
      <property name="component-propfile" value="${basedir}/build.properties"/>
      <property file="${component-propfile}"/>

      <!-- read properties from the ${user.home}/propfile, if any -->
      <property name="user-propfile" value="${user.home}/build.properties"/>
      <property file="${user-propfile}"/>

      <property name="commons-pool.jar" value="${basedir}/../pool/dist/commons-pool.jar"/>
   	  <property name="commons-dbcp.jar" value="${basedir}/../../commons-dbcp-1.3-SNAPSHOT.jar"/>

      <!-- now combine the classpaths -->
      <property name="classpath" 
       value="${cp}:${commons-pool.jar}:${commons-dbcp.jar}:${jdbc20ext.jar}:${junit.jar}:
        ${naming-common.jar}:${naming-java.jar}:${commons-logging.jar}:
      	${xerces.jar}:${xml-apis.jar}:${jta-spec.jar}:${jta-impl.jar}:
      	${backport-util-concurrent.jar}:${ejb-spec.jar}"/>

      <property name="build.dir" value="${basedir}/build"/>
      <property name="build.test-classes.dir" value="${build.dir}/test-classes"/>

      <property name="test.entry" value="org.apache.commons.dbcp.TestAll"/>
      <property name="test.failonerror" value="true" /> 
      <property name="test.runner" value="junit.textui.TestRunner" /> 
 
      <property name="javac.optimize" value="false"/>
      <property name="javac.debug" value="true"/>
      <property name="javac.deprecation" value="false"/>
      
   	  <available property="jndi.present" classname="javax.naming.Context"/>
      <available property="jdbc4.present" classname="java.sql.Wrapper"/>
   </target>

   <target name="check_jar">
   	   <available file="${file}" property="found"/>
   	   <antcall target="check_message"/>
   </target>

	<target name="check_message" unless="found">
		<!-- echo could be replaced with fail if required -->
        <echo message="Could not find ${file}"/>
   </target>

   <!-- Check that all the dependencies exist -->
   <target name="check_depends" depends="init">
       <echo>Checking dependencies</echo>
       <antcall target="check_jar">
           <param name="file" value="${commons-pool.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${junit.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${naming-common.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${naming-java.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${commons-logging.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${xerces.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${jta-spec.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${jta-impl.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${backport-util-concurrent.jar}"/>
       </antcall>
       <antcall target="check_jar">
           <param name="file" value="${ejb-spec.jar}"/>
       </antcall>
   </target>

   <!-- ######################################################### -->

   <target name="clean" depends="init" description="removes generated files">
      <delete dir="${build.dir}"/>
      <delete dir="${dist.dir}"/>
   </target>

	<target name="prepare-nojdbc4" depends="init" unless="jdbc4.present">
	   <echo message="Commenting out the jdbc4 additional methods since JDBC 4 was not detected."/>
	   <property name="src.dir" value="${build.dir}/src"/>
	   <property name="src.java.dir" value="${src.dir}/java"/>
	   <property name="src.test.dir" value="${src.dir}/test"/>
	   <property name="javac.source" value="1.4" />

	   <mkdir dir="${src.dir}"/> 
	   <copy todir="${src.dir}" filtering="yes">
	      <fileset dir="${basedir}/src" defaultexcludes="no">
	         <include name="**/*.java"/>
	         <include name="**/*.xml"/>
	         <include name="**/*.properties"/>
	         <include name="**/*.jocl"/>
	         <include name="**/package.html"/>
	      </fileset>
	   </copy>
	   <replace dir="${src.dir}" token="/* JDBC_4_ANT_KEY_BEGIN */" value="/*"/>
	   <replace dir="${src.dir}" token="/* JDBC_4_ANT_KEY_END */" value="*/"/>
	</target>

	<target name="prepare-jdbc4" depends="init" if="jdbc4.present">
	  <echo message="JDBC 4 was detected."/>
	      <property name="src.dir" value="${basedir}/src"/>
	      <property name="src.java.dir" value="${src.dir}/java"/>
	      <property name="src.test.dir" value="${src.dir}/test"/>
	      <property name="javac.source" value="1.5" />
	   </target>

   <target name="prepare" depends="init,prepare-nojdbc4,prepare-jdbc4"/>

   <!-- ######################################################### -->
   
   <target name="compile-test" depends="check_depends,prepare" description="compiles test files">
      <mkdir dir="${build.test-classes.dir}"/>
      <javac destdir="${build.test-classes.dir}"
             srcdir="${src.test.dir}"
             debug="${javac.debug}"
             deprecation="${javac.deprecation}"
             optimize="${javac.optimize}"
             source="${javac.source}">
        <classpath>
          <pathelement location="${build.test-classes.dir}" /> 
          <pathelement path="${classpath}" /> 
        </classpath>
      </javac>
      <copy todir="${build.test-classes.dir}" file="${src.test.dir}/testpool.jocl"/>
   </target>

   <target name="test" depends="compile-test" description="runs (junit) unit tests">
      <echo message="${classpath}"/>
      <junit printsummary="true" showoutput="true" fork="yes" haltonfailure="${test.failonerror}">
        <classpath>
          <pathelement location="${build.test-classes.dir}" /> 
          <pathelement path="${classpath}" /> 
        </classpath>
        <test name="${test.entry}"/>
      	<formatter type="plain"/>
      </junit>
   </target>
   
</project>
