/*
 * blancoDb Enterprise Edition
 * Copyright (C) 2004-2005 Tosiki Iga
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.db.exception;

import blanco.ig.expander.ClassExpander;
import blanco.ig.expander.Scope;
import blanco.ig.expander.Type;
import blanco.ig.expander.Value;
import blanco.ig.expander.field.FieldExpander;
import blanco.ig.expander.implementor.Statement;
import blanco.ig.expander.method.Constructor;

/**
 * データベースデッドロックに関する例外クラス <br>
 * このクラスが生成するクラスはblancoDbが生成したソースコードで利用されます <br>
 * 
 * @since 2006.02.28
 * @author IGA Tosiki
 */
public class DeadlockExceptionClass extends ClassExpander {
    /**
     * 例外クラスのクラス名
     */
    public static final String CLASS_NAME = "DeadlockException";

    /**
     * コンストラクタに示すJavaDoc説明。
     */
    private static final String CONSTRUCTOR_JAVADOC = "データベースのデッドロックが発生したことを示す例外オブジェクト のインスタンスを作成します。";

    public DeadlockExceptionClass(final Type argType) {
        super(argType);
    }

    protected void expandClassStruct() {
        setSuperClass(new Type("java.sql.SQLException"));

        getJavaDoc().addLine("データベースデッドロックに関する例外クラス <br>");
        getJavaDoc().addLine("このクラスはblancoDbが生成したソースコードで利用されます <br>");
        getJavaDoc().addLine("※このクラスは、ソースコード自動生成後のファイルとして利用されます。");
        getJavaDoc().addLine("");
        getJavaDoc().addLine("@since 2006.02.28");
        getJavaDoc().addLine("@author blanco Framework");

        final FieldExpander fieldCode = new FieldExpander(new Type(
                "java.lang.String"), "SQLSTATE_DEADLOCK") {
            protected Scope getScope() {
                return Scope.PROTECTED;
            }

            protected boolean isStatic() {
                return true;
            }

            protected boolean isFinal() {
                return true;
            }
        };
        fieldCode.getJavaDoc().addLine("このクラスを表現するSQLStateコード。");
        fieldCode.setDefaultStatement(new Statement("\"40001\""));
        addField(fieldCode);

        addMethod(new Constructor(CLASS_NAME) {
            public void setupSignature() {
                getJavaDoc().addLine(CONSTRUCTOR_JAVADOC);
                getJavaDoc().addLine("");
                getJavaDoc()
                        .addLine(
                                "@deprecated このコンストラクタはなるべく利用せずに、もとの例外のSQLStateやvenderCodeを利用可能な別のコンストラクタを利用してください。");

            }

            public void implement() {
                getData()
                        .addLine(
                                "super(\"Deadlock exception has occured.\", SQLSTATE_DEADLOCK);");
            }
        });

        addMethod(new Constructor(CLASS_NAME) {
            public void setupSignature() {
                getJavaDoc().addLine(CONSTRUCTOR_JAVADOC);
                getJavaDoc().addLine("");
                getJavaDoc()
                        .addLine(
                                "@deprecated このコンストラクタはなるべく利用せずに、もとの例外のSQLStateやvenderCodeを利用可能な別のコンストラクタを利用してください。");
                getJavaDoc().addParameter("reason", "例外の説明");
                addArgument(new Value(new Type("java.lang.String"), "reason"));
            }

            public void implement() {
                getData().addLine("super(reason, SQLSTATE_DEADLOCK);");
            }
        });

        addMethod(new Constructor(CLASS_NAME) {
            public void setupSignature() {
                getJavaDoc().addLine(CONSTRUCTOR_JAVADOC);
                getJavaDoc().addLine("");
                getJavaDoc()
                        .addLine(
                                "@deprecated このコンストラクタはなるべく利用せずに、もとの例外のSQLStateやvenderCodeを利用可能な別のコンストラクタを利用してください。");
                getJavaDoc().addParameter("reason", "例外の説明");
                addArgument(new Value(new Type("java.lang.String"), "reason"));
                getJavaDoc().addParameter("SQLState",
                        "例外を識別する XOPENコードまたは SQL 99のコード");
                addArgument(new Value(new Type("java.lang.String"), "SQLState"));
            }

            public void implement() {
                getData().addLine("super(reason, SQLState);");
            }
        });

        addMethod(new Constructor(CLASS_NAME) {
            public void setupSignature() {
                getJavaDoc().addLine(CONSTRUCTOR_JAVADOC);
                getJavaDoc().addParameter("reason", "例外の説明");
                addArgument(new Value(new Type("java.lang.String"), "reason"));
                getJavaDoc().addParameter("SQLState",
                        "例外を識別する XOPENコードまたは SQL 99のコード");
                addArgument(new Value(new Type("java.lang.String"), "SQLState"));
                getJavaDoc().addParameter("vendorCode",
                        "データベースベンダーが定める固有の例外コード");
                addArgument(new Value(new Type("int"), "vendorCode"));
            }

            public void implement() {
                getData().addLine("super(reason, SQLState, vendorCode);");
            }
        });
    }
}