X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=4a6eb893e0418d524b38ba71681d6e859dc27db6;hp=3484a4eb5a9dc5724e37525bfe81954e230114a0;hb=efba981c9bf18c733dfde945b09111ff4b6007ce;hpb=b848cab53db89342f0a854a00be91cadbcff2967 diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 3484a4e..4a6eb89 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -5,7 +5,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software + * @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 * @@ -32,6 +32,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * The language instance for the template loader */ private static $langInstance = null; + + /** + * Debug instance + */ + private static $debugInstance = null; + /** * Instance of a request class */ @@ -42,6 +48,31 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $responseInstance = null; + /** + * Search criteria instance + */ + private $searchInstance = null; + + /** + * The file I/O instance for the template loader + */ + private $fileIoInstance = null; + + /** + * Resolver instance + */ + private $resolverInstance = null; + + /** + * Template engine instance + */ + private $templateInstance = null; + + /** + * Database result instance + */ + private $resultInstance = null; + /** * The real class name */ @@ -67,11 +98,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $decimals = ","; // German - /** - * The file I/O instance for the template loader - */ - private $fileIoInstance = null; - /*********************** * Exception codes.... * ***********************/ @@ -124,20 +150,24 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_MISSING_LANGUAGE_HANDLER = 0x02e; const EXCEPTION_MISSING_FILE_IO_HANDLER = 0x02f; const EXCEPTION_MISSING_ELEMENT = 0x030; - const EXCEPTION_INVALID_COMMAND = 0x031; - const EXCEPTION_INVALID_CONTROLLER = 0x032; - const EXCEPTION_HEADERS_ALREADY_SENT = 0x033; - const EXCEPTION_DEFAUL_CONTROLLER_GONE = 0x034; - const EXCEPTION_CLASS_NOT_FOUND = 0x035; - const EXCEPTION_REQUIRED_INTERFACE_MISSING = 0x036; + 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 @@ -160,40 +190,35 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Private super constructor * + * @param $className Name of the class * @return void */ - protected 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->setObjectDescription(sprintf("Entferntes Objekt %s", $this->__toString())); - $this->setRealClass("DestructedObject"); + $this->setObjectDescription(sprintf("Removed object %s", $this->__toString())); + $this->setRealClass('DestructedObject'); $this->resetUniqueID(); } 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() )); } @@ -238,9 +263,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } elseif (is_null($arg)) { // Null $argsString .= "(null)"; + } elseif (is_resource($arg)) { + // Resource + $argsString .= "(resource)"; } else { // Unknown type (please report!) - $argsString .= $arg."(unknown!)"; + $argsString .= $arg."(unknown!)"; } // Add comma @@ -248,13 +276,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // Remove last comma - if (substr($argsString, -2, 1) === ",") $argsString = substr($argsString, 0, -2); + 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 @@ -289,13 +320,90 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { ))); // Initialization done! :D - Registry::isInitialized("OK"); - } elseif ($this->__toString() == "DebugMiddleware") { + Registry::isInitialized('OK'); + } elseif ($this->__toString() == 'DebugMiddleware') { // Set 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; + } + + /** + * Getter for database result instance + * + * @return $resultInstance An instance of a database result class + */ + public final function getResultInstance () { + return $this->resultInstance; + } + + /** + * 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; + } + + /** + * Getter for template engine instances + * + * @return $templateInstance An instance of a template engine class + */ + protected final function getTemplateInstance () { + return $this->templateInstance; + } + + /** + * Setter for search instance + * + * @param $searchInstance Searchable criteria instance + * @return void + */ + public final function setSearchInstance (LocalSearchCriteria $searchInstance) { + $this->searchInstance = $searchInstance; + } + + /** + * 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 * @@ -310,29 +418,30 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Getter for configuration instance * - * @return $cfhInstance - Configuration instance + * @return $cfgInstance Configuration instance */ - protected final function getConfigInstance () { - return Registry::getRegistry()->getInstance('config'); + public final function getConfigInstance () { + $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) { - Registry::getRegistry()->addInstance('debug', $debugInstance); + 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 Registry::getRegistry()->getInstance('debug'); + return self::$debugInstance; } /** @@ -632,10 +741,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Validate if given object is the same as current * - * @param $object An object instance for comparison with this class + * @param $object An object instance for comparison with this class * @return boolean The result of comparing both's unique ID */ - public final function equals ($object) { + public final function equals (FrameworkInterface $object) { return ($this->getUniqueID() == $object->getUniqueID()); } @@ -643,8 +752,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * Compare if both simulation part description and class name matches * (shall be enougth) * - * @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 */ public function itemMatches ($itemInstance) { return ( @@ -659,11 +768,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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) { - return ($this->__toString() == $class); + public final function isClass ($className) { + return ($this->__toString() == $className); } /** @@ -761,10 +870,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * The left part of the ID shall always be a valid class name and the * right part an ID number. * - * @return $pfn The file name with a prepended path name - * @throws NoArrayCreatedException If explode() fails to create an array + * @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 + * more than two elements */ public final function getPathFileNameFromObject () { // Get the main object's unique ID. We use this as a path/filename combination @@ -776,10 +885,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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); + 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); + throw new InvalidArrayCountException(array($this, 'pathFile', count($pathFile), 2), self::EXCEPTION_ARRAY_HAS_INVALID_COUNT); } // Auto-append missing trailing slash @@ -822,22 +931,22 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Prepare the template engine (TemplateEngine by default) for a given + * 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 $tplEngine The template engine instance + * @return $templateInstance The template engine instance * @throws NullPointerException If the template engine could not * be initialized - * @throws UnsupportedTemplateEngineException If $tplEngine is an + * @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 prepareTemplateEngine (BaseFrameworkSystem $appInstance=null) { + protected function prepareTemplateInstance (BaseFrameworkSystem $appInstance=null) { // Is the application instance set? if (is_null($appInstance)) { // Get the current instance @@ -847,8 +956,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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", @@ -868,10 +977,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // Initialize the template engine - $tplEngine = ObjectFactory::createObjectByConfiguredName('template_class', array($fqfn, $appInstance->getLanguageInstance(), $appInstance->getFileIoInstance())); + $templateInstance = ObjectFactory::createObjectByConfiguredName('template_class', array($fqfn, $appInstance->getLanguageInstance(), $appInstance->getFileIoInstance())); // Return the prepared instance - return $tplEngine; + return $templateInstance; } /** @@ -880,13 +989,24 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @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(print_r($this, true)) + trim( + htmlentities( + print_r($this, true) + ) + ) ); // Output it - ApplicationEntryPoint::app_die(sprintf("%s debug output:%s", $this->__toString(), $content)); + ApplicationEntryPoint::app_die(sprintf("%s debug output:
%s
\nLoaded includes:
%s
", + $this->__toString(), + $content, + ClassLoader::getInstance()->getPrintableIncludeList() + )); } /** @@ -900,10 +1020,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $backtrace = debug_backtrace(); // Generate the class::method string - $methodName = "UnknownClass::unknownMethod"; + $methodName = "UnknownClass->unknownMethod"; if ((isset($backtrace[1]['class'])) && (isset($backtrace[1]['function']))) { - $methodName = $backtrace[1]['class']."::".$backtrace[1]['function']; - } + $methodName = $backtrace[1]['class']."->".$backtrace[1]['function']; + } // END - if // Construct the full message $stubMessage = sprintf("[%s:] Partial stub!", @@ -913,19 +1033,59 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Is the extra message given? if (!empty($message)) { // Then add it as well - $stubMessage .= sprintf(" Message: %s", $message); - } + $stubMessage .= sprintf(" Message: %s", $message); + } // END - if // Debug instance is there? if (!is_null($this->getDebugInstance())) { // Output stub message - $this->getDebugInstance()->output($stubMessage); + $this->debugOutput($stubMessage); } else { // Trigger an error trigger_error($stubMessage."
\n"); } } + /** + * Outputs a debug backtrace and stops further script execution + * + * @return void + */ + public function debugBackTrace () { + // Sorry, there is no other way getting this nice backtrace + print "
\n";
+		debug_print_backtrace();
+		print "
"; + exit; + } + + /** + * 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 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 * @@ -950,16 +1110,162 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Outputs a debug backtrace and stops further script execution + * Marks up the code by adding e.g. line numbers + * + * @param $phpCode Unmarked PHP code + * @return $markedCode Marked PHP code + */ + public function markupCode ($phpCode) { + // Get last error + $errorArray = error_get_last(); + + // Init the code with error message + $markedCode = ""; + 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; + } + + /** + * Filter a given timestamp to make it look more beatifull 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 { + $this->partialStub("Do further analysis on timestamp {$timestamp}."); + } + + // 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(); + + // And return it + return $entry; + } + + /** + * Getter for field name * + * @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 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; + } + + /** + * Updates a given field with new value + * + * @param $fieldName Field to update + * @param $fieldValue New value to store * @return void + * @throws DatabaseUpdateSupportException If this class does not support database updates */ - public function debugBacktrace () { - // Sorry, there is no other way getting this nice backtrace - print "
\n";
-		debug_print_backtrace();
-		print "
"; - exit; + public function updateDatabaseField ($fieldName, $fieldValue) { + // Is updating database fields allowed by interface? + if (!$this instanceof Updateable) { + // Update not supported! + throw new DatabaseUpdateSupportException($this, self::EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED); + } // END - if + + // Get a critieria instance + $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); + + // Add search criteria + $searchInstance->addCriteria(UserDatabaseWrapper::DB_COLUMN_USERNAME, $this->getUserName()); + $searchInstance->setLimit(1); + + // Now get another criteria + $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); + + // And add our both entries + $updateInstance->addCriteria($fieldName, $fieldValue); + + // Add the search criteria for searching for the right entry + $updateInstance->setSearchInstance($searchInstance); + + // Remember the update in database result + $this->getResultInstance()->add2UpdateQueue($updateInstance); } }