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

     https://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="common" xmlns:ivy="antlib:org.apache.ivy.ant">
    <!-- a sample common ant build file, used for ivy multi-project tutorial
         feel free to copy and adapt it to your own needs
         Note that the only targets specific to ivy are:
         load-ivy
         resolve
         report
         ivy-new-version
         publish
         publish-local

         All other targets are usual ant based targets, which could have been written
         in a build not depending at all on ivy:
         resolve constructs a lib directory based upon ivy dependencies, and then the lib dir
         is used as in any classical ant build
    -->

    <property file="${common.dir}/build.properties"/>

    <property name="ivy.jar.dir" value="${user.home}/.ivy2/jars"/>
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"/>

    <!-- =================================
         target: load-ivy
         this target is not necessary if you put ivy.jar in your ant lib directory
         if you already have ivy 2.0 in your ant lib, you can simply remove this
         target
         ================================= -->
    <target name="load-ivy">
        <!-- try to load ivy here from home ivy dir, in case the user has not already dropped
             it into ant's lib dir (note that the latter copy will always take precedence).
             We will not fail as long as ivy home lib dir exists (it may be empty) and
             ivy is in at least one of ant's lib dir or the ivy home lib dir. -->
        <mkdir dir="${ivy.jar.dir}"/>
        <path id="ivy.lib.path">
            <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
    </target>

    <path id="lib.path.id">
        <fileset dir="${lib.dir}"/>
    </path>
    <path id="run.path.id">
        <path refid="lib.path.id"/>
        <path location="${classes.dir}"/>
    </path>

    <!-- setup ivy default configuration with some custom info -->
    <property name="ivy.local.default.root" value="${repository.dir}/local"/>
    <property name="ivy.shared.default.root" value="${repository.dir}/shared"/>

    <!-- here is how we would have configured ivy if we had our own ivysettings file
         <ivy:settings file="${common.dir}/ivysettings.xml"/>
    -->

    <!-- =================================
         target: resolve
         ================================= -->
    <target name="resolve" depends="clean-lib, load-ivy" description="--> resolve and retrieve dependencies with ivy">
        <mkdir dir="${lib.dir}"/> <!-- not usually necessary, ivy creates the directory IF there are dependencies -->

        <!-- the call to resolve is not mandatory, retrieve makes an implicit call if we don't -->
        <ivy:resolve file="${ivy.file}"/>
        <ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"/>
    </target>

    <!-- =================================
         target: report
         ================================= -->
    <target name="report" depends="resolve" description="--> generates a report of dependencies">
        <ivy:report todir="${build.dir}"/>
    </target>

    <!-- =================================
         target: compile
         ================================= -->
    <target name="compile" depends="resolve" description="--> compile the project">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib.path.id" debug="true" includeAntRuntime="false"/>
    </target>

    <!-- =================================
         target: run
         ================================= -->
    <target name="run" depends="version, compile" description="--> compile and run the project">
        <java classpathref="run.path.id" classname="${main.class.name}"/>
    </target>

    <target name="ivy-new-version" depends="load-ivy" unless="ivy.new.revision">
        <!-- default module version prefix value -->
        <property name="module.version.prefix" value="${module.version.target}-dev-b"/>

        <!-- asks to ivy an available version number -->
        <ivy:info file="${ivy.file}"/>
        <ivy:buildnumber
            organisation="${ivy.organisation}" module="${ivy.module}"
            revision="${module.version.prefix}" defaultBuildNumber="1" revSep=""/>
        </target>

        <target name="local-version">
            <tstamp>
                <format property="now" pattern="yyyyMMddHHmmss"/>
            </tstamp>
            <property name="ivy.new.revision" value="${module.version.target}-local-${now}"/>
        </target>

        <target name="version" depends="ivy-new-version">
            <!-- create version file in classpath for later inclusion in jar -->
            <mkdir dir="${classes.dir}"/>
            <echo message="version=${ivy.new.revision}" file="${classes.dir}/${ant.project.name}.properties" append="false"/>

            <!-- load generated version properties file -->
            <property file="${classes.dir}/${ant.project.name}.properties"/>
        </target>

        <!-- =================================
             target: jar
             ================================= -->
        <target name="jar" depends="version, compile" description="--> make a jar file for this project">
            <jar destfile="${jar.file}">
                <fileset dir="${classes.dir}"/>
                <manifest>
                    <attribute name="Built-By" value="${user.name}"/>
                    <attribute name="Build-Version" value="${version}"/>
                </manifest>
            </jar>
        </target>

        <!-- =================================
             target: publish
             ================================= -->
        <target name="publish" depends="clean-build, jar" description="--> publish this project in the ivy repository">
            <ivy:publish artifactspattern="${build.dir}/[artifact].[ext]"
                         resolver="shared"
                         pubrevision="${version}"
                         status="release"/>
            <echo message="project ${ant.project.name} released with version ${version}"/>
        </target>

        <!-- =================================
             target: publish-local
             ================================= -->
        <target name="publish-local" depends="local-version, jar" description="--> publish this project in the local ivy repository">
            <ivy:publish artifactspattern="${build.dir}/[artifact].[ext]"
                         resolver="local"
                         pubrevision="${version}"
                         pubdate="${now}"
                         status="integration"
                         forcedeliver="true"/>
            <echo message="project ${ant.project.name} published locally with version ${version}"/>
        </target>

        <!-- =================================
             target: clean-local
             ================================= -->
        <target name="clean-local" depends="load-ivy"
                description="--> cleans the local repository for the current module">
            <ivy:info file="${ivy.file}"/>
            <delete dir="${ivy.local.default.root}/${ivy.organisation}/${ivy.module}"/>
        </target>

        <!-- =================================
             target: clean-lib
             ================================= -->
        <target name="clean-lib" description="--> clean the project libraries directory (dependencies)">
            <delete includeemptydirs="true" dir="${lib.dir}"/>
        </target>

        <!-- =================================
             target: clean-build
             ================================= -->
        <target name="clean-build" description="--> clean the project built files">
            <delete includeemptydirs="true" dir="${build.dir}"/>
        </target>

        <!-- =================================
             target: clean
             ================================= -->
        <target name="clean" depends="clean-build,clean-lib" description="--> clean the project"/>
</project>
