/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.fts;

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;

/**
 * FTSで使用するBtreeファクトリ
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class FTSBtreeFactory extends BtreeFactory {
	private static Properties _prop;
	private static BtreeKey _key = null;
	
	/*
	 * このファクトリの初期化パラメータの設定処理
	 */
	static {
		_prop = new Properties();
		_prop.setProperty(BtreeFile.MAGIC_NUMBER, "ABCD");
		_prop.setProperty(BtreeFile.MAJOR_VERSION, "1");
		_prop.setProperty(BtreeFile.MINOR_VERSION, "0");
		_prop.setProperty(BtreeFile.HEADER_SIZE, "128");
		_prop.setProperty(BtreeFile.ORDER, "16");
		_prop.setProperty(BtreeFile.KEYSIZE, "" + FTSBtreeKey.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 o 引数オブジェクト
	 * @return 復元されたキー
	 * @exception BtreeException 何らかの理由で復元に失敗した
	 */
	public BtreeKey newKey(Object o) throws BtreeException {
//		if(o instanceof String) {
			return new FTSBtreeKey(o);
//		} else {
//			throw new BtreeException("newKey()の引数にはStringを指定してください");
//		}
	}

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

	/**
	 * キーのバイトサイズを返す
	 * @return バイトサイズ
	 */
	public int keyByteSize() {
		if(_key == null) {
			try {
				_key = newKey("");
			} catch(BtreeException be) {}
		}
		return _key.byteSize();
	}

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