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

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

import blanco.xliff.util.task.valueobject.BlancoXliffUtilMergeProcessInput;

/**
 * Apache Antタスク [BlancoXliffUtilMerge]のクラス。
 *
 * [XLIFF対応ツール] 指定されたディレクトリ間で OASIS XLIFF ファイル(*.xlf)をマージします。このタスクは targetdir(左辺)を優先としたマージを実施します。sourcedir(右辺)のみに存在するtrans-unit (Babel URI)は破棄されます。Noteは転送されます。<br>
 * このクラスでは、Apache Antタスクで一般的に必要なチェックなどのコーディングを肩代わりします。
 * 実際の処理は パッケージ[blanco.xliff.util.task]にBlancoXliffUtilMergeBatchProcessクラスを作成して記述してください。<br>
 * <br>
 * Antタスクへの組み込み例<br>
 * <pre>
 * &lt;taskdef name=&quot;blancoxliffutilmerge&quot; classname=&quot;blanco.xliff.util.task.BlancoXliffUtilMergeTask">
 *     &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 BlancoXliffUtilMergeTask extends Task {
    /**
     * [XLIFF対応ツール] 指定されたディレクトリ間で OASIS XLIFF ファイル(*.xlf)をマージします。このタスクは targetdir(左辺)を優先としたマージを実施します。sourcedir(右辺)のみに存在するtrans-unit (Babel URI)は破棄されます。Noteは転送されます。
     */
    protected BlancoXliffUtilMergeProcessInput fInput = new BlancoXliffUtilMergeProcessInput();

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

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

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

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

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

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

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

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

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

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

    /**
     * Antタスクの[targetdir]アトリビュートのセッターメソッド。
     *
     * 項目番号: 1<br>
     * 入出力対象の XLIFF (*.xlf) ファイル(左辺)が含まれるディレクトリ。こちらを基準に処理します。変更は こちらの XLIFF のみに実施されます。<br>
     *
     * @param arg セットしたい値
     */
    public void setTargetdir(final String arg) {
        fInput.setTargetdir(arg);
        fIsFieldTargetdirProcessed = true;
    }

    /**
     * Antタスクの[targetdir]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 1<br>
     * 入出力対象の XLIFF (*.xlf) ファイル(左辺)が含まれるディレクトリ。こちらを基準に処理します。変更は こちらの XLIFF のみに実施されます。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getTargetdir() {
        return fInput.getTargetdir();
    }

    /**
     * Antタスクの[sourcedir]アトリビュートのセッターメソッド。
     *
     * 項目番号: 2<br>
     * 入力対象の XLIFF (*.xlf) ファイル(右辺)が含まれるディレクトリ。左辺に存在しない trans-unit (Babel URI) は無視します。sourcefileと排他利用。<br>
     *
     * @param arg セットしたい値
     */
    public void setSourcedir(final String arg) {
        fInput.setSourcedir(arg);
        fIsFieldSourcedirProcessed = true;
    }

    /**
     * Antタスクの[sourcedir]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 2<br>
     * 入力対象の XLIFF (*.xlf) ファイル(右辺)が含まれるディレクトリ。左辺に存在しない trans-unit (Babel URI) は無視します。sourcefileと排他利用。<br>
     *
     * @return このフィールドの値
     */
    public String getSourcedir() {
        return fInput.getSourcedir();
    }

    /**
     * Antタスクの[sourcefile]アトリビュートのセッターメソッド。
     *
     * 項目番号: 3<br>
     * 入力対象の XLIFF (*.xlf) ファイル(右辺)。左辺に存在しない trans-unit (Babel URI) は無視します。sourcedirと排他利用。<br>
     *
     * @param arg セットしたい値
     */
    public void setSourcefile(final String arg) {
        fInput.setSourcefile(arg);
        fIsFieldSourcefileProcessed = true;
    }

    /**
     * Antタスクの[sourcefile]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 3<br>
     * 入力対象の XLIFF (*.xlf) ファイル(右辺)。左辺に存在しない trans-unit (Babel URI) は無視します。sourcedirと排他利用。<br>
     *
     * @return このフィールドの値
     */
    public String getSourcefile() {
        return fInput.getSourcefile();
    }

    /**
     * Antタスクの[toolid]アトリビュートのセッターメソッド。
     *
     * 項目番号: 4<br>
     * マージを実施した際に利用する tool-id。nlpack や pleiades などを指定します。alt-trans で利用されます。<br>
     *
     * @param arg セットしたい値
     */
    public void setToolid(final String arg) {
        fInput.setToolid(arg);
        fIsFieldToolidProcessed = true;
    }

    /**
     * Antタスクの[toolid]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 4<br>
     * マージを実施した際に利用する tool-id。nlpack や pleiades などを指定します。alt-trans で利用されます。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getToolid() {
        return fInput.getToolid();
    }

    /**
     * Antタスクの[settarget]アトリビュートのセッターメソッド。
     *
     * 項目番号: 5<br>
     * trans-unit の target について、値をセットするかどうか。なお、基本的に source 文字列が一致することが大前提となります。<br>
     *
     * @param arg セットしたい値
     */
    public void setSettarget(final boolean arg) {
        fInput.setSettarget(arg);
        fIsFieldSettargetProcessed = true;
    }

    /**
     * Antタスクの[settarget]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 5<br>
     * trans-unit の target について、値をセットするかどうか。なお、基本的に source 文字列が一致することが大前提となります。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public boolean getSettarget() {
        return fInput.getSettarget();
    }

    /**
     * Antタスクの[settargetoverwrite]アトリビュートのセッターメソッド。
     *
     * 項目番号: 6<br>
     * trans-unit の target について、存在の有無にかかわらず値をセットするかどうか。翻訳物の優先順位が存在する場合のマージにおいてのみセットされます。<br>
     *
     * @param arg セットしたい値
     */
    public void setSettargetoverwrite(final boolean arg) {
        fInput.setSettargetoverwrite(arg);
        fIsFieldSettargetoverwriteProcessed = true;
    }

    /**
     * Antタスクの[settargetoverwrite]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 6<br>
     * trans-unit の target について、存在の有無にかかわらず値をセットするかどうか。翻訳物の優先順位が存在する場合のマージにおいてのみセットされます。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public boolean getSettargetoverwrite() {
        return fInput.getSettargetoverwrite();
    }

    /**
     * Antタスクの[setalttrans]アトリビュートのセッターメソッド。
     *
     * 項目番号: 7<br>
     * セットした target の内容を alt-trans にセットするかどうか。<br>
     *
     * @param arg セットしたい値
     */
    public void setSetalttrans(final boolean arg) {
        fInput.setSetalttrans(arg);
        fIsFieldSetalttransProcessed = true;
    }

    /**
     * Antタスクの[setalttrans]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 7<br>
     * セットした target の内容を alt-trans にセットするかどうか。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public boolean getSetalttrans() {
        return fInput.getSetalttrans();
    }

    /**
     * Antタスクの[copyalttrans]アトリビュートのセッターメソッド。
     *
     * 項目番号: 8<br>
     * 入力元の alt-trans を 出力先の alt-trans にセットするかどうか。<br>
     *
     * @param arg セットしたい値
     */
    public void setCopyalttrans(final boolean arg) {
        fInput.setCopyalttrans(arg);
        fIsFieldCopyalttransProcessed = true;
    }

    /**
     * Antタスクの[copyalttrans]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 8<br>
     * 入力元の alt-trans を 出力先の alt-trans にセットするかどうか。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public boolean getCopyalttrans() {
        return fInput.getCopyalttrans();
    }

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

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

        if (getVerbose()) {
            System.out.println("- verbose:[true]");
            System.out.println("- targetdir:[" + getTargetdir() + "]");
            System.out.println("- sourcedir:[" + getSourcedir() + "]");
            System.out.println("- sourcefile:[" + getSourcefile() + "]");
            System.out.println("- toolid:[" + getToolid() + "]");
            System.out.println("- settarget:[" + getSettarget() + "]");
            System.out.println("- settargetoverwrite:[" + getSettargetoverwrite() + "]");
            System.out.println("- setalttrans:[" + getSetalttrans() + "]");
            System.out.println("- copyalttrans:[" + getCopyalttrans() + "]");
        }

        try {
            // 実際のAntタスクの主処理を実行します。
            // この箇所でコンパイルエラーが発生する場合、BlancoXliffUtilMergeProcessインタフェースを実装して blanco.xliff.util.taskパッケージに BlancoXliffUtilMergeProcessImplクラスを作成することにより解決できる場合があります。
            final BlancoXliffUtilMergeProcess proc = new BlancoXliffUtilMergeProcessImpl();
            if (proc.execute(fInput) != BlancoXliffUtilMergeBatchProcess.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());
        }
    }
}
