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

import java.io.IOException;

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

/**
 * バッチ処理クラス [BlancoXliffUtilMergeBatchProcess]。
 *
 * <P>バッチ処理の呼び出し例。</P>
 * <code>
 * java -classpath (クラスパス) blanco.xliff.util.task.BlancoXliffUtilMergeBatchProcess -help
 * </code>
 */
public class BlancoXliffUtilMergeBatchProcess {
    /**
     * 正常終了。
     */
    public static final int END_SUCCESS = 0;

    /**
     * 入力異常終了。内部的にjava.lang.IllegalArgumentExceptionが発生した場合。
     */
    public static final int END_ILLEGAL_ARGUMENT_EXCEPTION = 7;

    /**
     * 入出力例外終了。内部的にjava.io.IOExceptionが発生した場合。
     */
    public static final int END_IO_EXCEPTION = 8;

    /**
     * 異常終了。バッチの処理開始に失敗した場合、および内部的にjava.lang.Errorまたはjava.lang.RuntimeExceptionが発生した場合。
     */
    public static final int END_ERROR = 9;

    /**
     * コマンドラインから実行された際のエントリポイントです。
     *
     * @param args コンソールから引き継がれた引数。
     */
    public static final void main(final String[] args) {
        final BlancoXliffUtilMergeBatchProcess batchProcess = new BlancoXliffUtilMergeBatchProcess();

        // バッチ処理の引数。
        final BlancoXliffUtilMergeProcessInput input = new BlancoXliffUtilMergeProcessInput();

        boolean isNeedUsage = false;
        boolean isFieldTargetdirProcessed = false;
        boolean isFieldToolidProcessed = false;

        // コマンドライン引数の解析をおこないます。
        for (int index = 0; index < args.length; index++) {
            String arg = args[index];
            if (arg.startsWith("-verbose=")) {
                input.setVerbose(Boolean.valueOf(arg.substring(9)).booleanValue());
            } else if (arg.startsWith("-targetdir=")) {
                input.setTargetdir(arg.substring(11));
                isFieldTargetdirProcessed = true;
            } else if (arg.startsWith("-sourcedir=")) {
                input.setSourcedir(arg.substring(11));
            } else if (arg.startsWith("-sourcefile=")) {
                input.setSourcefile(arg.substring(12));
            } else if (arg.startsWith("-toolid=")) {
                input.setToolid(arg.substring(8));
                isFieldToolidProcessed = true;
            } else if (arg.startsWith("-settarget=")) {
                input.setSettarget(Boolean.valueOf(arg.substring(11)).booleanValue());
            } else if (arg.startsWith("-settargetoverwrite=")) {
                input.setSettargetoverwrite(Boolean.valueOf(arg.substring(20)).booleanValue());
            } else if (arg.startsWith("-setalttrans=")) {
                input.setSetalttrans(Boolean.valueOf(arg.substring(13)).booleanValue());
            } else if (arg.startsWith("-copyalttrans=")) {
                input.setCopyalttrans(Boolean.valueOf(arg.substring(14)).booleanValue());
            } else if (arg.equals("-?") || arg.equals("-help")) {
                usage();
                System.exit(END_SUCCESS);
            } else {
                System.out.println("BlancoXliffUtilMergeBatchProcess: 入力パラメータ[" + arg + "]は無視されました。");
                isNeedUsage = true;
            }
        }

        if (isNeedUsage) {
            usage();
        }

        if( isFieldTargetdirProcessed == false) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: 処理開始失敗。入力パラメータ[input]の必須フィールド値[targetdir]に値が設定されていません。");
            System.exit(END_ILLEGAL_ARGUMENT_EXCEPTION);
        }
        if( isFieldToolidProcessed == false) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: 処理開始失敗。入力パラメータ[input]の必須フィールド値[toolid]に値が設定されていません。");
            System.exit(END_ILLEGAL_ARGUMENT_EXCEPTION);
        }

        int retCode = batchProcess.execute(input);

        // 終了コードを戻します。
        // ※注意：System.exit()を呼び出している点に注意してください。
        System.exit(retCode);
    }

    /**
     * 具体的なバッチ処理内容を記述するためのメソッドです。
     *
     * このメソッドに実際の処理内容を記述します。
     *
     * @param input バッチ処理の入力パラメータ。
     * @return バッチ処理の終了コード。END_SUCCESS, END_ILLEGAL_ARGUMENT_EXCEPTION, END_IO_EXCEPTION, END_ERROR のいずれかの値を戻します。
     * @throws IOException 入出力例外が発生した場合。
     * @throws IllegalArgumentException 入力値に不正が見つかった場合。
     */
    public int process(final BlancoXliffUtilMergeProcessInput input) throws IOException, IllegalArgumentException {
        // 入力パラメータをチェックします。
        validateInput(input);

        // この箇所でコンパイルエラーが発生する場合、BlancoXliffUtilMergeProcessインタフェースを実装して blanco.xliff.util.taskパッケージに BlancoXliffUtilMergeProcessImplクラスを作成することにより解決できる場合があります。
        final BlancoXliffUtilMergeProcess process = new BlancoXliffUtilMergeProcessImpl();

        // 処理の本体を実行します。
        final int retCode = process.execute(input);

        return retCode;
    }

    /**
     * クラスをインスタンス化してバッチを実行する際のエントリポイントです。
     *
     * このメソッドは下記の仕様を提供します。
     * <ul>
     * <li>メソッドの入力パラメータの内容チェック。
     * <li>IllegalArgumentException, RuntimeException, Errorなどの例外をcatchして戻り値へと変換。
     * </ul>
     *
     * @param input バッチ処理の入力パラメータ。
     * @return バッチ処理の終了コード。END_SUCCESS, END_ILLEGAL_ARGUMENT_EXCEPTION, END_IO_EXCEPTION, END_ERROR のいずれかの値を戻します。
     * @throws IllegalArgumentException 入力値に不正が見つかった場合。
     */
    public final int execute(final BlancoXliffUtilMergeProcessInput input) throws IllegalArgumentException {
        try {
            // バッチ処理の本体を実行します。
            int retCode = process(input);

            return retCode;
        } catch (IllegalArgumentException ex) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: 入力例外が発生しました。バッチ処理を中断します。:" + ex.toString());
            // 入力異常終了。
            return END_ILLEGAL_ARGUMENT_EXCEPTION;
        } catch (IOException ex) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: 入出力例外が発生しました。バッチ処理を中断します。:" + ex.toString());
            // 入力異常終了。
            return END_IO_EXCEPTION;
        } catch (RuntimeException ex) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: ランタイム例外が発生しました。バッチ処理を中断します。:" + ex.toString());
            ex.printStackTrace();
            // 異常終了。
            return END_ERROR;
        } catch (Error er) {
            System.out.println("BlancoXliffUtilMergeBatchProcess: ランタイムエラーが発生しました。バッチ処理を中断します。:" + er.toString());
            er.printStackTrace();
            // 異常終了。
            return END_ERROR;
        }
    }

    /**
     * このバッチ処理クラスの使い方の説明を標準出力に示すためのメソッドです。
     */
    public static final void usage() {
        System.out.println("BlancoXliffUtilMergeBatchProcess: Usage:");
        System.out.println("  java blanco.xliff.util.task.BlancoXliffUtilMergeBatchProcess -verbose=値1 -targetdir=値2 -sourcedir=値3 -sourcefile=値4 -toolid=値5 -settarget=値6 -settargetoverwrite=値7 -setalttrans=値8 -copyalttrans=値9");
        System.out.println("    -verbose");
        System.out.println("      説明[verboseモードで動作させるかどうか。]");
        System.out.println("      型[真偽]");
        System.out.println("      デフォルト値[false]");
        System.out.println("    -targetdir");
        System.out.println("      説明[入出力対象の XLIFF (*.xlf) ファイル(左辺)が含まれるディレクトリ。こちらを基準に処理します。変更は こちらの XLIFF のみに実施されます。]");
        System.out.println("      型[文字列]");
        System.out.println("      必須パラメータ");
        System.out.println("    -sourcedir");
        System.out.println("      説明[入力対象の XLIFF (*.xlf) ファイル(右辺)が含まれるディレクトリ。左辺に存在しない trans-unit (Babel URI) は無視します。sourcefileと排他利用。]");
        System.out.println("      型[文字列]");
        System.out.println("    -sourcefile");
        System.out.println("      説明[入力対象の XLIFF (*.xlf) ファイル(右辺)。左辺に存在しない trans-unit (Babel URI) は無視します。sourcedirと排他利用。]");
        System.out.println("      型[文字列]");
        System.out.println("    -toolid");
        System.out.println("      説明[マージを実施した際に利用する tool-id。nlpack や pleiades などを指定します。alt-trans で利用されます。]");
        System.out.println("      型[文字列]");
        System.out.println("      必須パラメータ");
        System.out.println("    -settarget");
        System.out.println("      説明[trans-unit の target について、値をセットするかどうか。なお、基本的に source 文字列が一致することが大前提となります。]");
        System.out.println("      型[真偽]");
        System.out.println("      デフォルト値[false]");
        System.out.println("    -settargetoverwrite");
        System.out.println("      説明[trans-unit の target について、存在の有無にかかわらず値をセットするかどうか。翻訳物の優先順位が存在する場合のマージにおいてのみセットされます。]");
        System.out.println("      型[真偽]");
        System.out.println("      デフォルト値[false]");
        System.out.println("    -setalttrans");
        System.out.println("      説明[セットした target の内容を alt-trans にセットするかどうか。]");
        System.out.println("      型[真偽]");
        System.out.println("      デフォルト値[false]");
        System.out.println("    -copyalttrans");
        System.out.println("      説明[入力元の alt-trans を 出力先の alt-trans にセットするかどうか。]");
        System.out.println("      型[真偽]");
        System.out.println("      デフォルト値[false]");
        System.out.println("    -? , -help");
        System.out.println("      説明[使い方を表示します。]");
    }

    /**
     * このバッチ処理クラスの入力パラメータの妥当性チェックを実施するためのメソッドです。
     *
     * @param input バッチ処理の入力パラメータ。
     * @throws IllegalArgumentException 入力値に不正が見つかった場合。
     */
    public void validateInput(final BlancoXliffUtilMergeProcessInput input) throws IllegalArgumentException {
        if (input == null) {
            throw new IllegalArgumentException("BlancoBatchProcessBatchProcess: 処理開始失敗。入力パラメータ[input]にnullが与えられました。");
        }
        if (input.getTargetdir() == null) {
            throw new IllegalArgumentException("BlancoXliffUtilMergeBatchProcess: 処理開始失敗。入力パラメータ[input]の必須フィールド値[targetdir]に値が設定されていません。");
        }
        if (input.getToolid() == null) {
            throw new IllegalArgumentException("BlancoXliffUtilMergeBatchProcess: 処理開始失敗。入力パラメータ[input]の必須フィールド値[toolid]に値が設定されていません。");
        }
    }
}
