Esempio n. 1
0
/**
* Boots the system and reads the configuration files. Should not be called manually.
*/
function __bootloader()
{
    //get the current path
    $currentPath = getcwd();
    //we make sure the last character of the current path is a separator
    if (substr($currentPath, -1) != '/') {
        $currentPath .= '/';
    }
    //these definitions must be present
    if (!defined('PATH_SYSTEM')) {
        throw new \Exception('PATH_SYSTEM is not set in paths.inc');
    }
    if (!defined('PATH_CONFIG')) {
        throw new \Exception('PATH_CONFIG is not set in paths.inc');
    }
    if (!defined('PATH_TEMP')) {
        throw new \Exception('PATH_TEMP is not set in paths.inc');
    }
    if (!defined('PATH_LOGS')) {
        throw new \Exception('PATH_LOGS is not set in paths.inc');
    }
    if (!defined('PATH_MODULES')) {
        throw new \Exception('PATH_MODULES is not set in paths.inc');
    }
    if (!defined('PATH_PAGECACHE_CACHE')) {
        throw new \Exception('PATH_PAGECACHE_CACHE is not set in paths.inc');
    }
    //define the security locks so we can include files
    define('InSite', null);
    define('System', null);
    //we define the default character sets to utf8
    mb_internal_encoding("UTF-8");
    //load the autoloader. After this call, all the classes can be called.
    $autoloader = PATH_SYSTEM . 'Autoload.class.php';
    if (file_exists($autoloader)) {
        require_once $autoloader;
    } else {
        throw new \Exception('Could not load ' . $autoloader . '. Please check the PATH_SYSTEM constant in your configuration!');
    }
    //debug parameters when the platform is our development platform
    if (\System\Server\OS::getOS() == \System\Server\OS::OS_WINDOWS) {
        defined('DEBUG') || define('DEBUG', null);
    }
    register_shutdown_function('\\System\\Db\\Database::handleShutdown');
    //boot the errorhandler and register the exception and error handlers
    \System\Error\ErrorHandler::getInstance();
    //set the timezone values
    defined('TIMEZONE_IDENTIFIER') || define('TIMEZONE_IDENTIFIER', 'Europe/Amsterdam');
    \System\Version::registerRequiredConfigDirective('TIMEZONE_IDENTIFIER');
    date_default_timezone_set(TIMEZONE_IDENTIFIER);
    //register
    $register = \System\Register\Register::getInstance();
    //we set the start timer
    \System\Calendar\Timer::getSystemExecutionTime();
    //config
    require_once PATH_CONFIG . 'site.inc';
    //initialize the language subsystem
    \System\Internationalization\Language::init();
    //initialize the system interaction system
    \System\System\Interaction\Event\SystemInteractionEvent::registerListeners();
    //register extra handlers if needed
    if (file_exists(PATH_CONFIG . 'handlers.inc')) {
        require_once PATH_CONFIG . 'handlers.inc';
    }
    //turn the displaying of errors off, when we are in production environment
    defined('DEBUG') || ini_set('display_errors', 0);
    //verify the required configuration variables
    __requirements();
    //check if the visitors ip address is allowed.
    if (!\System\HTTP\Visitor\PermaBan\PermaBan::isIPAllowed(\System\HTTP\Visitor\IP::getClientIP())) {
        header('HTTP/1.0 403 Forbidden');
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit;
    }
    //database
    $register->defaultDb = \System\Db\Database::getConnection();
    //we dont want to cache our output, as this allows access without revalidating
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    //requestshizzle
    \System\Version::registerRequiredConfigDirective('DEFAULT_CONTROLLER');
    if (!defined('DEFAULT_CONTROLLER')) {
        throw new \System\Error\Exception\SystemException('The configuration is invalid: DEFAULT_CONTROLLER not set or invalid.');
    }
    $controller = \System\Web\Controller::callController();
    //do buffered output rendering if needed
    if ($controller->getRenderSetting() == \System\Web\Controller::RENDERER_ENABLED) {
        //render the surface
        $renderSurface = $controller->getRenderSurface();
        if (!$renderSurface) {
            throw new \System\Error\Exception\SystemException('Please make sure your controller action sets a RenderSurface!');
        }
        $controller->getRenderSurface()->execute();
    }
    //shutdown the system to prevent further execution of code
    exit;
}
Esempio n. 2
0
 /**
  * This function retrieves all the services for the controller and then executes them.
  * @param \System\Web\Controller The controller to process the services for.
  */
 private static final function processServices(\System\Web\Controller $controller)
 {
     //get all the registered services for this controller
     $services = new \System\Collection\Vector();
     $controller->deployServices($services);
     $serviceResults = new \System\Collection\Map();
     //process all the registered services
     foreach ($services as $service) {
         if ($service instanceof \System\Web\ServiceEntry) {
             //this is an optimization. A ServiceEntry needs to define on which actionName it needs to fire.
             //for instance: <actioncontainer>-><actionfield> must be a specific <actionname> to fire the service.
             //the service sets the value to check for, so the servicemanagement can distinguish if it is needed or not
             switch ($service->getActionType()) {
                 case \System\Web\ServiceEntry::ACTIONTYPE_POST:
                     $actionContainer = new \System\HTTP\Request\Post();
                     break;
                 case \System\Web\ServiceEntry::ACTIONTYPE_GET:
                     $actionContainer = new \System\HTTP\Request\Get();
                     break;
                 case \System\Web\ServiceEntry::ACTIONTYPE_SESSION:
                     $actionContainer = new \System\HTTP\Storage\Session();
                     break;
                 case \System\Web\ServiceEntry::ACTIONTYPE_COOKIE:
                     $actionContainer = new \System\HTTP\Storage\Cookie();
                     break;
                 default:
                     throw new \InvalidArgumentException('Unknown ACTIONTYPE given. Please check the serviceentries');
             }
             //do the actual matching and check if we need to fire this service call
             $actionType = $service->getActionField();
             $actionValue = (string) $actionContainer->{$actionType};
             if ($actionValue == $service->getActionName()) {
                 if (is_callable($service->getCallback())) {
                     $serviceResult = new \System\Collection\Map();
                     //automatically call the validation of handles
                     \System\Web\Service::validateHandles();
                     //passing parameters to a static method implies call by reference. thus the params are passed by reference
                     $isMatch = call_user_func_array($service->getCallback(), array($serviceResult, $controller->getDefaultDb()));
                     if (is_bool($isMatch) && $isMatch) {
                         $serviceResults[$service->getCallback()] = $serviceResult;
                         //we raise the proper event
                         $event = new \System\Event\Event\OnServiceExecutedEvent();
                         $callBack = $service->getCallback();
                         $event->setServiceCallback($callBack);
                         $event->setServiceResult($serviceResult);
                         $event->raise($controller);
                     }
                 } else {
                     throw new \InvalidArgumentException('Cannot execute the callback in the given service. Please check the callback');
                 }
             }
         } else {
             throw new \InvalidArgumentException('The given entry in the \'deployServices\' method is not a \\System\\Web\\ServiceEntry.');
         }
     }
     //we store the service results in the controller
     $controller->setServiceResults($serviceResults);
 }