*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
+ /**
+ * The real class name
+ */
+ private $realClass = 'BaseFrameworkSystem';
+
/**
* Instance of a request class
*/
- private $requestInstance = null;
+ private $requestInstance = NULL;
/**
* Instance of a response class
*/
- private $responseInstance = null;
+ private $responseInstance = NULL;
/**
* Search criteria instance
*/
- private $searchInstance = null;
+ private $searchInstance = NULL;
/**
* Update criteria instance
*/
- private $updateInstance = null;
+ private $updateInstance = NULL;
/**
* The file I/O instance for the template loader
*/
- private $fileIoInstance = null;
+ private $fileIoInstance = NULL;
/**
* Resolver instance
*/
- private $resolverInstance = null;
+ private $resolverInstance = NULL;
/**
* Template engine instance
*/
- private $templateInstance = null;
+ private $templateInstance = NULL;
/**
* Database result instance
*/
- private $resultInstance = null;
+ private $resultInstance = NULL;
/**
* Instance for user class
*/
- private $userInstance = null;
+ private $userInstance = NULL;
/**
* A controller instance
*/
- private $controllerInstance = null;
+ private $controllerInstance = NULL;
/**
* Instance of a RNG
*/
- private $rngInstance = null;
+ private $rngInstance = NULL;
/**
* Instance of a crypto helper
*/
- private $cryptoInstance = null;
+ private $cryptoInstance = NULL;
/**
* Instance of an Iterator class
*/
- private $iteratorInstance = null;
+ private $iteratorInstance = NULL;
/**
* Instance of the list
*/
- private $listInstance = null;
+ private $listInstance = NULL;
/**
* Instance of a menu
*/
- private $menuInstance = null;
+ private $menuInstance = NULL;
/**
* Instance of the image
*/
- private $imageInstance = null;
+ private $imageInstance = NULL;
/**
* Instance of the stacker
*/
- private $stackerInstance = null;
+ private $stackerInstance = NULL;
/**
* A Compressor instance
*/
- private $compressorInstance = null;
+ private $compressorInstance = NULL;
/**
* A Parseable instance
*/
- private $parserInstance = null;
+ private $parserInstance = NULL;
/**
* A ProtocolHandler instance
*/
- private $protocolInstance = null;
+ private $protocolInstance = NULL;
/**
* A database wrapper instance
*/
- private $databaseInstance = null;
+ private $databaseInstance = NULL;
/**
* A helper instance for the form
*/
- private $helperInstance = null;
+ private $helperInstance = NULL;
/**
* An instance of a Sourceable class
*/
- private $sourceInstance = null;
+ private $sourceInstance = NULL;
/**
* An instance of a InputStreamable class
*/
- private $inputStreamInstance = null;
+ private $inputStreamInstance = NULL;
/**
* An instance of a OutputStreamable class
*/
- private $outputStreamInstance = null;
+ private $outputStreamInstance = NULL;
/**
* Networkable handler instance
*/
- private $handlerInstance = null;
+ private $handlerInstance = NULL;
/**
- * The real class name
+ * Visitor handler instance
*/
- private $realClass = 'BaseFrameworkSystem';
+ private $visitorInstance = NULL;
+
+ /**
+ * DHT instance
+ */
+ private $dhtInstance = NULL;
/**
* An instance of a database wrapper class
*/
- private $wrapperInstance = null;
+ private $wrapperInstance = NULL;
/**
- * Thousands seperator
+ * Thousands separator
*/
private $thousands = '.'; // German
/**
- * Decimal seperator
+ * Decimal separator
*/
private $decimals = ','; // German
const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040;
- // Hexadecimal->Decimal translation array
+ /**
+ * Hexadecimal->Decimal translation array
+ */
private static $hexdec = array(
'0' => 0,
'1' => 1,
'f' => 15
);
- // Decimal->hexadecimal translation array
+ /**
+ * Decimal->hexadecimal translation array
+ */
private static $dechex = array(
0 => '0',
1 => '1',
15 => 'f'
);
+ /**
+ * Startup time in miliseconds
+ */
+ private static $startupTime = 0;
+
/**
* Protected super constructor
*
// Set configuration instance if no registry ...
if (!$this instanceof Register) {
// ... because registries doesn't need to be configured
- $this->setConfigInstance(FrameworkConfiguration::getInstance());
+ $this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
+ } // END - if
+
+ // Is the startup time set? (0 cannot be true anymore)
+ if (self::$startupTime == 0) {
+ // Then set it
+ self::$startupTime = microtime(true);
} // END - if
}
/**
- * Destructor reached...
+ * Destructor for all classes
*
* @return void
*/
- public function __destruct() {
+ public function __destruct () {
// Flush any updated entries to the database
$this->flushPendingUpdates();
$this->setRealClass('DestructedObject');
} elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) {
// Already destructed object
- $this->debugOutput(sprintf("[%s:] The object <span class=\"object_name\">%s</span> is already destroyed.",
+ self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[%s:] The object <span class=\"object_name\">%s</span> is already destroyed.",
__CLASS__,
$this->__toString()
));
* @return void
*/
public final function __call ($methodName, $args) {
- // Implode all given arguments
+ return self::__callStatic($methodName, $args);
+ }
+
+ /**
+ * The __callStatic() method where all non-implemented static methods end up
+ *
+ * @param $methodName Name of the missing method
+ * @args $args Arguments passed to the method
+ * @return void
+ */
+ public static final function __callStatic ($methodName, $args) {
+ // Init argument string
$argsString = '';
+
+ // Is it empty or an array?
if (empty($args)) {
// No arguments
$argsString = 'NULL';
} elseif (is_array($args)) {
// Some arguments are there
foreach ($args as $arg) {
- // Add the type
- $argsString .= $this->replaceControlCharacters($arg) . ' (' . gettype($arg);
+ // Add the value itself if not array. This prevents 'array to string conversion' message
+ if (is_array($arg)) {
+ $argsString .= 'Array';
+ } else {
+ $argsString .= $arg;
+ }
+
+ // Add data about the argument
+ $argsString .= ' (' . gettype($arg);
- // Add length if type is string
if (is_string($arg)) {
- $argsString .= ', '.strlen($arg);
- } // END - if
+ // Add length for strings
+ $argsString .= ', ' . strlen($arg);
+ } elseif (is_array($arg)) {
+ // .. or size if array
+ $argsString .= ', ' . count($arg);
+ } elseif ($arg === true) {
+ // ... is boolean 'true'
+ $argsString .= ', true';
+ } elseif ($arg === false) {
+ // ... is boolean 'true'
+ $argsString .= ', false';
+ }
// Closing bracket
$argsString .= '), ';
}
// Output stub message
- $this->debugOutput(sprintf("[%s->%s] Stub! Args: %s",
- $this->__toString(),
+ // @TODO __CLASS__ does always return BaseFrameworkSystem but not the extending (=child) class
+ self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[unknown::%s:] Stub! Args: %s",
$methodName,
$argsString
));
// Return nothing
- return null;
+ return NULL;
}
/**
));
}
+ /**
+ * 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
*
/**
* 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) {
/**
* Setter for database instance
*
- * @param $dbInstance 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 $dbInstance) {
- Registry::getRegistry()->addInstance('db_instance', $dbInstance);
+ public final function setDatabaseInstance (DatabaseConnection $databaseInstance) {
+ Registry::getRegistry()->addInstance('db_instance', $databaseInstance);
}
/**
* Getter for database layer
*
- * @return $dbInstance The database layer instance
+ * @return $databaseInstance The database layer instance
*/
public final function getDatabaseInstance () {
// Get instance
- $dbInstance = Registry::getRegistry()->getInstance('db_instance');
+ $databaseInstance = Registry::getRegistry()->getInstance('db_instance');
// Return instance
- return $dbInstance;
+ return $databaseInstance;
}
/**
* Setter for compressor channel
*
- * @param $compressorInstance An instance of CompressorChannel
+ * @param $compressorInstance An instance of CompressorChannel
* @return void
*/
public final function setCompressorChannel (CompressorChannel $compressorInstance) {
}
/**
- * Setter for the real class name
+ * Private getter for language instance
*
- * @param $realClass Class name (string)
- * @return void
+ * @return $langInstance An instance to the language sub-system
*/
- public final function setRealClass ($realClass) {
- // Cast to string
- $realClass = (string) $realClass;
-
- // Set real class
- $this->realClass = $realClass;
+ protected final function getLanguageInstance () {
+ $langInstance = Registry::getRegistry()->getInstance('language');
+ return $langInstance;
}
/**
- * Checks wether an object equals this object. You should overwrite this
- * method to implement own equality checks
+ * Setter for language instance
*
- * @param $objectInstance An instance of a FrameworkInterface object
- * @return $equals Wether both objects equals
+ * @param $langInstance An instance to the language sub-system
+ * @return void
+ * @see LanguageSystem
*/
- public function equals (FrameworkInterface $objectInstance) {
- // Now test it
- $equals = ((
- $this->__toString() == $objectInstance->__toString()
- ) && (
- $this->hashCode() == $objectInstance->hashCode()
- ));
-
- // Return the result
- return $equals;
+ public final function setLanguageInstance (ManageableLanguage $langInstance) {
+ Registry::getRegistry()->addInstance('language', $langInstance);
}
/**
- * 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.
+ * Private getter for file IO instance
*
- * @return $hashCode A generic hash code respresenting this whole class
+ * @return $fileIoInstance An instance to the file I/O sub-system
*/
- public function hashCode () {
- // Simple hash code
- return crc32($this->__toString());
+ protected final function getFileIoInstance () {
+ return $this->fileIoInstance;
}
/**
- * Formats computer generated price values into human-understandable formats
- * with thousand and decimal seperators.
+ * Setter for file I/O instance
*
- * @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
+ * @param $fileIoInstance An instance to the file I/O sub-system
+ * @return void
*/
- 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);
- } // END - if
-
- // Cast the number
- $value = (float) $value;
-
- // Reformat the US number
- $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency;
+ public final function setFileIoInstance (IoHandler $fileIoInstance) {
+ $this->fileIoInstance = $fileIoInstance;
+ }
- // Return as string...
- return $price;
+ /**
+ * Protected setter for user instance
+ *
+ * @param $userInstance An instance of a user class
+ * @return void
+ */
+ protected final function setUserInstance (ManageableAccount $userInstance) {
+ $this->userInstance = $userInstance;
}
/**
- * Private getter for language instance
+ * Getter for user instance
*
- * @return $langInstance An instance to the language sub-system
+ * @return $userInstance An instance of a user class
*/
- protected final function getLanguageInstance () {
- $langInstance = Registry::getRegistry()->getInstance('language');
- return $langInstance;
+ public final function getUserInstance () {
+ return $this->userInstance;
}
/**
- * Setter for language instance
+ * Setter for controller instance (this surely breaks a bit the MVC patterm)
*
- * @param $langInstance An instance to the language sub-system
+ * @param $controllerInstance An instance of the controller
* @return void
- * @see LanguageSystem
*/
- public final function setLanguageInstance (ManageableLanguage $langInstance) {
- Registry::getRegistry()->addInstance('language', $langInstance);
+ public final function setControllerInstance (Controller $controllerInstance) {
+ $this->controllerInstance = $controllerInstance;
}
/**
- * Appends a trailing slash to a string
+ * Getter for controller instance (this surely breaks a bit the MVC patterm)
*
- * @param $str A string (maybe) without trailing slash
- * @return $str A string with an auto-appended trailing slash
+ * @return $controllerInstance An instance of the controller
*/
- public final function addMissingTrailingSlash ($str) {
- // Is there a trailing slash?
- if (substr($str, -1, 1) != '/') {
- $str .= '/';
- } // END - if
+ public final function getControllerInstance () {
+ return $this->controllerInstance;
+ }
- // Return string with trailing slash
- return $str;
+ /**
+ * 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;
}
/**
- * Private getter for file IO instance
+ * Getter for RNG instance
*
- * @return $fileIoInstance An instance to the file I/O sub-system
+ * @return $rngInstance An instance of a random number generator (RNG)
*/
- protected final function getFileIoInstance () {
- return $this->fileIoInstance;
+ public final function getRngInstance () {
+ return $this->rngInstance;
}
/**
- * Setter for file I/O instance
+ * Setter for Cryptable instance
*
- * @param $fileIoInstance An instance to the file I/O sub-system
+ * @param $cryptoInstance An instance of a Cryptable class
* @return void
*/
- public final function setFileIoInstance (FileIoHandler $fileIoInstance) {
- $this->fileIoInstance = $fileIoInstance;
+ protected final function setCryptoInstance (Cryptable $cryptoInstance) {
+ $this->cryptoInstance = $cryptoInstance;
}
/**
- * Prepare the template engine (WebTemplateEngine by default) for a given
- * application helper instance (ApplicationHelper by default).
+ * Getter for Cryptable 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
+ * @return $cryptoInstance An instance of a Cryptable class
*/
- 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;
+ public final function getCryptoInstance () {
+ return $this->cryptoInstance;
}
/**
- * Debugs this instance by putting out it's full content
+ * Setter for the list instance
*
- * @param $message Optional message to show in debug output
+ * @param $listInstance A list of Listable
* @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("<div class=\"debug_message\">Message: %s</div>\n", $message);
- } // END - if
-
- // Generate the output
- $content .= sprintf("<pre>%s</pre>",
- trim(
- htmlentities(
- print_r($this, true)
- )
- )
- );
+ protected final function setListInstance (Listable $listInstance) {
+ $this->listInstance = $listInstance;
+ }
- // Output it
- ApplicationEntryPoint::app_die(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
- $this->__toString(),
- $content,
- ClassLoader::getInstance()->getPrintableIncludeList()
- ));
+ /**
+ * Getter for the list instance
+ *
+ * @return $listInstance A list of Listable
+ */
+ protected final function getListInstance () {
+ return $this->listInstance;
}
/**
- * Replaces control characters with printable output
+ * Setter for the menu instance
*
- * @param $str String with control characters
- * @return $str Replaced string
+ * @param $menuInstance A RenderableMenu instance
+ * @return void
*/
- protected function replaceControlCharacters ($str) {
- // Replace them
- $str = str_replace(
- "\r", '[r]', str_replace(
- "\n", '[n]', str_replace(
- "\t", '[t]',
- $str
- )));
+ protected final function setMenuInstance (RenderableMenu $menuInstance) {
+ $this->menuInstance = $menuInstance;
+ }
- // Return it
- return $str;
+ /**
+ * Getter for the menu instance
+ *
+ * @return $menuInstance A RenderableMenu instance
+ */
+ protected final function getMenuInstance () {
+ return $this->menuInstance;
}
/**
- * Output a partial stub message for the caller method
+ * Setter for image instance
*
- * @param $message An optional message to display
+ * @param $imageInstance An instance of an image
* @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: <span id=\"stub_message\">%s</span>", $message);
- } // END - if
+ public final function setImageInstance (BaseImage $imageInstance) {
+ $this->imageInstance = $imageInstance;
+ }
- // Debug instance is there?
- if (!is_null($this->getDebugInstance())) {
- // Output stub message
- $this->debugOutput($stubMessage);
- } else {
- // Trigger an error
- trigger_error($stubMessage . "<br />\n");
- }
+ /**
+ * Getter for image instance
+ *
+ * @return $imageInstance An instance of an image
+ */
+ public final function getImageInstance () {
+ return $this->imageInstance;
}
/**
- * Outputs a debug backtrace and stops further script execution
+ * Setter for stacker instance
*
- * @param $message An optional message to output
+ * @param $stackerInstance An instance of an stacker
* @return void
*/
- public function debugBackTrace ($message = '') {
- // Sorry, there is no other way getting this nice backtrace
- if (!empty($message)) {
- // Output message
- printf("Message: %s<br />\n", $message);
- } // END - if
+ public final function setStackerInstance (Stackable $stackerInstance) {
+ $this->stackerInstance = $stackerInstance;
+ }
- print("<pre>\n");
- debug_print_backtrace();
- print("</pre>");
- exit();
+ /**
+ * Getter for stacker instance
+ *
+ * @return $stackerInstance An instance of an stacker
+ */
+ public final function getStackerInstance () {
+ return $this->stackerInstance;
}
/**
- * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message
+ * Setter for compressor instance
*
- * @param $message Message we shall send out...
- * @param $doPrint Wether we shall print or die here which first is the default
+ * @param $compressorInstance An instance of an compressor
* @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) {
- print($message);
- } else {
- // DO NOT REWRITE THIS TO app_die() !!!
- die($message);
- }
- }
+ public final function setCompressorInstance (Compressor $compressorInstance) {
+ $this->compressorInstance = $compressorInstance;
}
/**
- * Converts e.g. a command from URL to a valid class by keeping out bad characters
+ * Getter for compressor instance
*
- * @param $str The string, what ever it is needs to be converted
- * @return $className Generated class name
+ * @return $compressorInstance An instance of an compressor
*/
- 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 getCompressorInstance () {
+ return $this->compressorInstance;
}
/**
- * Converts dashes to underscores, e.g. useable for configuration entries
+ * Setter for Parseable instance
*
- * @param $str The string with maybe dashes inside
- * @return $str The converted string with no dashed, but underscores
+ * @param $parserInstance An instance of an Parseable
+ * @return void
*/
- public final function convertDashesToUnderscores ($str) {
- // Convert them all
- $str = str_replace('-', '_', $str);
-
- // Return converted string
- return $str;
+ public final function setParserInstance (Parseable $parserInstance) {
+ $this->parserInstance = $parserInstance;
}
/**
- * Marks up the code by adding e.g. line numbers
+ * Getter for Parseable instance
*
- * @param $phpCode Unmarked PHP code
- * @return $markedCode Marked PHP code
+ * @return $parserInstance An instance of an Parseable
*/
- 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("<div id=\"error_header\">File: <span id=\"error_data\">%s</span>, Line: <span id=\"error_data\">%s</span>, Message: <span id=\"error_data\">%s</span>, Type: <span id=\"error_data\">%s</span></div>",
- 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("<span id=\"code_line\">%s</span>: %s\n",
- ($lineNo + 1),
- htmlentities($code, ENT_QUOTES)
- );
- } // END - foreach
-
- // Return the code
- return $markedCode;
+ public final function getParserInstance () {
+ return $this->parserInstance;
}
/**
- * 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 ProtocolHandler instance
*
- * @param $timestamp Timestamp to prepare (filter) for display
- * @return $readable A readable timestamp
+ * @param $protocolInstance An instance of an ProtocolHandler
+ * @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;
+ public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) {
+ $this->protocolInstance = $protocolInstance;
}
/**
- * Filter a given number into a localized number
+ * Getter for ProtocolHandler instance
*
- * @param $value The raw value from e.g. database
- * @return $localized Localized value
+ * @return $protocolInstance An instance of an ProtocolHandler
*/
- 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;
+ public final function getProtocolInstance () {
+ return $this->protocolInstance;
}
/**
- * "Getter" for databse entry
+ * Setter for DatabaseWrapper 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 $wrapperInstance An instance of an DatabaseWrapper
+ * @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 setWrapperInstance (DatabaseWrapper $wrapperInstance) {
+ $this->wrapperInstance = $wrapperInstance;
}
/**
- * Getter for field name
+ * Getter for DatabaseWrapper 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 $wrapperInstance An instance of an DatabaseWrapper
*/
- public final function getField ($fieldName) {
- // Default field value
- $fieldValue = null;
-
- // Get result instance
- $resultInstance = $this->getResultInstance();
+ public final function getWrapperInstance () {
+ return $this->wrapperInstance;
+ }
- // 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
+ /**
+ * Setter for socket resource
+ *
+ * @param $socketResource A valid socket resource
+ * @return void
+ */
+ public final function setSocketResource ($socketResource) {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': socketResource=' . $socketResource . ',previous[' . gettype($this->socketResource) . ']=' . $this->socketResource);
+ $this->socketResource = $socketResource;
+ }
- // Get current array
- $fieldArray = $resultInstance->current();
- //* DEBUG: */ $this->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
+ /**
+ * Getter for socket resource
+ *
+ * @return $socketResource A valid socket resource
+ */
+ public final function getSocketResource () {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': socketResource[' . gettype($this->socketResource) . ']=' . $this->socketResource);
+ return $this->socketResource;
+ }
- // Does the field exist?
- if (isset($fieldArray[$fieldName])) {
- // Get it
- $fieldValue = $fieldArray[$fieldName];
- } // END - if
+ /**
+ * 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 $fieldValue;
+ /**
+ * Getter for helper instance
+ *
+ * @return $helperInstance An instance of a helper class
+ */
+ public final function getHelperInstance () {
+ return $this->helperInstance;
}
/**
- * Protected setter for user instance
+ * Setter for a Sourceable instance
*
- * @param $userInstance An instance of a user class
+ * @param $sourceInstance The Sourceable instance
* @return void
*/
- protected final function setUserInstance (ManageableAccount $userInstance) {
- $this->userInstance = $userInstance;
+ protected final function setSourceInstance (Sourceable $sourceInstance) {
+ $this->sourceInstance = $sourceInstance;
}
/**
- * Getter for user instance
+ * Getter for a Sourceable instance
*
- * @return $userInstance An instance of a user class
+ * @return $sourceInstance The Sourceable instance
*/
- public final function getUserInstance () {
- return $this->userInstance;
+ protected final function getSourceInstance () {
+ return $this->sourceInstance;
}
/**
- * Setter for controller instance (this surely breaks a bit the MVC patterm)
+ * Getter for a InputStreamable instance
*
- * @param $controllerInstance An instance of the controller
+ * @param $inputStreamInstance The InputStreamable instance
+ */
+ protected final function getInputStreamInstance () {
+ return $this->inputStreamInstance;
+ }
+
+ /**
+ * Setter for a InputStreamable instance
+ *
+ * @param $inputStreamInstance The InputStreamable instance
* @return void
*/
- public final function setControllerInstance (Controller $controllerInstance) {
- $this->controllerInstance = $controllerInstance;
+ protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) {
+ $this->inputStreamInstance = $inputStreamInstance;
}
/**
- * Getter for controller instance (this surely breaks a bit the MVC patterm)
+ * Getter for a OutputStreamable instance
*
- * @return $controllerInstance An instance of the controller
+ * @param $outputStreamInstance The OutputStreamable instance
*/
- public final function getControllerInstance () {
- return $this->controllerInstance;
+ protected final function getOutputStreamInstance () {
+ return $this->outputStreamInstance;
}
/**
- * Flushs all pending updates to the database layer
+ * Setter for a OutputStreamable instance
*
+ * @param $outputStreamInstance The OutputStreamable instance
* @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();
+ protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
+ $this->outputStreamInstance = $outputStreamInstance;
+ }
- // Create object instance
- $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry);
+ /**
+ * Setter for handler instance
+ *
+ * @param $handlerInstance An instance of a Handleable class
+ * @return void
+ */
+ protected final function setHandlerInstance (Handleable $handlerInstance) {
+ $this->handlerInstance = $handlerInstance;
+ }
- // Yes, then send the whole result to the database layer
- $wrapperInstance->doUpdateByResult($this->getResultInstance());
- } // END - if
+ /**
+ * Getter for handler instance
+ *
+ * @return $handlerInstance A Networkable instance
+ */
+ protected final function getHandlerInstance () {
+ return $this->handlerInstance;
}
/**
- * Outputs a deprecation warning to the developer.
+ * Setter for visitor instance
*
- * @param $message The message we shall output to the developer
+ * @param $visitorInstance A Visitor instance
* @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 . "<br />\n");
- }
- } else {
- // @TODO Finish this part!
- $this->partialStub('Developer mode inactive. Message:' . $message);
- }
+ protected final function setVisitorInstance (Visitor $visitorInstance) {
+ $this->visitorInstance = $visitorInstance;
}
/**
- * Checks wether the given PHP extension is loaded
+ * Getter for visitor instance
*
- * @param $phpExtension The PHP extension we shall check
- * @return $isLoaded Wether the PHP extension is loaded
+ * @return $visitorInstance A Visitor instance
*/
- public final function isPhpExtensionLoaded ($phpExtension) {
- // Is it loaded?
- $isLoaded = in_array($phpExtension, get_loaded_extensions());
-
- // Return result
- return $isLoaded;
+ protected final function getVisitorInstance () {
+ return $this->visitorInstance;
}
/**
- * Setter for RNG instance
+ * Setter for DHT instance
*
- * @param $rngInstance An instance of a random number generator (RNG)
+ * @param $dhtInstance A Distributable instance
* @return void
*/
- protected final function setRngInstance (RandomNumberGenerator $rngInstance) {
- $this->rngInstance = $rngInstance;
+ protected final function setDhtInstance (Distributable $dhtInstance) {
+ $this->dhtInstance = $dhtInstance;
}
/**
- * Getter for RNG instance
+ * Getter for DHT instance
*
- * @return $rngInstance An instance of a random number generator (RNG)
+ * @return $dhtInstance A Distributable instance
*/
- public final function getRngInstance () {
- return $this->rngInstance;
+ protected final function getDhtInstance () {
+ return $this->dhtInstance;
}
/**
- * Setter for Cryptable instance
+ * Setter for raw package Data
*
- * @param $cryptoInstance An instance of a Cryptable class
+ * @param $packageData Raw package Data
* @return void
*/
- protected final function setCryptoInstance (Cryptable $cryptoInstance) {
- $this->cryptoInstance = $cryptoInstance;
+ public final function setPackageData (array $packageData) {
+ $this->packageData = $packageData;
}
/**
- * Getter for Cryptable instance
+ * Getter for raw package Data
*
- * @return $cryptoInstance An instance of a Cryptable class
+ * @return $packageData Raw package Data
*/
- public final function getCryptoInstance () {
- return $this->cryptoInstance;
+ public function getPackageData () {
+ return $this->packageData;
}
+
/**
* Setter for Iterator instance
*
}
/**
- * "Getter" as a time() replacement but with milliseconds. You should use this
- * method instead of the encapsulated getimeofday() function.
+ * Checks whether an object equals this object. You should overwrite this
+ * method to implement own equality checks
*
- * @return $milliTime Timestamp with milliseconds
+ * @param $objectInstance An instance of a FrameworkInterface object
+ * @return $equals Whether both objects equals
*/
- public function getMilliTime () {
- // Get the time of day as float
- $milliTime = gettimeofday(true);
+ public function equals (FrameworkInterface $objectInstance) {
+ // Now test it
+ $equals = ((
+ $this->__toString() == $objectInstance->__toString()
+ ) && (
+ $this->hashCode() == $objectInstance->hashCode()
+ ));
- // Return it
- return $milliTime;
+ // Return the result
+ return $equals;
}
/**
- * Idles (sleeps) for given milliseconds
+ * 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 $hasSlept Wether it goes fine
+ * @return $hashCode A generic hash code respresenting this whole class
*/
- 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;
+ public function hashCode () {
+ // Simple hash code
+ return crc32($this->__toString());
}
/**
- * Setter for the list instance
+ * Formats computer generated price values into human-understandable formats
+ * with thousand and decimal separators.
*
- * @param $listInstance A list of Listable
- * @return void
+ * @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
*/
- protected final function setListInstance (Listable $listInstance) {
- $this->listInstance = $listInstance;
- }
+ 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
- /**
- * Getter for the list instance
- *
- * @return $listInstance A list of Listable
- */
- protected final function getListInstance () {
- return $this->listInstance;
- }
+ // Cast the number
+ $value = (float) $value;
- /**
- * Setter for the menu instance
- *
- * @param $menuInstance A RenderableMenu instance
- * @return void
- */
- protected final function setMenuInstance (RenderableMenu $menuInstance) {
- $this->menuInstance = $menuInstance;
- }
+ // Reformat the US number
+ $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency;
- /**
- * Getter for the menu instance
- *
- * @return $menuInstance A RenderableMenu instance
- */
- protected final function getMenuInstance () {
- return $this->menuInstance;
+ // Return as string...
+ return $price;
}
/**
- * Setter for image instance
+ * Appends a trailing slash to a string
*
- * @param $imageInstance An instance of an image
- * @return void
+ * @param $str A string (maybe) without trailing slash
+ * @return $str A string with an auto-appended trailing slash
*/
- public final function setImageInstance (BaseImage $imageInstance) {
- $this->imageInstance = $imageInstance;
+ 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;
}
/**
- * Getter for image instance
+ * Prepare the template engine (WebTemplateEngine by default) for a given
+ * application helper instance (ApplicationHelper by default).
*
- * @return $imageInstance An instance of an image
+ * @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
*/
- public final function getImageInstance () {
- return $this->imageInstance;
- }
+ 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
- /**
- * Setter for stacker instance
- *
- * @param $stackerInstance An instance of an stacker
- * @return void
- */
- public final function setStackerInstance (Stackable $stackerInstance) {
- $this->stackerInstance = $stackerInstance;
- }
+ // Initialize the template engine
+ $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class');
- /**
- * Getter for stacker instance
- *
- * @return $stackerInstance An instance of an stacker
- */
- public final function getStackerInstance () {
- return $this->stackerInstance;
+ // Return the prepared instance
+ return $templateInstance;
}
/**
- * Setter for compressor instance
+ * Debugs this instance by putting out it's full content
*
- * @param $compressorInstance An instance of an compressor
+ * @param $message Optional message to show in debug output
* @return void
*/
- public final function setCompressorInstance (Compressor $compressorInstance) {
- $this->compressorInstance = $compressorInstance;
+ 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("<div class=\"debug_message\">Message: %s</div>\n", $message);
+ } // END - if
+
+ // Generate the output
+ $content .= sprintf("<pre>%s</pre>",
+ trim(
+ htmlentities(
+ print_r($this, true)
+ )
+ )
+ );
+
+ // Output it
+ ApplicationEntryPoint::app_exit(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
+ $this->__toString(),
+ $content,
+ ClassLoader::getSelfInstance()->getPrintableIncludeList()
+ ));
}
/**
- * Getter for compressor instance
+ * Replaces control characters with printable output
*
- * @return $compressorInstance An instance of an compressor
+ * @param $str String with control characters
+ * @return $str Replaced string
*/
- public final function getCompressorInstance () {
- return $this->compressorInstance;
+ 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 Parseable instance
+ * Output a partial stub message for the caller method
*
- * @param $parserInstance An instance of an Parseable
+ * @param $message An optional message to display
* @return void
*/
- public final function setParserInstance (Parseable $parserInstance) {
- $this->parserInstance = $parserInstance;
- }
+ protected function partialStub ($message = '') {
+ // Get the backtrace
+ $backtrace = debug_backtrace();
- /**
- * Getter for Parseable instance
- *
- * @return $parserInstance An instance of an Parseable
- */
- public final function getParserInstance () {
- return $this->parserInstance;
+ // 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 .= ' Message: ' . $message;
+ } // END - if
+
+ // Debug instance is there?
+ if (!is_null($this->getDebugInstance())) {
+ // Output stub message
+ self::createDebugInstance(__CLASS__)->debugOutput($stubMessage);
+ } else {
+ // Trigger an error
+ trigger_error($stubMessage);
+ }
}
/**
- * Setter for ProtocolHandler instance
+ * Outputs a debug backtrace and stops further script execution
*
- * @param $protocolInstance An instance of an ProtocolHandler
+ * @param $message An optional message to output
+ * @param $doExit Whether exit the program (true is default)
* @return void
*/
- public final function setProtocolInstance (ProtocolHandler $protocolInstance) {
- $this->protocolInstance = $protocolInstance;
+ public function debugBackTrace ($message = '', $doExit = TRUE) {
+ // Sorry, there is no other way getting this nice backtrace
+ if (!empty($message)) {
+ // Output message
+ printf('Message: %s<br />' . chr(10), $message);
+ } // END - if
+
+ print('<pre>');
+ debug_print_backtrace();
+ print('</pre>');
+
+ // Exit program?
+ if ($doExit === true) {
+ exit();
+ } // END - if
}
/**
- * Getter for ProtocolHandler instance
+ * Creates an instance of a debugger instance
*
- * @return $protocolInstance An instance of an ProtocolHandler
+ * @param $className Name of the class (currently unsupported)
+ * @return $debugInstance An instance of a debugger class
*/
- public final function getProtocolInstance () {
- return $this->protocolInstance;
+ public final static function createDebugInstance ($className) {
+ // Init debug instance
+ $debugInstance = NULL;
+
+ // Try it
+ try {
+ // Get a debugger instance
+ $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class'));
+ } catch (NullPointerException $e) {
+ // Didn't work, no instance there
+ exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
+ }
+
+ // Empty string should be ignored and used for testing the middleware
+ DebugMiddleware::getSelfInstance()->output('');
+
+ // Return it
+ return $debugInstance;
}
/**
- * Setter for BaseDatabaseWrapper instance
+ * Outputs a debug message whether to debug instance (should be set!) or
+ * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to
+ * ApplicationEntryPoint::app_exit(), this would cause an endless loop.
*
- * @param $wrapperInstance An instance of an BaseDatabaseWrapper
+ * @param $message Message we shall send out...
+ * @param $doPrint Whether print or die here (default: print)
+ * @paran $stripTags Whether to strip tags (default: false)
* @return void
*/
- public final function setWrapperInstance (BaseDatabaseWrapper $wrapperInstance) {
- $this->wrapperInstance = $wrapperInstance;
+ public function debugOutput ($message, $doPrint = true, $stripTags = false) {
+ // Set debug instance to NULL
+ $debugInstance = NULL;
+
+ // Try it:
+ try {
+ // Get debug instance
+ $debugInstance = $this->getDebugInstance();
+ } catch (NullPointerException $e) {
+ // The debug instance is not set (yet)
+ }
+
+ // Is the debug instance there?
+ if (is_object($debugInstance)) {
+ // Use debug output handler
+ $debugInstance->output($message, $stripTags);
+
+ if ($doPrint === false) {
+ // Die here if not printed
+ exit();
+ } // END - if
+ } else {
+ // Are debug times enabled?
+ if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') {
+ // Prepent it
+ $message = $this->getPrintableExecutionTime() . $message;
+ } // END - if
+
+ // Put directly out
+ if ($doPrint === true) {
+ // Print message
+ print($message . chr(10));
+ } else {
+ // Die here
+ exit($message);
+ }
+ }
}
/**
- * Getter for BaseDatabaseWrapper instance
+ * Converts e.g. a command from URL to a valid class by keeping out bad characters
*
- * @return $wrapperInstance An instance of an BaseDatabaseWrapper
+ * @param $str The string, what ever it is needs to be converted
+ * @return $className Generated class name
*/
- public final function getWrapperInstance () {
- return $this->wrapperInstance;
+ 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;
}
/**
- * Setter for socket resource
+ * Converts dashes to underscores, e.g. useable for configuration entries
*
- * @param $socketResource A valid socket resource
- * @return void
+ * @param $str The string with maybe dashes inside
+ * @return $str The converted string with no dashed, but underscores
*/
- public final function setSocketResource ($socketResource) {
- $this->socketResource = $socketResource;
+ public final function convertDashesToUnderscores ($str) {
+ // Convert them all
+ $str = str_replace('-', '_', $str);
+
+ // Return converted string
+ return $str;
}
/**
- * Getter for socket resource
+ * Marks up the code by adding e.g. line numbers
*
- * @return $socketResource A valid socket resource
+ * @param $phpCode Unmarked PHP code
+ * @return $markedCode Marked PHP code
*/
- public function getSocketResource () {
- return $this->socketResource;
+ 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('<div id="error_header">File: <span id="error_data">%s</span>, Line: <span id="error_data">%s</span>, Message: <span id="error_data">%s</span>, Type: <span id="error_data">%s</span></div>',
+ 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('<span id="code_line">%s</span>: %s' . chr(10),
+ ($lineNo + 1),
+ htmlentities($code, ENT_QUOTES)
+ );
+ } // END - foreach
+
+ // Return the code
+ return $markedCode;
}
/**
- * Setter for helper instance
+ * 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 $helperInstance An instance of a helper class
- * @return void
+ * @param $timestamp Timestamp to prepare (filter) for display
+ * @return $readable A readable timestamp
*/
- protected final function setHelperInstance (Helper $helperInstance) {
- $this->helperInstance = $helperInstance;
- }
+ 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
+ }
- /**
- * Getter for helper instance
- *
- * @return $helperInstance An instance of a helper class
- */
- public final function getHelperInstance () {
- return $this->helperInstance;
+ // Return the stamp
+ return $readable;
}
/**
- * Setter for a Sourceable instance
+ * Filter a given number into a localized number
*
- * @param $sourceInstance The Sourceable instance
- * @return void
+ * @param $value The raw value from e.g. database
+ * @return $localized Localized value
*/
- protected final function setSourceInstance (Sourceable $sourceInstance) {
- $this->sourceInstance = $sourceInstance;
- }
+ 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 a InputStreamable instance
- *
- * @param $inputStreamInstance The InputStreamable instance
- */
- protected final function getInputStreamInstance () {
- return $this->inputStreamInstance;
+ default: // US, etc.
+ $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), '.', ',');
+ break;
+ } // END - switch
+
+ // Return it
+ return $localized;
}
/**
- * Setter for a InputStreamable instance
+ * "Getter" for databse entry
*
- * @param $inputStreamInstance The InputStreamable instance
- * @return void
+ * @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 setInputStreamInstance (InputStreamable $inputStreamInstance) {
- $this->inputStreamInstance = $inputStreamInstance;
+ 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 a OutputStreamable instance
+ * Getter for field name
*
- * @param $outputStreamInstance The OutputStreamable instance
+ * @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 getOutputStreamInstance () {
- return $this->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: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
+
+ // Convert dashes to underscore
+ $fieldName = $this->convertDashesToUnderscores($fieldName);
+
+ // Does the field exist?
+ if (isset($fieldArray[$fieldName])) {
+ // Get it
+ $fieldValue = $fieldArray[$fieldName];
+ } else {
+ // Missing field entry, may require debugging
+ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ':fieldname=' . $fieldName . ' not found!');
+ }
+
+ // Return it
+ return $fieldValue;
}
/**
- * Setter for a OutputStreamable instance
+ * Flushs all pending updates to the database layer
*
- * @param $outputStreamInstance The OutputStreamable instance
* @return void
*/
- protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
- $this->outputStreamInstance = $outputStreamInstance;
+ 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
}
/**
- * Setter for handler instance
+ * Outputs a deprecation warning to the developer.
*
- * @param $handlerInstance A Networkable instance
+ * @param $message The message we shall output to the developer
* @return void
+ * @todo Write a logging mechanism for productive mode
*/
- protected final function setHandlerInstance (Networkable $handlerInstance) {
- $this->handlerInstance = $handlerInstance;
+ public function deprecationWarning ($message) {
+ // Is developer mode active?
+ if (defined('DEVELOPER')) {
+ // Debug instance is there?
+ if (!is_null($this->getDebugInstance())) {
+ // Output stub message
+ self::createDebugInstance(__CLASS__)->debugOutput($message);
+ } else {
+ // Trigger an error
+ trigger_error($message . "<br />\n");
+ }
+ } else {
+ // @TODO Finish this part!
+ $this->partialStub('Developer mode inactive. Message:' . $message);
+ }
}
/**
- * Getter for handler instance
+ * Checks whether the given PHP extension is loaded
*
- * @return $handlerInstance A Networkable instance
+ * @param $phpExtension The PHP extension we shall check
+ * @return $isLoaded Whether the PHP extension is loaded
*/
- protected final function getHandlerInstance () {
- return $this->handlerInstance;
+ 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.
}
/**
- * Converts even very large decimal numbers, also with negative sign, to a
- * hexadecimal string.
+ * Converts even very large decimal numbers, also signed, to a hexadecimal
+ * string.
*
* This work is based on comment #97756 on php.net documentation page at:
* <http://de.php.net/manual/en/function.hexdec.php#97756>
// Encode the decimal number into a hexadecimal string
$hex = '';
do {
- $hex = self::$dechex[($dec % 16)] . $hex;
- $dec /= 16;
+ $hex = self::$dechex[($dec % (2 ^ 4))] . $hex;
+ $dec /= (2 ^ 4);
} while ($dec >= 1);
/*
- * We need hexadecimal strings with leading zeros if the length cannot
- * be divided by 2
+ * Leading zeros are required for hex-decimal "numbers". In some
+ * situations more leading zeros are wanted, so check for both
+ * conditions.
*/
if ($maxLength > 0) {
// Prepend more zeros
- $hex = $this->prependStringToString($hex, '0', $maxLength);
+ $hex = str_pad($hex, $maxLength, '0', STR_PAD_LEFT);
} elseif ((strlen($hex) % 2) != 0) {
+ // Only make string's length dividable by 2
$hex = '0' . $hex;
}
*/
protected function hex2asc ($hex) {
// Check for length, it must be devideable by 2
- //* DEBUG: */ $this->debugOutput('hex='.$hex);
+ //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('hex='.$hex);
assert((strlen($hex) % 2) == 0);
// Walk the string
}
/**
- * Prepends a given string $prepend to $str with a given total length
+ * Checks whether the given encoded data was encoded with Base64
*
- * @param $str Given original string which should be prepended
- * @param $prepend The string to prepend
- * @param $length Total length of the final string
- * @return $strFinal Final prepended string
+ * @param $encodedData Encoded data we shall check
+ * @return $isBase64 Whether the encoded data is Base64
*/
- protected function prependStringToString ($str, $prepend, $length) {
- // Set final string to original string by default
- $strFinal = $str;
+ protected function isBase64Encoded ($encodedData) {
+ // Determine it
+ $isBase64 = (@base64_decode($encodedData, true) !== false);
- // Can it devided
- if (strlen($str) < $length) {
- // Difference between total length and length of original string
- $diff = $length - strlen($str);
+ // Return it
+ return $isBase64;
+ }
- // Prepend the string
- $prepend = str_repeat($prepend, ($diff / strlen($prepend) + 1));
+ /**
+ * "Getter" to get response/request type from analysis of the system.
+ *
+ * @return $responseType Analyzed response type
+ */
+ protected function getResponseTypeFromSystem () {
+ // Default is console
+ $responseType = 'console';
- // Make sure it will definedly fit
- assert(strlen($prepend) >= $diff);
+ // Is 'HTTP_HOST' set?
+ if (isset($_SERVER['HTTP_HOST'])) {
+ // Then it is a HTTP response/request
+ $responseType = 'http';
+ } // END - if
- // Cut it a little down
- $prepend = substr($prepend, 0, $diff);
- //* DEBUG: */ $this->debugOutput('prepend('.strlen($prepend).')='.$prepend.',diff='.$diff.',length='.$length);
+ // Return it
+ return $responseType;
+ }
- // Construct the final prepended string
- $strFinal = $prepend . $str;
- } // END - if
+ /**
+ * Gets a cache key from Criteria instance
+ *
+ * @param $criteriaInstance An instance of a Criteria class
+ * @param $onlyKeys Only use these keys for a cache key
+ * @return $cacheKey A cache key suitable for lookup/storage purposes
+ */
+ protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
+ // Generate it
+ $cacheKey = sprintf("%s@%s",
+ $this->__toString(),
+ $criteriaInstance->getCacheKey($onlyKeys)
+ );
+
+ // And return it
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ': cacheKey=' . $cacheKey);
+ return $cacheKey;
+ }
+
+ /**
+ * Getter for startup time in miliseconds
+ *
+ * @return $startupTime Startup time in miliseconds
+ */
+ protected function getStartupTime () {
+ return self::$startupTime;
+ }
+
+ /**
+ * "Getter" for a printable currently execution time in nice braces
+ *
+ * @return $executionTime Current execution time in nice braces
+ */
+ protected function getPrintableExecutionTime () {
+ // Caculate the execution time
+ $executionTime = microtime(true) - $this->getStartupTime();
+
+ // Pack it in nice braces
+ $executionTime = sprintf('[ %01.5f ] ', $executionTime);
+
+ // And return it
+ return $executionTime;
+ }
+
+ /**
+ * Hashes a given string with a simple but stronger hash function (no salts)
+ *
+ * @param $str The string to be hashed
+ * @return $hash The hash from string $str
+ */
+ public function hashString ($str) {
+ // Hash given string with (better secure) hasher
+ $hash = mhash(MHASH_SHA256, $str);
// Return it
- return $strFinal;
+ return $hash;
}
/**
- * Checks wether the given encoded data was encoded with Base64
+ * Checks whether the given number is really a number (only chars 0-9).
*
- * @param $encodedData Encoded data we shall check
- * @return $isBase64 Wether the encoded data is Base64
+ * @param $num A string consisting only chars between 0 and 9
+ * @param $castValue Whether to cast the value to double. Do only use this to secure numbers from Requestable classes.
+ * @param $assertMismatch Whether to assert mismatches
+ * @return $ret The (hopefully) secured numbered value
*/
- protected function isBase64Encoded ($encodedData) {
+ public function bigintval ($num, $castValue = true, $assertMismatch = false) {
+ // Filter all numbers out
+ $ret = preg_replace('/[^0123456789]/', '', $num);
+
+ // Shall we cast?
+ if ($castValue === true) {
+ // Cast to biggest numeric type
+ $ret = (double) $ret;
+ } // END - if
+
+ // Assert only if requested
+ if ($assertMismatch === true) {
+ // Has the whole value changed?
+ assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
+ } // END - if
+
+ // Return result
+ return $ret;
+ }
+
+ /**
+ * Checks whether the given hexadecimal number is really a hex-number (only chars 0-9,a-f).
+ *
+ * @param $num A string consisting only chars between 0 and 9
+ * @param $assertMismatch Whether to assert mismatches
+ * @return $ret The (hopefully) secured hext-numbered value
+ */
+ public function hexval ($num, $assertMismatch = false) {
+ // Filter all numbers out
+ $ret = preg_replace('/[^0123456789abcdefABCDEF]/', '', $num);
+
+ // Assert only if requested
+ if ($assertMismatch === true) {
+ // Has the whole value changed?
+ assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
+ } // END - if
+
+ // Return result
+ return $ret;
+ }
+
+ /**
+ * Checks whether start/end marker are set
+ *
+ * @param $data Data to be checked
+ * @return $isset Whether start/end marker are set
+ */
+ public final function ifStartEndMarkersSet ($data) {
// Determine it
- $isBase64 = (@base64_decode($encodedData, true) !== false);
+ $isset = ((substr($data, 0, strlen(BaseRawDataHandler::STREAM_START_MARKER)) == BaseRawDataHandler::STREAM_START_MARKER) && (substr($data, -1 * strlen(BaseRawDataHandler::STREAM_END_MARKER), strlen(BaseRawDataHandler::STREAM_END_MARKER)) == BaseRawDataHandler::STREAM_END_MARKER));
- // Return it
- return $isBase64;
+ // ... and return it
+ return $isset;
}
}