package org.logical_paradox.rss.rcm.accessor.simple;

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;

/**
 * RCMで使用するシンプルなBtreeFactory
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class RCMBtreeFactory extends BtreeFactory {
	private static Properties _prop;

	/*
	 * このファクトリの初期化パラメータの設定処理
	 */
	static {
		_prop = new Properties();
		_prop.setProperty(BtreeFile.MAGIC_NUMBER, "RCMF");
		_prop.setProperty(BtreeFile.MAJOR_VERSION, "1");
		_prop.setProperty(BtreeFile.MINOR_VERSION, "0");
		_prop.setProperty(BtreeFile.HEADER_SIZE, "128");
		_prop.setProperty(BtreeFile.ORDER, "32");
		_prop.setProperty(BtreeFile.KEYSIZE, "" + RCMBtreeKey.KEY_BYTE_SIZE);
	}

	/**
	 * このファクトリの生成パラメータを返す
	 * @return プロパティ
	 * @exception BtreeException プロパティの取得中に失敗した
	 */
	protected Properties getProperty() throws BtreeException {
		return (Properties)_prop.clone();
	}

	/**
	 * ファイルハンドルをオープンする
	 * @param filename ファイル名
	 * @return オープンされた状態のストレージ
	 * @exception BtreeException  ファイル生成に失敗した
	 */
	public BtreeFile getFileHandle(String filename) throws BtreeException {
		if(filename == null || filename.trim().length() == 0) {
			throw new BtreeException("ファイル名が指定されていません");
		}
		Properties p = (Properties)_prop.clone();
		p.setProperty(BtreeFile.FILENAME,filename);		
		BtreeFile bf = new BtreeFile(this, p);
		return bf;
	}

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

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

	/**
	 * 新しいキーを生成する
	 * @param stream バイト列
	 * @return 復元されたキー
	 * @exception BtreeException 何らかの理由で復元に失敗した
	 */	
	public BtreeKey newKey(byte[] stream) throws BtreeException {
		return new RCMBtreeKey(stream);
	}

	/**
	 * キーのバイトサイズを返す
	 * @return バイトサイズ
	 */
	public int keyByteSize() {
		return RCMBtreeKey.KEY_BYTE_SIZE;
	}

}
