<?xml version="1.0" encoding="utf-8"?>
<project name="sample" default="" basedir=".">
    <!--
        ビルドファイル内で使用するプロパティを設定します．
        プロパティとは，nameとvalueの対からなる変数定義のようなものです．
        名前："src.dir"，値："./src"というプロパティを属性内で参照するためには，
        ${src.dir}と記述します．

        展開例：
        dir="${src.dir}" → dir="./src"

        また，Javaのシステムプロパティは，特に定義なしで参照することができること
        は覚えておきましょう．

        システムプロパティ例：
        java.home, java.vendor, user.version, java.class.path等
    -->
    <!-- ディレクトリ名の定義 -->
    <property name="src.dir" value="./src"/>
    <property name="build.dir" value="./build"/>
    <property name="build.classes" value="${build.dir}/classes"/>
    <property name="build.apidocs" value="${build.dir}/apidocs"/>
    <property name="reports.dir" value="reports"/>
    <property name="correctreports.dir" value="${reports.dir}/html"/>
    
    <!-- JARアーカイブファイル名の定義 -->
    <property name="build.sample.jar" value="${build.dir}/sample.jar"/>
    
    <!--
        prepareターゲットの定義
        
        ここでは，主にディレクトリの作成を行っています．prepareという名前は，
        あくまでも名前なので別の名前でも構いません．
        
        準備ターゲットでは，タイムスタンプ関連プロパティを設定する，Tstampタスク
        を呼び出しておくと，タイムスタンプをファイル名などに使えて便利なのを覚え
        ておきましょう．
    -->
    <target name="prepare">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
        <mkdir dir="${build.apidocs}"/>
        <mkdir dir="${reports.dir}"/>
    </target>

    <!--
        complieターゲットの定義
        
        ソースコードのコンパイルを行います．
        
        ターゲットの属性として，depends属性を指定していますが，ここでは，compile
        ターゲットがprepareタスクに依存していることをあらわしています．
        Antを実行するときに，ターゲットを指定して実行することができますが，指定
        されたターゲットが依存しているターゲットが存在するときは，先に依存先のタ
        ーゲットが実行されることになるので，compileターゲットを指定してAntを実行
        すると，必ずprepare → compileという順番で，ターゲットが実行されることに
        なります．
    -->
    <target name="compile" depends="prepare">
        <javac srcdir="${src.dir}" destdir="${build.classes}"/>
    </target>
    
    <!--
        apidocsターゲットの定義
        
        Javadocドキュメントの出力を行います．ここでは，一番シンプルな指定で出力
        させていますが，形式の詳細を設定することもできます．
        詳しくは，Antのドキュメントを参照してください．
    -->
    <target name="apidocs" depends="compile">
        <javadoc sourcepath="${src.dir}" destdir="${build.apidocs}"
            packagenames="com.*"/>
    </target>

    <!--
        runtestsターゲットの定義
        
        JUnitを利用した自動テストを実行し，テスト結果をHTML形式のレポートにまと
        めます．
        
        オプションのタスクである，junitおよびjunitreportタスクを利用することで，
        JUnitの自動実行だけにとどまらず，結果をHTML形式でまとめるところまでが，
        自動でできるのです．
        これで，また一歩eXtremeに近づきました！
    -->
    <target name="runtests" depends="compile">
        <junit printsummary="yes" haltonfailure="no">
            <classpath>
                <pathelement location="${build.classes}"/>
                <pathelement path="${java.class.path}"/>
            </classpath>
            
            <formatter type="xml"/>
            
            <batchtest fork="yes" todir="${reports.dir}">
                <fileset dir="${src.dir}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>

        <junitreport todir="${reports.dir}">
            <fileset dir="${reports.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${correctreports.dir}"/>
        </junitreport>
    </target>
    
    <!--
        jarターゲットの定義
        
        JARアーカイブを作成します．リリース時のアーカイブには，ユニットテストの
        クラスファイルは，必要ありませんので，jarタスクのexcludes属性を使用して，
        ユニットテストファイルを除外してJARアーカイブを作成しています．
        
        このように，ユニットテストを含めない形でのアーカイブ作成が簡単にできるの
        で，ユニットテストのコードをテストパッケージとして，ソースコードから遠い
        場所に配置しなくて済みますね．
    -->
    <target name="jar" depends="apidocs,runtests">
        <jar jarfile="${build.sample.jar}" basedir="${build.classes}"
            excludes="**/test/**"/>
    </target>
    
    <target name="clean">
        <delete dir="${build.dir}"/>
        <delete dir="${reports.dir}"/>
    </target>
</project>

