<!--
	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="japanese-addon"
         default="jar" basedir=".">

    <property name="src.dir" value="src"/>
    <property name="cls.dir" value="classes"/>
    <property name="lib.dir" value="lib"/>
    <property name="test.result.dir" value="test-result"/>
    <property name="product.jar" value="opennlp-japanese-addon-1.0-SNAPSHOT.jar"/>

    <target name="compile" description="compile source and test code">
        <mkdir dir="${cls.dir}"/>
        <javac srcdir="${src.dir}/main/java" destdir="${cls.dir}" debug="on" includes="**/*.java">
            <classpath path="${cls.dir}"/>
            <classpath>
                <fileset dir="${lib.dir}" includes="**/*.jar"/>
            </classpath>
        </javac>
        <javac srcdir="${src.dir}/test/java" destdir="${cls.dir}" debug="on" includes="**/*Test.java">
            <classpath path="${cls.dir}"/>
            <classpath>
                <fileset dir="${lib.dir}" includes="**/*.jar"/>
            </classpath>
        </javac>
    </target>

    <target name="test" depends="compile" description="run all tests">
        <mkdir dir="${test.result.dir}"/>
        <junit printsummary="on"
               haltonfailure="no"
               errorProperty="tests.failed"
               failureProperty="tests.failed"
               dir="${src.dir}/test/resources">
            <classpath path="${cls.dir}"/>
            <classpath>
                <fileset dir="${lib.dir}" includes="**/*.jar"/>
            </classpath>
            <jvmarg value="-ea"/>
            <formatter type="plain"/>
            <batchtest fork="yes" todir="${test.result.dir}" unless="testcase">
                <fileset dir="${src.dir}/test/java" includes="**/*Test.java"/>
            </batchtest>
            <batchtest fork="yes" todir="${test.result.dir}" if="testcase">
                <fileset dir="${src.dir}/test/java" includes="**/${testcase}.java"/>
            </batchtest>
        </junit>
        <fail if="tests.failed">***** Tests failed! *****</fail>
    </target>

    <target name="jar" depends="compile" description="create a jar file">
        <jar destfile="${product.jar}" basedir="${cls.dir}"/>
    </target>

    <target name="clean" description="clean all">
        <delete dir="${cls.dir}"/>
        <delete dir="${test.result.dir}"/>
        <delete>
            <fileset dir="." includes="*.jar"/>
        </delete>
    </target>
    
</project>
