public function loadSystem($environmentsFile, $systemFile) { // $start = microtime(TRUE); // determine DESIGN from cookie if (!array_key_exists('DESIGN', $_SERVER)) { $_SERVER['DESIGN'] = !empty($_COOKIE['DESIGN']) && !array_key_exists('design_switch', $_GET) ? (string) $_COOKIE['DESIGN'] : 'default'; } // determine DEVICE_VIEW from cookie if (!array_key_exists('DEVICE_VIEW', $_SERVER)) { $_SERVER['DEVICE_VIEW'] = !empty($_COOKIE['DEVICE_VIEW']) && !array_key_exists('device_view', $_GET) ? (string) $_COOKIE['DEVICE_VIEW'] : 'main'; } if (!array_key_exists('ENVIRONMENT', $_SERVER)) { $_SERVER['ENVIRONMENT'] = 'default'; } $this->env = $_SERVER['ENVIRONMENT']; // read master.xml $masterCacheFile = $this->getMasterCacheFile(); $regen = true; if (file_exists($masterCacheFile) && (include $masterCacheFile) === true) { if ($this->hotDeploy) { //check timestamp $timestamp = filemtime($environmentsFile); $timestamp2 = filemtime($systemFile); if ($this->masterTimestamp == max($timestamp, $timestamp2)) { $regen = false; } } else { $regen = false; } $this->setProperty('system.version', $this->systemTimestamp); } if ($regen) { if (!file_exists($environmentsFile)) { if (file_exists(PATH_BUILD . '/contexts.xml')) { // upgrade deprecated contexts.xml $contextsContent = file_get_contents(PATH_BUILD . '/contexts.xml'); $contextsContent = str_replace('<contexts>', '<environments> <environment slug="default">', $contextsContent); $contextsContent = str_replace('</contexts>', ' </environment> </environments>', $contextsContent); $contextsContent = preg_replace("/\\<context slug=\"([^\"]+)\"\\>/", "<context slug=\"\$1\" enabled=\"true\">", $contextsContent); $contextsContent = str_replace("<context slug=\"cli\"", "<context slug=\"cli\" cli=\"true\"", $contextsContent); $contextsContent = str_replace("domain_aliases", "domain_alias", $contextsContent); file_put_contents($environmentsFile, $contextsContent, LOCK_EX); die("Deprecated contexts.xml for environments.xml, please refresh"); } else { throw new Exception('Missing environments.xml file: ' . $environmentsFile); } } if (!file_exists($systemFile)) { throw new Exception('Missing system.xml file: ' . $systemFile); } // error_log('regen'); $this->uris = null; $this->enabledPluginsByID = array(); $this->rewriteBase = ''; $this->anchorSite = null; $this->deploymentBase = null; $this->oneOffRedeploy = true; //check timestamp $timestamp = filemtime($environmentsFile); $timestamp2 = filemtime($systemFile); $this->masterTimestamp = max($timestamp, $timestamp2); $this->systemTimestamp = $timestamp2; $this->setProperty('system.version', $timestamp2); $config = array(); // parse XML file $xml = ContextUtils::parseXMLFile($environmentsFile); foreach ($xml as $ename => $enode) { switch ((string) $ename) { case 'environment': foreach ($enode->attributes() as $name => $value) { $environment[$name] = (string) $value; } if (!empty($environment['slug']) && strtolower($environment['slug']) != strtolower($_SERVER['ENVIRONMENT'])) { continue; } foreach ($enode as $name => $node) { switch ((string) $name) { case 'rewrite_base': $this->rewriteBase = (string) $node; break; case 'context': $context = array('sites' => array()); foreach ($node->attributes() as $name => $value) { $context[$name] = (string) $value; } if (empty($context['enabled']) || !$this->strBool($context['enabled'])) { break; } foreach ($node as $childNode) { if ($childNode->getName() == 'sites') { foreach ($childNode as $siteNode) { $site = array(); foreach ($siteNode->attributes() as $name => $value) { $site[$name] = (string) $value; } foreach ($siteNode as $siteChildNode) { if ((string) $siteChildNode->getName() == 'storage_facility') { $sf = array(); foreach ($siteChildNode->attributes() as $name => $value) { $sf[$name] = (string) $value; } foreach ($siteChildNode as $sfChildNode) { $sf[(string) $sfChildNode->getName()] = (string) $sfChildNode; } if (isset($sf['for'])) { $site['storagefacilities'][$sf['for']] = $sf; } } else { $site[(string) $siteChildNode->getName()] = (string) $siteChildNode; } } $context['sites'][] = $site; } } else { if ($childNode->getName() == 'storage_facility') { $sf = array(); foreach ($childNode->attributes() as $name => $value) { $sf[$name] = (string) $value; } foreach ($childNode as $sfChildNode) { $sf[(string) $sfChildNode->getName()] = (string) $sfChildNode; } if (isset($sf['for'])) { $context['storagefacilities'][$sf['for']] = $sf; } } else { $context[(string) $childNode->getName()] = (string) $childNode; } } } if (empty($context['sites'])) { unset($context['sites']); } $config['contexts'][] = $context; break; } } break; } } // parse XML file $xml = ContextUtils::parseXMLFile($systemFile); foreach ($xml as $name => $node) { switch ((string) $name) { case 'plugins': foreach ($node as $pluginNode) { if ($pluginNode->getName() == 'plugin') { $plugin = array(); foreach ($pluginNode->attributes() as $name => $value) { $plugin[$name] = (string) $value; } $plugin['path'] = strval($pluginNode->path); $plugin['priority'] = intval($pluginNode->info->priority); $plugin['installed'] = $this->strBool($plugin['installed']); $plugin['enabled'] = $this->strBool($plugin['enabled']); if ($plugin['installed'] == true && $plugin['enabled'] == true) { $this->enabledPluginsByID[$plugin['slug']] = $plugin; } //$config['plugins'][] = $plugin; } } break; } } if (empty($config['contexts'])) { throw new Exception('No environment found for slug: ' . $_SERVER['ENVIRONMENT']); } $uris = array(); $sites = array(); foreach ($config['contexts'] as $context2) { if (isset($context2['sites'])) { foreach ($context2['sites'] as $site) { $site2 = array_merge($context2, $site); if (isset($context2['storagefacilities'])) { foreach ($context2['storagefacilities'] as $key => $sf) { $site2['storagefacilities'][$key] = $sf; } } if (isset($site['storagefacilities'])) { foreach ($site['storagefacilities'] as $key => $sf) { $site2['storagefacilities'][$key] = $sf; } } $site2['context'] = $context2['slug']; unset($site2['sites']); $sites[] = $site2; } } else { $clone = array_merge(array(), $context2); $clone['context'] = $clone['slug']; $sites[] = $clone; } } foreach ($sites as $site) { if (!isset($site['domain'])) { continue; } if (isset($site['domain_base_uri'])) { $uri = str_replace(array('%REWRITE_BASE%', '%CONTEXT%'), array($this->rewriteBase, $site['context']), $site['domain_base_uri']); $uri = preg_replace("/\\/[\\/]+/", "/", $uri); } else { $uri = ''; } $site['uri'] = $uri; $uri = trim($site['uri'], '/'); if (!array_key_exists($uri, $uris)) { $uris[$uri] = array(); } if (isset($site['anchor']) && $this->strBool($site['anchor']) == true) { $this->anchorSite = $site; } $uris[$uri][] = $site; } // sort uri's by length (longest first) for matching uksort($uris, array(__CLASS__, '_urilenCompare')); $this->uris = $uris; $cacheContents = '<?php $this->masterTimestamp = ' . var_export($this->masterTimestamp, true) . '; $this->systemTimestamp = ' . var_export($this->systemTimestamp, true) . '; $this->rewriteBase = ' . var_export($this->rewriteBase, true) . '; $this->uris = ' . var_export($this->uris, true) . '; $this->enabledPluginsByID = ' . var_export($this->enabledPluginsByID, true) . '; $this->anchorSite = ' . var_export($this->anchorSite, true) . ';'; $cacheContents .= "\n\n"; $cacheContents .= "return true;"; ContextUtils::safeFilePutContents($masterCacheFile, $cacheContents); } $found = false; foreach ($this->uris as $uri => $sites) { if (substr(trim($_SERVER['REQUEST_URI'], '/'), 0, strlen($uri)) == $uri) { foreach ((array) $sites as $site) { if (isset($site['domain_alias'])) { $domain_alias = strtolower($site['domain_alias']); if (strtolower($_SERVER['SERVER_NAME']) == $domain_alias) { $site['matched_alias'] = true; $found = true; break 2; } } if (isset($site['server_domain'])) { $server_domains = explode(',', strtolower($site['server_domain'])); if (in_array(strtolower($_SERVER['SERVER_NAME']), $server_domains)) { $found = true; break 2; } } if (isset($site['server_domain_alias'])) { $domain_aliases = explode(',', strtolower($site['server_domain_alias'])); if (in_array(strtolower($_SERVER['SERVER_NAME']), $domain_aliases)) { $site['matched_alias'] = true; $found = true; break 2; } } $domain = $site['domain']; if ($domain == $_SERVER['SERVER_NAME']) { $found = true; break 2; } if (isset($site['domain_redirects'])) { $domain_redirects = explode(',', strtolower($site['domain_redirects'])); if (in_array(strtolower($_SERVER['SERVER_NAME']), $domain_redirects)) { $this->redirect($domain, '/' . ltrim($site['uri'], '/'), isset($site['ssl']) && $this->strBool($site['ssl']) == true); } } } } else { foreach ((array) $sites as $site) { $domain = $site['domain']; if (isset($site['domain_redirects'])) { $domain_redirects = explode(',', strtolower($site['domain_redirects'])); if (in_array(strtolower($_SERVER['SERVER_NAME']), $domain_redirects)) { $this->redirect($domain, '/' . ltrim($site['uri'], '/'), isset($site['ssl']) && $this->strBool($site['ssl']) == true); } } } } } if (!$found) { if (!is_null($this->anchorSite)) { $this->redirect($this->anchorSite['domain'], '/' . ltrim($this->anchorSite['uri'], '/'), isset($this->anchorSite['ssl']) && $this->strBool($this->anchorSite['ssl']) == true); } else { echo 'Site not found: ' . $_SERVER['SERVER_NAME']; exit; } } // determine CONTEXT, ROUTER_BASE from SERVER_NAME and REQUEST_URI $_SERVER['SYSTEM_VERSION'] = $this->getSystemVersionTimestamp(); $_SERVER['DOMAIN'] = $site['domain']; $_SERVER['CONTEXT'] = $site['context']; $_SERVER['ROUTER_BASE'] = $site['uri']; $_SERVER['MATCHED_ALIAS'] = !empty($site['matched_alias']) ? $site['matched_alias'] : false; $_SERVER['REWRITE_BASE'] = $this->rewriteBase; if (!empty($site['ssl']) && $this->strBool($site['ssl']) == true && (empty($_SERVER["HTTPS"]) && isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] != 'https') && (empty($_SERVER['CLI_REQUEST']) || $_SERVER['CLI_REQUEST'] !== true)) { $this->redirect($_SERVER['SERVER_NAME'], $_SERVER['REQUEST_URI'], true); } if (!empty($site['cli']) && $this->strBool($site['cli']) && (empty($_SERVER['CLI_REQUEST']) || $_SERVER['CLI_REQUEST'] !== true)) { $this->redirect($this->anchorSite['domain'], '/' . ltrim($this->anchorSite['uri'], '/'), isset($this->anchorSite['ssl']) && $this->strBool($this->anchorSite['ssl']) == true); } $this->deploymentBase = $this->_replaceVars($site['deployment_base_path']); if (strpos($this->deploymentBase, $this->cacheDir) === FALSE) { throw new Exception('deployment_base_path must be located in: ' . $this->cacheDir); } $_SERVER['DEPLOYMENT_BASE_PATH'] = $this->deploymentBase; array_walk_recursive($site, array($this, '_replaceVars')); $_SERVER['SITE'] = $site; $this->pluginContextFile = array_key_exists('plugin_context_file', $site) ? $site['plugin_context_file'] : 'context/' . $_SERVER['CONTEXT'] . '-context.xml'; if (is_dir($this->systemContextDir)) { if (file_exists($this->systemContextDir . '/' . $_SERVER['CONTEXT'] . '-context.xml')) { $this->contextResources[] = $this->systemContextDir . '/' . $_SERVER['CONTEXT'] . '-context.xml'; } else { $this->contextResources[] = $this->systemContextDir . '/shared-context.xml'; } } $contextFile = array_key_exists('context_file', $site) ? $site['context_file'] : PATH_BUILD . '/context/' . $_SERVER['CONTEXT'] . '-context.xml'; if (!empty($contextFile)) { $this->contextResources[] = $contextFile; } // error_log(((microtime(TRUE) - $start)*1000).'ms'); }
public function loadContextFile($contextXML, $ignoreInfo = false) { $config = array('objects' => array(), 'propertyFiles' => array()); if (file_exists($contextXML)) { $basedir = dirname($contextXML); $xml = ContextUtils::parseXMLFile($contextXML); foreach ($xml as $name => $node) { switch ((string) $name) { case 'info': if ($ignoreInfo) { break; } if (!empty($node->priority)) { $config['priority'] = (int) $node->priority; } if (!empty($node->description)) { $config['description'] = (string) $node->description; } if (!empty($node->title)) { $config['title'] = (string) $node->title; } if (!empty($node->version)) { $config['version'] = (string) $node->version; } if (!empty($node->provider)) { $config['provider'] = (string) $node->provider; } break; case 'import': $importFile = '' . $node; if ($importFile != '') { $config = array_merge_recursive($config, $this->loadContextFile($basedir . DIRECTORY_SEPARATOR . $importFile, $ignoreInfo = true)); } break; case 'property-files': foreach ($node as $resourceFile) { if ($resourceFile->getName() == 'property-file' && '' . $resourceFile != '') { $config['propertyFiles'][] = (string) $basedir . DIRECTORY_SEPARATOR . $resourceFile; } } break; case 'objects': foreach ($node as $objectNode) { if ($objectNode->getName() == 'object') { $object = array(); foreach ($objectNode->attributes() as $name => $value) { $object[$name] = (string) $value; } foreach ($objectNode as $childNode) { switch ($childNode->getName()) { case 'alias': $object['aliases'][] = (string) $childNode; break; case 'constructor-arg': // if(($name = (string)$childNode->attributes()->name) != '') // $object['constructor-args'][$name] = $this->getPropertyValue($childNode); // else $object['constructor-args'][] = $this->getPropertyValue($childNode); break; case 'property': if (($name = (string) $childNode->attributes()->name) != '') { $object['properties'][$name] = $this->getPropertyValue($childNode); } else { throw new ApplicationContextException('Object "' . $object['id'] . '" property is missing "name" attribute.'); } // $object['properties'][] = $this->getPropertyValue($childNode); break; case 'invoke': $invokeMethod = array('name' => (string) $childNode->attributes()->name); foreach ($childNode as $methodArgNode) { if (($name = (string) $methodArgNode->attributes()->name) != '') { $invokeMethod['method-args'][$name] = $this->getPropertyValue($methodArgNode); } else { $invokeMethod['method-args'][] = $this->getPropertyValue($methodArgNode); } } $object['invokes'][] = $invokeMethod; break; case 'initialize-method': $object['initialize-method'] = (string) $childNode->attributes()->name; break; } } $config['objects'][] = $object; } } break; case 'events': foreach ($node as $bindNode) { $event = array(); foreach ($bindNode->attributes() as $name => $value) { $event[$name] = (string) $value; } $config['events'][strtolower($bindNode->getName())][] = $event; } break; } } } return $config; }