/*
 * 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.expander.query.iterator;

import java.util.ArrayList;
import java.util.List;

import blanco.db.definition.QueryIterator;
import blanco.ig.expander.Type;
import blanco.ig.expander.Value;
import blanco.ig.expander.implementor.Implementor;
import blanco.ig.expander.method.MethodExpander;

/**
 * @author Tosiki Iga
 */
public class GetListMethod extends MethodExpander {

    private QueryIterator _iterator = null;

    public GetListMethod(final QueryIterator iterator) {
        super("getList");
        _iterator = iterator;
    }

    public void setupSignature() {
        setReturnType(new Type(List.class));

        getJavaDoc().addException(new Type("java.sql.SQLException"),
                "SQL例外が発生した場合。");
        addException(new Type("java.sql.SQLException"));

        addUsingType(new Type(ArrayList.class));

        getJavaDoc().addLine("検索結果をリストの形式で取得します。");
        getJavaDoc().addLine("");
        getJavaDoc()
                .addLine("リストには " + _iterator.getName() + "クラスが格納されます。<br>");
        getJavaDoc().addLine("検索結果の件数があらかじめわかっていて、且つ件数が少ない場合に利用することができます。<br>");
        getJavaDoc()
                .addLine(
                        "検索結果の件数が多い場合には、このメソッドは利用せず、代わりに next()メソッドを利用することをお勧めします。<br>");
        if (_iterator.getScrollInterface().equals("forward_only")) {
            getJavaDoc()
                    .addLine(
                            "このQueryIteratorは FORWARD_ONLY(順方向カーソル)です。このgetListメソッドの利用は極力避けてください。または スクロールカーソルとして再生成してください。");
        }

        if (_iterator.getScrollInterface().equals("forward_only") == false) {
            addArgument(new Value(int.class, "absoluteStartPoint"));
            getJavaDoc().addParameter("absoluteStartPoint",
                    "読み出しを開始する行。最初の行から読み出したい場合には 1 を指定します。");
        }

        addArgument(new Value(int.class, "size"));
        getJavaDoc().addParameter("size", "読み出しを行う行数。");

        getJavaDoc().addReturn(
                _iterator.getName() + "クラスのList。検索結果が0件の場合には空のリストが戻ります。");
    }

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

        implementor.addLine("List result = new ArrayList(size);");
        if (_iterator.getScrollInterface().equals("forward_only") == false) {
            implementor.addLine("if (absolute(absoluteStartPoint) == false) {");
            implementor.addLine("return result;");
            implementor.addLine("}");
        }
        implementor.addLine("for (int count = 1; count <= size; count++) {");
        if (_iterator.getScrollInterface().equals("forward_only")) {
            implementor.addLine("if (next() == false) {");
            implementor.addLine("break;");
            implementor.addLine("}");
        } else {
            implementor.addLine("if (count != 1) {");
            implementor.addLine("if (next() == false) {");
            implementor.addLine("break;");
            implementor.addLine("}");
            implementor.addLine("}");
        }
        implementor.addLine("result.add(getRow());");
        implementor.addLine("}");
        implementor.addLine("return result;");
    }
}