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

import java.util.Hashtable;

/**
 * レコードを生成するファクトリ
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public abstract class RecordFactory {
	public static final String DEFAULT_RECORD_FACTORY_CLASS_NAME = "org.logical_paradox.common.vrm.DefaultRecordFactory";
	public static final String DEFAULT_RECORD_FACTORY_PROPERTY_NAME = "org.logical_paradox.common.vrm.RecordFactoryClass";
	private static final Hashtable factoryPool = new Hashtable();

	/**
	 * コンストラクタ
	 * デフォルトコンストラクタが必要なので，仕方なく
	 */
	protected RecordFactory() {
	}
	/**
	 * デフォルトファクトリのインスタンスを返す
	 * @return デフォルトファクトリ
	 */
	public static final RecordFactory getInstance() throws Exception {
		return RecordFactory.getInstance(DEFAULT_RECORD_FACTORY_CLASS_NAME);
	}
	/**
	 * ファクトリのインスタンスを返す
	 * @param classname
	 * @return ファクトリ
	 * @throws Exception ファクトリの生成に失敗した
	 */
	public static final RecordFactory getInstance(String classname) throws Exception {
		RecordFactory factory = (RecordFactory)factoryPool.get(classname);
		if(factory != null) {
			return factory;
		}
		
		// ファクトリプールに指定されたファクトリのインスタンスがないので，新しく生成する
		factory = (RecordFactory)Class.forName(classname).newInstance();
		// ファクトリプールに登録
		factoryPool.put(classname, factory);

		return factory;
	}
	
	/**
	 * バイト列からレコードを生成して返す
	 * @param bstream
	 * @return
	 */
	public abstract Record getRecord(byte[] bstream);
}
