X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=4a6eb893e0418d524b38ba71681d6e859dc27db6;hp=ea3201f20a0cfbcb0c5d5555504e607d7d737696;hb=efba981c9bf18c733dfde945b09111ff4b6007ce;hpb=b3e47fb693fb8d40868158b0192b3392b309d97a diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index ea3201f..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 * @@ -63,6 +63,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $resolverInstance = null; + /** + * Template engine instance + */ + private $templateInstance = null; + + /** + * Database result instance + */ + private $resultInstance = null; + /** * The real class name */ @@ -141,19 +151,23 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_MISSING_FILE_IO_HANDLER = 0x02f; const EXCEPTION_MISSING_ELEMENT = 0x030; const EXCEPTION_HEADERS_ALREADY_SENT = 0x031; - const EXCEPTION_DEFAUL_CONTROLLER_GONE = 0x032; + 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 @@ -193,24 +207,18 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * 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.", - __CLASS__, $this->__toString() - )); - } // END - if - + 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.", + $this->debugOutput(sprintf("[%s:] The object %s is already destroyed.", __CLASS__, $this->__toString() )); } @@ -255,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 @@ -265,14 +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); } // Output stub message - $this->getDebugInstance()->output(sprintf("[%s::%s] Stub! Args: %s", + $this->debugOutput(sprintf("[%s->%s] Stub! Args: %s", $this->__toString(), $methodName, $argsString @@ -307,13 +320,52 @@ 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 * @@ -368,7 +420,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * * @return $cfgInstance Configuration instance */ - protected final function getConfigInstance () { + public final function getConfigInstance () { $cfgInstance = Registry::getRegistry()->getInstance('config'); return $cfgInstance; } @@ -818,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 @@ -833,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 @@ -879,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 @@ -904,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", @@ -925,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; } /** @@ -937,13 +989,20 @@ 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
Loaded includes:
%s
", + ApplicationEntryPoint::app_die(sprintf("%s debug output:
%s
\nLoaded includes:
%s
", $this->__toString(), $content, ClassLoader::getInstance()->getPrintableIncludeList() @@ -961,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!", @@ -975,12 +1034,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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->getDebugInstance()->output($stubMessage); + $this->debugOutput($stubMessage); } else { // Trigger an error trigger_error($stubMessage."
\n"); @@ -992,7 +1051,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * * @return void */ - public function debugBacktrace () { + public function debugBackTrace () { // Sorry, there is no other way getting this nice backtrace print "
\n";
 		debug_print_backtrace();
@@ -1004,10 +1063,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 	 * 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 last is the default
+	 * @param	$doPrint	Wether we shall print or die here which first is the default
 	 * @return	void
 	 */
-	public function debugOutput ($message, $doPrint = false) {
+	public function debugOutput ($message, $doPrint = true) {
 		// Get debug instance
 		$debugInstance = $this->getDebugInstance();
 
@@ -1018,10 +1077,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 			if (!$doPrint) die(); // Die here if not printed
 		} else {
 			// Put directly out
-			// DO NOT REWRITE THIS TO app_die() !!!
 			if ($doPrint) {
 				print($message);
 			} else {
+				// DO NOT REWRITE THIS TO app_die() !!!
 				die($message);
 			}
 		}
@@ -1084,6 +1143,130 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 		// 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 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);
+	}
 }
 
 // [EOF]