<?xml version="1.0" encoding="UTF-8"?>
<!--
    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 name="SQL Build" default="build" basedir=".">
    <description>Build for SQL component</description>

    <!-- import common properties -->
    <property name="hy.hdk" location="${basedir}/../../deploy" />
    <import file="${hy.hdk}/build/ant/properties.xml" />

    <!-- set global properties for this build. -->
    <xmlproperty file="make/hyproperties.xml" semanticAttributes="true" />

    <fileset id="classes" dir="${hy.build}">
        <or>
            <present targetdir="${hy.sql.src.main.java}" />
            <present targetdir="${hy.sql.src.main.java}">
                <mapper type="regexp"
                        from="^(.*?)(\$$[^/\\\.]*)?\.class$$"
                        to="\1.java"/>
            </present>
        </or>
    </fileset>

    <property name="sql.exclude.file" location="${hy.hdk}/build/sql.exclude" />

    <target name="build" depends="compile-java, copy-resources, build-jar" />

    <target name="test" depends="-test-module">
        <fail message="Some tests failed">
            <condition>
                <or>
                    <isset property="test.failures" />
                    <isset property="test.errors" />
                </or>
            </condition>
        </fail>
    </target>

    <!-- internal target for local and global test run sequence -->
    <target name="-test-module" depends="build, compile-tests, prepare-exclude, run-tests" />

    <target name="clean">
        <delete file="${hy.jdk}/jre/lib/boot/sql.jar" />
        <delete file="${hy.jdk}/jre/lib/boot/sql-src.jar" />
        <delete failonerror="false">
            <fileset refid="classes" />
            <fileset dir="${hy.sql.bin.test}" />
        </delete>
    </target>

    <target name="compile-java">
        <echo message="Compiling SQL classes" />

        <javac sourcepath=""
               srcdir="${hy.sql.src.main.java}"
               destdir="${hy.build}"
               compiler="${hy.javac.compiler}"
               memoryMaximumSize="${hy.javac.maxmem}"
               source="${hy.javac.source}" 
               target="${hy.javac.target}"
               debug="${hy.javac.debug}">

            <compilerarg line="${build.compilerarg}" />

            <bootclasspath>
                <fileset dir="${hy.jdk}/jre/lib/boot">
                    <include name="**/*.jar" />
                </fileset>
            </bootclasspath>
        </javac>
    </target>

    <target name="copy-resources">
        <mkdir dir="${hy.build}" />
        <copy todir="${hy.build}" includeemptydirs="false">
            <fileset dir="${hy.sql.src.main.java}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
    </target>

    <target name="build-jar" depends="svn-info">
        <jar destfile="${hy.jdk}/jre/lib/boot/sql.jar"
             manifest="${hy.sql}/META-INF/MANIFEST.MF">
            <fileset refid="classes" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>

            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <jar destfile="${hy.jdk}/jre/lib/boot/sql-src.jar">
            <fileset dir="${hy.sql.src.main.java}" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>

            <metainf refid="hy.required.metainf-files"/>
        </jar>
    </target>

    <target name="compile-tests">
        <echo message="Compiling SQL tests" />

        <mkdir dir="${hy.sql.bin.test}" />

        <javac srcdir="${hy.sql.src.test.java}"
               destdir="${hy.sql.bin.test}"
               sourcepath=""
               compiler="${hy.javac.compiler}"
               memoryMaximumSize="${hy.javac.maxmem}"
               source="${hy.javac.source}" 
               target="${hy.javac.target}"
               debug="${hy.javac.debug}">

            <compilerarg line="${build.compilerarg}" />

            <bootclasspath>
                <fileset dir="${hy.jdk}/jre/lib/boot">
                    <include name="**/*.jar" />
                </fileset>
            </bootclasspath>
            <classpath location="${hy.hdk}/build/test/support.jar" />
        </javac>
    </target>

    <target name="prepare-exclude">
       <prepare-exclude-list moduleName="sql" dir="./make"
                             result="${sql.exclude.file}"/>
    </target>

    <target name="run-tests">

        <mkdir dir="${hy.tests.reports}" />

        <property name="test.jre.home" value="${hy.jdk}/jre" />

        <junit fork="yes"
               forkmode="${hy.test.forkmode}"
               timeout="${hy.test.timeout}"
               printsummary="withOutAndErr"
               errorproperty="test.errors"
               failureproperty="test.failures"
               showoutput="on"
               dir="${basedir}"
               jvm="${test.jre.home}/bin/java">
            <jvmarg line="${hy.test.vmargs}" />

            <classpath>
                <pathelement path="${hy.sql.bin.test}"/>
                <pathelement path="${hy.sql.src.test.resources}"/>
                <pathelement path="${hy.hdk}/build/test/support.jar"/>
            </classpath>
            <classpath location="../../build/tests" />

            <formatter type="xml" />

            <batchtest todir="${hy.tests.reports}" haltonfailure="no" >

                <fileset dir="${hy.sql.src.test.java}">
                    <!-- if ${test.case}     -->
                    <include name="${converted.tc}" if="test.case" />
                    <!-- unless ${test.case} -->
                    <include name="**/*Test.java" unless="test.case" />
                    <excludesfile name="${sql.exclude.file}" unless="test.case" />
                </fileset>
            </batchtest>
        </junit>
        <antcall target="touch-failures-file" />
        <antcall target="touch-errors-file" />
    </target>

    <target name="touch-failures-file" if="test.failures">
        <echo file="${hy.tests.reports}/test.failures"
            append="true">sql${line.separator}</echo>
    </target>

    <target name="touch-errors-file" if="test.errors">
        <echo file="${hy.tests.reports}/test.errors"
            append="true">sql${line.separator}</echo>
    </target>

</project>
