* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team * @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 * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Instance of a request class */ private $requestInstance = null; /** * Instance of a response class */ private $responseInstance = null; /** * Search criteria instance */ private $searchInstance = null; /** * Update criteria instance */ private $updateInstance = 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; /** * Instance for user class */ private $userInstance = null; /** * A controller instance */ private $controllerInstance = null; /** * Instance of a RNG */ private $rngInstance = null; /** * Instance of an Iterator class */ private $iteratorInstance = null; /** * Instance of the list */ private $listInstance = null; /** * The real class name */ private $realClass = 'BaseFrameworkSystem'; /** * Thousands seperator */ private $thousands = '.'; // German /** * Decimal seperator */ private $decimals = ','; // German /*********************** * Exception codes.... * ***********************/ // @todo Try to clean these constants up const EXCEPTION_IS_NULL_POINTER = 0x001; const EXCEPTION_IS_NO_OBJECT = 0x002; const EXCEPTION_IS_NO_ARRAY = 0x003; const EXCEPTION_MISSING_METHOD = 0x004; const EXCEPTION_CLASSES_NOT_MATCHING = 0x005; const EXCEPTION_INDEX_OUT_OF_BOUNDS = 0x006; const EXCEPTION_DIMENSION_ARRAY_INVALID = 0x007; const EXCEPTION_ITEM_NOT_TRADEABLE = 0x008; const EXCEPTION_ITEM_NOT_IN_PRICE_LIST = 0x009; const EXCEPTION_GENDER_IS_WRONG = 0x00a; const EXCEPTION_BIRTH_DATE_IS_INVALID = 0x00b; const EXCEPTION_EMPTY_STRUCTURES_ARRAY = 0x00c; const EXCEPTION_HAS_ALREADY_PERSONELL_LIST = 0x00d; const EXCEPTION_NOT_ENOUGTH_UNEMPLOYEES = 0x00e; const EXCEPTION_TOTAL_PRICE_NOT_CALCULATED = 0x00f; const EXCEPTION_HARBOR_HAS_NO_SHIPYARDS = 0x010; const EXCEPTION_CONTRACT_PARTNER_INVALID = 0x011; const EXCEPTION_CONTRACT_PARTNER_MISMATCH = 0x012; const EXCEPTION_CONTRACT_ALREADY_SIGNED = 0x013; const EXCEPTION_UNEXPECTED_EMPTY_STRING = 0x014; const EXCEPTION_PATH_NOT_FOUND = 0x015; const EXCEPTION_INVALID_PATH_NAME = 0x016; const EXCEPTION_READ_PROTECED_PATH = 0x017; const EXCEPTION_WRITE_PROTECED_PATH = 0x018; const EXCEPTION_DIR_POINTER_INVALID = 0x019; const EXCEPTION_FILE_POINTER_INVALID = 0x01a; const EXCEPTION_INVALID_RESOURCE = 0x01b; const EXCEPTION_UNEXPECTED_OBJECT = 0x01c; const EXCEPTION_LIMIT_ELEMENT_IS_UNSUPPORTED = 0x01d; const EXCEPTION_GETTER_IS_MISSING = 0x01e; const EXCEPTION_ARRAY_EXPECTED = 0x01f; const EXCEPTION_ARRAY_HAS_INVALID_COUNT = 0x020; const EXCEPTION_ID_IS_INVALID_FORMAT = 0x021; const EXCEPTION_MD5_CHECKSUMS_MISMATCH = 0x022; const EXCEPTION_UNEXPECTED_STRING_SIZE = 0x023; const EXCEPTION_SIMULATOR_ID_INVALID = 0x024; const EXCEPTION_MISMATCHING_COMPRESSORS = 0x025; const EXCEPTION_CONTAINER_ITEM_IS_NULL = 0x026; const EXCEPTION_ITEM_IS_NO_ARRAY = 0x027; const EXCEPTION_CONTAINER_MAYBE_DAMAGED = 0x028; const EXCEPTION_INVALID_STRING = 0x029; 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; const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040; /** * Protected super constructor * * @param $className Name of the class * @return void */ protected function __construct ($className) { // Set real class $this->setRealClass($className); // Set configuration instance if no registry if (!$this instanceof Register) { // Because registries doesn't need to be configured $this->setConfigInstance(FrameworkConfiguration::getInstance()); } // END - if } /** * Destructor reached... * * @return void * @todo This is old code. Do we still need this old lost code? */ public function __destruct() { // Flush any updated entries to the database $this->flushPendingUpdates(); // Is this object already destroyed? if ($this->__toString() != 'DestructedObject') { // Destroy all informations about this class but keep some text about it alive $this->setRealClass('DestructedObject'); } elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) { // Already destructed object $this->debugOutput(sprintf("[%s:] The object %s is already destroyed.", __CLASS__, $this->__toString() )); } } /** * The call method where all non-implemented methods end up * * @return void */ public final function __call ($methodName, $args) { // Implode all given arguments $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); // Add length if type is string if (gettype($arg) == 'string') $argsString .= ', '.strlen($arg); // Closing bracket $argsString .= '), '; } // END - foreach // Remove last comma if (substr($argsString, -2, 1) == ',') { $argsString = substr($argsString, 0, -2); } // END - if } else { // Invalid arguments! $argsString = '!INVALID:' . gettype($args) . '!'; } // Output stub message $this->debugOutput(sprintf("[%s->%s] Stub! Args: %s", $this->__toString(), $methodName, $argsString )); // Return nothing return null; } /** * 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 update instance * * @param $updateInstance Searchable criteria instance * @return void */ public final function setUpdateInstance (LocalUpdateCriteria $updateInstance) { $this->updateInstance = $updateInstance; } /** * Getter for update instance * * @return $updateInstance Updateable criteria instance */ public final function getUpdateInstance () { return $this->updateInstance; } /** * 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 * @return void */ public final function setConfigInstance (FrameworkConfiguration $configInstance) { Registry::getRegistry()->addInstance('config', $configInstance); } /** * Getter for configuration instance * * @return $configInstance Configuration instance */ public final function getConfigInstance () { $configInstance = Registry::getRegistry()->getInstance('config'); return $configInstance; } /** * Setter for debug instance * * @param $debugInstance The instance for debug output class * @return void */ public final function setDebugInstance (DebugMiddleware $debugInstance) { Registry::getRegistry()->addInstance('debug', $debugInstance); } /** * Getter for debug instance * * @return $debugInstance Instance to class DebugConsoleOutput or DebugWebOutput */ public final function getDebugInstance () { // Get debug instance $debugInstance = Registry::getRegistry()->getInstance('debug'); // Return it return $debugInstance; } /** * Setter for web output instance * * @param $webInstance The instance for web output class * @return void */ public final function setWebOutputInstance (OutputStreamer $webInstance) { Registry::getRegistry()->addInstance('web_output', $webInstance); } /** * Getter for web output instance * * @return $webOutputInstance - Instance to class WebOutput */ public final function getWebOutputInstance () { $webOutputInstance = Registry::getRegistry()->getInstance('web_output'); return $webOutputInstance; } /** * Setter for database instance * * @param $dbInstance The instance for the database connection * (forced DatabaseConnection) * @return void */ public final function setDatabaseInstance (DatabaseConnection $dbInstance) { Registry::getRegistry()->addInstance('db_instance', $dbInstance); } /** * Getter for database layer * * @return $dbInstance The database layer instance */ public final function getDatabaseInstance () { // Get instance $dbInstance = Registry::getRegistry()->getInstance('db_instance'); // Return instance return $dbInstance; } /** * Setter for compressor channel * * @param $compressorInstance An instance of CompressorChannel * @return void */ public final function setCompressorChannel (CompressorChannel $compressorInstance) { Registry::getRegistry()->addInstance('compressor', $compressorInstance); } /** * Getter for compressor channel * * @return $compressorInstance The compressor channel */ public final function getCompressorChannel () { $compressorInstance = Registry::getRegistry()->getInstance('compressor'); return $compressorInstance; } /** * Protected getter for a manageable application helper class * * @return $applicationInstance An instance of a manageable application helper class */ protected final function getApplicationInstance () { $applicationInstance = Registry::getRegistry()->getInstance('application'); return $applicationInstance; } /** * Setter for a manageable application helper class * * @param $applicationInstance An instance of a manageable application helper class * @return void */ public final function setApplicationInstance (ManageableApplication $applicationInstance) { Registry::getRegistry()->addInstance('application', $applicationInstance); } /** * 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 request instance * * @return $requestInstance An instance of a Requestable class */ public final function getRequestInstance () { return $this->requestInstance; } /** * Setter for response instance * * @param $responseInstance An instance of a Responseable class * @return void */ public final function setResponseInstance (Responseable $responseInstance) { $this->responseInstance = $responseInstance; } /** * Getter for response instance * * @return $responseInstance An instance of a Responseable class */ public final function getResponseInstance () { return $this->responseInstance; } /** * Getter for $realClass * * @return $realClass The name of the real class (not BaseFrameworkSystem) */ public final function __toString () { return $this->realClass; } /** * 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 wether 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 Wether both objects equals */ public function equals (FrameworkInterface $objectInstance) { // Now test it $equals = (( $this->__toString() == $objectInstance->__toString() ) && ( $this->hashCode() == $objectInstance->hashCode() )); // Return the result return $result; } /** * 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 * @throws MissingDecimalsThousandsSeperatorException If decimals or * thousands seperator * 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 MissingDecimalsThousandsSeperatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); } // 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 * * @return $langInstance An instance to the language sub-system */ protected final function getLanguageInstance () { $langInstance = Registry::getRegistry()->getInstance('language'); return $langInstance; } /** * Setter for language instance * * @param $langInstance An instance to the language sub-system * @return void * @see LanguageSystem */ public final function setLanguageInstance (ManageableLanguage $langInstance) { 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 .= '/'; 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 (FrameworkInterface $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 // 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($appInstance)); // 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 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::getInstance()->getPrintableIncludeList() )); } /** * Output a partial stub message for the caller method * * @param $message An optional message to display * @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."
\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 === false) die(); // Die here if not printed } else { // Put directly out if ($doPrint === true) { 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 = $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("\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 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; } /** * Filter a given number into a localized number * * @param $value The raw value from e.g. database * @return $localized Localized value */ public function doFilterFormatNumber ($value) { // Generate it from config and localize depencies 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; } /** * "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() === 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; } /** * 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(); //* 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; } /** * 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; } /** * Setter for controller instance (this surely breaks a bit the MVC patterm) * * @param $controllerInstance An instance of the controller * @return void */ public final function setControllerInstance (Controller $controllerInstance) { $this->controllerInstance = $controllerInstance; } /** * Getter for controller instance (this surely breaks a bit the MVC patterm) * * @return $controllerInstance An instance of the controller */ public final function getControllerInstance () { return $this->controllerInstance; } /** * Flushs all pending updates to the database layer * * @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); // Yes, then send the whole result to the database layer $wrapperInstance->doUpdateByResult($this->getResultInstance()); } // END - if } /** * Outputs a deprecation warning to the developer. * * @param $message The message we shall output to the developer * @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); } } /** * 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()); } /** * Checks wether the given PHP extension is loaded * * @param $phpExtension The PHP extension we shall check * @return $isLoaded Wether the PHP extension is loaded */ public final function isPhpExtensionLoaded ($phpExtension) { // Is it loaded? $isLoaded = in_array($phpExtension, get_loaded_extensions()); // Return result return $isLoaded; } /** * Setter for RNG instance * * @param $rngInstance An instance of a random number generator (RNG) * @return void */ protected final function setRngInstance (RandomNumberGenerator $rngInstance) { $this->rngInstance = $rngInstance; } /** * Getter for RNG instance * * @return $rngInstance An instance of a random number generator (RNG) */ public final function getRngInstance () { return $this->rngInstance; } /** * Setter for Iterator instance * * @param $iteratorInstance An instance of an Iterator * @return void */ protected final function setIteratorInstance (Iterator $iteratorInstance) { $this->iteratorInstance = $iteratorInstance; } /** * Getter for Iterator instance * * @return $iteratorInstance An instance of an Iterator */ public final function getIteratorInstance () { return $this->iteratorInstance; } /** * "Getter" as a time() replacement but with milliseconds. You should use this * method instead of the encapsulated getimeofday() function. * * @return $milliTime Timestamp with milliseconds */ public function getMilliTime () { // Get the time of day as float $milliTime = gettimeofday(true); // Return it return $milliTime; } /** * Idles (sleeps) for given milliseconds * * @return $hasSlept Wether it goes fine */ 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 $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; } /** * Setter for the list instance * * @param $listInstance A list of Listable * @return void */ protected final function setListInstance (Listable $listInstance) { $this->listInstance = $listInstance; } /** * Getter for the list instance * * @return $listInstance A list of Listable */ protected final function getListInstance () { return $this->listInstance; } } // [EOF] ?>