/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: ContentsAccessorFactory.java,v 1.4 2005/10/10 12:34:52 rampil Exp $
 */
package org.logical_paradox.rss.rcm.accessor;

import java.util.HashMap;

import org.logical_paradox.common.util.StringUtils;

/**
 * ContentsAccessorFactory
 * コンテンツストレージへアクセスするためのアクセサを生成する生成子の基底インターフェース
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.4 $
 */
public class ContentsAccessorFactory {
	/** コンテンツアクセサのクラスファイル */
	private Class seed;
	/** リモートコンテンツ管理システムの正式名 */
	private String fqsn;
	/** 初期化パラメータ */
	private String initparam;
	/** 既に生成されたインターフェース */
	private HashMap instances = new HashMap();

	/**
	 * コンストラクタ．
	 * @param コンテンツアクセサのクラス名
	 * @param initp 初期化パラメータ
	 */
	public ContentsAccessorFactory(String classname, String initp) throws ClassNotFoundException {
		seed = Class.forName(classname);
		initparam = initp;
	}
	/**
	 * 新しいコンテンツアクセサを生成して返す．
	 * 同じ初期化パラメータで生成されたインスタンスは共有される
	 * @return 生成されたコンテンツアクセサ
	 * @throws IllegalArgumentException 生成に失敗した
	 */
	public ContentsAccessor getAccessor() throws IllegalArgumentException {
		try {
			String initp = initparam != null ? initparam : "";
			ContentsAccessor accessor = (ContentsAccessor)instances.get(initp);
			if(accessor != null) {
				return accessor;
			}
			accessor = (ContentsAccessor)seed.newInstance();
			if(StringUtils.isEmpty(initp) == false) {
				// 初期化パラメータが指定されている場合，init()を呼び出す
				accessor.init(initparam);
			}
			instances.put(initp, accessor);

			return accessor;
		} catch(Exception e) {
			throw new IllegalArgumentException(e.getMessage());
		}
	}
	/**
	 * リモートコンテンツ管理システムの正式名を設定する．
	 * @param fqsn リモートコンテンツ管理システムの正式名
	 */
	public void setRCMServiceName(String fqsn_) {
		fqsn = fqsn_;
	}
}

// end of ContentsAccessorFactory.java
