<!--
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="XQueryXPath" default="build">
    <property environment="env"/>

    <path id="XQueryXPath.path">
        <path refid="xmlbeans.path"/>
        <fileset dir="build/lib" includes="*.jar"/>
        <pathelement path="build/classes"/>
	  <pathelement path="${env.CLASSPATH}"/>
    </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>

        <taskdef name="xmlbean"
            classname="org.apache.xmlbeans.impl.tool.XMLBean"
            classpathref="xmlbeans.path"/>
    </target>

    <!-- ========================== clean ==== -->

    <target name="clean">
        <delete dir="build"/>
    </target>

    <!-- ========================== build ==== -->

    <target name="build" depends="init,schemas.jar,XQueryXPath.classes">
    </target>

    <target name="schemas.check">
        <uptodate property="schemas.notRequired"
            targetfile="build/lib/schemas.jar">
            <srcfiles dir="schemas" includes="**/*.xsd"/>
        </uptodate>
    </target>

    <target name="schemas.jar" depends="init,schemas.check"
        unless="schemas.notRequired">
        <mkdir dir="build/lib"/>

        <xmlbean schema="schemas"
            destfile="build/lib/schemas.jar"
            classpathref="xmlbeans.path"
            debug="on"
            />
    </target>

    <target name="XQueryXPath.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="XQueryXPath.path"
            debug="on"
            source="1.8"
            executable="${exe}"
            fork="yes"
            />
    </target>

    <!-- ========================== run ==== -->

    <target name="run" depends="init,build">
        <echo message="============================== running XQueryXPath"/>
        <java
            classname="org.apache.xmlbeans.samples.xquery.XQueryXPath"
            classpathref="XQueryXPath.path"
            fork="true">
            <arg line="xml/employees.xml"/>
        </java>
    </target>

    <!-- ========================== test ==== -->

    <target name="test" depends="init,build">
        <echo message="============================== testing XQueryXPath"/>
        <java
            classname="org.apache.xmlbeans.samples.xquery.XQueryXPathTest"
            classpathref="XQueryXPath.path"
            fork="true">
            <arg line="xml/employees.xml"/>
        </java>
    </target>

</project>
