From 1203b1ad0320972541b4a60f0fd4e0bc67e24425 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Thu, 13 Mar 2008 20:30:57 +0000 Subject: [PATCH] More exceptions added, class loader can now load extra configs --- .gitattributes | 5 +- .../class_MissingFileIoHandlerException.php | 45 +++++++ .../class_MissingLanguageHandlerException.php | 45 +++++++ .../main/class_BaseFrameworkSystem.php | 120 +++++++++++++++++- .../classes/class_LocalFileDatabase.php | 43 +------ .../main/template/class_TemplateEngine.php | 42 +----- inc/config.php | 12 -- inc/config/class_FrameworkConfiguration.php | 36 +----- .../config-override.php} | 0 inc/includes.php | 23 +--- inc/language/.htaccess | 1 + inc/loader/class_ClassLoader.php | 24 +++- 12 files changed, 250 insertions(+), 146 deletions(-) create mode 100644 inc/classes/exceptions/language/class_MissingFileIoHandlerException.php create mode 100644 inc/classes/exceptions/language/class_MissingLanguageHandlerException.php rename inc/{config-local.php => config/config-override.php} (100%) create mode 100644 inc/language/.htaccess diff --git a/.gitattributes b/.gitattributes index 43e83aa723..6f52559c15 100644 --- a/.gitattributes +++ b/.gitattributes @@ -47,6 +47,8 @@ inc/classes/exceptions/language/class_InvalidLanguagePathStringException.php -te inc/classes/exceptions/language/class_LanguagePathIsEmptyException.php -text inc/classes/exceptions/language/class_LanguagePathIsNoDirectoryException.php -text inc/classes/exceptions/language/class_LanguagePathReadProtectedException.php -text +inc/classes/exceptions/language/class_MissingFileIoHandlerException.php -text +inc/classes/exceptions/language/class_MissingLanguageHandlerException.php -text inc/classes/exceptions/main/.htaccess -text inc/classes/exceptions/main/class_ClassMismatchException.php -text inc/classes/exceptions/main/class_ClassNotFoundException.php -text @@ -145,16 +147,17 @@ inc/classes/middleware/debug/.htaccess -text inc/classes/middleware/debug/class_DebugMiddleware.php -text inc/classes/middleware/io/.htaccess -text inc/classes/middleware/io/class_FileIOHandler.php -text -inc/config-local.php -text inc/config.php -text inc/config/.htaccess -text inc/config/class_FrameworkConfiguration.php -text +inc/config/config-override.php -text inc/database.php -text inc/database/.htaccess -text inc/database/lib-local.php -text inc/file_io.php -text inc/includes.php -text inc/language.php -text +inc/language/.htaccess -text inc/loader/.htaccess -text inc/loader/class_ClassLoader.php -text inc/output.php -text diff --git a/inc/classes/exceptions/language/class_MissingFileIoHandlerException.php b/inc/classes/exceptions/language/class_MissingFileIoHandlerException.php new file mode 100644 index 0000000000..9a56466276 --- /dev/null +++ b/inc/classes/exceptions/language/class_MissingFileIoHandlerException.php @@ -0,0 +1,45 @@ + + * @version 0.3.0 + * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @license GNU GPL 3.0 or any newer version + * @link http://www.mxchange.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class MissingFileIoHandlerException extends FrameworkException { + /** + * The constructor + * + * @param $message Message from the exception + * @param $code Code number for the exception + * @return void + */ + public function __construct (BaseFrameworkSystem $class, $code) { + // Add a message around the missing class + $message = sprintf("[%s:%d] File i/o sub-system not initialized!", + $class->__toString(), + $this->getLine() + ); + + // Call parent constructor + parent::__construct($message, $code); + } +} + +// [EOF] +?> diff --git a/inc/classes/exceptions/language/class_MissingLanguageHandlerException.php b/inc/classes/exceptions/language/class_MissingLanguageHandlerException.php new file mode 100644 index 0000000000..4b2ef13cba --- /dev/null +++ b/inc/classes/exceptions/language/class_MissingLanguageHandlerException.php @@ -0,0 +1,45 @@ + + * @version 0.3.0 + * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @license GNU GPL 3.0 or any newer version + * @link http://www.mxchange.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class MissingLanguageHandlerException extends FrameworkException { + /** + * The constructor + * + * @param $message Message from the exception + * @param $code Code number for the exception + * @return void + */ + public function __construct (BaseFrameworkSystem $class, $code) { + // Add a message around the missing class + $message = sprintf("[%s:%d] Language sub-system not initialized!", + $class->__toString(), + $this->getLine() + ); + + // Call parent constructor + parent::__construct($message, $code); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 2ffe0b25eb..8ac8d31fb0 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -78,6 +78,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $decimals = ","; // German + /** + * The language instance for the template loader + */ + private $langInstance = null; + + /** + * The file I/O instance for the template loader + */ + private $fileIOInstance = null; + /*********************** * Exception codes.... * ***********************/ @@ -127,6 +137,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_ATTRIBUTES_ARE_MISSING = 0x02b; const EXCEPTION_ARRAY_ELEMENTS_MISSING = 0x02c; const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED = 0x02d; + const EXCEPTION_MISSING_LANGUAGE_HANDLER = 0x02e; + const EXCEPTION_MISSING_FILE_IO_HANDLER = 0x02f; /** * In the super constructor these system classes shall be ignored or else @@ -751,7 +763,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Appends a trailing slash to a string * - * @param $str A string (maybe) without trailing slash + * @param $str A string (maybe) without trailing slash * @return $str A string with an auto-appended trailing slash */ public final function addMissingTrailingSlash ($str) { @@ -759,6 +771,112 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { if (substr($str, -1, 1) != "/") $str .= "/"; return $str; } + + /** + * Private getter for language instance + * + * @return $langInstance An instance to the language sub-system + */ + protected final function getLanguageInstance () { + return $this->langInstance; + } + + /** + * Setter for language instance + * + * @param $langInstance An instance to the language sub-system + * @return void + * @see LanguageSystem + */ + public final function setLanguageInstance (ManageableLanguage $langInstance) { + $this->langInstance = $langInstance; + } + + /** + * Private getter for file IO instance + * + * @return $fileIOInstance An instance to the file I/O sub-system + */ + protected final function getFileIOInstance () { + return $this->fileIOInstance; + } + + /** + * Setter for file I/O instance + * + * @param $fileIOInstance An instance to the file I/O sub-system + * @return void + */ + public final function setFileIOInstance (FileIOHandler $fileIOInstance) { + $this->fileIOInstance = $fileIOInstance; + } + + /** + * Prepare the template engine (TemplateEngine by default) for a given + * application helper instance (ApplicationHelper by default). + * + * @param $appInstance An application helper instance + * @return $tplEngine The template engine instance + * @throws NullPointerException If the template engine could not + * be initialized + * @throws UnsupportedTemplateEngineException If $tplEngine is an + * unsupported template engine + * @throws MissingLanguageHandlerException If the language sub-system + * is not yet initialized + */ + protected function prepareTemplateEngine (BaseFrameworkSystem $appInstance) { + // Generate FQFN for all application templates + $fqfn = sprintf("%s%s/%s/%s", + PATH, + $this->getConfigInstance()->readConfig("application_path"), + strtolower($appInstance->getAppShortName()), + $this->getConfigInstance()->readConfig("tpl_base_path") + ); + + // Are both instances set? + if ($appInstance->getLanguageInstance() === null) { + // Invalid language instance + throw new MissingLanguageHandlerException($appInstance, self::EXCEPTION_MISSING_LANGUAGE_HANDLER); + } elseif ($appInstance->getFileIOInstance() === null) { + // Invalid language instance + throw new MissingFileIoHandlerException($appInstance, self::EXCEPTION_MISSING_FILE_IO_HANDLER); + } + + // Initialize the template engine + $tplEngine = null; + $eval = sprintf("\$tplEngine = %s::create%s( + \"%s\", + \$appInstance->getLanguageInstance(), + \$appInstance->getFileIOInstance() +);", + $this->getConfigInstance()->readConfig("tpl_engine"), + $this->getConfigInstance()->readConfig("tpl_engine"), + $fqfn + ); + + // Debug message + if ((!is_null($this->getDebugInstance())) && (defined('DEBUG_EVAL'))) { + $this->getDebugInstance()->output(sprintf("[%s:] Konstruierte PHP-Anweisung:
%s

