<?php

⁄**
 * Configクラスはウェブアプリケーションが一番基本的なレベルで動くのに
 * 必要な基本設定情報を保持します。
 *
 * 追記:このクラスはSingletonデザインパターンで実装されています。
 *
 * @author Darryl Patterson
 * @copyright Euro RSCG 4D
 *
 *⁄

class Config {

    var $sessionName;
    var $sessionKeyName;
    var $sessionTimeout;
    var $sessionMaxAge;
    var $cookieTimeout;

    var $dbconn;
    var $sessionDatabaseName;

    var $applicationRoot;
    var $defaultModule;
    var $defaultAction;
    var $language;

    var $environmentClassName;
    var $frontController;
    var $failedAuthenticationRedirect;

    function Config()
    {

        // 設定ファイルから情報を読み込む
        $configArray = $this->loadConfigInfo();

        // アプリケーションルートを読み込む
        if (isset($configArray['applicationRoot'])){
            $this->applicationRoot =
          $configArray['applicationRoot'];
        } else {
            echo "Config::Config(): "
             . "applicationRoot is undefined.";
            exit();
        }

        // デフォルトモジュールを読み込む
        if (isset($configArray['defaultModule'])){
            $this->defaultModule =
              $configArray['defaultModule'];
        } else {
            $this->defaultModule = 'Default';
        }

        // デフォルトアクションを読み込む
        if (isset($configArray['defaultAction'])){
            $this->defaultAction =
              $configArray['defaultAction'];
        } else {
            $this->defaultAction = 'defaultAction';
        }

        // セッション名を読み込む
        if (isset($configArray['sessionName'])){
            $this->sessionName =
              $configArray['sessionName'];
        } else {
            $this->sessionName = 'sessionId';
        }

        // セッションキーを読み込む
        if (isset($configArray['sessionKeyName'])){
            $this->sessionKeyName =
              $configArray['sessionKeyName'];
        } else {
            $this->sessionKeyName = 'sessionKey';
        }
        // セッションタイムアウト時間を読み込む
        if (isset($configArray['sessionTimeout'])){
            $this->sessionTimeout =
              $configArray['sessionTimeout'];
        } else {
            $this->sessionTimeout = '600';
        }

        // セッション最大生存時間を読み込む
        if (isset($configArray['sessionMaxAge'])){
            $this->sessionMaxAge =
              $configArray['sessionMaxAge'];
        } else {
            $this->sessionMaxAge = '3600';
        }

        // cookieタイムアウト時間を読み込む
        if (isset($configArray['cookieTimeout'])){
            $this->cookieTimeout =
              $configArray['cookieTimeout'];
        } else {
            $this->cookieTimeout = '129600';
        }

        // 言語を読み込む
        if (isset($configArray['language'])){
            $this->language = $configArray['language'];
        } else {
          $this->language = 'en';
        }

        // environmentクラス名を読み込む
        if (isset($configArray['environmentClassName'])){
            $this->environmentClassName =
              $configArray['environmentClassName'];
        } else {
            $this->environmentClassName = 'Environment';
        }

        // フロントコントローラ名を読み込む
        if (isset($configArray['frontController'])){
            $this->frontController =
              $configArray['frontController'];
        } else {
            $this->frontController = 'app';
        }

        // 認証失敗時のリダイレクトURLを読み込む
        if (isset(
          $configArray['failedAuthenticationRedirect'])){
             $this->failedAuthenticationRedirect =
              $configArray['failedAuthenticationRedirect'];
        } else {
            $this->failedAuthenticationRedirect =
             '/'.$this->frontController.'/Default';
        }

        // デフォルトのデータベース接続情報
        $dbuser = 'guest';
        $dbpass = '';
        $dbname = 'common';
        $dbhost = 'localhost';
        $dbtype = 'mysql';
        if (isset($configArray['dbuser'])){
            $dbuser = $configArray['dbuser'];
        }
        if (isset($configArray['dbpass'])){
            $dbpass = $configArray['dbpass'];
        }
        if (isset($configArray['dbname'])){
            $dbname = $configArray['dbname'];
        }
        if (isset($configArray['dbhost'])){
            $dbhost = $configArray['dbhost'];
        }
        if (isset($configArray['dbtype'])){
            $dbtype = $configArray['dbtype'];
        }

        $this->dbconn = mysql_connect($dbhost, $dbuser,
      $dbpass);
        mysql_select_db($dbname, $this->dbconn);
    }

    ⁄**
     * スタティック関数が呼ばれていることになります。
     * Config::instance()
     *
     * @return Config
     * @access public
     * @static
     *⁄
    function &instance()
    {
        if (is_a($GLOBALS['__configInstance__'],
       'Config')) {
            return $GLOBALS['__configInstance__'];
        }

        if (isset($_SERVER['configClassName'])) {
            $classFilename = 'class-'.
           $_SERVER['configClassName'].'.php';
     
            ⁄**
              * 開発者がアプリケーション特有のConfigクラスを
                定義しているか確認。
              * フレームワークのConfigクラスのサブクラスである必要あり。
              * 見つからなければ、フレームワークの
                Configクラスインスタンスを作成。
              *⁄

            if (@fopen($classFilename,'r',true)) {
               require_once($classFilename);
                $GLOBALS['__configInstance__'] =
          new $_SERVER['configClassName']();
            } else {
                $GLOBALS['__configInstance__'] =
          new Config();
            }
        } else {
            die('Config::instance(): configClassName '
         . 'not set in Apache config.');
        }

        return $GLOBALS['__configInstance__'];
    }

    // アクセサメソッド

    function getSessionName()
    {
        return $this->sessionName;
    }

    function getSessionKeyName()
    {
        return $this->sessionKeyName;
    }

    function getSessionTimeout()
    {
        return $this->sessionTimeout;
    }

    function getSessionMaxAge()
    {
        return $this->sessionMaxAge;
    }

    function getCookieTimeout()
    {
        return $this->cookieTimeout;
    }

    function getEnvironmentClassName()
    {
        return $this->environmentClassName;
    }

    function getDBConnection()
    {
        return $this->dbconn;
    }

    ⁄**
     * 設定ファイルから設定情報を読み込む。
     * 設定ファイルのパスはApacheの設定を使用
     * SetEnv configFilePath /path/to/config/directory/
     *
     * @return array
     * @access private
     *⁄

    function loadConfigInfo()
    {
        $configArray = array();

        $configFilePath = $_SERVER['configFilePath'] .
      $_SERVER['HTTP_HOST'] . '.config';

        $configLines = file($configFilePath);

        if ($configLines === false){
            echo 'Error loading Config info.';
            exit;
        }

        foreach($configLines as $line){
            if (trim($line) == '' ||
            substr($line, 0, 1) == '#'){
                continue;
            }

            list($key, $val) = explode('=', $line);
            $configArray[trim($key)] = trim($val);
        }

        return $configArray;
    }

}
?>