From 8e5bb526ab03b1de868e80e9bf0ef662ba2421a3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Sat, 28 Apr 2012 08:57:20 +0000 Subject: [PATCH] Sorted fields/attributes and setter/getter to top, except realClass. That always remains on top of all --- .../main/class_BaseFrameworkSystem.php | 1409 ++++++++--------- 1 file changed, 703 insertions(+), 706 deletions(-) diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 78242807..370e2ff0 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -23,6 +23,11 @@ * along with this program. If not, see . */ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { + /** + * The real class name + */ + private $realClass = 'BaseFrameworkSystem'; + /** * Instance of a request class */ @@ -158,11 +163,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $visitorInstance = NULL; - /** - * The real class name - */ - private $realClass = 'BaseFrameworkSystem'; - /** * An instance of a database wrapper class */ @@ -457,6 +457,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { )); } + /** + * Setter for the real class name + * + * @param $realClass Class name (string) + * @return void + */ + public final function setRealClass ($realClass) { + // Set real class + $this->realClass = (string) $realClass; + } + /** * Setter for database result instance * @@ -600,7 +611,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for web output instance * - * @param $webInstance The instance for web output class + * @param $webInstance The instance for web output class * @return void */ public final function setWebOutputInstance (OutputStreamer $webInstance) { @@ -620,7 +631,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for database instance * - * @param $databaseInstance The instance for the database connection (forced DatabaseConnection) + * @param $databaseInstance The instance for the database connection (forced DatabaseConnection) * @return void */ public final function setDatabaseInstance (DatabaseConnection $databaseInstance) { @@ -643,7 +654,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for compressor channel * - * @param $compressorInstance An instance of CompressorChannel + * @param $compressorInstance An instance of CompressorChannel * @return void */ public final function setCompressorChannel (CompressorChannel $compressorInstance) { @@ -718,79 +729,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { return $this->responseInstance; } - /** - * Setter for the real class name - * - * @param $realClass Class name (string) - * @return void - */ - public final function setRealClass ($realClass) { - // Cast to string - $realClass = (string) $realClass; - - // Set real class - $this->realClass = $realClass; - } - - /** - * Checks whether an object equals this object. You should overwrite this - * method to implement own equality checks - * - * @param $objectInstance An instance of a FrameworkInterface object - * @return $equals Whether both objects equals - */ - public function equals (FrameworkInterface $objectInstance) { - // Now test it - $equals = (( - $this->__toString() == $objectInstance->__toString() - ) && ( - $this->hashCode() == $objectInstance->hashCode() - )); - - // Return the result - return $equals; - } - - /** - * Generates a generic hash code of this class. You should really overwrite - * this method with your own hash code generator code. But keep KISS in mind. - * - * @return $hashCode A generic hash code respresenting this whole class - */ - public function hashCode () { - // Simple hash code - return crc32($this->__toString()); - } - - /** - * Formats computer generated price values into human-understandable formats - * with thousand and decimal separators. - * - * @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 MissingDecimalsThousandsSeparatorException If decimals or - * thousands separator - * is missing - */ - public function formatCurrency ($value, $currency = '€', $decNum = 2) { - // Are all required attriutes set? - if ((!isset($this->decimals)) || (!isset($this->thousands))) { - // Throw an exception - throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); - } // END - if - - // Cast the number - $value = (float) $value; - - // Reformat the US number - $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency; - - // Return as string... - return $price; - } - /** * Private getter for language instance * @@ -812,22 +750,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { Registry::getRegistry()->addInstance('language', $langInstance); } - /** - * 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 .= '/'; - } // END - if - - // Return string with trailing slash - return $str; - } - /** * Private getter for file IO instance * @@ -848,897 +770,972 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Prepare the template engine (WebTemplateEngine by default) for a given - * application helper instance (ApplicationHelper by default). + * Protected setter for user instance * - * @param $applicationInstance An application helper instance or - * null if we shall use the default - * @return $templateInstance The template engine instance - * @throws NullPointerException If the discovered application - * instance is still null + * @param $userInstance An instance of a user class + * @return void */ - protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) { - // Is the application instance set? - if (is_null($applicationInstance)) { - // Get the current instance - $applicationInstance = $this->getApplicationInstance(); - - // Still null? - if (is_null($applicationInstance)) { - // Thrown an exception - throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); - } // END - if - } // END - if - - // Initialize the template engine - $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + protected final function setUserInstance (ManageableAccount $userInstance) { + $this->userInstance = $userInstance; + } - // Return the prepared instance - return $templateInstance; + /** + * Getter for user instance + * + * @return $userInstance An instance of a user class + */ + public final function getUserInstance () { + return $this->userInstance; } /** - * Debugs this instance by putting out it's full content + * Setter for controller instance (this surely breaks a bit the MVC patterm) * - * @param $message Optional message to show in debug output + * @param $controllerInstance An instance of the controller * @return void */ - public final function debugInstance ($message = '') { - // Restore the error handler to avoid trouble with missing array elements or undeclared variables - restore_error_handler(); - - // Init content - $content = ''; - - // Is a message set? - if (!empty($message)) { - // Construct message - $content = sprintf("
Message: %s
\n", $message); - } // END - if - - // 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(), - $content, - ClassLoader::getSelfInstance()->getPrintableIncludeList() - )); + public final function setControllerInstance (Controller $controllerInstance) { + $this->controllerInstance = $controllerInstance; } /** - * Replaces control characters with printable output + * Getter for controller instance (this surely breaks a bit the MVC patterm) * - * @param $str String with control characters - * @return $str Replaced string + * @return $controllerInstance An instance of the controller */ - protected function replaceControlCharacters ($str) { - // Replace them - $str = str_replace( - chr(13), '[r]', str_replace( - chr(10), '[n]', str_replace( - chr(9) , '[t]', - $str - ))); - - // Return it - return $str; + public final function getControllerInstance () { + return $this->controllerInstance; } /** - * Output a partial stub message for the caller method + * Setter for RNG instance * - * @param $message An optional message to display + * @param $rngInstance An instance of a random number generator (RNG) * @return void */ - 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 . '
' + chr(10)); - } + protected final function setRngInstance (RandomNumberGenerator $rngInstance) { + $this->rngInstance = $rngInstance; } /** - * Outputs a debug backtrace and stops further script execution + * Getter for RNG instance * - * @param $message An optional message to output - * @param $doExit Whether exit the program (true is default) - * @return void + * @return $rngInstance An instance of a random number generator (RNG) */ - public function debugBackTrace ($message = '', $doExit = true) { - // Sorry, there is no other way getting this nice backtrace - if (!empty($message)) { - // Output message - printf("Message: %s
\n", $message); - } // END - if - - print('
');
-		debug_print_backtrace();
-		print('
'); - - // Exit program? - if ($doExit === true) { - exit(); - } // END - if + public final function getRngInstance () { + return $this->rngInstance; } /** - * Outputs a debug message whether to debug instance (should be set!) or dies with or pints the message + * Setter for Cryptable instance * - * @param $message Message we shall send out... - * @param $doPrint Whether we shall print or die here which first is the default + * @param $cryptoInstance An instance of a Cryptable class * @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 === false) { - // Die here if not printed - die(); - } // END - if - } else { - // Put directly out - if ($doPrint === true) { - // Are debug times enabled? - if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') { - // Output it first - print($this->getPrintableExecutionTime()); - } // END - if - - // Print message - print($message . chr(10)); - } else { - // DO NOT REWRITE THIS TO app_die() !!! - die($message); - } - } + protected final function setCryptoInstance (Cryptable $cryptoInstance) { + $this->cryptoInstance = $cryptoInstance; } /** - * Converts e.g. a command from URL to a valid class by keeping out bad characters + * Getter for Cryptable instance * - * @param $str The string, what ever it is needs to be converted - * @return $className Generated class name + * @return $cryptoInstance An instance of a Cryptable class */ - public function convertToClassName ($str) { - // Init class name - $className = ''; - - // Convert all dashes in underscores - $str = $this->convertDashesToUnderscores($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; + public final function getCryptoInstance () { + return $this->cryptoInstance; } /** - * Converts dashes to underscores, e.g. useable for configuration entries + * Setter for the list instance * - * @param $str The string with maybe dashes inside - * @return $str The converted string with no dashed, but underscores + * @param $listInstance A list of Listable + * @return void */ - public final function convertDashesToUnderscores ($str) { - // Convert them all - $str = str_replace('-', '_', $str); - - // Return converted string - return $str; + protected final function setListInstance (Listable $listInstance) { + $this->listInstance = $listInstance; } /** - * Marks up the code by adding e.g. line numbers + * Getter for the list instance * - * @param $phpCode Unmarked PHP code - * @return $markedCode Marked PHP code + * @return $listInstance A list of Listable */ - 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(chr(10), $phpCode) as $lineNo => $code) { - // Add line numbers - $markedCode .= sprintf('%s: %s' + chr(10), - ($lineNo + 1), - htmlentities($code, ENT_QUOTES) - ); - } // END - foreach - - // Return the code - return $markedCode; + protected final function getListInstance () { + return $this->listInstance; } /** - * 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. + * Setter for the menu instance * - * @param $timestamp Timestamp to prepare (filter) for display - * @return $readable A readable timestamp + * @param $menuInstance A RenderableMenu instance + * @return void */ - 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()->getConfigEntry('german_date_time'), - $dateArray[0], - $dateArray[1], - $dateArray[2], - $timeArray[0], - $timeArray[1], - $timeArray[2] - ); - break; - - default: // Default is pass-through - $readable = $timestamp; - break; - } // END - switch - } - - // Return the stamp - return $readable; + protected final function setMenuInstance (RenderableMenu $menuInstance) { + $this->menuInstance = $menuInstance; } /** - * Filter a given number into a localized number + * Getter for the menu instance * - * @param $value The raw value from e.g. database - * @return $localized Localized value + * @return $menuInstance A RenderableMenu instance */ - public function doFilterFormatNumber ($value) { - // Generate it from config and localize dependencies - switch ($this->getLanguageInstance()->getLanguageCode()) { - case 'de': // German format is a bit different to default - $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), ',', '.'); - break; - - default: // US, etc. - $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), '.', ','); - break; - } // END - switch - - // Return it - return $localized; + protected final function getMenuInstance () { + return $this->menuInstance; } /** - * "Getter" for databse entry + * Setter for image instance * - * @return $entry An array with database entries - * @throws NullPointerException If the database result is not found - * @throws InvalidDatabaseResultException If the database result is invalid + * @param $imageInstance An instance of an image + * @return void */ - 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() === false) { - 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; + public final function setImageInstance (BaseImage $imageInstance) { + $this->imageInstance = $imageInstance; } /** - * Getter for field name + * Getter for image instance * - * @param $fieldName Field name which we shall get - * @return $fieldValue Field value from the user - * @throws NullPointerException If the result instance is null + * @return $imageInstance An instance of an image */ - 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(); - //* DEBUG: */ $this->debugOutput($fieldName.':
'.print_r($fieldArray, true).'
'); - - // Does the field exist? - if (isset($fieldArray[$fieldName])) { - // Get it - $fieldValue = $fieldArray[$fieldName]; - } // END - if - - // Return it - return $fieldValue; + public final function getImageInstance () { + return $this->imageInstance; } /** - * Protected setter for user instance + * Setter for stacker instance * - * @param $userInstance An instance of a user class + * @param $stackerInstance An instance of an stacker * @return void */ - protected final function setUserInstance (ManageableAccount $userInstance) { - $this->userInstance = $userInstance; + public final function setStackerInstance (Stackable $stackerInstance) { + $this->stackerInstance = $stackerInstance; } /** - * Getter for user instance + * Getter for stacker instance * - * @return $userInstance An instance of a user class + * @return $stackerInstance An instance of an stacker */ - public final function getUserInstance () { - return $this->userInstance; + public final function getStackerInstance () { + return $this->stackerInstance; } /** - * Setter for controller instance (this surely breaks a bit the MVC patterm) + * Setter for compressor instance * - * @param $controllerInstance An instance of the controller + * @param $compressorInstance An instance of an compressor * @return void */ - public final function setControllerInstance (Controller $controllerInstance) { - $this->controllerInstance = $controllerInstance; - } + public final function setCompressorInstance (Compressor $compressorInstance) { + $this->compressorInstance = $compressorInstance; + } /** - * Getter for controller instance (this surely breaks a bit the MVC patterm) + * Getter for compressor instance * - * @return $controllerInstance An instance of the controller + * @return $compressorInstance An instance of an compressor */ - public final function getControllerInstance () { - return $this->controllerInstance; + public final function getCompressorInstance () { + return $this->compressorInstance; } /** - * Flushs all pending updates to the database layer + * Setter for Parseable instance * + * @param $parserInstance An instance of an Parseable * @return void */ - public function flushPendingUpdates () { - // Get result instance - $resultInstance = $this->getResultInstance(); - - // Do we have data to update? - if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) { - // Get wrapper class name config entry - $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry(); - - // Create object instance - $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry); + public final function setParserInstance (Parseable $parserInstance) { + $this->parserInstance = $parserInstance; + } - // Yes, then send the whole result to the database layer - $wrapperInstance->doUpdateByResult($this->getResultInstance()); - } // END - if + /** + * Getter for Parseable instance + * + * @return $parserInstance An instance of an Parseable + */ + public final function getParserInstance () { + return $this->parserInstance; } /** - * Outputs a deprecation warning to the developer. + * Setter for ProtocolHandler instance * - * @param $message The message we shall output to the developer + * @param $protocolInstance An instance of an ProtocolHandler * @return void - * @todo Write a logging mechanism for productive mode */ - public function deprecationWarning ($message) { - // Is developer mode active? - if (defined('DEVELOPER')) { - // Debug instance is there? - if (!is_null($this->getDebugInstance())) { - // Output stub message - $this->debugOutput($message); - } else { - // Trigger an error - trigger_error($message . "
\n"); - } - } else { - // @TODO Finish this part! - $this->partialStub('Developer mode inactive. Message:' . $message); - } + public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) { + $this->protocolInstance = $protocolInstance; } /** - * Checks whether the given PHP extension is loaded + * Getter for ProtocolHandler instance * - * @param $phpExtension The PHP extension we shall check - * @return $isLoaded Whether the PHP extension is loaded + * @return $protocolInstance An instance of an ProtocolHandler */ - public final function isPhpExtensionLoaded ($phpExtension) { - // Is it loaded? - $isLoaded = in_array($phpExtension, get_loaded_extensions()); - - // Return result - return $isLoaded; + public final function getProtocolInstance () { + return $this->protocolInstance; } /** - * Setter for RNG instance + * Setter for BaseDatabaseWrapper instance * - * @param $rngInstance An instance of a random number generator (RNG) + * @param $wrapperInstance An instance of an BaseDatabaseWrapper * @return void */ - protected final function setRngInstance (RandomNumberGenerator $rngInstance) { - $this->rngInstance = $rngInstance; + public final function setWrapperInstance (BaseDatabaseWrapper $wrapperInstance) { + $this->wrapperInstance = $wrapperInstance; } /** - * Getter for RNG instance + * Getter for BaseDatabaseWrapper instance * - * @return $rngInstance An instance of a random number generator (RNG) + * @return $wrapperInstance An instance of an BaseDatabaseWrapper */ - public final function getRngInstance () { - return $this->rngInstance; + public final function getWrapperInstance () { + return $this->wrapperInstance; } /** - * Setter for Cryptable instance + * Setter for socket resource * - * @param $cryptoInstance An instance of a Cryptable class + * @param $socketResource A valid socket resource * @return void */ - protected final function setCryptoInstance (Cryptable $cryptoInstance) { - $this->cryptoInstance = $cryptoInstance; + public final function setSocketResource ($socketResource) { + $this->socketResource = $socketResource; } /** - * Getter for Cryptable instance + * Getter for socket resource * - * @return $cryptoInstance An instance of a Cryptable class + * @return $socketResource A valid socket resource */ - public final function getCryptoInstance () { - return $this->cryptoInstance; + public function getSocketResource () { + return $this->socketResource; } /** - * Setter for Iterator instance + * Setter for helper instance * - * @param $iteratorInstance An instance of an Iterator + * @param $helperInstance An instance of a helper class * @return void */ - protected final function setIteratorInstance (Iterator $iteratorInstance) { - $this->iteratorInstance = $iteratorInstance; + protected final function setHelperInstance (Helper $helperInstance) { + $this->helperInstance = $helperInstance; } /** - * Getter for Iterator instance + * Getter for helper instance * - * @return $iteratorInstance An instance of an Iterator + * @return $helperInstance An instance of a helper class */ - public final function getIteratorInstance () { - return $this->iteratorInstance; + public final function getHelperInstance () { + return $this->helperInstance; } /** - * "Getter" as a time() replacement but with milliseconds. You should use this - * method instead of the encapsulated getimeofday() function. + * Setter for a Sourceable instance * - * @return $milliTime Timestamp with milliseconds + * @param $sourceInstance The Sourceable instance + * @return void */ - public function getMilliTime () { - // Get the time of day as float - $milliTime = gettimeofday(true); - - // Return it - return $milliTime; + protected final function setSourceInstance (Sourceable $sourceInstance) { + $this->sourceInstance = $sourceInstance; } /** - * Idles (sleeps) for given milliseconds + * Getter for a Sourceable instance * - * @return $hasSlept Whether it goes fine + * @return $sourceInstance The Sourceable instance */ - public function idle ($milliSeconds) { - // Sleep is fine by default - $hasSlept = true; - - // Idle so long with found function - if (function_exists('time_sleep_until')) { - // Get current time and add idle time - $sleepUntil = $this->getMilliTime() + abs($milliSeconds) / 1000; - - // New PHP 5.1.0 function found, ignore errors - $hasSlept = @time_sleep_until($sleepUntil); - } else { - /* - * My Sun station doesn't have that function even with latest PHP - * package. :( - */ - usleep($milliSeconds * 1000); - } - - // Return result - return $hasSlept; + protected final function getSourceInstance () { + return $this->sourceInstance; } /** - * Setter for the list instance + * Getter for a InputStreamable instance * - * @param $listInstance A list of Listable - * @return void + * @param $inputStreamInstance The InputStreamable instance */ - protected final function setListInstance (Listable $listInstance) { - $this->listInstance = $listInstance; + protected final function getInputStreamInstance () { + return $this->inputStreamInstance; } /** - * Getter for the list instance + * Setter for a InputStreamable instance * - * @return $listInstance A list of Listable + * @param $inputStreamInstance The InputStreamable instance + * @return void */ - protected final function getListInstance () { - return $this->listInstance; + protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) { + $this->inputStreamInstance = $inputStreamInstance; } /** - * Setter for the menu instance + * Getter for a OutputStreamable instance * - * @param $menuInstance A RenderableMenu instance - * @return void + * @param $outputStreamInstance The OutputStreamable instance */ - protected final function setMenuInstance (RenderableMenu $menuInstance) { - $this->menuInstance = $menuInstance; + protected final function getOutputStreamInstance () { + return $this->outputStreamInstance; } /** - * Getter for the menu instance + * Setter for a OutputStreamable instance * - * @return $menuInstance A RenderableMenu instance + * @param $outputStreamInstance The OutputStreamable instance + * @return void */ - protected final function getMenuInstance () { - return $this->menuInstance; + protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) { + $this->outputStreamInstance = $outputStreamInstance; } /** - * Setter for image instance + * Setter for handler instance * - * @param $imageInstance An instance of an image + * @param $handlerInstance An instance of a Handleable class * @return void */ - public final function setImageInstance (BaseImage $imageInstance) { - $this->imageInstance = $imageInstance; + protected final function setHandlerInstance (Handleable $handlerInstance) { + $this->handlerInstance = $handlerInstance; } /** - * Getter for image instance + * Getter for handler instance * - * @return $imageInstance An instance of an image + * @return $handlerInstance A Networkable instance */ - public final function getImageInstance () { - return $this->imageInstance; + protected final function getHandlerInstance () { + return $this->handlerInstance; } /** - * Setter for stacker instance + * Setter for visitor instance * - * @param $stackerInstance An instance of an stacker + * @param $visitorInstance A Visitor instance * @return void */ - public final function setStackerInstance (Stackable $stackerInstance) { - $this->stackerInstance = $stackerInstance; + protected final function setVisitorInstance (Visitor $visitorInstance) { + $this->visitorInstance = $visitorInstance; } /** - * Getter for stacker instance + * Getter for visitor instance * - * @return $stackerInstance An instance of an stacker + * @return $visitorInstance A Visitor instance */ - public final function getStackerInstance () { - return $this->stackerInstance; + protected final function getVisitorInstance () { + return $this->visitorInstance; } /** - * Setter for compressor instance + * Setter for raw package Data * - * @param $compressorInstance An instance of an compressor + * @param $packageData Raw package Data * @return void */ - public final function setCompressorInstance (Compressor $compressorInstance) { - $this->compressorInstance = $compressorInstance; + public final function setPackageData (array $packageData) { + $this->packageData = $packageData; } /** - * Getter for compressor instance + * Getter for raw package Data * - * @return $compressorInstance An instance of an compressor + * @return $packageData Raw package Data */ - public final function getCompressorInstance () { - return $this->compressorInstance; + public function getPackageData () { + return $this->packageData; } + /** - * Setter for Parseable instance + * Setter for Iterator instance * - * @param $parserInstance An instance of an Parseable + * @param $iteratorInstance An instance of an Iterator * @return void */ - public final function setParserInstance (Parseable $parserInstance) { - $this->parserInstance = $parserInstance; + protected final function setIteratorInstance (Iterator $iteratorInstance) { + $this->iteratorInstance = $iteratorInstance; } /** - * Getter for Parseable instance + * Getter for Iterator instance * - * @return $parserInstance An instance of an Parseable + * @return $iteratorInstance An instance of an Iterator */ - public final function getParserInstance () { - return $this->parserInstance; + public final function getIteratorInstance () { + return $this->iteratorInstance; } /** - * Setter for ProtocolHandler instance + * Checks whether an object equals this object. You should overwrite this + * method to implement own equality checks * - * @param $protocolInstance An instance of an ProtocolHandler + * @param $objectInstance An instance of a FrameworkInterface object + * @return $equals Whether both objects equals + */ + public function equals (FrameworkInterface $objectInstance) { + // Now test it + $equals = (( + $this->__toString() == $objectInstance->__toString() + ) && ( + $this->hashCode() == $objectInstance->hashCode() + )); + + // Return the result + return $equals; + } + + /** + * Generates a generic hash code of this class. You should really overwrite + * this method with your own hash code generator code. But keep KISS in mind. + * + * @return $hashCode A generic hash code respresenting this whole class + */ + public function hashCode () { + // Simple hash code + return crc32($this->__toString()); + } + + /** + * Formats computer generated price values into human-understandable formats + * with thousand and decimal separators. + * + * @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 MissingDecimalsThousandsSeparatorException If decimals or + * thousands separator + * is missing + */ + public function formatCurrency ($value, $currency = '€', $decNum = 2) { + // Are all required attriutes set? + if ((!isset($this->decimals)) || (!isset($this->thousands))) { + // Throw an exception + throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); + } // END - if + + // Cast the number + $value = (float) $value; + + // Reformat the US number + $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency; + + // Return as string... + return $price; + } + + /** + * 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 .= '/'; + } // END - if + + // Return string with trailing slash + return $str; + } + + /** + * Prepare the template engine (WebTemplateEngine by default) for a given + * application helper instance (ApplicationHelper by default). + * + * @param $applicationInstance An application helper instance or + * null if we shall use the default + * @return $templateInstance The template engine instance + * @throws NullPointerException If the discovered application + * instance is still null + */ + protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) { + // Is the application instance set? + if (is_null($applicationInstance)) { + // Get the current instance + $applicationInstance = $this->getApplicationInstance(); + + // Still null? + if (is_null($applicationInstance)) { + // Thrown an exception + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } // END - if + } // END - if + + // Initialize the template engine + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + + // Return the prepared instance + return $templateInstance; + } + + /** + * Debugs this instance by putting out it's full content + * + * @param $message Optional message to show in debug output * @return void */ - public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) { - $this->protocolInstance = $protocolInstance; + public final function debugInstance ($message = '') { + // Restore the error handler to avoid trouble with missing array elements or undeclared variables + restore_error_handler(); + + // Init content + $content = ''; + + // Is a message set? + if (!empty($message)) { + // Construct message + $content = sprintf("
Message: %s
\n", $message); + } // END - if + + // 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(), + $content, + ClassLoader::getSelfInstance()->getPrintableIncludeList() + )); } /** - * Getter for ProtocolHandler instance + * Replaces control characters with printable output * - * @return $protocolInstance An instance of an ProtocolHandler + * @param $str String with control characters + * @return $str Replaced string */ - public final function getProtocolInstance () { - return $this->protocolInstance; + protected function replaceControlCharacters ($str) { + // Replace them + $str = str_replace( + chr(13), '[r]', str_replace( + chr(10), '[n]', str_replace( + chr(9) , '[t]', + $str + ))); + + // Return it + return $str; } /** - * Setter for BaseDatabaseWrapper instance + * Output a partial stub message for the caller method * - * @param $wrapperInstance An instance of an BaseDatabaseWrapper + * @param $message An optional message to display * @return void */ - public final function setWrapperInstance (BaseDatabaseWrapper $wrapperInstance) { - $this->wrapperInstance = $wrapperInstance; + 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 . '
' . chr(10)); + } + } + + /** + * Outputs a debug backtrace and stops further script execution + * + * @param $message An optional message to output + * @param $doExit Whether exit the program (true is default) + * @return void + */ + public function debugBackTrace ($message = '', $doExit = true) { + // Sorry, there is no other way getting this nice backtrace + if (!empty($message)) { + // Output message + printf("Message: %s
" . chr(10), $message); + } // END - if + + print('
');
+		debug_print_backtrace();
+		print('
'); + + // Exit program? + if ($doExit === true) { + exit(); + } // END - if + } + + /** + * Outputs a debug message whether to debug instance (should be set!) or dies with or pints the message + * + * @param $message Message we shall send out... + * @param $doPrint Whether 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 === false) { + // Die here if not printed + die(); + } // END - if + } else { + // Put directly out + if ($doPrint === true) { + // Are debug times enabled? + if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') { + // Output it first + print($this->getPrintableExecutionTime()); + } // END - if + + // Print message + print($message . chr(10)); + } 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 = $this->convertDashesToUnderscores($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; + } + + /** + * Converts dashes to underscores, e.g. useable for configuration entries + * + * @param $str The string with maybe dashes inside + * @return $str The converted string with no dashed, but underscores + */ + public final function convertDashesToUnderscores ($str) { + // Convert them all + $str = str_replace('-', '_', $str); + + // Return converted string + return $str; + } + + /** + * Marks up the code by adding e.g. line numbers + * + * @param $phpCode Unmarked PHP code + * @return $markedCode Marked PHP code + */ + 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(chr(10), $phpCode) as $lineNo => $code) { + // Add line numbers + $markedCode .= sprintf('%s: %s' . chr(10), + ($lineNo + 1), + htmlentities($code, ENT_QUOTES) + ); + } // END - foreach + + // Return the code + return $markedCode; } - /** - * Getter for BaseDatabaseWrapper instance - * - * @return $wrapperInstance An instance of an BaseDatabaseWrapper - */ - public final function getWrapperInstance () { - return $this->wrapperInstance; + /** + * 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()->getConfigEntry('german_date_time'), + $dateArray[0], + $dateArray[1], + $dateArray[2], + $timeArray[0], + $timeArray[1], + $timeArray[2] + ); + break; + + default: // Default is pass-through + $readable = $timestamp; + break; + } // END - switch + } + + // Return the stamp + return $readable; } /** - * Setter for socket resource + * Filter a given number into a localized number * - * @param $socketResource A valid socket resource - * @return void + * @param $value The raw value from e.g. database + * @return $localized Localized value */ - public final function setSocketResource ($socketResource) { - $this->socketResource = $socketResource; - } + public function doFilterFormatNumber ($value) { + // Generate it from config and localize dependencies + switch ($this->getLanguageInstance()->getLanguageCode()) { + case 'de': // German format is a bit different to default + $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), ',', '.'); + break; - /** - * Getter for socket resource - * - * @return $socketResource A valid socket resource - */ - public function getSocketResource () { - return $this->socketResource; - } + default: // US, etc. + $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), '.', ','); + break; + } // END - switch - /** - * Setter for helper instance - * - * @param $helperInstance An instance of a helper class - * @return void - */ - protected final function setHelperInstance (Helper $helperInstance) { - $this->helperInstance = $helperInstance; + // Return it + return $localized; } /** - * Getter for helper instance + * "Getter" for databse entry * - * @return $helperInstance An instance of a helper class + * @return $entry An array with database entries + * @throws NullPointerException If the database result is not found + * @throws InvalidDatabaseResultException If the database result is invalid */ - public final function getHelperInstance () { - return $this->helperInstance; - } + 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 - /** - * Setter for a Sourceable instance - * - * @param $sourceInstance The Sourceable instance - * @return void - */ - protected final function setSourceInstance (Sourceable $sourceInstance) { - $this->sourceInstance = $sourceInstance; - } + // Rewind it + $this->getResultInstance()->rewind(); - /** - * Getter for a Sourceable instance - * - * @return $sourceInstance The Sourceable instance - */ - protected final function getSourceInstance () { - return $this->sourceInstance; - } + // Do we have an entry? + if ($this->getResultInstance()->valid() === false) { + throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT); + } // END - if - /** - * Getter for a InputStreamable instance - * - * @param $inputStreamInstance The InputStreamable instance - */ - protected final function getInputStreamInstance () { - return $this->inputStreamInstance; - } + // Get next entry + $this->getResultInstance()->next(); - /** - * Setter for a InputStreamable instance - * - * @param $inputStreamInstance The InputStreamable instance - * @return void - */ - protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) { - $this->inputStreamInstance = $inputStreamInstance; - } + // Fetch it + $entry = $this->getResultInstance()->current(); - /** - * Getter for a OutputStreamable instance - * - * @param $outputStreamInstance The OutputStreamable instance - */ - protected final function getOutputStreamInstance () { - return $this->outputStreamInstance; + // And return it + return $entry; } /** - * Setter for a OutputStreamable instance + * Getter for field name * - * @param $outputStreamInstance The OutputStreamable instance - * @return void + * @param $fieldName Field name which we shall get + * @return $fieldValue Field value from the user + * @throws NullPointerException If the result instance is null */ - protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) { - $this->outputStreamInstance = $outputStreamInstance; + 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(); + //* DEBUG: */ $this->debugOutput($fieldName.':
'.print_r($fieldArray, true).'
'); + + // Does the field exist? + if (isset($fieldArray[$fieldName])) { + // Get it + $fieldValue = $fieldArray[$fieldName]; + } // END - if + + // Return it + return $fieldValue; } /** - * Setter for handler instance + * Flushs all pending updates to the database layer * - * @param $handlerInstance An instance of a Handleable class * @return void */ - protected final function setHandlerInstance (Handleable $handlerInstance) { - $this->handlerInstance = $handlerInstance; - } + public function flushPendingUpdates () { + // Get result instance + $resultInstance = $this->getResultInstance(); - /** - * Getter for handler instance - * - * @return $handlerInstance A Networkable instance - */ - protected final function getHandlerInstance () { - return $this->handlerInstance; + // Do we have data to update? + if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) { + // Get wrapper class name config entry + $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry(); + + // Create object instance + $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry); + + // Yes, then send the whole result to the database layer + $wrapperInstance->doUpdateByResult($this->getResultInstance()); + } // END - if } /** - * Setter for visitor instance + * Outputs a deprecation warning to the developer. * - * @param $visitorInstance A Visitor instance + * @param $message The message we shall output to the developer * @return void + * @todo Write a logging mechanism for productive mode */ - protected final function setVisitorInstance (Visitor $visitorInstance) { - $this->visitorInstance = $visitorInstance; + public function deprecationWarning ($message) { + // Is developer mode active? + if (defined('DEVELOPER')) { + // Debug instance is there? + if (!is_null($this->getDebugInstance())) { + // Output stub message + $this->debugOutput($message); + } else { + // Trigger an error + trigger_error($message . "
\n"); + } + } else { + // @TODO Finish this part! + $this->partialStub('Developer mode inactive. Message:' . $message); + } } /** - * Getter for visitor instance + * Checks whether the given PHP extension is loaded * - * @return $visitorInstance A Visitor instance + * @param $phpExtension The PHP extension we shall check + * @return $isLoaded Whether the PHP extension is loaded */ - protected final function getVisitorInstance () { - return $this->visitorInstance; + public final function isPhpExtensionLoaded ($phpExtension) { + // Is it loaded? + $isLoaded = in_array($phpExtension, get_loaded_extensions()); + + // Return result + return $isLoaded; } /** - * Setter for raw package Data + * "Getter" as a time() replacement but with milliseconds. You should use this + * method instead of the encapsulated getimeofday() function. * - * @param $packageData Raw package Data - * @return void + * @return $milliTime Timestamp with milliseconds */ - public final function setPackageData (array $packageData) { - $this->packageData = $packageData; + public function getMilliTime () { + // Get the time of day as float + $milliTime = gettimeofday(true); + + // Return it + return $milliTime; } /** - * Getter for raw package Data + * Idles (sleeps) for given milliseconds * - * @return $packageData Raw package Data + * @return $hasSlept Whether it goes fine */ - public function getPackageData () { - return $this->packageData; - } + public function idle ($milliSeconds) { + // Sleep is fine by default + $hasSlept = true; + + // Idle so long with found function + if (function_exists('time_sleep_until')) { + // Get current time and add idle time + $sleepUntil = $this->getMilliTime() + abs($milliSeconds) / 1000; + + // New PHP 5.1.0 function found, ignore errors + $hasSlept = @time_sleep_until($sleepUntil); + } else { + /* + * My Sun station doesn't have that function even with latest PHP + * package. :( + */ + usleep($milliSeconds * 1000); + } + // Return result + return $hasSlept; + } /** * Converts a hexadecimal string, even with negative sign as first string to * a decimal number using BC functions. -- 2.39.5