1: <?php
  2: 
  3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21: 
 22: 
 23: namespace picon;
 24: 
 25:  26:  27:  28:  29:  30: 
 31: class ConfigLoader
 32: {
 33:     const SETTINGS_TAG_NAME = "settings";
 34:     const PROFILES_TAG_NAME = "profile";
 35:     const DATA_SOURCE_ELEMENT = "dataSource";
 36:     
 37:     private static $CORE_CONFIG = array("homePage", "mode");
 38:     
 39:     private function __construct()
 40:     {
 41:     }
 42:     
 43:     public static function load($file, &$config = null)
 44:     {
 45:         if($config==null)
 46:         {
 47:             $config = new Config();
 48:         }
 49:         
 50:         $xml = new \DOMDocument(); 
 51:         $xml->load($file);
 52:         libxml_use_internal_errors(true);
 53:         if (!$xml->schemaValidate(PICON_DIRECTORY.'/core/config.xsd')) 
 54:         {
 55:             throw new ConfigException("Config XML does not match schema");
 56:         }
 57:         ConfigLoader::parse($xml, $config);
 58:         return $config;
 59:     }
 60:     
 61:     private static function parse(\DOMDocument $xml, Config &$config)
 62:     {
 63:         self::processSettings($xml, $config);
 64:         self::processDataSources($xml, $config);
 65:     }
 66:     
 67:     private static function processSettings(\DOMDocument $xml, Config &$config)
 68:     {
 69:          $settings = $xml->getElementsByTagName(self::SETTINGS_TAG_NAME)->item(0);
 70:          $config->setHomePage($settings->getElementsByTagName("homePage")->item(0)->nodeValue);
 71:          $profileName = $settings->getElementsByTagName("profile")->length==0?null:$settings->getElementsByTagName("profile")->item(0)->nodeValue;
 72:          $config->setProfile($profileName==null?new ApplicationProfile():self::getProfile($xml, $profileName));
 73:          $config->setStartup($settings->getElementsByTagName("startUp")->item(0)->nodeValue);
 74:     }
 75:     
 76:     private static function getProfile(\DOMDocument $xml, $profileName)
 77:     {
 78:         $profiles = $xml->getElementsByTagName(self::PROFILES_TAG_NAME);
 79:         
 80:         foreach($profiles as $profile)
 81:         {
 82:             if($profile->getAttribute('name')==$profileName)
 83:             {
 84:                 $aprofile = new ApplicationProfile();
 85:                 $values = array("showPiconTags" => Component::TYPE_BOOL, "cacheMarkup" => Component::TYPE_BOOL, "cleanBeforeOutput" => Component::TYPE_BOOL);
 86:                 foreach($values as $property => $type)
 87:                 {
 88:                     $value = $profile->getElementsByTagName($property)->item(0)->nodeValue;
 89:                     settype($value, $type);
 90:                     $aprofile->$property = $value;
 91:                 }
 92:                 return $aprofile;
 93:             }
 94:         }
 95:         throw new ConfigException(sprintf("The %s profile name was not found.", $profileName));
 96:     }
 97:     
 98:     private static function processDataSources(\DOMDocument $xml, Config &$config)
 99:     {
100:         $sources = $xml->getElementsByTagName(self::DATA_SOURCE_ELEMENT);
101:         
102:         foreach($sources as $source)
103:         {
104:             $type = DataSourceType::valueOf($source->getAttribute('type'));
105:             $name = $source->getAttribute('name');
106:             $host = $source->getElementsByTagName('host')->item(0)->nodeValue;
107:             $port = $source->getElementsByTagName('port')->length==0?null:$source->getElementsByTagName('port')->item(0)->nodeValue;
108:             $username = $source->getElementsByTagName('username')->item(0)->nodeValue;
109:             $password = $source->getElementsByTagName('password')->item(0)->nodeValue;
110:             $database = $source->getElementsByTagName('database')->item(0)->nodeValue;
111:             $dataSource = new DataSourceConfig($type, $name, $host, $port, $username, $password, $database);
112:             $config->addDataSource($dataSource);
113:         }
114:     }
115: }
116: 
117: ?>
118: