<?php
/**
* プロシージャを生成するファクトリークラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class charcoal_ProcedureFactory
{
	/*
	 * プロシージャを作成
	 */
	public static function create( $proc_key )
	{
		log_info( "system",  "プロシージャ[$proc_key]をロードします。", __FILE__, __LINE__ );

		// proc_list.iniを読み込む
		$config_file = charcoal_ResourceLocator::getWebAppPath( 'config', "proc_list.ini" );
		if ( is_file($config_file) ){
			$proc_list = parse_ini_file($config_file,FALSE);
		}
		else{
			$proc_list = array();
		}
		
		// 登録されていないキーが指定された場合は404
		if ( !isset($proc_list[ "$proc_key" ]) ){
			throw new charcoal_HttpException( 404 );
		}

		// プロシージャキーからプロシージャ名に変換
		$proc_name = $proc_list[ "$proc_key" ];

		// ProcedureConfigをロード
		$config = charcoal_ConfigLoader::loadConfig( $proc_name, "procedure" );

		// クラス名を取得
		$class_name = $config->getString( 'class_name' );

		if ( !$class_name ){
			throw new charcoal_ProcedureConfigException( $proc_name, 'class_name' );
		}

		// プロシージャのインスタンス生成
		$procedure = charcoal_ClassUtil::newInstance( $class_name );

		// 生成したインスタンスがIprocedureインタフェースを実装しているか確認
		if ( !($procedure instanceof charcoal_IProcedure) ){
			// 実装例外
			throw new charcoal_InterfaceImplementException( $class_name, "charcoal_IProcedure" );
		}

		log_info( "system",  "プロシージャ[$proc_key]を初期化します。", __FILE__, __LINE__ );

		// プロシージャを初期化
		$procedure->init( $config );

		log_info( "system",  "プロシージャ[$proc_key]をロードしました。", __FILE__, __LINE__ );

		// プロシージャ、プロシージャ名を返却
		return array( $procedure, $proc_name );
	}
}
