/**
 * LOGICAL-PARADOX.ORG b-tree library
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 * Release 1.0
 * ・初期パージョン
 */
package org.logical_paradox.common.btree;

/**
 * BtreeKeyのテスト用の実装<br>
 * 文字列のみによる単純な実装．
 * @author satoshi akabane
 * @version 1.0
 */
public class BtreeKeyTestImpl extends BtreeKey {
	private String _key;

	/**
	 * コンストラクタ
	 *
	 * @param o キー
	 */
	public BtreeKeyTestImpl(Object o) throws BtreeException {
		super(o);
	}

	/**
	 * コンストラクタ
	 *
	 * @param bstream バイト列
	 * @exception BtreeException バイト列からキーを復元できなかった場合に発生する
	 */
	public BtreeKeyTestImpl(byte[] bstream) throws BtreeException {
		super(bstream);
	}

	/**
	 * オブジェクトからBtreeKeyの実体を生成する．<br>
	 * ※このメソッドは公開されない．通常は<br>
	 * ※public void objectToBtreeKey(String str)<br>
	 * ※のほうを使用する
	 * @param o オブジェクト
	 * @throws BtreeException 実体化に失敗した
	 */
	protected void objectToBtreeKey(Object o) throws BtreeException {
		if(o instanceof java.lang.String == false) {
			throw new BtreeException("引数オブジェクトはjava.lang.Stringのみ有効です");
		}
		_key = (String)o;
	}
	/**
	 * オブジェクトからBtreeKeyの実体を生成する．
	 * @param o オブジェクト
	 * @throws BtreeException 実体化に失敗した
	 */
	public void objectToBtreeKey(String str) throws BtreeException {
		if(str == null) {
			throw new BtreeException("引数オブジェクトがnullです");
		}
		objectToBtreeKey((Object)str);
	}
	/**
	 * バイト列からBtreeKeyの実体を生成する．
	 * @param bstream バイト列
	 * @exception BtreeException
	 */
	public void byteStreamToBtreeKey( byte[] bstream ) throws BtreeException {
		_key = new String(bstream).trim();
	}

	/**
	 * キーの文字列形式を返す．
	 * @return String キーの文字列形式
	 */
	public String toString() {
		return _key;
	}

	/**
	 * キーを比較する．
	 * @param obj 比較対象
	 * @return boolean true: 同じである / false: 違う
	 */
	public boolean equals( Object obj ) {
		return _key.equals(obj.toString());
	}

	/**
	 * 指定されたキーより小さいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this < key / false: this >= key
	 */
	public boolean isLessThan( BtreeKey key ) {
		return _key.compareTo(key.toString()) < 0;
	}

	/**
	 * 指定されたキーより大きいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this > key / false: this <= key
	 */
	public boolean isGreaterThan( BtreeKey key ) {
		return _key.compareTo(key.toString()) > 0;
	}

	/**
	 * キーのバイトストリームを返す．<br>
	 * 永続ストレージに対してキーを保存する際に，BtreePageによって
	 * 呼び出される．<br>
	 * キーは固定長サイズで，それ以上の長さのキーは自動的にサイズ内に整形される．
	 * @return byte[] バイト列
	 */
	public byte[] byteStream() {
		byte[] result = new byte[byteSize()];
		byte[] bstream = _key.getBytes();
		System.arraycopy(bstream, 0, result, 0, bstream.length);

		return result;
	}

	/**
	 * バイトストリームにした際のサイズ<br>
	 * キーの大きさは固定長なので，必ず固定サイズが返る
	 * @return int バイト表現にした場合のサイズ
	 */
	public int byteSize() {
		return 128;
	}
}

// end of BtreeKeyTestImpl.java
