/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: ContentsAccessorFactory.java,v 1.8 2006/02/21 14:54:47 akabane Exp $
 */
package org.logical_paradox.rss.rcm.accessor;

import java.util.HashMap;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.common.util.ExceptionUtils;
import org.logical_paradox.common.util.StringUtils;

/**
 * ContentsAccessorFactory
 * コンテンツストレージへアクセスするためのアクセサを生成する生成子の基底インターフェース
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.8 $
 */
public class ContentsAccessorFactory {
	/** コンテンツアクセスインターフェースの具象クラス名 */
	public static final String PARAM_ACCESSOR_CLASSNAME = "param.accessor.classname";
	/** 接続先DSRのURI */
	public static final String PARAM_DSR_URI = "param.dsr.uri";
	/** コンテンツアクセスインターフェースの初期化パラメータ */
	public static final String PARAM_INIT_PARAM = "param.init.param";
	/** コンテンツを格納する際のエンコーディング */
	public static final String PARAM_CONTENTS_ENCODING = "param.contents.encoding";

	/** ロガー */
	private static final Log log = LogFactory.getLog(ContentsAccessorFactory.class);
	/** コンテンツアクセサのクラスファイル */
	private Class seed;
	/** 初期化パラメータ */
	private String initparam;
	/** 既に生成されたインターフェース */
	private HashMap<String, ContentsAccessor> instances = new HashMap<String, ContentsAccessor>();
	/** DSR */
	private String dsruri;
	/** コンテンツを管理する際のエンコーディング */
	private String contentsEncoding;

	/**
	 * コンストラクタ．
	 * @param factoryInitProperties ファクトリ初期化パラメータ
	 * @throws ClassNotFoundException アクセサが生成できなかった
	 */
	public ContentsAccessorFactory(Properties factoryInitProperties) throws ClassNotFoundException {
		// ファクトリを初期化する
		String classname = factoryInitProperties.getProperty(PARAM_ACCESSOR_CLASSNAME);

		seed = Class.forName(classname);
		initparam = factoryInitProperties.getProperty(PARAM_INIT_PARAM);
		dsruri = factoryInitProperties.getProperty(PARAM_DSR_URI);
		contentsEncoding = factoryInitProperties.getProperty(PARAM_CONTENTS_ENCODING);
	}
	/**
	 * 新しいコンテンツアクセサを生成して返す．
	 * 同じ初期化パラメータで生成されたインスタンスは共有される
	 * @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();
			accessor.setDSRURI(dsruri);
			accessor.setContentsEncoding(contentsEncoding);
			if(StringUtils.isEmpty(initp) == false) {
				// 初期化パラメータが指定されている場合，init()を呼び出す
				accessor.init(initparam);
			}
			instances.put(initp, accessor);

			return accessor;
		} catch(Exception e) {
			String stackTraceMsg = ExceptionUtils.stackTraceToString(e);
			log.error("コンテンツアクセサ生成中にエラーが発生しました:[" + e.getMessage() + "]", e);
			log.error(stackTraceMsg);
			throw new IllegalArgumentException(e.getMessage());
		}
	}
}

// end of ContentsAccessorFactory.java
