X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=198280bd430a4044918eb05421f3f00b0e0e571a;hp=3721f6399b07bfb27dfcae42b3f7842298c1d73f;hb=ec23e72b16433ac136817f3ea78697fb70236e4a;hpb=ff66822b5fb6a92f5dc8af55290ecb89ec7f1aaf diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 3721f63..198280b 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -4,9 +4,10 @@ * class handles saving of games etc. * * @author Roland Haeder - * @version 0.0 - * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.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 @@ -19,53 +20,68 @@ * 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 . + * along with this program. If not, see . */ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** - * The instance to the debug output handler (should be DebugConsoleOutput or DebugWebOutput) - * - * @see DebugConsoleOutput - * @see DebugWebOutput + * Instance to an application helper class */ - private static $debug = null; + private static $applicationInstance = null; /** - * The instance to the web output handler (should be WebOutput) - * - * @see WebOutput + * The language instance for the template loader */ - private static $webOutput = null; + private static $langInstance = null; /** - * The instance to the compression layer which should be CompressorChannel + * Debug instance */ - private static $compressor = null; + private static $debugInstance = null; /** - * The configuration instance which shall be FrameworkConfiguration + * Instance of a request class */ - private static $cfgInstance = null; + private $requestInstance = null; /** - * The instance to the database layer which should be DatabaseConnection + * Instance of a response class */ - private $dbInstance = null; + private $responseInstance = null; /** - * The real class name + * Search criteria instance */ - private $realClass = "FrameworkSystem"; + private $searchInstance = null; + + /** + * The file I/O instance for the template loader + */ + private $fileIoInstance = null; + + /** + * Resolver instance + */ + private $resolverInstance = null; /** - * A human-readable description for this simulator part + * Template engine instance */ - private $partDescr = "Namenlose Framework-Einheit"; + private $templateInstance = null; /** - * The unique ID string for identifying all type of classes + * Database result instance */ - private $uniqueID = ""; + private $resultInstance = null; + + /** + * Instance for user class + */ + private $userInstance = null; + + /** + * The real class name + */ + private $realClass = "FrameworkSystem"; /** * Thousands seperator @@ -125,60 +141,77 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_VARIABLE_NOT_SET = 0x02a; 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; + const EXCEPTION_MISSING_ELEMENT = 0x030; + const EXCEPTION_HEADERS_ALREADY_SENT = 0x031; + const EXCEPTION_DEFAULT_CONTROLLER_GONE = 0x032; + const EXCEPTION_CLASS_NOT_FOUND = 0x033; + const EXCEPTION_REQUIRED_INTERFACE_MISSING = 0x034; + const EXCEPTION_FATAL_ERROR = 0x035; + const EXCEPTION_FILE_NOT_FOUND = 0x036; + const EXCEPTION_ASSERTION_FAILED = 0x037; + const EXCEPTION_FILE_CANNOT_BE_READ = 0x038; + const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039; /** * In the super constructor these system classes shall be ignored or else * we would get an endless calling loop. * - *--------------------------------------------------------------------* - * ATTENTION: IF YOU REMOVE ONE OF THEM YOU WILL SHOOT YOUR SERVER!!! * - *--------------------------------------------------------------------* + *---------------------------------------------------------------------* + * ATTENTION: IF YOU REMOVE ONE OF THEM YOU WILL RUN YOUR SERVER IN AN * + * ENDLESS LOOP !!! * + *---------------------------------------------------------------------* */ private $systemClasses = array( - "DebugMiddleware", // Debug middleware output sub-system - "DebugWebOutput", // Debug web output sub-system - "DebugConsoleOutput", // Debug console output sub-system - "DebugErrorLogOutput", // Debug error_log() output sub-system - "CompressorChannel", // Compressor sub-system + "DebugMiddleware", // Debug middleware output sub-system + "Registry", // Object registry + "ObjectFactory", // Object factory + "DebugWebOutput", // Debug web output sub-system + "WebOutput", // Web output sub-system + "CompressorChannel", // Compressor sub-system + "DebugConsoleOutput", // Debug console output sub-system + "DebugErrorLogOutput", // Debug error_log() output sub-system "FrameworkDirectoryPointer", // Directory handler sub-system - "NullCompressor", // Null compressor - "Bzip2Compressor", // BZIP2 compressor - "GzipCompressor", // GZIP compressor - "WebOutput", // Web output sub-system + "NullCompressor", // Null compressor + "Bzip2Compressor", // BZIP2 compressor + "GzipCompressor", // GZIP compressor ); + /* No longer used: + */ + /** * Private super constructor * + * @param $className Name of the class * @return void */ - private function __construct ($class) { + protected function __construct ($className) { // Set real class - $this->setRealClass($class); + $this->setRealClass($className); + + // Initialize the class if the registry is there + if ((class_exists('Registry')) && (Registry::isInitialized() === false)) { + $this->initInstance(); + } // END - if } /** * Destructor reached... * * @return void + * @todo This is old code. Do we still need this old lost code? */ public function __destruct() { // Is this object already destroyed? - if ($this->__toString() != "DestructedObject") { - // Debug message - if ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) { - $this->getDebugInstance()->output(sprintf("[%s:] Das Objekt %s wird zerstört.
\n", - __CLASS__, $this->__toString() - )); - } - + if ($this->__toString() != 'DestructedObject') { // Destroy all informations about this class but keep some text about it alive - $this->setPartDescr(sprintf("Entferntes Objekt %s", $this->__toString())); - $this->setRealClass("DestructedObject"); - $this->resetUniqueID(); + $this->setRealClass('DestructedObject'); } elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) { // Already destructed object - $this->getDebugInstance()->output(sprintf("[%s:] Das Objekt %s wurde bereits zerstört.
\n", + $this->debugOutput(sprintf("[%s:] The object %s is already destroyed.", __CLASS__, $this->__toString() )); } @@ -191,10 +224,28 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ public final function __call ($methodName, $args) { // Implode all given arguments - $argsString = implode("|", $args); - if (empty($argsString)) $argsString = "NULL"; + $argsString = ""; + if (empty($args)) { + // No arguments + $argsString = "NULL"; + } elseif (is_array($args)) { + // Some arguments are there + foreach ($args as $arg) { + // Add the type + $argsString .= $arg." (".gettype($arg)."), "; + } // END - foreach + + // Remove last comma + if (substr($argsString, -2, 1) === ",") { + $argsString = substr($argsString, 0, -2); + } // END - if + } else { + // Invalid arguments! + $argsString = sprintf("!INVALID:%s!", $args); + } - $this->getDebugInstance()->output(sprintf("[%s::%s] Stub! Args: %s", + // Output stub message + $this->debugOutput(sprintf("[%s->%s] Stub! Args: %s", $this->__toString(), $methodName, $argsString @@ -205,119 +256,152 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Public constructor (for initializing things, etc.) + * Private initializer for this class * * @return void */ - public function constructor ($class) { - // Call constructor - $this->__construct($class); + private final function initInstance () { + // Is this a system class? + if (!in_array($this->__toString(), $this->systemClasses)) { + // Add application helper to our class + $this->systemclasses[] = $this->getConfigInstance()->readConfig('app_helper_class'); + + // Set debug instance + $this->setDebugInstance(DebugMiddleware::createDebugMiddleware($this->getConfigInstance()->readConfig('debug_class'))); + + // Get output instance and set it + $outputInstance = ObjectFactory::createObjectByConfiguredName('web_engine', array($this->getConfigInstance()->readConfig('web_content_type'))); + $this->setWebOutputInstance($outputInstance); + + // Set the compressor channel + $this->setCompressorChannel(CompressorChannel::createCompressorChannel(sprintf("%s%s", + PATH, + $this->getConfigInstance()->readConfig('compressor_base_path') + ))); + + // Initialization done! :D + Registry::isInitialized('OK'); + } elseif ($this->__toString() == 'DebugMiddleware') { + // Set configuration instance + $this->setConfigInstance(FrameworkConfiguration::createFrameworkConfiguration()); + } + } - // Get the current (singleton) configuration instance - $this->setConfigInstance(FrameworkConfiguration::createFrameworkConfiguration()); + /** + * Setter for database result instance + * + * @param $resultInstance An instance of a database result class + * @return void + * @todo SearchableResult and UpdateableResult shall have a super interface to use here + */ + protected final function setResultInstance (SearchableResult $resultInstance) { + $this->resultInstance = $resultInstance; + } - // Is the class weather debug nor compressor channel? - if (!in_array($class, $this->systemClasses)) { - // Initialize debug instance - if (is_null($this->getDebugInstance())) { - // Set the debug output system if it is not debug class ;) - $this->setDebugInstance(DebugMiddleware::createDebugMiddleware($this->getConfigInstance()->readConfig("debug_engine"))); - } + /** + * Getter for database result instance + * + * @return $resultInstance An instance of a database result class + */ + public final function getResultInstance () { + return $this->resultInstance; + } - // Initialize web instance - if (is_null($this->getWebOutputInstance())) { - // Generate the eval() command - $eval = sprintf("\$this->setWebOutputInstance(%s::create%s(\"%s\"));", - $this->getConfigInstance()->readConfig("web_engine"), - $this->getConfigInstance()->readConfig("web_engine"), - $this->getConfigInstance()->readConfig("web_content_type") - ); - - // Debug message - if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:] Konstruierte PHP-Anweisung:
%s

\n", - $this->__toString(), - htmlentities($eval) - )); - - // Run the command - eval($eval); - } + /** + * Setter for template engine instances + * + * @param $templateInstance An instance of a template engine class + * @return void + */ + protected final function setTemplateInstance (CompileableTemplate $templateInstance) { + $this->templateInstance = $templateInstance; + } - // Initialize compressor channel - if (is_null($this->getCompressorChannel())) { - // Set the compressor channel - $this->setCompressorChannel(CompressorChannel::createCompressorChannel(sprintf("%s%s", - PATH, - $this->getConfigInstance()->readConfig("compressor_base_path") - ))); - } + /** + * Getter for template engine instances + * + * @return $templateInstance An instance of a template engine class + */ + protected final function getTemplateInstance () { + return $this->templateInstance; + } - // Initialize database middleware - if (is_null($this->getDatabaseInstance())) { - // Get the middleware instance - $db = DatabaseConnection::getInstance(); - if (is_object($db)) { - // Set the database middleware - $this->setDatabaseInstance($db); - } - } + /** + * Setter for search instance + * + * @param $searchInstance Searchable criteria instance + * @return void + */ + public final function setSearchInstance (LocalSearchCriteria $searchInstance) { + $this->searchInstance = $searchInstance; + } - // Debug output - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Alle Sub-Systeme sind initialisiert.
\n", - $this->__toString() - )); - } + /** + * Getter for search instance + * + * @return $searchInstance Searchable criteria instance + */ + public final function getSearchInstance () { + return $this->searchInstance; + } + + /** + * Setter for resolver instance + * + * @param $resolverInstance Instance of a command resolver class + * @return void + */ + public final function setResolverInstance (Resolver $resolverInstance) { + $this->resolverInstance = $resolverInstance; + } + + /** + * Getter for resolver instance + * + * @return $resolverInstance Instance of a command resolver class + */ + public final function getResolverInstance () { + return $this->resolverInstance; } /** * Setter for language instance * - * @param $configInstance The configuration instance which shall - * be FrameworkConfiguration + * @param $configInstance The configuration instance which shall + * be FrameworkConfiguration * @return void */ public final function setConfigInstance (FrameworkConfiguration $configInstance) { - $this->cfgInstance = $configInstance; - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Konfigurations-Handler auf %s gesetzt.
\n", - $this->__toString(), - $configInstance->__toString() - )); + Registry::getRegistry()->addInstance('config', $configInstance); } /** * Getter for configuration instance * - * @return $cfhInstance - Configuration instance + * @return $cfgInstance Configuration instance */ public final function getConfigInstance () { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Konfigurations-Handler %s angefordert.
\n", - $this->__toString(), - $this->cfgInstance->__toString() - )); - return $this->cfgInstance; + $cfgInstance = Registry::getRegistry()->getInstance('config'); + return $cfgInstance; } /** * Setter for debug instance * - * @param $debugInstance The instance for debug output class + * @param $debugInstance The instance for debug output class * @return void */ public final function setDebugInstance (DebugMiddleware $debugInstance) { - self::$debug = $debugInstance; - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Debug-Handler auf %s gesetzt.
\n", - $this->__toString(), - $this->getDebugInstance()->__toString() - )); + self::$debugInstance = $debugInstance; } /** * Getter for debug instance * - * @return $debug - Instance to class DebugConsoleOutput or DebugWebOutput + * @return $debugInstance Instance to class DebugConsoleOutput or DebugWebOutput */ public final function getDebugInstance () { - return self::$debug; + return self::$debugInstance; } /** @@ -327,11 +411,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ public final function setWebOutputInstance (OutputStreamer $webInstance) { - self::$webOutput = $webInstance; - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Web-Handler auf %s gesetzt.
\n", - $this->__toString(), - $this->getWebOutputInstance()->__toString() - )); + Registry::getRegistry()->addInstance('web_output', $webInstance); } /** @@ -340,269 +420,164 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return $webOutput - Instance to class WebOutput */ public final function getWebOutputInstance () { - return self::$webOutput; + return Registry::getRegistry()->getInstance('web_output'); } /** - * Static setter for database instance + * Setter for database instance * * @param $dbInstance The instance for the database connection * (forced DatabaseConnection) * @return void */ public final function setDatabaseInstance (DatabaseConnection $dbInstance) { - if ((defined('DEBUG_SYSTEM')) && (is_object($dbInstance->getDebugInstance()))) $dbInstance->getDebugInstance()->output(sprintf("[%s:] Datenbankschicht gesetzt.
\n", - $dbInstance->__toString() - )); - $this->dbInstance = $dbInstance; + Registry::getRegistry()->addInstance('dbInstance', $dbInstance); } /** - * Getter for $realClass + * Getter for database layer * - * @return $realClass The name of the real class (not BaseFrameworkSystem) + * @return $dbInstance The database layer instance */ - public final function __toString () { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] __toString() erreicht.
\n", - $this->realClass - )); - return $this->realClass; + public final function getDatabaseInstance () { + // Default is invalid db instance + $dbInstance = null; + + // Is the registry there and initialized? + if ((class_exists('Registry')) && (Registry::isInitialized() === true)) { + $dbInstance = Registry::getRegistry()->getInstance('dbInstance'); + } // END - if + + // Return instance + return $dbInstance; } /** - * Setter for the real class name + * Setter for compressor channel * - * @param $realClass Class name (string) + * @param $compressorChannel An instance of CompressorChannel * @return void */ - public final function setRealClass ($realClass) { - // Cast to string - $realClass = (string) $realClass; - - // Set real class - $this->realClass = $realClass; + public final function setCompressorChannel (CompressorChannel $compressorChannel) { + Registry::getRegistry()->addInstance('compressor', $compressorChannel); } /** - * Generate unique ID from a lot entropy + * Getter for compressor channel * - * @return void + * @return $compressor The compressor channel */ - public final function createUniqueID () { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] createUniqueID aufgerufen.
\n", - $this->__toString() - )); - - // Existiert noch keine? - if (empty($this->uniqueID)) { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] createUniqueID erzeugt neue Unique-ID.
\n", - $this->__toString() - )); - - // Correct missing class name - $corrected = false; - if ($this->__toString() == "") { - $this->setRealClass(__CLASS__); - $corrected = true; - } - - // Neue ID erstellen - $tempID = false; - while (true) { - // Generate a unique ID number - $tempID = $this->generateIdNumber(); - $isUsed = false; - - // Try to figure out if the ID number is not yet used - try { - if (is_object($this->getDatabaseInstance())) { - $isUsed = $this->getDatabaseInstance()->isUniqueIdUsed($tempID, true); - } - } catch (FrameworkException $e) { - // Catches all and ignores all ;-) - } - - if ( - ( - $tempID !== false - ) && ( - ( - $this->getDatabaseInstance() === null - ) || ( - ( - is_object($this->getDatabaseInstance()) - ) && ( - !$isUsed - ) - ) - ) - ) { - // Abort the loop - break; - } - } - - // Debug message - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] uniqueID ist auf %s gesetzt.
\n", - $this->__toString(), - $tempID - )); - - // Apply the new ID - $this->setUniqueID($tempID); - - // Revert maybe corrected class name - if ($corrected) { - $this->setRealClass(""); - } - - // Remove system classes if we are in a system class - if ((isset($this->systemClasses)) && (in_array($this->__toString(), $this->systemClasses))) { - // This may save some RAM... - $this->removeSystemArray(); - } - } + public final function getCompressorChannel () { + return Registry::getRegistry()->getInstance('compressor'); } /** - * Generates a new ID number for classes based from the class' real name, - * the description and some random data + * Protected getter for a manageable application helper class * - * @return $tempID The new (temporary) ID number + * @return $applicationInstance An instance of a manageable application helper class */ - private final function generateIdNumber () { - return sprintf("%s@%s", - $this->__toString(), - md5(sprintf("%s:%s:%s:%s:%s:%s", - $this->__toString(), - $this->getPartDescr(), - time(), - getenv('REMOTE_ADDR'), - getenv('SERVER_ADDR'), - mt_rand() - )) - ); + protected final function getApplicationInstance () { + return self::$applicationInstance; } /** - * Setter for unique ID + * Setter for a manageable application helper class * - * @param $uniqueID The newly generated unique ID number + * @param $applicationInstance An instance of a manageable application helper class * @return void */ - private final function setUniqueID ($uniqueID) { - // Cast to string - $uniqueID = (string) $uniqueID; - - // Debug message - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Unique-ID gesetzt auf %s.
\n", - $this->__toString(), - $uniqueID - )); + public final function setApplicationInstance (ManageableApplication $applicationInstance) { + self::$applicationInstance = $applicationInstance; + } - // Set the ID number - $this->uniqueID = $uniqueID; + /** + * Setter for request instance + * + * @param $requestInstance An instance of a Requestable class + * @return void + */ + public final function setRequestInstance (Requestable $requestInstance) { + $this->requestInstance = $requestInstance; } /** - * Getter for unique ID + * Getter for request instance * - * @return $uniqueID The unique ID of this class + * @return $requestInstance An instance of a Requestable class */ - public final function getUniqueID () { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Unique-ID angefordert.
\n", - $this->__toString() - )); - return $this->uniqueID; + public final function getRequestInstance () { + return $this->requestInstance; } /** - * Resets or recreates the unique ID number + * Setter for response instance * + * @param $responseInstance An instance of a Responseable class * @return void */ - public final function resetUniqueID() { - // Sweet and simple... ;-) - $newUniqueID = $this->generateIdNumber(); - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Unique-ID zurückgesetzt auf %s.
\n", - $this->__toString(), - $newUniqueID - )); - $this->setUniqueID($newUniqueID); + public final function setResponseInstance (Responseable $responseInstance) { + $this->responseInstance = $responseInstance; } /** - * Getter for simulator description + * Getter for response instance * - * @return $partDescr The description of this simulation part + * @return $responseInstance An instance of a Responseable class */ - public final function getPartDescr () { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] getPartDescr erreicht.
\n", - $this->__toString() - )); - if (isset($this->partDescr)) { - return $this->partDescr; - } else { - return null; - } + public final function getResponseInstance () { + return $this->responseInstance; } /** - * Setter for simulation part description + * Getter for $realClass * - * @param $partDescr The description as string for this simulation part - * @return void + * @return $realClass The name of the real class (not BaseFrameworkSystem) */ - public final function setPartDescr ($partDescr) { - $this->partDescr = (String) $partDescr; - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Teilbeschreibung wird auf %s gesetzt.
\n", - $this->__toString(), - $this->partDescr - )); + public final function __toString () { + return $this->realClass; } /** - * Validate if given object is the same as current + * Setter for the real class name * - * @param $object An object instance for comparison with this class - * @return boolean The result of comparing both's unique ID + * @param $realClass Class name (string) + * @return void */ - public final function equals ($object) { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Ist %s=%s?
\n", - $this->__toString(), - $this->__toString(), - $object->__toString() - )); - return ($this->getUniqueID() == $object->getUniqueID()); + public final function setRealClass ($realClass) { + // Cast to string + $realClass = (string) $realClass; + + // Set real class + $this->realClass = $realClass; } /** * Compare if both simulation part description and class name matches - * (shall be enougth) + * (shall be enough) * - * @param $itemInstance An object instance to an other class - * @return boolean The result of comparing class name simulation part description + * @param $itemInstance An object instance to an other class + * @return boolean The result of comparing class name simulation part description + * @deprecated */ public function itemMatches ($itemInstance) { + $this->partialStub("Deprecated!"); return ( - ($this->__toString() == $itemInstance->__toString()) - && ($this->getPartDescr() == $itemInstance->getPartDescr()) + ( + $this->__toString() == $itemInstance->__toString() + ) && ( + $this->getObjectDescription() == $itemInstance->getObjectDescription() + ) ); } /** * Compare class name of this and given class name * - * @param $class The class name as string from the other class + * @param $className The class name as string from the other class * @return boolean The result of comparing both class names */ - public final function isClass ($class) { - if ((defined('DEBUG_SYSTEM')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] %s=%s?
\n", - $this->__toString(), - $this->__toString(), - $class - )); - return ($this->__toString() == $class); + public final function isClass ($className) { + return ($this->__toString() == $className); } /** @@ -628,10 +603,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * Formats computer generated price values into human-understandable formats * with thousand and decimal seperators. * - * @param $value The in computer format value for a price - * @param $currency The currency symbol (use HTML-valid characters!) - * @param $decNum Number of decimals after commata - * @return $price The for the current language formated price string + * @param $value The in computer format value for a price + * @param $currency The currency symbol (use HTML-valid characters!) + * @param $decNum Number of decimals after commata + * @return $price The for the current language formated price string * @throws MissingDecimalsThousandsSeperatorException If decimals or * thousands seperator * is missing @@ -645,10 +620,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Cast the number $value = (float) $value; - if (defined('DEBUG_CORE') && is_object($this->getDebugInstance())) $this->getDebugInstance()->output(sprintf("[%s:] %d wird umformatiert.
\n", - $this->__toString(), - $value - )); // Reformat the US number $price = sprintf("%s %s", @@ -666,98 +637,413 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return void */ public final function removeNumberFormaters () { - if (defined('DEBUG_CORE') && is_object($this->getDebugInstance())) $this->getDebugInstance()->output(sprintf("[%s:] Zahlenumformatierungszeichen werden entfernt.
\n", - $this->__toString() - )); unset($this->thousands); unset($this->decimals); } /** - * Getter for database layer + * Private getter for language instance * - * @return $dbInstance The database layer instance + * @return $langInstance An instance to the language sub-system */ - public final function getDatabaseInstance () { - if (defined('DEBUG_CORE') && is_object($this->getDebugInstance())) $this->getDebugInstance()->output(sprintf("[%s:] Datenbank-Instanz %s angefordert.
\n", + protected final function getLanguageInstance () { + return self::$langInstance; + } + + /** + * Setter for language instance + * + * @param $langInstance An instance to the language sub-system + * @return void + * @see LanguageSystem + */ + public final function setLanguageInstance (ManageableLanguage $langInstance) { + self::$langInstance = $langInstance; + } + + /** + * Remove the $systemClasses array from memory + * + * @return void + */ + public final function removeSystemArray () { + unset($this->systemClasses); + } + + /** + * Appends a trailing slash to a string + * + * @param $str A string (maybe) without trailing slash + * @return $str A string with an auto-appended trailing slash + */ + public final function addMissingTrailingSlash ($str) { + // Is there a trailing slash? + if (substr($str, -1, 1) != "/") $str .= "/"; + return $str; + } + + /** + * 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 (WebTemplateEngine by default) for a given + * application helper instance (ApplicationHelper by default). + * + * @param $appInstance An application helper instance or + * null if we shall use the default + * @return $templateInstance The template engine instance + * @throws NullPointerException If the template engine could not + * be initialized + * @throws UnsupportedTemplateEngineException If $templateInstance is an + * unsupported template engine + * @throws MissingLanguageHandlerException If the language sub-system + * is not yet initialized + * @throws NullPointerException If the discovered application + * instance is still null + */ + protected function prepareTemplateInstance (BaseFrameworkSystem $appInstance=null) { + // Is the application instance set? + if (is_null($appInstance)) { + // Get the current instance + $appInstance = $this->getApplicationInstance(); + + // Still null? + if (is_null($appInstance)) { + // Thrown an exception + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } // END - if + } // END - if + + // 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 + $templateInstance = ObjectFactory::createObjectByConfiguredName('template_class', array($fqfn, $appInstance->getLanguageInstance(), $appInstance->getFileIoInstance())); + + // Return the prepared instance + return $templateInstance; + } + + /** + * Debugs this instance by putting out it's full content + * + * @return void + */ + public final function debugInstance () { + // Restore the error handler to avoid trouble with missing array elements or undeclared variables + restore_error_handler(); + + // Generate the output + $content = sprintf("
%s
", + trim( + htmlentities( + print_r($this, true) + ) + ) + ); + + // Output it + ApplicationEntryPoint::app_die(sprintf("%s debug output:
%s
\nLoaded includes:
%s
", $this->__toString(), - $this->dbInstance + $content, + ClassLoader::getInstance()->getPrintableIncludeList() )); - return $this->dbInstance; } /** - * Setter for compressor channel + * Output a partial stub message for the caller method * - * @param $compressorChannel An instance of CompressorChannel + * @param $message An optional message to display * @return void */ - public final function setCompressorChannel (CompressorChannel $compressorChannel) { - self::$compressor = $compressorChannel; + protected function partialStub ($message = "") { + // Get the backtrace + $backtrace = debug_backtrace(); + + // Generate the class::method string + $methodName = "UnknownClass->unknownMethod"; + if ((isset($backtrace[1]['class'])) && (isset($backtrace[1]['function']))) { + $methodName = $backtrace[1]['class']."->".$backtrace[1]['function']; + } // END - if + + // Construct the full message + $stubMessage = sprintf("[%s:] Partial stub!", + $methodName + ); + + // Is the extra message given? + if (!empty($message)) { + // Then add it as well + $stubMessage .= sprintf(" Message: %s", $message); + } // END - if + + // Debug instance is there? + if (!is_null($this->getDebugInstance())) { + // Output stub message + $this->debugOutput($stubMessage); + } else { + // Trigger an error + trigger_error($stubMessage."
\n"); + } } /** - * Getter for compressor channel + * Outputs a debug backtrace and stops further script execution * - * @return $compressor The compressor channel + * @return void */ - public final function getCompressorChannel () { - return self::$compressor; + public function debugBackTrace () { + // Sorry, there is no other way getting this nice backtrace + print "
\n";
+		debug_print_backtrace();
+		print "
"; + exit; } /** - * Remove the $systemClasses array from memory + * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message * + * @param $message Message we shall send out... + * @param $doPrint Wether we shall print or die here which first is the default * @return void */ - public final function removeSystemArray () { - unset($this->systemClasses); + public function debugOutput ($message, $doPrint = true) { + // Get debug instance + $debugInstance = $this->getDebugInstance(); + + // Is the debug instance there? + if (is_object($debugInstance)) { + // Use debug output handler + $debugInstance->output($message); + if (!$doPrint) die(); // Die here if not printed + } else { + // Put directly out + if ($doPrint) { + print($message); + } else { + // DO NOT REWRITE THIS TO app_die() !!! + die($message); + } + } + } + + /** + * Converts e.g. a command from URL to a valid class by keeping out bad characters + * + * @param $str The string, what ever it is needs to be converted + * @return $className Generated class name + */ + public function convertToClassName ($str) { + // Init class name + $className = ""; + + // Convert all dashes in underscores + $str = str_replace("-", "_", $str); + + // Now use that underscores to get classname parts for hungarian style + foreach (explode("_", $str) as $strPart) { + // Make the class name part lower case and first upper case + $className .= ucfirst(strtolower($strPart)); + } // END - foreach + + // Return class name + return $className; } /** - * Create a file name and path name from the object's unique ID number. - * The left part of the ID shall always be a valid class name and the - * right part an ID number. + * Marks up the code by adding e.g. line numbers * - * @return $pfn The file name with a prepended path name - * @throws NoArrayCreatedException If explode() fails to create an array - * @throws InvalidArrayCountException If the array contains less or - * more than two elements + * @param $phpCode Unmarked PHP code + * @return $markedCode Marked PHP code */ - public function getPathFileNameFromObject () { - // Get the main object's unique ID. We use this as a path/filename combination - $pathFile = $this->getUniqueID(); + public function markupCode ($phpCode) { + // Init marked code + $markedCode = ""; + + // Get last error + $errorArray = error_get_last(); + + // Init the code with error message + if (is_array($errorArray)) { + // Get error infos + $markedCode = sprintf("
File: %s, Line: %s, Message: %s, Type: %s
", + basename($errorArray['file']), + $errorArray['line'], + $errorArray['message'], + $errorArray['type'] + ); + } // END - if + + // Add line number to the code + foreach (explode("\n", $phpCode) as $lineNo=>$code) { + // Add line numbers + $markedCode .= sprintf("%s: %s\n", + ($lineNo + 1), + htmlentities($code, ENT_QUOTES) + ); + } // END - foreach + + // Return the code + return $markedCode; + } - // Split it up in path and file name - $pathFile = explode("@", $pathFile); + /** + * Filter a given GMT timestamp (non Uni* stamp!) to make it look more + * beatiful for web-based front-ends. If null is given a message id + * null_timestamp will be resolved and returned. + * + * @param $timestamp Timestamp to prepare (filter) for display + * @return $readable A readable timestamp + */ + public function doFilterFormatTimestamp ($timestamp) { + // Default value to return + $readable = "???"; + + // Is the timestamp null? + if (is_null($timestamp)) { + // Get a message string + $readable = $this->getLanguageInstance()->getMessage('null_timestamp'); + } else { + switch ($this->getLanguageInstance()->getLanguageCode()) { + case "de": // German format is a bit different to default + // Split the GMT stamp up + $dateTime = explode(" ", $timestamp); + $dateArray = explode("-", $dateTime[0]); + $timeArray = explode(":", $dateTime[1]); + + // Construct the timestamp + $readable = sprintf($this->getConfigInstance()->readConfig('german_date_time'), + $dateArray[0], + $dateArray[1], + $dateArray[2], + $timeArray[0], + $timeArray[1], + $timeArray[2] + ); + break; - // Are there two elements? Index 0 is the path, 1 the file name + global extension - if (!is_array($pathFile)) { - // No array found - throw new NoArrayCreatedException(array($this, "pathFile"), self::EXCEPTION_ARRAY_EXPECTED); - } elseif (count($pathFile) != 2) { - // Invalid ID returned! - throw new InvalidArrayCountException(array($this, "pathFile", count($pathFile), 2), self::EXCEPTION_ARRAY_HAS_INVALID_COUNT); + default: // Default is pass-through + $readable = $timestamp; + break; + } } - // Auto-append missing trailing slash - $pathFile[0] = $this->addMissingTrailingSlash($pathFile[0]); + // Return the stamp + return $readable; + } + + /** + * "Getter" for databse entry + * + * @return $entry An array with database entries + * @throws NullPointerException If the database result is not found + * @throws InvalidDatabaseResultException If the database result is invalid + */ + protected final function getDatabaseEntry () { + // Is there an instance? + if (is_null($this->getResultInstance())) { + // Throw an exception here + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } // END - if + + // Rewind it + $this->getResultInstance()->rewind(); + + // Do we have an entry? + if (!$this->getResultInstance()->valid()) { + throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT); + } // END - if + + // Get next entry + $this->getResultInstance()->next(); + + // Fetch it + $entry = $this->getResultInstance()->current(); - // Create the file name and return it - $pfn = ($pathFile[0] . $pathFile[1]); - return $pfn; + // And return it + return $entry; } /** - * Appends a trailing slash to a string + * Getter for field name * - * @param $str A string (maybe) without trailing slash - * @return $str A string with an auto-appended trailing slash + * @param $fieldName Field name which we shall get + * @return $fieldValue Field value from the user + * @throws NullPointerException If the result instance is null */ - public final function addMissingTrailingSlash ($str) { - // Is there a trailing slash? - if (substr($str, -1, 1) != "/") $str .= "/"; - return $str; + public final function getField ($fieldName) { + // Default field value + $fieldValue = null; + + // Get result instance + $resultInstance = $this->getResultInstance(); + + // Is this instance null? + if (is_null($resultInstance)) { + // Then the user instance is no longer valid (expired cookies?) + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } // END - if + + // Get current array + $fieldArray = $resultInstance->current(); + + // Does the field exist? + if (isset($fieldArray[$fieldName])) { + // Get it + $fieldValue = $fieldArray[$fieldName]; + } // END - if + + // Return it + return $fieldValue; + } + + /** + * Protected setter for user instance + * + * @param $userInstance An instance of a user class + * @return void + */ + protected final function setUserInstance (ManageableAccount $userInstance) { + $this->userInstance = $userInstance; + } + + /** + * Getter for user instance + * + * @return $userInstance An instance of a user class + */ + public final function getUserInstance () { + return $this->userInstance; } }