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

import jp.co.cybec.cb3.exception.ServiceProviderCreationException;
import jp.co.cybec.cb3.util.CB3BeanFactory;
import jp.co.cybec.cb3.util.logging.ErrorCodeConstant;
import jp.co.cybec.cb3.util.logging.LogMessageConstant;
import jp.co.cybec.cb3.util.logging.LogMessageFactory;

/**
 * サービスプロバイダファクトリクラス。
 * @author Naoko Sugimoto
 */
public class ServiceProviderFactory {
	/** サービスプロバイダファクトリ */
	private static ServiceProviderFactory factory = new ServiceProviderFactory();

	/** メッセージ */
	private static final LogMessageFactory MESSAGE = new LogMessageFactory(
			LogMessageConstant.CB3_MESSAGE_FILENAME);

	/**
	 * サービスプロバイダファクトリを取得します。
	 * @return サービスファクトリ
	 */
	public static ServiceProviderFactory getInstance() {
		return factory;
	}

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

	/**
	 * サービスプロバイダを取得します。
	 *
	 * @param beanId サービスプロバイダのbean id。
	 * @return サービスプロバイダ。
	 */
	public ServiceProvider getServiceProvider(String beanId) {
		CB3BeanFactory beanFactory = CB3BeanFactory.getInstance();
		try {
			// Beanファクトリからサービスプロバイダを取得する。
			return (ServiceProvider)beanFactory.getBean(beanId);

		} catch (RuntimeException e) {
			Object[] param = {
					beanFactory.getApplicationContextFilePath(),
					beanId
			};
			throw new ServiceProviderCreationException(MESSAGE.getErrorMessage(
					ErrorCodeConstant.CONTAINER_PROVIDER_001,
					LogMessageConstant.CB3_CONTAINER_PROVIDER_002, param), e);
		}

	}
}
