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');
    }
Exemplo n.º 2
0
 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;
 }