/*
 * CB3BeanFactory.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * CB3で扱うBeanを生成するファクトリクラス。
 * @author Naoko Sugimoto
 */
public class CB3BeanFactory {

	/** CB3BeanFactory */
	private static CB3BeanFactory factory = new CB3BeanFactory();

	/** デフォルトのコンテキストファイルパス */
	private static final String APPLICATION_CONTEXT_FILEPATH = "applicationContext.xml";

	/** コンテキストファイルパス */
	private String applicationContextFilePath = null;

	/** アプリケーションコンテキスト */
	private ApplicationContext context = null;

	/**
	 * CB3BeanFactoryを取得します。
	 * @return CB3BeanFactory
	 */
	public static CB3BeanFactory getInstance() {
		return factory;
	}

	/**
	 * コンストラクタ。
	 */
	private CB3BeanFactory() {
	}

	/**
	 * Beanを取得します。
	 *
	 * @param beanId Bean ID
	 * @return Bean
	 */
	public Object getBean(String beanId) {
		if (context == null) {
			// アプリケーションコンテキストを生成する。
			createApplicationContext();
		}
		// アプリケーションコンテキストからBeanを取得する。
		return context.getBean(beanId);
	}

	/**
	 * アプリケーションコンテキストを生成します。
	 */
	private void createApplicationContext() {
		context = new ClassPathXmlApplicationContext(
				new String[]{
						getApplicationContextFilePath()
				}
		);
	}

	/**
	 * アクセッサーコンテキストのファイルパスを取得します。
	 * @return アクセッサーコンテキストのファイルパス
	 */
	public String getApplicationContextFilePath() {
		if (applicationContextFilePath == null) {
			applicationContextFilePath = APPLICATION_CONTEXT_FILEPATH;
		}
		return applicationContextFilePath;
	}

	/**
	 * アクセッサーコンテキストのファイルパスを設定します。
	 * @param filePath アクセッサーコンテキストのファイルパス
	 */
	public void setApplicationContextFilePath(String filePath) {
		context = null;
		this.applicationContextFilePath = filePath;
	}
}
