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: