<?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="BEANS Build" default="build" basedir=".">
    <description>Build for BEANS component</description>

    <property name="hy.module" value="beans" />
    <property name="hy.hdk" location="${basedir}/../../deploy" />
    <import file="${hy.hdk}/build/ant/properties.xml" />

    <property file="../../make/depends.properties" />

    <target name="build" depends="compile-java, 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, run-tests" />

    <target name="clean" depends="clean-java,clean-test" />
    
    <target name="clean-java" depends="class-patternset">
        <delete file="${hy.jdk}/jre/lib/boot/beans.jar" />
        <delete file="${hy.jdk}/jre/lib/boot/beans-src.jar" />
        <delete failonerror="false">
            <fileset refid="classes" />
        </delete>
        <delete-patternset module="${hy.module}" />
    </target>

    <target name="clean-test">
        <delete dir="${tests.hdk.dir}" failonerror="false" />
        <delete failonerror="false" dir="bin"/>
    </target>

    <target name="compile-java">
        <echo message="Compiling ${hy.module} classes" />

        <mkdir dir="../../build/classes" />

        <javac sourcepath=""
               srcdir="src/main/java"
               destdir="../../build/classes"
               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="findbugs" depends="build-jar">
        <run-findBugs
            jarFile="${hy.jdk}/jre/lib/boot/beans.jar"
            excludeFilter="make/findbugs-exclude-filter.xml"
            outputFile="${findBugs.report}/beans.xml"/>
    </target>

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

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

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

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

    <target name="test-jar" depends="svn-info,compile-tests">
        <mkdir dir="${tests.hdk.dir}" />
        
        <copy file="make/run-test.xml" tofile="${tests.hdk.dir}/build.xml" />
        
        <jar destfile="${tests.hdk.dir}/beans_test_support.jar">
            <fileset dir="bin/test_support" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>
            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <jar destfile="${tests.hdk.dir}/beans_tests.jar">
            <fileset dir="bin/test" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>
            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <jar destfile="${tests.hdk.dir}/beans_impl_tests.jar">
            <fileset dir="bin/test-internal" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>
            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <mkdir dir="${tests.excludes.hdk.dir}"/>
        <copy todir="${tests.excludes.hdk.dir}">
            <fileset dir="make" includes="exclude*"/>
            <filterchain>
                <tokenfilter>
                    <replaceregex pattern="\.java" replace="\.class" flags="g"/>
                </tokenfilter>
            </filterchain>
        </copy>

        <copy todir="${tests.resources.hdk.dir}" includeemptydirs="false">
            <fileset dir="src/test/resources">
                <exclude name="**/*.java" />
            </fileset>
            <fileset dir="src/test/support/java">
                <exclude name="**/*.java" />
            </fileset>
        </copy>

        <copy file="../../${junit.jar}"
              tofile="${hy.hdk}/build/test/junit.jar" />
    </target>

    <target name="compile-tests"> 
        <compile-tests description="beans test support"
                       destdir="bin/test_support">
            <javac-elements>
                <src>
                    <pathelement location="src/test/support/java" />
                </src>
            </javac-elements>
        </compile-tests>
        <compile-tests description="beans internal tests"
                       destdir="bin/test-internal">
            <javac-elements>
                <src>
                    <pathelement location="src/test/java-internal" />
                </src>
                <classpath location="bin/test_support" />
            </javac-elements>
        </compile-tests>
        <compile-tests description="beans api tests">
            <javac-elements>
                <src>
                    <pathelement location="src/test/java" />
                </src>
                <classpath location="bin/test_support" />
            </javac-elements>
        </compile-tests>
    </target>

    <target name="run-tests" depends="test-jar">
        <ant dir="${tests.hdk.dir}" target="test-module" />
    </target>

    <target name="class-patternset">
        <make-patternset module="${hy.module}" />
    </target>

</project>
