<?
/**
* モジュールグラフを実装するプローシージャ
*
* PHP version 5
*
* @package    procedures
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
class charcoal_ModuleGraphProcedure extends charcoal_DefaultProcedure implements charcoal_IProcedure
{
	var $_input_filters;
	var $_output_filters;
	var $_class_loaders;
	var $_renderer;

	/*
	 * コンストラクタ
	 */
	public function __construct()
	{
	}

	/*
	 * プロシージャ名を取得
	 */
	public function getProcedureName()
	{
		return "Module Graph Procedure";
	}

	/*
	 * プロシージャを初期化する
	 */
	public function init( charcoal_Config $config )
	{
		parent::init( $config );;
	}

	/*
	 * プロシージャを実行する
	 */
	public function execute( charcoal_Request $request, charcoal_ProcedureContext $context, charcoal_Response $response )
	{
		$proc_name = $context->getProcedureName();

		log_info( "system",  "プロシージャ[$proc_name]を実行します。", __FILE__, __LINE__ );

		//=======================================
		// 入力フィルタの実行
		//
		parent::processInputFilters( $request, $context, $response );

		//=======================================
		// ModuleGraphの構築
		//
		log_info( "system",  "モジュールグラフの構築を行います。", __FILE__, __LINE__ );

		// 設定ファイルの読み込み
		$module_graph_config = 	charcoal_ConfigLoader::loadConfig( "$proc_name", 'module_graph' );

		// ModuleGraphを組み立てる
		$module_graph = new charcoal_ModuleGraph();
		$module_graph->build( $module_graph_config, $context );

		log_info( "system",  "モジュールグラフの構築を完了しました。", __FILE__, __LINE__ );

		//=======================================
		// ModuleGraphの実行
		//
		log_info( "system",  "モジュールグラフの実行を開始します。", __FILE__, __LINE__ );

		// モジュールグラフのカレントノードをstartノードに設定
		$module_graph->start();

		// ModuleGraphを実行する
		while ( $module_graph->hasCurrentNode() )
		{
			// 現在のノード
			$node = $module_graph->getCurrentNode();
			$node_name = $node->getNodeName();

			// ノードを実行する
			$transition_key = $node->execute( $request, $context, $response );

			log_info( "system",  "次のノードの遷移キーは[$transition_key]です。", __FILE__, __LINE__ );

			// 次のノード
			$next_node = $node->getNextNode( $transition_key );

			log_info( "system",  "次のノード名は[$next_node]です。", __FILE__, __LINE__ );

			// 遷移先がなければデフォルト遷移先に遷移
			if ( $next_node == NULL ){
				log_info( "system",  "遷移先[$transition_key]が定義されていないため、規定の遷移先に遷移します。", __FILE__, __LINE__ );
				$transition_key = 'default';
			}

			// 次のノードに移動
			$node = $module_graph->moveNext( $transition_key );

			// 遷移キーがNULLならば終了
			if ( $node == NULL ){
				log_info( "system",  "遷移を終了します。", __FILE__, __LINE__ );
				break;
			}

			$next_node_name = $node->getNodeName();
			log_info( "system",  "ノード[$node_name]からノード[$next_node_name]に遷移しました。", __FILE__, __LINE__ );
		}


		log_info( "system",  "モジュールグラフの実行を終了しました。", __FILE__, __LINE__ );

		//=======================================
		// 出力フィルタの実行
		//
		parent::processOutputFilters( $request, $context, $response );

		//=======================================
		// レンダラの実行
		//
		parent::processRenderer( $proc_name, $context, $response );

		log_info( "system",  "プロシージャ[$proc_name]を実行しました。", __FILE__, __LINE__ );
	}
}
