<?php
/**
* 単純なURLマッパーを実装するクラス
*
* PHP version 5
*
* @package    interfaces
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
class charcoal_SimpleURLMapper implements charcoal_IURLMapper
{
	var $_mapping_rules;

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

	/**
	 * URLマッパー名
	 */
	public function getURLMapperName()
	{
		return "Simple URL Mapper";
	}

	/**
	 * URLマッパーを初期化する
	 */
	public function init( charcoal_Config $config )
	{
		$this->_mapping_rules = $config->getArray( 'mapping_rules' );

	}

	/**
	 * URLをマッピングする
	 */
	public function mapURL( charcoal_Request $request )
	{
		// パス情報を取得
		$request_uri = $_SERVER["REQUEST_URI"];
		$script_name = $_SERVER["SCRIPT_NAME"];
		$dir_name    = dirname($script_name);

		$pos = strpos( $request_uri, $dir_name );
		$url = substr( $request_uri, $pos + strlen($dir_name) );

		log_info( 'url_mapper', "mapping url:$url", __FILE__, __LINE__ );
		log_info( 'system', "SimpleURLMapperによるマッピングを行います。URL=[$url]", __FILE__, __LINE__ );

		if ( $this->_mapping_rules ){
			foreach( $this->_mapping_rules as $proc => $rule ){
				$a = self::_match( $rule, $url );
				// 完全にマッチした
				if ( $a !== NULL ){
					$request->setArray( $a );
					$request->set( PROC_KEYWORD, $proc );
					log_info( 'system', "URLマッピングルールにマッチしました。ルール=[$rule] プロシージャ=[$proc]", __FILE__, __LINE__ );
					return;
				}
			}
		}
	}

	/**
	 * URLがパターンに合致するか
	 */
	private static function _match( $rule, $url )
	{
		$url_dir_array = explode( '/', $url );
		$rule_dir_array = explode( '/', $rule );

		$a = array();

		foreach( $rule_dir_array as $rule_dir ){
			$url_dir = array_shift( $url_dir_array );
			if ( strpos($rule_dir,':') === 0 ){
				// コロンで始まる階層は変数名
				$key = substr($rule_dir,1);
				$a[ $key] = $url_dir;
			}
			else if ( $rule_dir !== $url_dir ){
				// マッチしなかった
				log_info( 'url_mapper', "[$rule] did not matched to [$url]", __FILE__, __LINE__ );
				return NULL;
			}
		}

		log_info( 'url_mapper',"[$rule] matched to [$url]", __FILE__, __LINE__ );
		log_info( 'system', "URLマッピングルールにマッチしました。ルール=[$rule]", __FILE__, __LINE__ );

		return $a;
	}

}
