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

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

/**
 * Apache Antタスク [BlancoDbDotNet]の抽象親クラス。
 *
 * R/Oマッピング自動生成を行う BlancoDbDotNet のAntTaskです。<br>
 * この抽象親クラスでは、Apache Antタスクで一般的に必要なチェックなどのコーディングを肩代わりします。
 * このクラスを継承して、パッケージ[blanco.db.task]にBlancoDbDotNetTaskクラスを作成してください。そしてAntタスクの処理内容を記述してください。<br>
 * <br>
 * Antタスクへの組み込み例<br>
 * <pre>
 * &lt;taskdef name=&quot;blancodbdotnet&quot; classname=&quot;blanco.db.task.BlancoDbDotNetTask">
 *     &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 abstract class AbstractBlancoDbDotNetTask extends Task {
    /**
     * Verboseモードで動作させるかどうか。
     */
    private String fVerbose = "false";

    /**
     * Antタスクの[jdbcdriver]アトリビュート。
     *
     * 項目番号: 1<br>
     * JDBCドライバのクラス名を指定します。<br>
     * 必須項目<br>
     */
    private String fJdbcdriver;

    /**
     * Antタスクの[jdbcurl]アトリビュート。
     *
     * 項目番号: 2<br>
     * JDBC接続先URLを指定します。<br>
     * 必須項目<br>
     */
    private String fJdbcurl;

    /**
     * Antタスクの[jdbcuser]アトリビュート。
     *
     * 項目番号: 3<br>
     * JDBCデータベース接続を行う際のユーザ名を指定します。<br>
     * 必須項目<br>
     */
    private String fJdbcuser;

    /**
     * Antタスクの[jdbcpassword]アトリビュート。
     *
     * 項目番号: 4<br>
     * JDBCデータベース接続を行う際のパスワードを指定します。<br>
     * 必須項目<br>
     */
    private String fJdbcpassword;

    /**
     * Antタスクの[metadir]アトリビュート。
     *
     * 項目番号: 5<br>
     * SQL定義メタファイルが格納されているディレクトリを指定します。<br>
     * 必須項目<br>
     */
    private String fMetadir;

    /**
     * Antタスクの[tmpdir]アトリビュート。
     *
     * 項目番号: 6<br>
     * テンポラリフォルダを指定します。無指定の場合にはカレント直下のtmpフォルダを利用します。<br>
     */
    private String fTmpdir;

    /**
     * Antタスクの[targetdir]アトリビュート。
     *
     * 項目番号: 7<br>
     * blancoDbがC#.NETソースコードを出力するディレクトリを指定します。<br>
     */
    private String fTargetdir;

    /**
     * Antタスクの[basepackage]アトリビュート。
     *
     * 項目番号: 8<br>
     * blancoDbがC#.NETソースコードを生成する際の基準となるパッケージ名を指定します。<br>
     * 必須項目<br>
     */
    private String fBasepackage;

    /**
     * Antタスクの[runtimepackage]アトリビュート。
     *
     * 項目番号: 9<br>
     * ランタイムクラスを生成する生成先を指定します。無指定の場合には basepackageを基準に生成されます。<br>
     */
    private String fRuntimepackage;

    /**
     * Antタスクの[schema]アトリビュート。
     *
     * 項目番号: 10<br>
     * 単一表情報を取得する際のスキーマ名。基本的に無指定です。ただしOracleの場合にのみ、ユーザ名を大文字化したものを指定します。Oracleの場合に これを指定しないと、システム表まで検索してしまい不具合が発生するためです。※現時点ではサポートされないオプションです。<br>
     */
    private String fSchema;

    /**
     * Antタスクの[table]アトリビュート。
     *
     * 項目番号: 11<br>
     * trueを設定すると単一表のためのアクセサ・コードを生成します。<br>
     */
    private String fTable;

    /**
     * Antタスクの[sql]アトリビュート。
     *
     * 項目番号: 12<br>
     * trueを設定するとSQL定義からコードを生成します。<br>
     */
    private String fSql;

    /**
     * Antタスクの[log]アトリビュート。
     *
     * 項目番号: 13<br>
     * trueを設定すると Log4Net用のロギングコードを生成します。※現時点ではサポートされないオプションです。<br>
     */
    private String fLog;

    /**
     * Antタスクの[statementtimeout]アトリビュート。
     *
     * 項目番号: 15<br>
     * ステートメントのタイムアウト値。SQL文のタイムアウトさせたい値を設定します。CommandTimeout プロパティに反映されます。無指定の場合にはAPIデフォルト。<br>
     */
    private String fStatementtimeout;

    /**
     * Antタスクの[executesql]アトリビュート。
     *
     * 項目番号: 16<br>
     * ソースコード自動生成時にSQL定義のSQL文を実行するかどうかを設定するフラグ。デフォルトは iterator。iterator:検索型のみSQL文を実行して検証する。none:SQL文は実行しない。<br>
     */
    private String fExecutesql;

    /**
     * Antタスクの[cache]アトリビュート。
     *
     * 項目番号: 17<br>
     * 定義書メタファイルから中間XMLファイルへの変換をキャッシュで済ますかどうかのフラグ。<br>
     */
    private String fCache;

    /**
     * Verboseモードで動作させるかどうか。
     *
     * @param arg Verboseモードで動作させるかどうか。
     */
    public void setVerbose(final String arg) {
        fVerbose = arg;
    }

    /**
     * Verboseモードで動作させるかどうか。
     *
     * @return Verboseモードで動作させるかどうか。
     */
    public String getVerbose() {
        return fVerbose;
    }

    /**
     * Antタスクの[jdbcdriver]アトリビュートのセッターメソッド。
     *
     * 項目番号: 1<br>
     * JDBCドライバのクラス名を指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setJdbcdriver(final String arg) {
        fJdbcdriver = arg;
    }

    /**
     * Antタスクの[jdbcdriver]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 1<br>
     * JDBCドライバのクラス名を指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getJdbcdriver() {
        return fJdbcdriver;
    }

    /**
     * Antタスクの[jdbcurl]アトリビュートのセッターメソッド。
     *
     * 項目番号: 2<br>
     * JDBC接続先URLを指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setJdbcurl(final String arg) {
        fJdbcurl = arg;
    }

    /**
     * Antタスクの[jdbcurl]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 2<br>
     * JDBC接続先URLを指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getJdbcurl() {
        return fJdbcurl;
    }

    /**
     * Antタスクの[jdbcuser]アトリビュートのセッターメソッド。
     *
     * 項目番号: 3<br>
     * JDBCデータベース接続を行う際のユーザ名を指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setJdbcuser(final String arg) {
        fJdbcuser = arg;
    }

    /**
     * Antタスクの[jdbcuser]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 3<br>
     * JDBCデータベース接続を行う際のユーザ名を指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getJdbcuser() {
        return fJdbcuser;
    }

    /**
     * Antタスクの[jdbcpassword]アトリビュートのセッターメソッド。
     *
     * 項目番号: 4<br>
     * JDBCデータベース接続を行う際のパスワードを指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setJdbcpassword(final String arg) {
        fJdbcpassword = arg;
    }

    /**
     * Antタスクの[jdbcpassword]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 4<br>
     * JDBCデータベース接続を行う際のパスワードを指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getJdbcpassword() {
        return fJdbcpassword;
    }

    /**
     * Antタスクの[metadir]アトリビュートのセッターメソッド。
     *
     * 項目番号: 5<br>
     * SQL定義メタファイルが格納されているディレクトリを指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setMetadir(final String arg) {
        fMetadir = arg;
    }

    /**
     * Antタスクの[metadir]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 5<br>
     * SQL定義メタファイルが格納されているディレクトリを指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getMetadir() {
        return fMetadir;
    }

    /**
     * Antタスクの[tmpdir]アトリビュートのセッターメソッド。
     *
     * 項目番号: 6<br>
     * テンポラリフォルダを指定します。無指定の場合にはカレント直下のtmpフォルダを利用します。<br>
     *
     * @param arg セットしたい値
     */
    public void setTmpdir(final String arg) {
        fTmpdir = arg;
    }

    /**
     * Antタスクの[tmpdir]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 6<br>
     * テンポラリフォルダを指定します。無指定の場合にはカレント直下のtmpフォルダを利用します。<br>
     * デフォルト値[tmp]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getTmpdir() {
        return fTmpdir;
    }

    /**
     * Antタスクの[targetdir]アトリビュートのセッターメソッド。
     *
     * 項目番号: 7<br>
     * blancoDbがC#.NETソースコードを出力するディレクトリを指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setTargetdir(final String arg) {
        fTargetdir = arg;
    }

    /**
     * Antタスクの[targetdir]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 7<br>
     * blancoDbがC#.NETソースコードを出力するディレクトリを指定します。<br>
     * デフォルト値[blanco.cs]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getTargetdir() {
        return fTargetdir;
    }

    /**
     * Antタスクの[basepackage]アトリビュートのセッターメソッド。
     *
     * 項目番号: 8<br>
     * blancoDbがC#.NETソースコードを生成する際の基準となるパッケージ名を指定します。<br>
     *
     * @param arg セットしたい値
     */
    public void setBasepackage(final String arg) {
        fBasepackage = arg;
    }

    /**
     * Antタスクの[basepackage]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 8<br>
     * blancoDbがC#.NETソースコードを生成する際の基準となるパッケージ名を指定します。<br>
     * 必須アトリビュートです。Apache Antタスク上で必ず値が指定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getBasepackage() {
        return fBasepackage;
    }

    /**
     * Antタスクの[runtimepackage]アトリビュートのセッターメソッド。
     *
     * 項目番号: 9<br>
     * ランタイムクラスを生成する生成先を指定します。無指定の場合には basepackageを基準に生成されます。<br>
     *
     * @param arg セットしたい値
     */
    public void setRuntimepackage(final String arg) {
        fRuntimepackage = arg;
    }

    /**
     * Antタスクの[runtimepackage]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 9<br>
     * ランタイムクラスを生成する生成先を指定します。無指定の場合には basepackageを基準に生成されます。<br>
     *
     * @return このフィールドの値
     */
    public String getRuntimepackage() {
        return fRuntimepackage;
    }

    /**
     * Antタスクの[schema]アトリビュートのセッターメソッド。
     *
     * 項目番号: 10<br>
     * 単一表情報を取得する際のスキーマ名。基本的に無指定です。ただしOracleの場合にのみ、ユーザ名を大文字化したものを指定します。Oracleの場合に これを指定しないと、システム表まで検索してしまい不具合が発生するためです。※現時点ではサポートされないオプションです。<br>
     *
     * @param arg セットしたい値
     */
    public void setSchema(final String arg) {
        fSchema = arg;
    }

    /**
     * Antタスクの[schema]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 10<br>
     * 単一表情報を取得する際のスキーマ名。基本的に無指定です。ただしOracleの場合にのみ、ユーザ名を大文字化したものを指定します。Oracleの場合に これを指定しないと、システム表まで検索してしまい不具合が発生するためです。※現時点ではサポートされないオプションです。<br>
     *
     * @return このフィールドの値
     */
    public String getSchema() {
        return fSchema;
    }

    /**
     * Antタスクの[table]アトリビュートのセッターメソッド。
     *
     * 項目番号: 11<br>
     * trueを設定すると単一表のためのアクセサ・コードを生成します。<br>
     *
     * @param arg セットしたい値
     */
    public void setTable(final String arg) {
        fTable = arg;
    }

    /**
     * Antタスクの[table]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 11<br>
     * trueを設定すると単一表のためのアクセサ・コードを生成します。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getTable() {
        return fTable;
    }

    /**
     * Antタスクの[sql]アトリビュートのセッターメソッド。
     *
     * 項目番号: 12<br>
     * trueを設定するとSQL定義からコードを生成します。<br>
     *
     * @param arg セットしたい値
     */
    public void setSql(final String arg) {
        fSql = arg;
    }

    /**
     * Antタスクの[sql]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 12<br>
     * trueを設定するとSQL定義からコードを生成します。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getSql() {
        return fSql;
    }

    /**
     * Antタスクの[log]アトリビュートのセッターメソッド。
     *
     * 項目番号: 13<br>
     * trueを設定すると Log4Net用のロギングコードを生成します。※現時点ではサポートされないオプションです。<br>
     *
     * @param arg セットしたい値
     */
    public void setLog(final String arg) {
        fLog = arg;
    }

    /**
     * Antタスクの[log]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 13<br>
     * trueを設定すると Log4Net用のロギングコードを生成します。※現時点ではサポートされないオプションです。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getLog() {
        return fLog;
    }

    /**
     * Antタスクの[statementtimeout]アトリビュートのセッターメソッド。
     *
     * 項目番号: 15<br>
     * ステートメントのタイムアウト値。SQL文のタイムアウトさせたい値を設定します。CommandTimeout プロパティに反映されます。無指定の場合にはAPIデフォルト。<br>
     *
     * @param arg セットしたい値
     */
    public void setStatementtimeout(final String arg) {
        fStatementtimeout = arg;
    }

    /**
     * Antタスクの[statementtimeout]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 15<br>
     * ステートメントのタイムアウト値。SQL文のタイムアウトさせたい値を設定します。CommandTimeout プロパティに反映されます。無指定の場合にはAPIデフォルト。<br>
     *
     * @return このフィールドの値
     */
    public String getStatementtimeout() {
        return fStatementtimeout;
    }

    /**
     * Antタスクの[executesql]アトリビュートのセッターメソッド。
     *
     * 項目番号: 16<br>
     * ソースコード自動生成時にSQL定義のSQL文を実行するかどうかを設定するフラグ。デフォルトは iterator。iterator:検索型のみSQL文を実行して検証する。none:SQL文は実行しない。<br>
     *
     * @param arg セットしたい値
     */
    public void setExecutesql(final String arg) {
        fExecutesql = arg;
    }

    /**
     * Antタスクの[executesql]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 16<br>
     * ソースコード自動生成時にSQL定義のSQL文を実行するかどうかを設定するフラグ。デフォルトは iterator。iterator:検索型のみSQL文を実行して検証する。none:SQL文は実行しない。<br>
     * デフォルト値[iterator]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getExecutesql() {
        return fExecutesql;
    }

    /**
     * Antタスクの[cache]アトリビュートのセッターメソッド。
     *
     * 項目番号: 17<br>
     * 定義書メタファイルから中間XMLファイルへの変換をキャッシュで済ますかどうかのフラグ。<br>
     *
     * @param arg セットしたい値
     */
    public void setCache(final String arg) {
        fCache = arg;
    }

    /**
     * Antタスクの[cache]アトリビュートのゲッターメソッド。
     *
     * 項目番号: 17<br>
     * 定義書メタファイルから中間XMLファイルへの変換をキャッシュで済ますかどうかのフラグ。<br>
     * デフォルト値[false]が設定されています。Apache Antタスク上でアトリビュートの指定が無い場合には、デフォルト値が設定されます。<br>
     *
     * @return このフィールドの値
     */
    public String getCache() {
        return fCache;
    }

    /**
     * 実際のAntTaskの処理について、このメソッドをオーバーライドします。
     *
     * @throws IllegalArgumentException 引数や入出力などについて例外が発生した場合。
     */
    protected abstract void process() throws IllegalArgumentException;

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

        // 項目番号[1]、アトリビュート[jdbcdriver]は必須入力です。入力チェックを行います。
        if (getJdbcdriver() == null) {
            throw new BuildException("アトリビュート[jdbcdriver]が設定されていません。処理を中断します。");
        }
        // 項目番号[2]、アトリビュート[jdbcurl]は必須入力です。入力チェックを行います。
        if (getJdbcurl() == null) {
            throw new BuildException("アトリビュート[jdbcurl]が設定されていません。処理を中断します。");
        }
        // 項目番号[3]、アトリビュート[jdbcuser]は必須入力です。入力チェックを行います。
        if (getJdbcuser() == null) {
            throw new BuildException("アトリビュート[jdbcuser]が設定されていません。処理を中断します。");
        }
        // 項目番号[4]、アトリビュート[jdbcpassword]は必須入力です。入力チェックを行います。
        if (getJdbcpassword() == null) {
            throw new BuildException("アトリビュート[jdbcpassword]が設定されていません。処理を中断します。");
        }
        // 項目番号[5]、アトリビュート[metadir]は必須入力です。入力チェックを行います。
        if (getMetadir() == null) {
            throw new BuildException("アトリビュート[metadir]が設定されていません。処理を中断します。");
        }
        // 項目番号[8]、アトリビュート[basepackage]は必須入力です。入力チェックを行います。
        if (getBasepackage() == null) {
            throw new BuildException("アトリビュート[basepackage]が設定されていません。処理を中断します。");
        }
        // 項目番号[6]、アトリビュート[tmpdir]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getTmpdir() == null) {
            setTmpdir("tmp");
        }
        // 項目番号[7]、アトリビュート[targetdir]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getTargetdir() == null) {
            setTargetdir("blanco.cs");
        }
        // 項目番号[11]、アトリビュート[table]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getTable() == null) {
            setTable("false");
        }
        // 項目番号[12]、アトリビュート[sql]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getSql() == null) {
            setSql("false");
        }
        // 項目番号[13]、アトリビュート[log]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getLog() == null) {
            setLog("false");
        }
        // 項目番号[16]、アトリビュート[executesql]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getExecutesql() == null) {
            setExecutesql("iterator");
        }
        // 項目番号[17]、アトリビュート[cache]にはデフォルトが設定されています。入力がnullの場合にはデフォルト値をセットします。
        if (getCache() == null) {
            setCache("false");
        }

        if ("true".equals(getVerbose())) {
            System.out.println("- verbose:[true]");
            System.out.println("- jdbcdriver:[" + getJdbcdriver() + "]");
            System.out.println("- jdbcurl:[" + getJdbcurl() + "]");
            System.out.println("- jdbcuser:[" + getJdbcuser() + "]");
            System.out.println("- jdbcpassword:[" + getJdbcpassword() + "]");
            System.out.println("- metadir:[" + getMetadir() + "]");
            System.out.println("- tmpdir:[" + getTmpdir() + "]");
            System.out.println("- targetdir:[" + getTargetdir() + "]");
            System.out.println("- basepackage:[" + getBasepackage() + "]");
            System.out.println("- runtimepackage:[" + getRuntimepackage() + "]");
            System.out.println("- schema:[" + getSchema() + "]");
            System.out.println("- table:[" + getTable() + "]");
            System.out.println("- sql:[" + getSql() + "]");
            System.out.println("- log:[" + getLog() + "]");
            System.out.println("- statementtimeout:[" + getStatementtimeout() + "]");
            System.out.println("- executesql:[" + getExecutesql() + "]");
            System.out.println("- cache:[" + getCache() + "]");
        }

        try {
            // 実際のAntタスクの主処理を実行します。
            process();
        } catch (IllegalArgumentException e) {
            if ("true".equals(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());
        }
    }
}
