package org.logical_paradox.common.btree;

import java.util.Properties;

/**
 * BtreeFactoryのテスト用の実装<br>
 * BtreeKeyTestImplとBtreeObjectTestImplを返す
 * @author satoshi akabane
 */
public class BtreeFactoryTestImpl extends BtreeFactory {
	private static BtreeKey _key = null;
	protected static Properties _prop = null;

	static {
		// このファクトリで生成するキー，オブジェクトおよびファイルの設定値の初期化処理
		_prop = new Properties();
		_prop.setProperty(BtreeFile.MAGIC_NUMBER, "ABCD");
		_prop.setProperty(BtreeFile.MAJOR_VERSION, "100");
		_prop.setProperty(BtreeFile.MINOR_VERSION, "200");
		_prop.setProperty(BtreeFile.HEADER_SIZE, "256");
		_prop.setProperty(BtreeFile.ORDER, "16");
		_prop.setProperty(BtreeFile.KEYSIZE, "128");
	}

	/**
	 * このファクトリで生成されるファイルの設定値を返す
	 * 
	 * @return 設定値
	 * @throws BtreeException 設定値を返すことができない場合
	 */
	public Properties getProperty() throws BtreeException {
		return _prop;
	}

	/**
	 * 新しいBtreeKeyを返す
	 *
	 * @param o キーの引数
	 * @return BtreeKey キー
	 * @exception BtreeException キーの生成に失敗した
	 * @see org.logical_paradox.common.btree.BtreeKey
	 */
	public BtreeKey newKey(Object o) throws BtreeException {
		return new BtreeKeyTestImpl(o);
	}

	/**
	 * バイト列からBtreeKeyを復元して返す
	 * @param stream バイト列
	 * @return 復元されたキー
	 * @exception 復元に失敗した
	 */
	public BtreeKey newKey(byte[] stream) throws BtreeException {
		return new BtreeKeyTestImpl(stream);
	}

	/**
	 * BtreeKeyのバイトサイズを返す
	 *
	 * @return int バイトサイズ
	 * @see org.logical_paradox.common.btree.BtreeKey
	 */
	public int keyByteSize() {
		// サイズ計測用のインスタンスがまだ生成されていない場合，生成する
		if(_key == null) {
			try {
				_key = new BtreeKeyTestImpl("1");
			} catch(BtreeException e) {
				e.printStackTrace();
			}
		}
		return _key.byteSize();
	}

	/**
	 * ファイルハンドルを返す<br>
	 * ただしこのメソッドを呼び出しても，ファイル自体はオープンされていないことに注意
	 * 
	 * @param filename ファイル名
	 * @return BtreeFile ファイル
	 * @throws BtreeException 何らかの理由でファイルハンドルの生成に失敗した
	 */
	public BtreeFile getFileHandle(String filename) throws BtreeException {
		Properties prop = (Properties)getProperty().clone();
		prop.setProperty(BtreeFile.FILENAME, filename);

		return new BtreeFileMoc(this, prop);
	}

	/**
	 * 利用可能リストを返す
	 * ただし，作成された利用可能リストはオープンされない
	 * @param filename ファイル名
	 * @return 利用可能リスト
	 * @throws BtreeException 利用可能リストの作成に失敗した
	 */
	public BtreeAvailableList getBtreeAvailableList(String filename) throws BtreeException {
		return new OnMemoryBtreeFragmentFile();
	}
}
