<?xml version="1.0"?>
<!--
  ~ 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
  ~
  ~ 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="XmlSchema" basedir="." default="jar">

	<property name="src.dir" value="${basedir}/src/main/java"/>
	<property name="project.name" value="XmlSchema"/>
	<property name="output.jar" value="${project.name}.jar"/>
	<property name="build.dir" value="${basedir}/build"/>
	<property name="build_classes.dir" value="${build.dir}/classes"/>
	<property name="build_lib.dir" value="${build.dir}/lib"/>
	<property name="build_doc.dir" value="${build.dir}/apidoc"/>	
	<property name="dist.dir" value="${build.dir}/dist"/>
	<property name="dist.zip" value="${project.name}.zip"/>
	<property name="srcdist.zip" value="${project.name}-src.zip"/>
    <property name="test.dir" value="${basedir}/src/test/java"/>
	<property name="test_classes.dir" value="${build.dir}/test-classes"/>
    <property name="test_reports.dir" value="${build.dir}/test-reports"/>
    <property name="test_reports_w3c.dir" value="${build.dir}/test-reports-w3c"/>

    <target name="setproxy" if="http.proxyhost">
        <setproxy proxyhost="${http.proxyHost}" proxyport="${http.proxyPort}"/>
    </target>

    <target name="prepare" depends="setproxy">
		<mkdir dir="${build_classes.dir}"/>
		<mkdir dir="${build_lib.dir}"/>
    	
    	<condition property="downloadLibs">
	      <not>
	      	<available file="${build_lib.dir}/xmlunit-1.0.jar"/>
	      </not>
	    </condition>

    	<antcall target="get-deps"/>
	</target>

	<target name="get-deps" if="downloadLibs">
	  <get src="http://www.ibiblio.org/maven2/xmlunit/xmlunit/1.0/xmlunit-1.0.jar"
	       dest="${build_lib.dir}/xmlunit-1.0.jar"/>
	  <get src="http://mirrors.ibiblio.org/pub/mirrors/maven2/junit/junit/3.8.2/junit-3.8.2.jar"
	       dest="${build_lib.dir}/junit-3.8.2.jar"/>
	</target>

    <target name="prepare-tests">
        <mkdir dir="${test_classes.dir}"/>
        <mkdir dir="${test_reports.dir}"/>
    	<mkdir dir="${test_reports_w3c.dir}"/>
    	
    	<antcall target="prepareNistTest"/>
    </target>
    	
    <target name="prepareNistTest" unless="maven.test.skip">
    	<condition property="needsTestsDownload">
	      <not>
	      	<available file="${build.dir}/xmlschema2002-01-16"/>
	      </not>
	    </condition>
    	<antcall target="get-xml-schema-tests"/>
   </target>
    	
	<target name="get-xml-schema-tests" if="needsTestsDownload">
		<echo>Downloading 6MB XML Schema test suite. This make take a few minutes...</echo>
		<get dest="${build.dir}/xsts-2002-01-16.tar.gz" 
			src="http://www.w3.org/XML/2004/xml-schema-test-suite/xmlschema2002-01-16/xsts-2002-01-16.tar.gz"/>
		<untar src="${build.dir}/xsts-2002-01-16.tar.gz" compression="gzip" dest="${build.dir}"/>
    </target>

    <target name="compile" depends="prepare" description="compiles the src and puts it in build/classes">
		<javac srcdir="${src.dir}" destdir="${build_classes.dir}" debug="true"
               source="1.2" target="1.2"
               deprecation="true">
        	<include name="**/*.java" />
	    </javac>
    </target>

    <target name="compile-tests" depends="prepare-tests, compile" description="compiles the tests and puts them in build/test-classes">
		<javac srcdir="${test.dir}" destdir="${test_classes.dir}" debug="true"
		       deprecation="true">
            <classpath>
                <pathelement location="${build_classes.dir}"/>
            	<fileset dir="${build_lib.dir}">
            	   <include name="*.jar" />
            	</fileset>
            </classpath>
        	<include name="**/*.java" />
	    </javac>
    </target>

    <target name="test" depends="compile-tests" description="Runs the unit tests">
        <junit printsummary="yes" haltonfailure="yes">
            <classpath>
                <pathelement location="${build_classes.dir}"/>
                <pathelement location="${test_classes.dir}"/>
            	<fileset dir="${build_lib.dir}">
            	   <include name="*.jar" />
            	</fileset>
            </classpath>
            <formatter type="plain"/>
            <batchtest todir="${test_reports.dir}">
                <fileset dir="${test.dir}">
                    <include name="tests/*Test*.java"/>
                    <include name="tests/w3c/TestW3CSchemaTestSet.java"/>
                </fileset>
            </batchtest>

        	<sysproperty key="nistTestLocation" 
        		value="${build.dir}/xmlschema2002-01-16/nisttest/NISTTestsAll"/>
		
        </junit>
    </target>
	
	<target name="testw3c" depends="compile-tests" description="Runs the full bucket of W3C unit tests">
        <junit printsummary="yes" haltonfailure="no">
            <classpath>
                <pathelement location="${build_classes.dir}"/>
                <pathelement location="${test_classes.dir}"/>
            	<fileset dir="${build_lib.dir}">
            	   <include name="*.jar" />
            	</fileset>
            </classpath>
            <formatter type="plain"/>
            <batchtest todir="${test_reports_w3c.dir}">
                <fileset dir="${test.dir}">
                    <include name="tests/w3c/TestW3CSchemaBucket.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>

    <target name="jar" depends="compile, test" description="compiles the src and creates XmlSchema.jar in  build/lib">
        <jar jarfile="${build_lib.dir}/${output.jar}" compress="true" basedir="${build_classes.dir}"/>
    </target>

    <target name="javadoc" depends="compile" description="Javadoc for Xml Schema API.">
        <mkdir dir="${build_doc.dir}"/>
        <javadoc packagenames="org.apache.axis.xsd.*" 
		             destdir="${build.dir}/apidoc" 
		             windowtitle="${project.name} API"
		             doctitle="${project.name}"
					 bottom="Copyright &#169;  Apache XML Schema Project. All Rights Reserved.">
            <classpath>
                <pathelement location="${build_classes.dir}"/>
            </classpath>
            <sourcepath>
                <pathelement location="${src.dir}"/>
            </sourcepath>
        </javadoc>
    </target>

    <target name="clean" description="Clean all build products.">
        <delete dir="${build.dir}"/>
    </target>

	<target name="dist" depends="jar,javadoc" description="Creates a binary distribution(XmlSchema.zip) in build/dist">
	    <mkdir dir="${dist.dir}"/>
		<zip zipfile="${dist.dir}/${dist.zip}">
		    <zipfileset dir="${build_lib.dir}" prefix="${project.name}/lib"/>
		    <zipfileset dir="${build_doc.dir}" prefix="${project.name}/doc"/>
		</zip>	
	</target>

	<target name="srcdist" depends="compile" description="Creates a source distribution(XmlSchema-src.zip) in build/dist">
	    <mkdir dir="${dist.dir}"/>
		<zip zipfile="${dist.dir}/${srcdist.zip}">
		    <zipfileset dir="${basedir}" includes="build.xml" prefix="${project.name}"/>
			<zipfileset dir="${src.dir}" prefix="${project.name}/src"/>
		</zip>	
	</target>
	
</project>
