<!--
	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-2.3.2-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>
