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

import blanco.encryption.task.valueobject.BlancoEncryptionDesedeBatchProcessInput;

/**
 * バッチ処理クラス [BlancoEncryptionDesedeBatchProcess]の抽象親クラス。
 *
 * このクラスを継承して [blanco.encryption.task]パッケージに[BlancoEncryptionDesedeBatchProcess]クラスを作成して実際のバッチ処理を実装してください。
 */
abstract class AbstractBlancoEncryptionDesedeBatchProcess {
    /**
     * 正常終了。
     */
    public static final int END_SUCCESS = 0;

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

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

    /**
     * コマンドラインから実行された際のエントリポイントです。
     *
     * @param args コンソールから引き継がれた引数。
     */
    public static final void main(final String[] args) {
        // この箇所でコンパイルエラーが発生する場合、AbstractBlancoEncryptionDesedeBatchProcessクラスを継承して blanco.encryption.taskパッケージに BlancoEncryptionDesedeBatchProcessクラスを作成することにより解決できる場合があります。
        final AbstractBlancoEncryptionDesedeBatchProcess batchProcess = new BlancoEncryptionDesedeBatchProcess();

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

        boolean isNeedUsage = false;

        // コマンドライン引数の解析をおこないます。
        for (int index = 0; index < args.length; index++) {
            String arg = args[index];
            if (arg.startsWith("-verbose=")) {
                input.setVerbose(arg.substring(9));
            } else if (arg.startsWith("-inputDir=")) {
                input.setInputDir(arg.substring(10));
            } else if (arg.startsWith("-outputDir=")) {
                input.setOutputDir(arg.substring(11));
            } else if (arg.startsWith("-password=")) {
                input.setPassword(arg.substring(10));
            } else if (arg.equals("-?") || arg.equals("-help")) {
                usage();
                System.exit(END_SUCCESS);
            } else {
                System.out.println("BlancoEncryptionDesedeBatchProcess: 入力パラメータ[" + arg + "]は無視されました。");
                isNeedUsage = true;
            }
        }

        if (isNeedUsage) {
            usage();
        }

        int retCode = batchProcess.execute(input);

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

    /**
     * 具体的なバッチ処理内容を記述するためのメソッドです。
     *
     * このメソッドに実際の処理内容を記述します。
     *
     * @param input バッチ処理の入力パラメータ。
     * @return バッチ処理の終了コード。
     */
    public abstract int process(final BlancoEncryptionDesedeBatchProcessInput input);

    /**
     * クラスをインスタンス化してバッチを実行する際のエントリポイントです。
     *
     * @param input バッチ処理の入力パラメータ。
     * @return バッチ処理の終了コード。
     */
    public final int execute(final BlancoEncryptionDesedeBatchProcessInput input) {
        try {
            if (input.getInputDir() == null) {
                System.out.println("BlancoEncryptionDesedeBatchProcess: 処理開始失敗。必須の入力パラメータ[inputDir]が設定されていません。");
                System.exit(END_ILLEGAL_ARGUMENT);
            }

            if (input.getOutputDir() == null) {
                System.out.println("BlancoEncryptionDesedeBatchProcess: 処理開始失敗。必須の入力パラメータ[outputDir]が設定されていません。");
                System.exit(END_ILLEGAL_ARGUMENT);
            }

            if (input.getPassword() == null) {
                System.out.println("BlancoEncryptionDesedeBatchProcess: 処理開始失敗。必須の入力パラメータ[password]が設定されていません。");
                System.exit(END_ILLEGAL_ARGUMENT);
            }

            // バッチ処理の本体を実行します。
            int retCode = process(input);

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

    /**
     * このバッチ処理クラスの使い方の説明を標準出力に示すためのメソッドです。
     */
    public static final void usage() {
        System.out.println("BlancoEncryptionDesedeBatchProcess: Usage:");
        System.out.println("  java blanco.encryption.task.BlancoEncryptionDesedeBatchProcess -verbose=値1 -inputDir=値2 -outputDir=値3 -password=値4");
        System.out.println("    -verbose");
        System.out.println("      説明[verboseモードで動作させるかどうか。]");
        System.out.println("    -inputDir");
        System.out.println("      説明[入力ディレクトリ名を指定します。]");
        System.out.println("      必須パラメータ。");
        System.out.println("    -outputDir");
        System.out.println("      説明[出力ディレクトリ名を指定します。]");
        System.out.println("      必須パラメータ。");
        System.out.println("    -password");
        System.out.println("      説明[パスワードを指定します。]");
        System.out.println("      必須パラメータ。");
        System.out.println("    -? , -help");
        System.out.println("      説明[使い方を表示します。]");
    }
}
