<!--
Copyright 2004 The Apache Software Foundation

Licensed 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="XmlSort" default="build">

    <property environment="env"/>

    <path id="XmlSort.path">
        <path refid="xmlbeans.path"/>
        <pathelement path="build/classes"/>
    </path>

    <target name="init">
        <property name="xmlbeans.home" value="${env.XMLBEANS_HOME}"/>
        <echo message="xmlbeans.home: ${xmlbeans.home}"/>

        <!-- check for xmlbeans-*.jar from binary distribution -->
        <pathconvert property="xmlbeans.lib" setonempty="false" pathsep=" ">
            <path><fileset dir="${xmlbeans.home}/libs" includes="xmlbeans-*.jar" /></path>
        </pathconvert>

        <fail message="Set XMLBEANS_HOME in your environment." unless="xmlbeans.lib"/>

        <echo message="xmlbeans.lib: ${xmlbeans.lib}"/>
        <path id="xmlbeans.path">
            <fileset dir="${xmlbeans.home}/libs" includes="*.jar"/>
        </path>
    </target>

    <!-- ========================== clean ==== -->

    <target name="clean">
        <delete dir="build"/>
    </target>

    <!-- ========================== build ==== -->

    <target name="build" depends="init,XmlSort.classes">
    </target>

    <target name="XmlSort.classes" depends="init">
        <mkdir dir="build/classes"/>

        <pathconvert property="exe" setonempty="false">
            <fileset dir="${env.JAVA_HOME}/bin" includes="javac, javac.exe"/>
        </pathconvert>
        <pathconvert property="exe" setonempty="false">
            <fileset dir="${env.JAVA_HOME}/../bin" includes="javac, javac.exe"/>
        </pathconvert>

        <javac srcdir="src"
            destdir="build/classes"
            classpathref="XmlSort.path"
            debug="on"
            source="1.8"
            executable="${exe}"
            fork="yes"
        />
    </target>

    <!-- ========================== run ==== -->

    <target name="run" depends="init,build">
        <echo message="============================== running XmlSort"/>
        <java
            classname="org.apache.xmlbeans.samples.cursor.XmlSort"
            classpathref="XmlSort.path"
            fork="true">
            <arg line="xml/unsorted.xml"/>
        </java>
    </target>

    <!-- ========================== test ==== -->

    <target name="test" depends="init,build">
        <echo message="============================== testing XmlSort"/>
        <java
            classname="org.apache.xmlbeans.samples.cursor.XmlSort"
            classpathref="XmlSort.path"
            fork="true">
            <arg line="xml/unsorted.xml"/>
        </java>
    </target>

</project>
