<!--
 -
 - 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="AMQ Java" default="build">

    <import file="common.xml"/>

    <property file="build.properties"/>
    <property name="modules.extra" value=""/>
    <property name="modules.client" value="common,client"/>
    <property name="modules"
              value="${modules.client},broker,broker/test,client/test,cluster,systests,${modules.extra}"/>

    <property name="release.fullversion" value="${build.release.version}-${build.release.name}-${build.release.tag}"/>

    <macrodef name="iterate">
        <attribute name="target"/>
        <attribute name="modules" default="${modules}"/>
        <element name="elements" implicit="true" optional="true"/>
        <sequential>
            <subant target="@{target}" antfile="build-module.xml">
                <filelist dir="." files="@{modules}"/>
                <elements/>
            </subant>
        </sequential>
    </macrodef>

    <target name="build" description="compile java source code for each module">
        <iterate target="build"/>
    </target>

    <target name="test" description="execute unit tests">
        <iterate target="test"/>
    </target>

    <target name="testreport" description="execute unit tests and produce reports">
        <iterate target="testreport"/>
    </target>

    <target name="doc" description="produce javadoc for each module">
        <iterate target="doc"/>
    </target>

    <target name="jar"
            description="create java class file archives for each module">
        <iterate target="jar"/>
    </target>

    <target name="dist"
            description="copy each module's files into a single distribution tree">
        <iterate target="dist"/>
        <iterate target="dist-lib" modules="${modules.client}">
            <property name="dist.dir" value="${dist.client.dir}"/>
        </iterate>
    </target>

    <target name="clean" description="remove all build artifacts">
        <iterate target="clean"/>
        <delete dir="${build.root.dir}"/>
        <delete dir="${release.dir}"/>
    </target>

    <property name="client.includes" value="*/client/**"/>

    <target name="zip" depends="dist"
            description="produce a zip archive of the distribution tree">
        <zip basedir="${dist.root}" destfile="${build.zip}"/>
        <zip basedir="${dist.root}" destfile="${client.zip}"
             includes="${client.includes}"/>
    </target>

    <target name="tar" depends="dist"
            description="produce a tar archive of the distribution tree">
        <tar basedir="${dist.root}" destfile="${build.tar}"/>
        <tar basedir="${dist.root}" destfile="${client.tar}"
             includes="${client.includes}"/>
    </target>

    <target name="gzip" depends="tar"
            description="produce a gzipped tarball of the distribution tree">
        <gzip src="${build.tar}" destfile="${build.tgz}"/>
        <gzip src="${client.tar}" destfile="${client.tgz}"/>
    </target>

    <target name="bzip2" depends="tar"
            description="produze a bzipped tarball of the distribution tree">
        <bzip2 src="${build.tar}" destfile="${build.bz2}"/>
        <bzip2 src="${client.tar}" destfile="${client.bz2}"/>
    </target>

    <target name="archive" depends="zip,gzip,bzip2"
            description="produce all archive formats of the distribution tree"/>

    <target name="preparerelease">
        <mkdir dir="${release.dir}"/>
    </target>

    <target name="copymodule">
        <copy todir="${todir}">
            <fileset dir="${project.root}">
                <!-- Module src -->
                <include name="${module}/${bin.dir}/**"/>
                <include name="${module}/${src.dir}/**"/>
                <include name="${module}/${lib.dir}/**"/>
                <include name="${module}/${etc.dir}/**"/>
                <include name="${module}/${test.dir}/**"/>
                <include name="${module}/${module.build.file}"/>
            </fileset>
        </copy>
    </target>

    <target name="preparereleasesrc" depends="preparerelease">

        <property name="release.src.dir" value="${build.release.dir}/src"/>
        <property name="release.java.src.dir" value="${build.release.dir}/src/java"/>

        <!-- Copy Source to prepare directory -->
        <mkdir dir="${release.java.src.dir}"/>

        <antcall target="copymodule">
            <param name="module" value="broker"/>
            <param name="todir" value="${release.java.src.dir}"/>
        </antcall>

        <antcall target="copymodule">
            <param name="module" value="client"/>
            <param name="todir" value="${release.java.src.dir}"/>
        </antcall>

        <antcall target="copymodule">
            <param name="module" value="common"/>
            <param name="todir" value="${release.java.src.dir}"/>
        </antcall>

        <antcall target="copymodule">
            <param name="module" value="cluster"/>
            <param name="todir" value="${release.java.src.dir}"/>
        </antcall>

        <antcall target="copymodule">
            <param name="module" value="systests"/>
            <param name="todir" value="${release.java.src.dir}"/>
        </antcall>

        <copy todir="${release.java.src.dir}">
            <fileset dir="${project.root}">
                <include name="${tasks.dir}/${src.dir}/**"/>
                <include name="${doc.dir}/**"/>
            </fileset>
        </copy>

        <copy todir="${release.java.src.dir}">
            <fileset dir="${project.root}">
                <!-- Module src -->
                <!-- Extra Common files -->
                <include name="${common.dir}/${stylesheets.dir}/**"/>
                <include name="${common.dir}/${resources.dir}/**"/>


                <!-- Root build Files -->
                <include name="${build.file}"/>
                <include name="${common.file}"/>
                <include name="${module.file}"/>
                <include name="${build.properties.file}"/>


                <!-- Copy additional files for building releases -->
                <include name="${resources.dir}/**"/>
                <include name="${releasedocs.dir}/**"/>
                <!-- Copy our main License file-->
                <include name="LICENSE.txt"/>
                <include name="README.txt"/>
                <include name="NOTICE.txt"/>

            </fileset>
        </copy>


        <!-- Copy Spec files for protocol generation -->
        <copy todir="${release.src.dir}">
            <fileset dir=".." casesensitive="false">
                <include name="${specs.dir}/**"/>
            </fileset>
        </copy>

        <!-- Copy release docs to root of release -->
        <antcall target="copyreleasedocs">
            <param name="todir" value="${build.release.dir}"/>
        </antcall>

    </target>

    <target name="copyreleasedocs">
        <!-- Copy Various Txt files to prepare directory -->
        <copy todir="${todir}">

            <fileset dir="release-docs">
                <include name="RELEASE_NOTES.txt"/>
            </fileset>

            <fileset dir="${project.root}">
                <include name="README.txt"/>
                <include name="NOTICE.txt"/>
            </fileset>

            <fileset dir="${resources.root.dir}/META-INF">
                <include name="DISCLAIMER.txt"/>
            </fileset>
        </copy>

        <antcall target="createLicense">
            <param name="fromdir" value="${todir}"/>
            <param name="destdir" value="${todir}"/>
        </antcall>

    </target>

    <target name="createLicense">

        <!-- Copy our main License file-->
        <copy file="LICENSE.txt" todir="${destdir}"/>

        <!-- Find all the license files-->
        <fileset dir="${fromdir}" id="license.files">
            <include name="**/license*"/>                        
        </fileset>

        <!-- Path to use to remove from the start of the license file name -->
        <path path="${todir}${file.separator}" id="release.prepare.dir.id"/>

        <!-- Convert this path to use the platform file separator \ or / -->
        <pathconvert refid="release.prepare.dir.id" property="release.prepare.path" dirsep="${file.separator}"/>

        <!-- For each of the license files remove the release prepare path-->
        <pathconvert refid="license.files" id="licenses.convert.path.id" property="licenses.convert"
                     pathsep="${line.separator}">
            <map from="${release.prepare.path}${file.separator}" to=''/>
        </pathconvert>


        <!-- Add the list of licence files to the end of the main license file.-->
        <echo file="${destdir}/LICENSE.txt" append="yes">
            ${line.separator}Additional license files can be found here:${line.separator}${licenses.convert}
        </echo>

    </target>

    <target name="tgzandzip">
        <tar compression="gzip" longfile="gnu"
             destfile="${file}.tar.gz">
            <tarfileset dir="${path}" mode="755" username="ant" group="ant">
                <include name="${source}/**"/>
            </tarfileset>
        </tar>

        <zip destfile="${file}.zip">
            <zipfileset dir="${path}">
                <include name="${source}/**"/>
            </zipfileset>
        </zip>
    </target>

    <target name="std-src-release-old">

        <!-- Setup the local variables -->
        <property name="release.src.name" value="${project.name}-java-${release.fullversion}-src"/>
        <property name="build.release.src.dir" value="${build.release}/${release.src.name}"/>

        <antcall target="preparereleasesrc">
            <param name="release.src.name" value="${release.src.name}"/>
            <param name="build.release.dir" value="${build.release.src.dir}"/>
        </antcall>

        <antcall target="tgzandzip">
            <param name="file" value="${release.dir}/${release.src.name}"/>
            <param name="path" value="${build.release}"/>
            <param name="source" value="${release.src.name}"/>
        </antcall>

    </target>

    <target name="std-src-release" depends="preparerelease">

        <!-- Setup the local variables -->
        <property name="release.src.name" value="${project.name}-java-${release.fullversion}-src"/>
        <property name="build.release.src.dir" value="${build.release}/${release.src.name}"/>

        <!-- Ensure there is nothing in our target bin dir -->
        <delete dir="${build.release.src.dir}"/>
        <mkdir dir="${build.release.src.dir}"/>

        <copy todir="${build.release.src.dir}">
            <fileset dir="${project.root}/..">
                <!--All source files -->
                <include name="specs/**"/>
                <include name="java/**"/>                                

                <!--exclude files -->
                <exclude name="**/.svn/**"/>
                <exclude name="java/${build.dir}/**"/>
                <exclude name="java/${release.dir}/**"/>
            </fileset>
        </copy>


        <!-- Copy release docs to root of release -->
        <antcall target="copyreleasedocs">
            <param name="todir" value="${build.release.src.dir}"/>
        </antcall>

        <antcall target="tgzandzip">
            <param name="file" value="${release.dir}/${release.src.name}"/>
            <param name="path" value="${build.release}"/>
            <param name="source" value="${release.src.name}"/>
        </antcall>

    </target>


    <target name="std-bin-release" depends="preparerelease">

        <antcall target="std-bin-release-item">
            <param name="module.content" value="client-broker"/>
        </antcall>

        <antcall target="std-bin-release-item">
            <param name="module.content" value="client"/>
            <param name="modules.include" value="${modules.client}"/>
            <param name="release.libsonly" value=""/>
        </antcall>

    </target>

    <!-- incoming params
         module.content    i.e. client or client-server
         modules.include   i.e. ${modules.client}
         release.libsonly  determines what task to run on the iterate normally dist but if libs only then dist-lib
    -->
    <target name="std-bin-release-item" depends="preparerelease">

        <!-- if modules.include has not been set set it to all modules-->
        <property name="modules.include" value="${modules}"/>

        <!-- Set the type of dist to do. Normally it is dist but if we are doing a libs only then set dist-lib -->
        <condition property="disttype" value="dist-lib" else="dist">
            <isset property="release.libsonly"/>
        </condition>

        <!-- If the module content has been specified then use then set that value-->
        <condition property="module.release.suffix" value="-bin-${module.content}" else="">
            <isset property="module.content"/>
        </condition>

        <!-- Setup the local variables -->
        <property name="release.bin.name" value="${project.name}-java-${release.fullversion}${module.release.suffix}"/>
        <property name="release.bin.dir" value="${build.release}/${release.bin.name}"/>
        <property name="module.jar.prefix" value="${project.name}-"/>
        <property name="module.jar.suffix" value="-${release.fullversion}"/>

        <!-- Ensure there is nothing in our target bin dir -->
        <delete dir="${release.bin.dir}"/>
        <mkdir dir="${release.bin.dir}"/>

        <iterate target="${disttype}" modules="${modules.include}">
            <property name="module.prefix" value="${module.jar.prefix}"/>
            <property name="module.suffix" value="${module.jar.suffix}"/>
            <property name="dist.dest.dir" value="${release.bin.dir}"/>
        </iterate>

        <antcall target="copyreleasedocs">
            <param name="todir" value="${release.bin.dir}"/>
        </antcall>

        <mkdir dir="${release.bin.dir}/${log.dir}"/>

        <antcall target="tgzandzip">
            <param name="file" value="${release.dir}/${release.bin.name}"/>
            <param name="path" value="${build.release}"/>
            <param name="source" value="${release.bin.name}"/>
        </antcall>

    </target>


    <target name="std-release" depends="std-src-release, std-bin-release"/>

</project>
