<!--
   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="go-ivy" default="go" xmlns:ivy="antlib:org.apache.ivy.ant">
    <!--
        this build file is a self contained project: it doesn't require anything else
        that Ant 1.8 or greater and Java 5 or greater properly installed.

        It is used to showcase how easy and straightforward it can be to use Ivy.

        This is not an example of the best practice to use in a project, especially
        for the Java source code "generation" :-) (see generate-src target)

        To run copy this file in an empty directory, open a shell (or command line) window
        in this directory and run "ant". It will download Ivy and then use it to resolve
        the dependency of the class which is itself "contained" in this build script.

        After a successful build run "ant" again and you will see the build will be
        much faster.

        More information can be found at http://ant.apache.org/ivy/
        -->

    <!-- here is the version of Ivy we will use. change this property to try a newer
         version if you want -->
    <property name="ivy.install.version" value="2.5.0"/>
    <property name="ivy.jar.dir" value="${basedir}/ivy"/>
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"/>

    <property name="build.dir" value="build"/>
    <property name="src.dir" value="src"/>


    <target name="download-ivy" unless="skip.download">
        <mkdir dir="${ivy.jar.dir}"/>
        <!-- download Ivy from web site so that it can be used even without any special installation -->
        <echo message="installing ivy..."/>
        <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
             dest="${ivy.jar.file}" usetimestamp="true"/>
    </target>

    <!-- =================================
          target: install-ivy
            this target is not necessary if you put ivy.jar in your Ant lib directory
            if you already have Ivy in your Ant lib, you can simply remove this
            target and the dependency the 'go' target has on it
         ================================= -->
    <target name="install-ivy" depends="download-ivy" description="--> install ivy">
        <!-- try to load Ivy here from local 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 local lib dir exists (it may be empty) and
             Ivy is in at least one of Ant's lib dir or the local lib 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>

    <!-- =================================
          target: go
                    Go Ivy, go!
         ================================= -->
    <target name="go" depends="install-ivy, generate-src"
            description="--> resolve dependencies, compile and run the project">
        <echo message="using ivy to resolve commons-lang 2.1..."/>
        <!-- here comes the magic line: asks Ivy to resolve a dependency on
             commons-lang 2.1 and to build an Ant path with it from its cache -->
        <ivy:cachepath organisation="commons-lang" module="commons-lang" revision="2.1"
                       pathid="lib.path.id" inline="true"/>

        <echo message="compiling..."/>
        <mkdir dir="${build.dir}"/>
        <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="lib.path.id"/>

        <echo>
We are now ready to execute our simple program with its dependency on commons-lang.
Let's go!
        </echo>
        <java classname="example.Hello">
            <classpath>
                <path refid="lib.path.id"/>
                <path location="${build.dir}"/>
            </classpath>
        </java>
    </target>

    <!-- =================================
          target: generate-src
            'Generates' the class source. It actually just echo a simple Java
            source code to a file. In real life this file would already be
            present on your file system, and this target wouldn't be necessary.
         ================================= -->
    <target name="generate-src">
        <mkdir dir="${src.dir}/example"/>
        <echo file="${src.dir}/example/Hello.java">
package example;

import org.apache.commons.lang.WordUtils;

public class Hello {
    public static void main(String[] args) {
        String message = "hello ivy !";
        System.out.println("standard message : " + message);
        System.out.println("capitalized by " + WordUtils.class.getName()
                + " : " + WordUtils.capitalizeFully(message));
    }
}
        </echo>
    </target>

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

    <!-- =================================
          target: clean-ivy
         ================================= -->
    <target name="clean-ivy" description="--> clean the Ivy installation">
        <delete dir="${ivy.jar.dir}"/>
    </target>

    <!-- =================================
          target: clean-cache
         ================================= -->
    <target name="clean-cache" depends="install-ivy"
            description="--> clean the Ivy cache">
        <ivy:cleancache/>
    </target>
</project>
