<?php
/**
* 単純なレイアウトマネージャを実装するクラス
*
* PHP version 5
*
* @package    dispatchers
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class DefaultLayoutManager implements ILayoutManager
{
	private $_response_injections;
	private $_context_injections;

	/**
	 *   コンストラクタ
	 */
	public function __construct()
	{
		$this->_tasks = NULL;
	}

	/**
	 *   レイアウトマネージャ名を取得
	 */
	public function getLayoutManagerName()
	{
		return "Default Layout Manager";
	}

	/**
	 *   レイアウトマネージャを初期化する
	 */
	public function init( Config $config )
	{
		$this->_response_injections     = $config->getArray( "response_injections" );
		$this->_context_injections      = $config->getArray( "context_injections" );
	}

	/**
	 *   レイアウトする
	 */
	public function layout( $layout_name, ITaskManager $task_manager, ProcedureContext $context, Response $response )
	{
		log_info( "system",  "レイアウトを開始します。", __FILE__, __LINE__ );

		// コンテキスト・インジェクション
		$context_injections = $this->_context_injections;
		if ( $context_injections && is_array($context_injections) ){
			foreach( $context_injections as $key => $value ){
				$context->set( $key, $value );
			}
		}

		// レスポンス・インジェクション
		$response_injections = $this->_response_injections;

		if ( $response_injections && is_array($response_injections) ){
			foreach( $response_injections as $key => $value ){
				// valueからスキーマを取得
				$pos = strpos($value,'.');
				$schema   = substr($value,0,$pos);
				$value    = substr($value,$pos+1);
				// スキーマごとにレスポンス値を設定
				$response_value = NULL;
				switch( $schema ){
				case 'Task':
					{
						// スキーマの後は「タスク名.プロパティ」
						$pos = strpos($value,'.');
						$task_name  = substr($value,0,$pos);
						$property   = substr($value,$pos+1);
						// 該当タスクを取得
						$task = $task_manager->getTask($task_name);
						// 該当タスクにプロパティが存在するかチェック
						if ( !property_exists($task,$property) ){
							throw new LayoutException( $layout_name, "No such property[$property] on task[$task_name]" );
						}
						// 値を取得
						$response_value = $task->$property;
					}
					break;
				case 'Profile':
					{
						// スキーマの後は「定数名」
						$const_name  = $value;
						// 値を取得
						$response_value = Profile::getString( $const_name );
					}
					break;
				case 'String':
					{
						// スキーマの後は「文字列」
						$string  = $value;
						// 値を取得
						$response_value = $string;
					}
					break;
				default:
					{
						throw new LayoutException( $layout_name, "Illegal schema name:$schema" );
					}
					break;
				}
				// レスポンス値をセット
				$response->set( $key, $response_value );
			}
		}

		log_info( "system",  "レイアウトを終了しました。", __FILE__, __LINE__ );
	}
}