\n", + $this->__toString(), + htmlentities($eval) + )); + } + + // Run the command + eval($eval); + + // Is it a valid instance? + if (is_null($tplEngine)) { + // No class returned + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } elseif (!$tplEngine instanceof CompileableTemplate) { + // Not an object! ;-( + throw new UnsupportedTemplateEngineException($tplEngine, self::EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED); + } + + // Return the prepared instance + return $tplEngine; + } } // [EOF] diff --git a/inc/classes/main/database/classes/class_LocalFileDatabase.php b/inc/classes/main/database/classes/class_LocalFileDatabase.php index 231dfee213..0dc66c6808 100644 --- a/inc/classes/main/database/classes/class_LocalFileDatabase.php +++ b/inc/classes/main/database/classes/class_LocalFileDatabase.php @@ -34,11 +34,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend */ private $fileExtension = "serialized"; - /** - * The IO handler for file handling which should be FileIOHandler. - */ - private $ioInstance = null; - /** * The last read file's name */ @@ -111,7 +106,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // Set save path and IO instance $dbInstance->setSavePath($savePath); - $dbInstance->setIOInstance($ioInstance); + $dbInstance->setFileIOInstance($ioInstance); // Return database instance return $dbInstance; @@ -146,15 +141,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend return $this->savePath; } - /** - * Getter for file extension - * - * @return $fileExtension The file extension for all file names - */ - public final function getFileExtension () { - return $this->fileExtension; - } - /** * Saves a given object to the local file system by serializing and * transparently compressing it @@ -201,7 +187,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // Save the file to disc we don't care here if the path is there, // this must be done in later methods. - $this->getIOInstance()->saveFile($fqfn, array($this->getCompressorChannel()->getCompressorExtension(), $serialized)); + $this->getFileIOInstance()->saveFile($fqfn, array($this->getCompressorChannel()->getCompressorExtension(), $serialized)); } /** @@ -301,7 +287,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend $this->setLastFile($fqfn); // Get instance for file handler - $inputHandler = $this->getIOInstance(); + $inputHandler = $this->getFileIOInstance(); // Try to read from it. This makes it sure that the file is // readable and a valid database file @@ -324,27 +310,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend return $isUsed; } - /** - * Getter for the file IO instance - * - *�@return $ioInstance An instance for IO operations - * @see FileIOHandler The concrete handler for IO operations - */ - public final function getIOInstance () { - return $this->ioInstance; - } - - /** - * Setter for the file IO instance - * - * @param $ioInstance An instance for IO operations (should be - * FileIOHandler) - * @return void - */ - public final function setIOInstance (FileIOHandler $ioInstance) { - $this->ioInstance = $ioInstance; - } - /** * Setter for the last read file * @@ -406,7 +371,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend */ public final function getObjectFromCachedData ($uniqueID) { // Get instance for file handler - $inputHandler = $this->getIOInstance(); + $inputHandler = $this->getFileIOInstance(); // Get last file's name and contents $fqfn = $this->repairFQFN($this->getLastFile(), $uniqueID); diff --git a/inc/classes/main/template/class_TemplateEngine.php b/inc/classes/main/template/class_TemplateEngine.php index 2fff655b7c..cc95918414 100644 --- a/inc/classes/main/template/class_TemplateEngine.php +++ b/inc/classes/main/template/class_TemplateEngine.php @@ -71,11 +71,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate */ private $configVariables = array(); - /** - * The language instance which should link to an object of LanguageSystem - */ - private $langInstance = null; - /** * Loaded templates for recursive protection and detection */ @@ -152,7 +147,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @throws BasePathReadProtectedException If $basePath is * read-protected */ - public final static function createTemplateEngine ($basePath, $langInstance, $ioInstance) { + public final static function createTemplateEngine ($basePath, ManageableLanguage $langInstance, FileIOHandler $ioInstance) { // Get a new instance $tplInstance = new TemplateEngine(); @@ -182,7 +177,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Set the language and IO instances $tplInstance->setLanguageInstance($langInstance); - $tplInstance->setIOInstance($ioInstance); + $tplInstance->setFileIOInstance($ioInstance); // Set template extensions $tplInstance->setRawTemplateExtension($cfgInstance->readConfig("raw_template_extension")); @@ -271,35 +266,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->varStack = new FrameworkArrayObject(); } - /** - * Setter for language instance which should be LanguageSystem - * - * @param $langInstance The language instance - * @return void - */ - public final function setLanguageInstance (ManageableLanguage $langInstance) { - $this->langInstance = $langInstance; - } - - /** - * Setter for file I/O instance which should be FileIOHandler - * - * @param $ioInstance The file I/O instance - * @return void - */ - public final function setIOInstance (FileIOHandler $ioInstance) { - $this->ioInstance = $ioInstance; - } - - /** - * Getter for file I/O instance which should be FileIOHandler - * - * @return $ioInstance The file I/O instance - */ - public final function getIOInstance () { - return $this->ioInstance; - } - /** * Setter for base path * @@ -533,7 +499,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Construct the FQFN for the template by honoring the current language $fqfn = sprintf("%s%s/%s/%s%s", $this->getBasePath(), - $this->langInstance->getLanguageCode(), + $this->getLanguageInstance()->getLanguageCode(), $this->getTemplateType(), $template, $ext @@ -562,7 +528,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate )); // Get a input/output instance from the middleware - $ioInstance = $this->getIOInstance(); + $ioInstance = $this->getFileIOInstance(); // Validate the instance if (is_null($ioInstance)) { diff --git a/inc/config.php b/inc/config.php index 3a14eaa9c8..ab944bf115 100644 --- a/inc/config.php +++ b/inc/config.php @@ -141,17 +141,5 @@ $cfg->setConfigEntry("default_application", "selector"); // CFG: VERBOSE-LEVEL $cfg->setConfigEntry("verbose_level", 0); -// Shall we include config-local.php where you can configure some things? Then -// We need to do some things: -// -// First generate FQFN -$localConfig = sprintf("%sinc/config-local%s", PATH, $cfg->readConfig("php_extension")); - -// Second is the file there and readable? -if ((file_exists($localConfig)) && (is_readable($localConfig))) { - // The third step to load it - require_once($localConfig); -} - // [EOF] ?> diff --git a/inc/config/class_FrameworkConfiguration.php b/inc/config/class_FrameworkConfiguration.php index a1ca42a3ae..957a3537d8 100644 --- a/inc/config/class_FrameworkConfiguration.php +++ b/inc/config/class_FrameworkConfiguration.php @@ -11,7 +11,7 @@ * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software * @license GNU GPL 3.0 or any newer version * @link http://www.mxchange.org - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -26,16 +26,6 @@ * along with this program. If not, see . */ class FrameworkConfiguration { - /** - * Include files which shall be included before the main loader. - */ - private $moreIncPre = null; - - /** - * Include files which shall be included after the main loader. - */ - private $moreIncPost = null; - /** * The framework's main configuration array which will be initialized with * hard-coded configuration data and might be overwritten/extended by @@ -56,9 +46,7 @@ class FrameworkConfiguration { * Private constructor */ private function __construct () { - // Initialize both include lists - $this->moreIncPre = new ArrayObject(); - $this->moreIncPost = new ArrayObject(); + // Empty for now } /** @@ -156,26 +144,6 @@ class FrameworkConfiguration { } } - /** - * Load all includes before main loader and clears the array after usage - * - * @return void - */ - public function loadPreIncludes () { - $this->loadIncludes($this->moreIncPre); - unset($this->moreIncPre); - } - - /** - * Load all includes after main loader and clears the array after usage - * - * @return void - */ - public function loadPostIncludes () { - $this->loadIncludes($this->moreIncPost); - unset($this->moreIncPost); - } - /** * Define the database type which must be valid and will not be verified. * diff --git a/inc/config-local.php b/inc/config/config-override.php similarity index 100% rename from inc/config-local.php rename to inc/config/config-override.php diff --git a/inc/includes.php b/inc/includes.php index 5cecef8875..c9158581e7 100644 --- a/inc/includes.php +++ b/inc/includes.php @@ -35,26 +35,9 @@ if (is_dir(sprintf("%sdevel", PATH))) { ClassLoader::getInstance()->loadClasses("devel"); } -/** - * Load additional include files before main load - */ -FrameworkConfiguration::getInstance()->loadPreIncludes(); - -/** - * Load all main include files - * - * +++ MAIN LOADER! +++ - * - */ - -/////////////////////////////////////////////////// -// Maybe we need this place for future releases? // -/////////////////////////////////////////////////// - -/** - * Load additional include files after main load - */ -FrameworkConfiguration::getInstance()->loadPostIncludes(); +// Shall we include additional configs where you can configure some things? Then +// Load matching config +ClassLoader::getInstance()->loadExtraConfigs(); // [EOF] ?> diff --git a/inc/language/.htaccess b/inc/language/.htaccess new file mode 100644 index 0000000000..3a42882788 --- /dev/null +++ b/inc/language/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/loader/class_ClassLoader.php b/inc/loader/class_ClassLoader.php index cd065629b3..61e8c216ff 100644 --- a/inc/loader/class_ClassLoader.php +++ b/inc/loader/class_ClassLoader.php @@ -212,7 +212,7 @@ class ClassLoader { //* DEBUG: */ print "Suffix=".$this->suffix."(".substr($dirClass2, -$this->sufLen, $this->sufLen).")\n"; //* DEBUG: */ print "ENTRY={$dirClass}\n"; if ( - (is_file($dirClass)) + (is_file($dirClass)) && (is_readable($dirClass)) && (substr($dirClass2, 0 , $this->preLen) == $this->prefix) && (substr($dirClass2, -$this->sufLen, $this->sufLen) == $this->suffix) @@ -262,6 +262,28 @@ class ClassLoader { $this->classes = new ArrayObject(); } } + + /** + * Load extra config files + * + * @return void + */ + public function loadExtraConfigs () { + // Backup old prefix + $oldPrefix = $this->prefix; + + // Set new prefix (temporary!) + $this->prefix = "config-"; + + // Set base directory + $basePath = sprintf("%s/inc/config/", PATH); + + // Load all classes from the config directory + $this->loadClasses($basePath); + + // Set the prefix back + $this->prefix = $oldPrefix; + } } // Initial load of core classes and the FrameworkDirectoryPointer class -- 2.39.5