<!--
   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.
-->

<project basedir="." default="jar" name="pigudf">

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="../../../ivy/ant-contrib-1.0b3.jar"/>
        </classpath>
    </taskdef>

    <property file="../../../build.properties" />
    <!-- javac properties -->
    <property name="javac.debug" value="on" />
    <property name="javac.level" value="source,lines,vars"/>
    <property name="javac.optimize" value="on" />
    <property name="javac.deprecation" value="off" />
    <property name="javac.version" value="1.7" />
    <property name="javac.args" value="" />
    <!-- TODO we should use warning...   <property name="javac.args.warnings" value="-Xlint:unchecked" /> -->
    <property name="javac.args.warnings" value="" />
    <property name="build.encoding" value="UTF8" />

    <!-- build properties -->
    <property name="build.dir" value="${basedir}/build" />
    <property name="build.classes" value="${build.dir}/classes" />
    <property name="build.docs" value="${build.dir}/docs" />
    <property name="build.javadoc" value="${build.docs}/api" />
    <property name="pigtest" value="../../../build/test/classes" />
    <property name="udfjar" value="piggybank.jar" />
    <property name="src.dir" value="src/main/java/org/apache/pig/piggybank" />
    <property name="hsqldb.jar" value="../../../build/ivy/lib/Pig/hsqldb-1.8.0.10.jar"/>

    <!--
      Hadoop master version
      (Value 23 is translated for backward compatibility in old build scripts)
    -->
    <if>
        <equals arg1="${hadoopversion}" arg2="23"/>
        <then>
            <echo>Property setting hadoopversion=23 is deprecated. Overwriting to hadoopversion=2</echo>
            <var name="hadoopversion" unset="true"/>
            <property name="hadoopversion" value="2" />
        </then>
    </if>
    <property name="hadoopversion" value="2" />

    <condition property="hadoopsuffix" value="2" else="">
        <equals arg1="${hadoopversion}" arg2="2"/>
    </condition>

    <!-- jar properties -->
    <property name=".javadoc" value="${build.docs}/api" />
    
    <!-- test properties -->
    <property name="test.build.dir" value="${build.dir}/test" />
    <property name="test.classes" value="${test.build.dir}/classes" />
    <property name="test.logs" value="${test.build.dir}/logs" />
    <property name="test.timeout" value="900000" />
    <property name="test.junit.output.format" value="plain" />
    <property name="test.src.dir" value="src/test/java" />

    <path id="pigudf.classpath">
        <pathelement location="../../../build/classes"/>
        <pathelement location="${build.classes}"/>
        <fileset dir="../../..">
            <include name="pig-*-core-h${hadoopsuffix}.jar"/>
        </fileset>
        <pathelement location="${pigtest}"/>
        <fileset dir="../../../build/ivy/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <path id="test.classpath">
        <pathelement location="${udfjar}"/>
        <pathelement location="${build.classes}"/>
        <pathelement location="${test.classes}"/>
        <pathelement location="${test.src.dir}"/>
        <path refid="pigudf.classpath"/>
    </path>

    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
        <mkdir dir="${test.build.dir}"/>
        <mkdir dir="${test.classes}"/>
        <mkdir dir="${build.javadoc}"/>
    </target>
    <target name="clean">
        <delete dir="build"/>
        <delete file="${udfjar}"/>
    </target>
    <target depends="init" name="compile" description="compile all of the class files">
        <echo> *** Compiling Pig UDFs ***</echo>
        <javac srcdir="${src.dir}" debug="${javac.debug}" debuglevel="${javac.level}" destdir="${build.classes}" source="${javac.version}"
        target="${javac.version}" optimize="${javac.optimize}" deprecation="${javac.deprecation}" excludes="${build.classes.excludes}" encoding="${build.encoding}">
            <compilerarg line="${javac.args} ${javac.args.warnings}" />
            <classpath refid="pigudf.classpath"/>
        </javac>
    </target>
    <target depends="init,compile" name="jar" description="create the jar files">
        <echo> *** Creating pigudf.jar ***</echo>
      <jar destfile="${udfjar}">
        <fileset dir="build/classes"/>
      </jar>
    </target>
    <target depends="compile" name="compile-test">
        <echo> *** Compiling UDF tests ***</echo>
        <javac srcdir="${test.src.dir}" debug="${javac.debug}" debuglevel="${javac.level}" destdir="${test.classes}" source="${javac.version}"
        	target="${javac.version}" excludes="${test.classes.excludes}">
            <compilerarg line="${javac.args} ${javac.args.warnings}"/>
            <classpath refid="pigudf.classpath"/>
        </javac>
    </target>
    <target depends="compile-test,jar" name="test">
        <echo> *** Running UDF tests ***</echo>
        <delete dir="${test.logs}"/>
        <mkdir dir="${test.logs}"/>
        <tempfile property="junit.tmp.dir" prefix="piggybank_junit_tmp" destDir="${user.dir}/build/test" />
        <mkdir dir="${junit.tmp.dir}/"/>
        <junit printsummary="yes" haltonfailure="no" fork="yes" maxmemory="512m" dir="${basedir}" timeout="${test.timeout}" errorProperty="tests.failed" failureProperty="tests.failed">        
            <sysproperty key="hadoop.log.dir" value="${test.logs}"/>
            <sysproperty key="java.io.tmpdir" value="${junit.tmp.dir}" />
            <env key="MALLOC_ARENA_MAX" value="4"/>
            <classpath refid="test.classpath"/>
            <formatter type="${test.junit.output.format}" />
            <batchtest fork="yes" todir="${test.logs}" unless="testcase">
                <fileset dir="${test.src.dir}">
                    <include name="**/*Test*.java" />
                    <exclude name="${test.classes.excludes}" />
                </fileset>
            </batchtest>
            <batchtest fork="yes" todir="${test.logs}" if="testcase">
                <fileset dir="${test.src.dir}" includes="**/${testcase}.java"/>
            </batchtest>
        </junit>
        <delete dir="${junit.tmp.dir}/"/>    	
        <fail if="tests.failed">Tests failed!</fail>
    </target>
    <target depends="init" name="javadoc"
            description="build javadoc for all of the packages">
        <echo> *** Creating Javadocs ***</echo>
      <javadoc destdir="build/javadoc"
               author="true">
        <fileset dir="${src.dir}/evaluation" includes="**/*.java"/>
        <fileset dir="${src.dir}/storage" includes="**/*.java"/>
        <classpath refid="pigudf.classpath"/>
      </javadoc>
    </target>
    
</project>
