package blanco.db.expander.query;

import blanco.db.util.BlancoDbObjectStorage;
import blanco.ig.expander.Scope;
import blanco.ig.expander.Type;
import blanco.ig.expander.implementor.Implementor;
import blanco.ig.expander.method.MethodExpander;

public class Finalize extends MethodExpander {
    private BlancoDbObjectStorage storage = null;

    private String className = null;

    public Finalize(final BlancoDbObjectStorage storage, final String className) {
        super("finalize");
        this.storage = storage;
        this.className = className;
    }

    protected Scope getScope() {
        return Scope.PROTECTED;
    }

    public void setupSignature() {
        getJavaDoc().addException(new Type(Throwable.class),
                "finalize処理の中で発生した例外。");
        addException(Throwable.class);

        getJavaDoc().addLine("finalizeメソッド。");
        getJavaDoc().addLine("");
        getJavaDoc()
                .addLine(
                        "このクラスが内部的に生成したオブジェクトのなかで、close()呼び出し忘れバグが存在するかどうかチェックします。<br>");
    }

    public void implement() {
        final Implementor implementor = new Implementor(getData());

        implementor.addLine("super.finalize();");
        implementor.addLine("if (fStatement != null) {");
        implementor.addLine("final String message = \"" + className
                + " : close()メソッドによるリソースの開放が行われていません。\";");
        implementor.addLine("System.out.println(message);");

        if (storage.getSetting().isLogging()) {
            implementor.addLine("");
            implementor.addLine("fLog.error(\"" + getName()
                    + ": \" + message);");
        }

        implementor.addLine("}");
    }
}