<?php
/**
* HTTPプローシージャ
*
* PHP version 5
*
* @package    procedures
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
class HttpProcedure implements IProcedure
{
	var $_events;
	var $_input_filters;
	var $_output_filters;
	var $_renderer;
	var $_task_manager;
	var $_layout_manager;

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

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

	/*
	 * プロシージャを初期化する
	 */
	public function init( Config $config )
	{
		$this->_events              = $config->getArray( "events" );
		$this->_output_filters      = $config->getArray( "output_filters" );
		$this->_input_filters       = $config->getArray( "input_filters" );
		$this->_renderer            = $config->getString( "renderer" );
		$this->_task_manager        = $config->getString( "task_manager" );
		$this->_layout_manager      = $config->getString( "layout_manager" );
	}

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

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

		//=======================================
		// タスクマネージャの作成
		//

		// タスクマネージャを作成
		$task_manager_name = $this->_task_manager;
		$task_manager = Factory::createTaskManager( $task_manager_name );

		//=======================================
		// 入力フィルタの実行
		//

		if ( $this->_input_filters ) {
			log_info( "system",  "入力フィルタを実行します。", __FILE__, __LINE__ );

			foreach( $this->_input_filters as $filter_name ) {
				// フィルタを作成
				$filter = Factory::createFilter( $filter_name );
				// フィルタの実行
				$filter->filter( $request, $context, $response );
			}
	
			log_info( "system",  "入力フィルタを実行しました。", __FILE__, __LINE__ );
		}

		//=======================================
		// イベントディスパッチ
		//

		$task_manager->dispatchEvents( $request, $this->_events );

		//=======================================
		// イベント処理
		//

		$task_manager->processEvents( $context );

		//=======================================
		// タスクハンドリング
		//

		// タスクハンドリング
		$screen_name = $task_manager->handleTasks( $response );

		//=======================================
		// レイアウト
		//

		// レイアウトマネージャの作成
		$layout_manager_name = $this->_layout_manager;
		if ( $layout_manager_name && !$layout_manager_name->isEmpty() ){

			// 指定されている場合だけ作成
			$layout_manager = Factory::createLayoutManager( $layout_manager_name );
			// レイアウト実行
			$layout_manager->layout( $screen_name, $task_manager, $context, $response );
		}

		//=======================================
		// 出力フィルタの実行
		//
		if ( $this->_output_filters ) {
			log_info( "system",  "出力フィルタを実行します。", __FILE__, __LINE__ );

			foreach( $this->_output_filters as $filter_name ) {
				// フィルタを作成
				$filter = Factory::createFilter( $filter_name );
				// フィルタの実行
				$filter->filter( $request, $context, $response );
			}

			log_info( "system",  "出力フィルタを実行しました。", __FILE__, __LINE__ );
		}

		//=======================================
		// レンダラの実行
		//
		if ( $this->_renderer && strlen($this->_renderer) > 0 ) {
			log_info( "system",  "レンダラを実行します。", __FILE__, __LINE__ );

			$renderer = Factory::createRenderer( $this->_renderer );
			if ( $renderer ) {
				$renderer->render( $context, $response );
			}
			log_info( "system",  "レンダラを実行しました。", __FILE__, __LINE__ );

		}

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