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

import java.util.Properties;

import org.logical_paradox.common.btree.BtreeAvailableList;
import org.logical_paradox.common.btree.BtreeException;
import org.logical_paradox.common.btree.BtreeFactory;
import org.logical_paradox.common.btree.BtreeFile;
import org.logical_paradox.common.btree.BtreeKey;
import org.logical_paradox.common.btree.OnMemoryBtreeFragmentFile;

/**
 * B-treeシミュレータ用のファクトリクラス
 * 描画可能なBtreeKey，BtreePageなどを生成する
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class DrawableBtreeFactory extends BtreeFactory {
	private static BtreeKey _key = null;
	protected static Properties _prop = null;

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

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

	/**
	 * ファイルハンドルを返す<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 BTSBtreeFile(this, prop);
	}

	/**
	 * 新しいキーを生成して返す
	 * @param o 引数オブジェクト
	 * @return 新しく生成されたキー
	 * @throws BtreeException 引数オブジェクトからの復元に失敗
	 */
	public BtreeKey newKey(Object o) throws BtreeException {
		return new DrawableBtreeKey(o);
	}

	/**
	 * 新しいキーを生成して返す
	 * @param stream バイトストリーム
	 * @return 新しく生成されたキー
	 * @throws BtreeException バイトストリームからの復元に失敗
	 */
	public BtreeKey newKey(byte[] stream) throws BtreeException {
		return new DrawableBtreeKey(stream);
	}

	/**
	 * BtreeKeyのバイトサイズを返す
	 *
	 * @return int バイトサイズ
	 * @see org.logical_paradox.common.btree.BtreeKey
	 */
	public int keyByteSize() {
		return DrawableBtreeKey.KEY_BYTE_SIZE;
	}

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