/*
 * このソースコードは blanco Frameworkによって自動生成されています。
 * Apache Antタスク [BlancoNLpackGeneratorMergeResultDetail]のクラス
 */
package blanco.nlpack.generator.task;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

import blanco.nlpack.generator.task.valueobject.BlancoNLpackGeneratorMergeResultDetailProcessInput;

/**
 * Apache Antタスク [BlancoNLpackGeneratorMergeResultDetail]のクラス。
 *
 * 指定された翻訳結果ログ(ResultDetailファイル)をマージします。このタスクは左辺を優先としたマージを実施します。右辺のみに存在するプロパティは破棄されます。<br>
 * このクラスでは、Apache Antタスクで一般的に必要なチェックなどのコーディングを肩代わりします。
 * 実際の処理は パッケージ[blanco.nlpack.generator.task]にBlancoNLpackGeneratorMergeResultDetailBatchProcessクラスを作成して記述してください。<br>
 * <br>
 * Antタスクへの組み込み例<br>
 * <pre>
 * &lt;taskdef name=&quot;blanconlpackgeneratormergeresultdetail&quot; classname=&quot;blanco.nlpack.generator.task.BlancoNLpackGeneratorMergeResultDetailTask">
 *     &lt;classpath&gt;
 *         &lt;fileset dir=&quot;lib&quot; includes=&quot;*.jar&quot; /&gt;
 *         &lt;fileset dir=&quot;lib.ant&quot; includes=&quot;*.jar&quot; /&gt;
 *     &lt;/classpath&gt;
 * &lt;/taskdef&gt;
 * </pre>
 */
public class BlancoNLpackGeneratorMergeResultDetailTask extends Task {
    /**
     * 指定された翻訳結果ログ(ResultDetailファイル)をマージします。このタスクは左辺を優先としたマージを実施します。右辺のみに存在するプロパティは破棄されます。
     */
    protected BlancoNLpackGeneratorMergeResultDetailProcessInput fInput = new BlancoNLpackGeneratorMergeResultDetailProcessInput();

    /**
     * フィールド [sourceleft] に値がセットされたかどうか。
     */
    protected boolean fIsFieldSourceleftProcessed = false;

    /**
     * フィールド [sourceright] に値がセットされたかどうか。
     */
    protected boolean fIsFieldSourcerightProcessed = false;

    /**
     * フィールド [targetfile] に値がセットされたかどうか。
     */
    protected boolean fIsFieldTargetfileProcessed = false;

    /**
     * verboseモードで動作させるかどうか。
     *
     * @param arg verboseモードで動作させるかどうか。
     */
    public void setVerbose(final boolean arg) {
        fInput.setVerbose(arg);
    }

    /**
     * verboseモードで動作させるかどうか。
     *
     * @return verboseモードで動作させるかどうか。
     */
    public boolean getVerbose() {
        return fInput.getVerbose();
    }

    /**
     * Antタスクの[sourceleft]アトリビュートのセッターメソッド。
     *
     * 項目番号: 1<br>
     * 入力の翻訳結果ログ(左辺)。基本的に これが英語ロケールです。こちらを基準に処理します。<br>
     *
     * @param arg セットしたい値
     */
    public void setSourceleft(final String arg) {
        fInput.setSourceleft(arg);
        fIsFieldSourceleftProcessed = true;
    }

    /**
     * Antタスクの[sourceleft]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 1<br>
     * 入力の翻訳結果ログ(左辺)。基本的に これが英語ロケールです。こちらを基準に処理します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getSourceleft() {
        return fInput.getSourceleft();
    }

    /**
     * Antタスクの[sourceright]アトリビュートのセッターメソッド。
     *
     * 項目番号: 2<br>
     * 入力の翻訳結果ログ(右辺)。基本的に、これが各国語ロケールです。左辺と一致しなかった翻訳は無視されます。<br>
     *
     * @param arg セットしたい値
     */
    public void setSourceright(final String arg) {
        fInput.setSourceright(arg);
        fIsFieldSourcerightProcessed = true;
    }

    /**
     * Antタスクの[sourceright]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 2<br>
     * 入力の翻訳結果ログ(右辺)。基本的に、これが各国語ロケールです。左辺と一致しなかった翻訳は無視されます。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getSourceright() {
        return fInput.getSourceright();
    }

    /**
     * Antタスクの[targetfile]アトリビュートのセッターメソッド。
     *
     * 項目番号: 3<br>
     * 出力のマージ後ファイル。<br>
     *
     * @param arg セットしたい値
     */
    public void setTargetfile(final String arg) {
        fInput.setTargetfile(arg);
        fIsFieldTargetfileProcessed = true;
    }

    /**
     * Antタスクの[targetfile]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 3<br>
     * 出力のマージ後ファイル。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getTargetfile() {
        return fInput.getTargetfile();
    }

    /**
     * Antタスクのメイン処理。Apache Antから このメソッドが呼び出されます。
     *
     * @throws BuildException タスクとしての例外が発生した場合。
     */
    @Override
    public final void execute() throws BuildException {
        System.out.println("BlancoNLpackGeneratorMergeResultDetailTask begin.");

        // 項目番号[1]、アトリビュート[sourceleft]は必須入力です。入力チェックを行います。
        if (fIsFieldSourceleftProcessed == false) {
            throw new BuildException("必須アトリビュート[sourceleft]が設定されていません。処理を中断します。");
        }
        // 項目番号[2]、アトリビュート[sourceright]は必須入力です。入力チェックを行います。
        if (fIsFieldSourcerightProcessed == false) {
            throw new BuildException("必須アトリビュート[sourceright]が設定されていません。処理を中断します。");
        }
        // 項目番号[3]、アトリビュート[targetfile]は必須入力です。入力チェックを行います。
        if (fIsFieldTargetfileProcessed == false) {
            throw new BuildException("必須アトリビュート[targetfile]が設定されていません。処理を中断します。");
        }

        if (getVerbose()) {
            System.out.println("- verbose:[true]");
            System.out.println("- sourceleft:[" + getSourceleft() + "]");
            System.out.println("- sourceright:[" + getSourceright() + "]");
            System.out.println("- targetfile:[" + getTargetfile() + "]");
        }

        try {
            // 実際のAntタスクの主処理を実行します。
            // この箇所でコンパイルエラーが発生する場合、BlancoNLpackGeneratorMergeResultDetailProcessインタフェースを実装して blanco.nlpack.generator.taskパッケージに BlancoNLpackGeneratorMergeResultDetailProcessImplクラスを作成することにより解決できる場合があります。
            final BlancoNLpackGeneratorMergeResultDetailProcess proc = new BlancoNLpackGeneratorMergeResultDetailProcessImpl();
            if (proc.execute(fInput) != BlancoNLpackGeneratorMergeResultDetailBatchProcess.END_SUCCESS) {
                throw new BuildException("タスクは異常終了しました。");
            }
        } catch (IllegalArgumentException e) {
            if (getVerbose()) {
                e.printStackTrace();
            }
            throw new BuildException(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            throw new BuildException("タスクを処理中に例外が発生しました。処理を中断します。" + e.toString());
        } catch (Error e) {
            e.printStackTrace();
            throw new BuildException("タスクを処理中にエラーが発生しました。処理を中断します。" + e.toString());
        }
    }
}
