/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// ログ集計結果クラス。
// 
//
//	変更履歴
//	2004/01/08 新規作成	T.Nishiki
//
package jp.co.ntt.lms.xms.framework.base;


/**
 * ログ集計した結果クラス。<br>
 * 通常、集計結果はリストとして保持するものと考えられるので、
 * 操作するのに必要なメソッドを宣言する。
 * java.sql.ResultSetインタフェイスのメソッドに近い構成を想定している。
 * すなわち、このインタフェイスを実装する結果クラスには、
 * リストの中で現在行を指し示すフィールド（カーソルと表現）があり、
 * getterメソッドを呼ぶとカーソルが指し示す現在行の中から
 * getterメソッドに対応する項目の値を取得する形とする。
 * カーソルが動作する範囲は、リストの各行と、先頭行の直前の行と、最終行の直後の行とする。
 * リストが存在しない場合も仮想の２行（直前行、直後行）は存在する。
 * カーソルの初期位置は先頭行の直前の行とする。<br>
 * 
 * 得られたデータを順次取得するには以下のようになる。
 * <pre>
 * LogResult result = null;
 * 
 * // LogResultの結果を取得
 * 
 * while ( result.next() ) {
 *     // 必要な値を取得
 *     result.getterメソッド();
 * 
 * }
 * </pre>
 * 
 * また、逆順に表示する場合は、以下のようになる。
 * <pre>
 * LogResult result = null;
 * 
 * // LogResultの結果を取得
 * 
 * result.afterLast();
 * while ( result.previous() ) {
 *     // 必要な値を取得
 *     result.getterメソッド();
 * 
 * }
 * </pre>
 * 
 * @author nishiki
 */
public abstract class LogResult implements LogicResult {

	/**
	 * 先頭行の直前のカーソル位置。<br>
	 */
	private int POSISION_BEFORE_FIRST = -1;
	/**
	 * カーソル現在位置。<br>
	 */
	private int cursorPos;

	/**
	 * コンストラクタ。<br>
	 * カーソル現在位置を先頭行の直前にします。<br>
	 */
	public LogResult() {
		cursorPos = POSISION_BEFORE_FIRST;
	}

	/**
	 * 集計した結果のデータ件数を戻す。<br>
	 */
	public abstract int size();

	/**
	 * カーソルを次の行に進める。<br>
	 * 現在行が最終行ではなく、かつ、次の行が実存する場合、
	 * カーソルを次の行に進め、trueを戻す。
	 * 現在行が最終行の場合、カーソルは直後の仮想行に移動し、falseを戻す。
	 * リストが存在せず、現在行が直前行の場合、カーソルは直後行に移動し、falseを戻す。
	 * その他の場合、次の行が実存しない場合、カーソル移動はなく、falseを戻す。
	 * 
	 * @return 次の行が実存する場合はtrueを、実存しない場合はfalseを戻します。
	 */
	public final boolean next() {
		boolean returnValue = false;
		// 次の行が実存する場合は、カーソルを移動し、trueを戻す。
		if ( cursorPos + 1 < this.size() ) {
			cursorPos++;
			returnValue = true;
		// 現在行が最終行の場合は、カーソルを移動し、falseを戻す。
		} else if ( cursorPos + 1 == this.size() ) {
			cursorPos++;
		}
		return returnValue;
	}

	/**
	 * カーソルを前の行に進める。<br>
	 * 現在行が先頭行ではなく、かつ、前の行が実存する場合、
	 * カーソルを前の行に進め、trueを戻す。
	 * 現在行が先頭行の場合、カーソルは直前の仮想行に移動するが、falseを戻す。
	 * リストが存在せず、現在行が直後行の場合、カーソルは直前行に移動し、falseを戻す。
	 * その他の場合、前の行が実存しない場合、カーソル移動はなく、falseを戻す。
	 * 
	 * @return 前の行が実存する場合はtrueを、実存しない場合はfalseを戻します。
	 */
	public final boolean previous() {
		boolean returnValue = false;
		// 前の行が実存する場合は、カーソルを移動し、trueを戻す。
		if ( 0 < cursorPos ) {
			cursorPos--;
			returnValue = true;
		// 現在行が先頭行の場合は、カーソルを移動し、falseを戻す。
		} else if ( 0 == cursorPos ) {
			cursorPos--;
		}
		return returnValue;
	}

	/**
	 * カーソルを先頭行の直前の行に移動する。<br>
	 */
	public final void beforeFirst() {
		cursorPos = POSISION_BEFORE_FIRST;
	}

	/**
	 * カーソルを最後行の直後の行に移動する。<br>
	 */
	public final void afterLast() {
		cursorPos = size();
	}

	/**
	 * 現在行を戻す。
	 * @return 現在行。
	 */
	protected final int getCursorPos() {
		return cursorPos;
	}

	/**
	 * カーソル位置の初期化を実施する。<br>
	 * 現在行が先頭行の場合、０を戻す。
	 * このメソッドをオーバーライドする場合は、
	 * super.initialize()とこのメソッドを呼ぶようにすること。
	 */
	protected void initialize() {
		cursorPos = POSISION_BEFORE_FIRST ;
	}
}
