<!--
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="xsdconfig" default="build">
	<property environment="env"/>

	 <path id="XsdConfig.path">
        <path refid="xmlbeans.path"/>
        <fileset dir="build/lib" includes="schemas_xsdconfig.jar"/>
        <pathelement path="build/classes"/>
    </path>

     <path id="Xsd.path">
        <path refid="xmlbeans.path"/>
        <fileset dir="build/lib" includes="schemas_xsd.jar"/>
        <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>

        <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_xsd.jar, schemas_xsdconfig.jar,XsdConfig.classes">
    </target>

     <target name="schemas_xsd.check">
        <uptodate property="schemas_xsd.notRequired"
            targetfile="build/lib/schemas_xsd.jar">
            <srcfiles dir="schemas" includes="**/*.xsd"/>
        </uptodate>

    </target>

	 <target name="schemas_xsdconfig.check">
        <uptodate property="schemas_xsdconfig.notRequired"
            targetfile="build/lib/schemas_xsdconfig.jar">
            <srcfiles dir="schemas" includes="**/*.xsd **/*.xsdconfig"/>
        </uptodate>

    </target>

	<target name="schemas_xsdconfig.jar" depends="init,schemas_xsdconfig.check"
         unless="schemas_xsdconfig.notRequired">
        <mkdir dir="build/lib"/>

		<!-- Generating with XSD and XsdConfig file -->
         <xmlbean schema="schemas"
            destfile="build/lib/schemas_xsdconfig.jar"
            srcgendir="build/src/xsdconfig"
            classpathref="xmlbeans.path"
            debug="on"
            />
    </target>

    <target name="schemas_xsd.jar" depends="init,schemas_xsd.check"
         unless="schemas_xsd.notRequired">
        <mkdir dir="build/lib"/>

		<!-- Generating with XSD only (no config file) -->
        <xmlbean schema="schemas/catalog.xsd"
            destfile="build/lib/schemas_xsd.jar"
            srcgendir="build/src/xsd"
            classpathref="xmlbeans.path"
            debug="on"
            />
    </target>



     <target name="XsdConfig.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" includes="org/apache/xmlbeans/samples/xsdconfig/CatalogXsdConfig.java org/apache/xmlbeans/samples/xsdconfig/XsdConfigTest.java"
            destdir="build/classes"
            classpathref="XsdConfig.path"
            debug="on"
            source="1.8"
            executable="${exe}"
            fork="yes"
            />
        <javac srcdir="src" includes="org/apache/xmlbeans/samples/xsdconfig/CatalogXsd.java org/apache/xmlbeans/samples/xsdconfig/XsdTest.java "
            destdir="build/classes"
            classpathref="Xsd.path"
            debug="on"
            source="1.8"
            executable="${exe}"
            fork="yes"
            />

    </target>

    <!-- ========================== run ==== -->

    <target name="run" depends="init,build">
        <echo message="============================== running Xsd Sample (With XSD only - no Config)"/>
        <java
            classname="org.apache.xmlbeans.samples.xsdconfig.CatalogXsd"
            classpathref="Xsd.path"
            fork="true">
            <arg line="xml/catalog.xml"/>
        </java>

        <echo message="============================== running Xsd Sample (With XSD and XsdConfig)"/>
        <java
            classname="org.apache.xmlbeans.samples.xsdconfig.CatalogXsdConfig"
            classpathref="XsdConfig.path"
            fork="true">
            <arg line="xml/catalog.xml"/>
        </java>
    </target>


    <!-- ========================== test ==== -->

    <target name="test" depends="init,build">
        <echo message="============================== testing XsdTest"/>
        <java
            classname="org.apache.xmlbeans.samples.xsdconfig.XsdTest"
            classpathref="Xsd.path"
            fork="true">
            <arg line="xml/catalog.xml"/>
        </java>

        <echo message="============================== testing XsdConfigTest"/>
        <java
            classname="org.apache.xmlbeans.samples.xsdconfig.XsdConfigTest"
            classpathref="XsdConfig.path"
            fork="true">
            <arg line="xml/catalog.xml"/>
        </java>
    </target>

</project>
