* The simulator system class is the super class of all other classes. This
* class handles saving of games etc.
*
- * @author Roland Haeder <webmaster@ship-simu.org>
+ * @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team
* @license GNU GPL 3.0 or any newer version
- * @link http://www.ship-simu.org
+ * @link http://www.shipsimu.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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
+ /**
+ * Length of output from hash()
+ */
+ private static $hashLength = NULL;
+
/**
* The real class name
*/
/**
* Instance of the stacker
*/
- private $stackerInstance = NULL;
+ private $stackInstance = NULL;
/**
* A Compressor instance
private $parserInstance = NULL;
/**
- * A ProtocolHandler instance
+ * A HandleableProtocol instance
*/
private $protocolInstance = NULL;
private $helperInstance = NULL;
/**
- * An instance of a Sourceable class
+ * An instance of a Source class
*/
private $sourceInstance = NULL;
/**
- * An instance of a InputStreamable class
+ * An instance of a UrlSource class
+ */
+ private $urlSourceInstance = NULL;
+
+ /**
+ * An instance of a InputStream class
*/
private $inputStreamInstance = NULL;
/**
- * An instance of a OutputStreamable class
+ * An instance of a OutputStream class
*/
private $outputStreamInstance = NULL;
*/
private $wrapperInstance = NULL;
+ /**
+ * An instance of a file I/O pointer class (not handler)
+ */
+ private $pointerInstance = NULL;
+
+ /**
+ * An instance of an Indexable class
+ */
+ private $indexInstance = NULL;
+
+ /**
+ * An instance of a Block class
+ */
+ private $blockInstance = NULL;
+
+ /**
+ * A Minable instance
+ */
+ private $minableInstance = NULL;
+
+ /**
+ * A FrameworkDirectory instance
+ */
+ private $directoryInstance = NULL;
+
+ /**
+ * Listener instance
+ */
+ private $listenerInstance = NULL;
+
+ /**
+ * An instance of a communicator
+ */
+ private $communicatorInstance = NULL;
+
+ /**
+ * The concrete output instance
+ */
+ private $outputInstance = NULL;
+
+ /**
+ * State instance
+ */
+ private $stateInstance = NULL;
+
/**
* Thousands separator
*/
*/
private $socketResource = FALSE;
+ /**
+ * Regular expression to use for validation
+ */
+ private $regularExpression = '';
+
/**
* Package data
*/
*/
private $genericArray = array();
+ /**
+ * Command name
+ */
+ private $commandName = '';
+
+ /**
+ * Controller name
+ */
+ private $controllerName = '';
+
+ /**
+ * Name of used protocol
+ */
+ private $protocolName = 'invalid';
+
+ /**
+ * Array with bitmasks and such for pack/unpack methods to support both
+ * 32-bit and 64-bit systems
+ */
+ private $packingData = array(
+ 32 => array(
+ 'step' => 3,
+ 'left' => 0xffff0000,
+ 'right' => 0x0000ffff,
+ 'factor' => 16,
+ 'format' => 'II',
+ ),
+ 64 => array(
+ 'step' => 7,
+ 'left' => 0xffffffff00000000,
+ 'right' => 0x00000000ffffffff,
+ 'factor' => 32,
+ 'format' => 'NN'
+ )
+ );
+
+ /**
+ * Simple 64-bit check, thanks to "Salman A" from stackoverflow.com:
+ *
+ * The integer size is 4 bytes on 32-bit and 8 bytes on a 64-bit system.
+ */
+ private $archArrayElement = FALSE;
+
/***********************
* Exception codes.... *
***********************/
const EXCEPTION_ARRAY_ELEMENTS_MISSING = 0x02c;
const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED = 0x02d;
const EXCEPTION_UNSPPORTED_OPERATION = 0x02e;
+ const EXCEPTION_FACTORY_REQUIRE_PARAMETER = 0x02f;
const EXCEPTION_MISSING_ELEMENT = 0x030;
const EXCEPTION_HEADERS_ALREADY_SENT = 0x031;
const EXCEPTION_DEFAULT_CONTROLLER_GONE = 0x032;
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;
+ const EXCEPTION_FILE_NOT_REACHABLE = 0x038;
+ const EXCEPTION_FILE_CANNOT_BE_READ = 0x039;
+ const EXCEPTION_FILE_CANNOT_BE_WRITTEN = 0x03a;
+ const EXCEPTION_PATH_CANNOT_BE_WRITTEN = 0x03b;
+ const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x03c;
+ const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x03d;
/**
* Hexadecimal->Decimal translation array
$this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
} // END - if
- // Is the startup time set? (0 cannot be true anymore)
+ // Is the startup time set? (0 cannot be TRUE anymore)
if (self::$startupTime == 0) {
// Then set it
- self::$startupTime = microtime(true);
+ self::$startupTime = microtime(TRUE);
} // END - if
+
+ // Set array element
+ $this->archArrayElement = (PHP_INT_SIZE === 8 ? 64 : 32);
}
/**
} else {
// Do not call this twice
trigger_error(__METHOD__ . ': Called twice.');
+ exit;
}
}
// Init argument string
$argsString = '';
- // Is it empty or an array?
- if (empty($args)) {
+ // Is it NULL, empty or an array?
+ if (is_null($args)) {
// No arguments
$argsString = 'NULL';
+ } elseif (empty($args)) {
+ // Empty arguments
+ $argsString = '(empty)';
} elseif (is_array($args)) {
// Some arguments are there
foreach ($args as $arg) {
// .. or size if array
$argsString .= ', ' . count($arg);
} elseif ($arg === TRUE) {
- // ... is boolean 'true'
- $argsString .= ', true';
+ // ... is boolean 'TRUE'
+ $argsString .= ', TRUE';
} elseif ($arg === FALSE) {
- // ... is boolean 'true'
- $argsString .= ', false';
+ // ... is boolean 'FALSE'
+ $argsString .= ', FALSE';
}
// Closing bracket
// Output stub message
// @TODO __CLASS__ does always return BaseFrameworkSystem but not the extending (=child) class
- self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[unknown::%s:] Stub! Args: %s",
+ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[unknown::%s:] Stub! Args: %s',
$methodName,
$argsString
));
}
/**
- * Magic function to catch setting of missing but set class fields/attributes
+ * Magic method to catch setting of missing but set class fields/attributes
*
* @param $name Name of the field/attribute
* @param $value Value to store
* @return void
*/
public final function __set ($name, $value) {
- $this->debugBackTrace(sprintf("Tried to set a missing field. name=%s, value[%s]=%s",
+ $this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
$name,
gettype($value),
- $value
+ print_r($value, TRUE)
));
}
/**
- * Magic function to catch getting of missing fields/attributes
+ * Magic method to catch getting of missing fields/attributes
*
* @param $name Name of the field/attribute
* @return void
*/
public final function __get ($name) {
- $this->debugBackTrace(sprintf("Tried to get a missing field. name=%s",
+ $this->debugBackTrace(sprintf('Tried to get a missing field. name=%s',
$name
));
}
/**
- * Magic function to catch unsetting of missing fields/attributes
+ * Magic method to catch unsetting of missing fields/attributes
*
* @param $name Name of the field/attribute
* @return void
*/
public final function __unset ($name) {
- $this->debugBackTrace(sprintf("Tried to unset a missing field. name=%s",
+ $this->debugBackTrace(sprintf('Tried to unset a missing field. name=%s',
$name
));
}
+ /**
+ * Magic method to catch object serialization
+ *
+ * @return $unsupported Unsupported method
+ * @throws UnsupportedOperationException Objects of this framework cannot be serialized
+ */
+ public final function __sleep () {
+ throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+ }
+
+ /**
+ * Magic method to catch object deserialization
+ *
+ * @return $unsupported Unsupported method
+ * @throws UnsupportedOperationException Objects of this framework cannot be serialized
+ */
+ public final function __wakeup () {
+ throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+ }
+
+ /**
+ * Magic method to catch calls when an object instance is called
+ *
+ * @return $unsupported Unsupported method
+ * @throws UnsupportedOperationException Objects of this framework cannot be serialized
+ */
+ public final function __invoke () {
+ throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+ }
+
/**
* Setter for the real class name
*
/**
* Setter for stacker instance
*
- * @param $stackerInstance An instance of an stacker
+ * @param $stackInstance An instance of an stacker
* @return void
*/
- public final function setStackerInstance (Stackable $stackerInstance) {
- $this->stackerInstance = $stackerInstance;
+ public final function setStackInstance (Stackable $stackInstance) {
+ $this->stackInstance = $stackInstance;
}
/**
* Getter for stacker instance
*
- * @return $stackerInstance An instance of an stacker
+ * @return $stackInstance An instance of an stacker
*/
- public final function getStackerInstance () {
- return $this->stackerInstance;
+ public final function getStackInstance () {
+ return $this->stackInstance;
}
/**
}
/**
- * Setter for ProtocolHandler instance
+ * Setter for HandleableProtocol instance
*
- * @param $protocolInstance An instance of an ProtocolHandler
+ * @param $protocolInstance An instance of an HandleableProtocol
* @return void
*/
- public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) {
+ public final function setProtocolInstance (HandleableProtocol $protocolInstance) {
$this->protocolInstance = $protocolInstance;
}
/**
- * Getter for ProtocolHandler instance
+ * Getter for HandleableProtocol instance
*
- * @return $protocolInstance An instance of an ProtocolHandler
+ * @return $protocolInstance An instance of an HandleableProtocol
*/
public final function getProtocolInstance () {
return $this->protocolInstance;
return $this->socketResource;
}
+ /**
+ * Setter for regular expression
+ *
+ * @param $regularExpression A valid regular expression
+ * @return void
+ */
+ public final function setRegularExpression ($regularExpression) {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': regularExpression=' . $regularExpression . ',previous[' . gettype($this->regularExpression) . ']=' . $this->regularExpression);
+ $this->regularExpression = $regularExpression;
+ }
+
+ /**
+ * Getter for regular expression
+ *
+ * @return $regularExpression A valid regular expression
+ */
+ public final function getRegularExpression () {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': regularExpression[' . gettype($this->regularExpression) . ']=' . $this->regularExpression);
+ return $this->regularExpression;
+ }
+
/**
* Setter for helper instance
*
}
/**
- * Setter for a Sourceable instance
+ * Setter for a Source instance
*
- * @param $sourceInstance The Sourceable instance
+ * @param $sourceInstance An instance of a Source class
* @return void
*/
- protected final function setSourceInstance (Sourceable $sourceInstance) {
+ protected final function setSourceInstance (Source $sourceInstance) {
$this->sourceInstance = $sourceInstance;
}
/**
- * Getter for a Sourceable instance
+ * Getter for a Source instance
*
- * @return $sourceInstance The Sourceable instance
+ * @return $sourceInstance An instance of a Source class
*/
protected final function getSourceInstance () {
return $this->sourceInstance;
}
/**
- * Getter for a InputStreamable instance
+ * Setter for a UrlSource instance
*
- * @param $inputStreamInstance The InputStreamable instance
+ * @param $sourceInstance An instance of a UrlSource class
+ * @return void
+ */
+ protected final function setUrlSourceInstance (UrlSource $urlSourceInstance) {
+ $this->urlSourceInstance = $urlSourceInstance;
+ }
+
+ /**
+ * Getter for a UrlSource instance
+ *
+ * @return $urlSourceInstance An instance of a UrlSource class
+ */
+ protected final function getUrlSourceInstance () {
+ return $this->urlSourceInstance;
+ }
+
+ /**
+ * Getter for a InputStream instance
+ *
+ * @param $inputStreamInstance The InputStream instance
*/
protected final function getInputStreamInstance () {
return $this->inputStreamInstance;
}
/**
- * Setter for a InputStreamable instance
+ * Setter for a InputStream instance
*
- * @param $inputStreamInstance The InputStreamable instance
+ * @param $inputStreamInstance The InputStream instance
* @return void
*/
- protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) {
+ protected final function setInputStreamInstance (InputStream $inputStreamInstance) {
$this->inputStreamInstance = $inputStreamInstance;
}
/**
- * Getter for a OutputStreamable instance
+ * Getter for a OutputStream instance
*
- * @param $outputStreamInstance The OutputStreamable instance
+ * @param $outputStreamInstance The OutputStream instance
*/
protected final function getOutputStreamInstance () {
return $this->outputStreamInstance;
}
/**
- * Setter for a OutputStreamable instance
+ * Setter for a OutputStream instance
*
- * @param $outputStreamInstance The OutputStreamable instance
+ * @param $outputStreamInstance The OutputStream instance
* @return void
*/
- protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
+ protected final function setOutputStreamInstance (OutputStream $outputStreamInstance) {
$this->outputStreamInstance = $outputStreamInstance;
}
return $this->iteratorInstance;
}
+ /**
+ * Setter for FilePointer instance
+ *
+ * @param $pointerInstance An instance of an FilePointer class
+ * @return void
+ */
+ protected final function setPointerInstance (FilePointer $pointerInstance) {
+ $this->pointerInstance = $pointerInstance;
+ }
+
+ /**
+ * Getter for FilePointer instance
+ *
+ * @return $pointerInstance An instance of an FilePointer class
+ */
+ public final function getPointerInstance () {
+ return $this->pointerInstance;
+ }
+
+ /**
+ * Unsets pointer instance which triggers a call of __destruct() if the
+ * instance is still there. This is surely not fatal on already "closed"
+ * file pointer instances.
+ *
+ * I don't want to mess around with above setter by giving it a default
+ * value NULL as setter should always explicitly only set (existing) object
+ * instances and NULL is NULL.
+ *
+ * @return void
+ */
+ protected final function unsetPointerInstance () {
+ // Simply it to NULL
+ $this->pointerInstance = NULL;
+ }
+
+ /**
+ * Setter for Indexable instance
+ *
+ * @param $indexInstance An instance of an Indexable class
+ * @return void
+ */
+ protected final function setIndexInstance (Indexable $indexInstance) {
+ $this->indexInstance = $indexInstance;
+ }
+
+ /**
+ * Getter for Indexable instance
+ *
+ * @return $indexInstance An instance of an Indexable class
+ */
+ public final function getIndexInstance () {
+ return $this->indexInstance;
+ }
+
+ /**
+ * Setter for Block instance
+ *
+ * @param $blockInstance An instance of an Block class
+ * @return void
+ */
+ protected final function setBlockInstance (Block $blockInstance) {
+ $this->blockInstance = $blockInstance;
+ }
+
+ /**
+ * Getter for Block instance
+ *
+ * @return $blockInstance An instance of an Block class
+ */
+ public final function getBlockInstance () {
+ return $this->blockInstance;
+ }
+
+ /**
+ * Setter for Minable instance
+ *
+ * @param $minableInstance A Minable instance
+ * @return void
+ */
+ protected final function setMinableInstance (Minable $minableInstance) {
+ $this->minableInstance = $minableInstance;
+ }
+
+ /**
+ * Getter for minable instance
+ *
+ * @return $minableInstance A Minable instance
+ */
+ protected final function getMinableInstance () {
+ return $this->minableInstance;
+ }
+
+ /**
+ * Setter for FrameworkDirectory instance
+ *
+ * @param $directoryInstance A FrameworkDirectoryPointer instance
+ * @return void
+ */
+ protected final function setDirectoryInstance (FrameworkDirectory $directoryInstance) {
+ $this->directoryInstance = $directoryInstance;
+ }
+
+ /**
+ * Getter for FrameworkDirectory instance
+ *
+ * @return $directoryInstance A FrameworkDirectory instance
+ */
+ protected final function getDirectoryInstance () {
+ return $this->directoryInstance;
+ }
+
+ /**
+ * Setter for listener instance
+ *
+ * @param $listenerInstance A Listenable instance
+ * @return void
+ */
+ protected final function setListenerInstance (Listenable $listenerInstance) {
+ $this->listenerInstance = $listenerInstance;
+ }
+
+ /**
+ * Getter for listener instance
+ *
+ * @return $listenerInstance A Listenable instance
+ */
+ protected final function getListenerInstance () {
+ return $this->listenerInstance;
+ }
+
+ /**
+ * Getter for communicator instance
+ *
+ * @return $communicatorInstance An instance of a Communicator class
+ */
+ public final function getCommunicatorInstance () {
+ return $this->communicatorInstance;
+ }
+
+ /**
+ * Setter for communicator instance
+ *
+ * @param $communicatorInstance An instance of a Communicator class
+ * @return void
+ */
+ protected final function setCommunicatorInstance (Communicator $communicatorInstance) {
+ $this->communicatorInstance = $communicatorInstance;
+ }
+
+ /**
+ * Setter for state instance
+ *
+ * @param $stateInstance A Stateable instance
+ * @return void
+ */
+ public final function setStateInstance (Stateable $stateInstance) {
+ $this->stateInstance = $stateInstance;
+ }
+
+ /**
+ * Getter for state instance
+ *
+ * @return $stateInstance A Stateable instance
+ */
+ public final function getStateInstance () {
+ return $this->stateInstance;
+ }
+
+ /**
+ * Setter for output instance
+ *
+ * @param $outputInstance The debug output instance
+ * @return void
+ */
+ public final function setOutputInstance (OutputStreamer $outputInstance) {
+ $this->outputInstance = $outputInstance;
+ }
+
+ /**
+ * Getter for output instance
+ *
+ * @return $outputInstance The debug output instance
+ */
+ public final function getOutputInstance () {
+ return $this->outputInstance;
+ }
+
+ /**
+ * Setter for command name
+ *
+ * @param $commandName Last validated command name
+ * @return void
+ */
+ protected final function setCommandName ($commandName) {
+ $this->commandName = $commandName;
+ }
+
+ /**
+ * Getter for command name
+ *
+ * @return $commandName Last validated command name
+ */
+ protected final function getCommandName () {
+ return $this->commandName;
+ }
+
+ /**
+ * Setter for controller name
+ *
+ * @param $controllerName Last validated controller name
+ * @return void
+ */
+ protected final function setControllerName ($controllerName) {
+ $this->controllerName = $controllerName;
+ }
+
+ /**
+ * Getter for controller name
+ *
+ * @return $controllerName Last validated controller name
+ */
+ protected final function getControllerName () {
+ return $this->controllerName;
+ }
+
+ /**
+ * Getter for protocol name
+ *
+ * @return $protocolName Name of used protocol
+ */
+ public final function getProtocolName () {
+ return $this->protocolName;
+ }
+
+ /**
+ * Setter for protocol name
+ *
+ * @param $protocolName Name of used protocol
+ * @return void
+ */
+ protected final function setProtocolName ($protocolName) {
+ $this->protocolName = $protocolName;
+ }
+
/**
* Checks whether an object equals this object. You should overwrite this
* method to implement own equality checks
}
/**
- * Prepare the template engine (WebTemplateEngine by default) for a given
+ * Prepare the template engine (HtmlTemplateEngine by default) for a given
* application helper instance (ApplicationHelper by default).
*
* @param $applicationInstance An application helper instance or
} // END - if
// Initialize the template engine
- $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class');
+ $templateInstance = ObjectFactory::createObjectByConfiguredName('html_template_class');
// Return the prepared instance
return $templateInstance;
// Is a message set?
if (!empty($message)) {
// Construct message
- $content = sprintf("<div class=\"debug_message\">Message: %s</div>\n", $message);
+ $content = sprintf('<div class="debug_message">Message: %s</div>' . PHP_EOL, $message);
} // END - if
// Generate the output
- $content .= sprintf("<pre>%s</pre>",
+ $content .= sprintf('<pre>%s</pre>',
trim(
htmlentities(
- print_r($this, true)
+ 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>",
+ ApplicationEntryPoint::app_exit(sprintf('<div class="debug_header">%s debug output:</div><div class="debug_content">%s</div>Loaded includes: <div class="debug_include_list">%s</div>',
$this->__toString(),
$content,
ClassLoader::getSelfInstance()->getPrintableIncludeList()
} else {
// Trigger an error
trigger_error($stubMessage);
+ exit;
}
}
* Outputs a debug backtrace and stops further script execution
*
* @param $message An optional message to output
- * @param $doExit Whether exit the program (true is default)
+ * @param $doExit Whether exit the program (TRUE is default)
* @return void
*/
public function debugBackTrace ($message = '', $doExit = TRUE) {
* @return $debugInstance An instance of a debugger class
*/
public final static function createDebugInstance ($className) {
- // Init debug instance
- $debugInstance = NULL;
+ // Is the instance set?
+ if (!Registry::getRegistry()->instanceExists('debug')) {
+ // Init debug instance
+ $debugInstance = NULL;
+
+ // Try it
+ try {
+ // Get a debugger instance
+ $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_' . self::getResponseTypeFromSystem() . '_class'), $className);
+ } catch (NullPointerException $e) {
+ // Didn't work, no instance there
+ exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
+ }
- // 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('');
- // Empty string should be ignored and used for testing the middleware
- DebugMiddleware::getSelfInstance()->output('');
+ // Set it in its own class. This will set it in the registry
+ $debugInstance->setDebugInstance($debugInstance);
+ } else {
+ // Get instance from registry
+ $debugInstance = Registry::getRegistry()->getDebugInstance();
+ }
// Return it
return $debugInstance;
}
+ /**
+ * Simple output of a message with line-break
+ *
+ * @param $message Message to output
+ * @return void
+ */
+ public function outputLine ($message) {
+ // Simply output it
+ print($message . PHP_EOL);
+ }
+
/**
* 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
*
* @param $message Message we shall send out...
* @param $doPrint Whether print or die here (default: print)
- * @paran $stripTags Whether to strip tags (default: false)
+ * @paran $stripTags Whether to strip tags (default: FALSE)
* @return void
*/
public function debugOutput ($message, $doPrint = TRUE, $stripTags = FALSE) {
// Put directly out
if ($doPrint === TRUE) {
// Print message
- print($message . chr(10));
+ $this->outputLine($message);
} else {
// Die here
exit($message);
* @param $str The string, what ever it is needs to be converted
* @return $className Generated class name
*/
- public function convertToClassName ($str) {
+ public static final function convertToClassName ($str) {
// Init class name
$className = '';
// Convert all dashes in underscores
- $str = $this->convertDashesToUnderscores($str);
+ $str = self::convertDashesToUnderscores($str);
// Now use that underscores to get classname parts for hungarian style
foreach (explode('_', $str) as $strPart) {
* @param $str The string with maybe dashes inside
* @return $str The converted string with no dashed, but underscores
*/
- public final function convertDashesToUnderscores ($str) {
+ public static final function convertDashesToUnderscores ($str) {
// Convert them all
$str = str_replace('-', '_', $str);
*/
protected final function getDatabaseEntry () {
// Is there an instance?
- if (is_null($this->getResultInstance())) {
+ if (!$this->getResultInstance() instanceof SearchableResult) {
// Throw an exception here
throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
} // END - if
// Do we have an entry?
if ($this->getResultInstance()->valid() === FALSE) {
- throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
+ // @TODO Move the constant to e.g. BaseDatabaseResult when there is a non-cached database result available
+ throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), CachedDatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
} // END - if
// Get next entry
// Get current array
$fieldArray = $resultInstance->current();
- //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
+ //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, TRUE).'</pre>');
// Convert dashes to underscore
- $fieldName = $this->convertDashesToUnderscores($fieldName);
+ $fieldName2 = self::convertDashesToUnderscores($fieldName);
// Does the field exist?
- if (isset($fieldArray[$fieldName])) {
+ if ($this->isFieldSet($fieldName)) {
// Get it
- $fieldValue = $fieldArray[$fieldName];
+ $fieldValue = $fieldArray[$fieldName2];
+ } elseif (defined('DEVELOPER')) {
+ // Missing field entry, may require debugging
+ self::createDebugInstance(__CLASS__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldArray<pre>=' . print_r($fieldArray, TRUE) . '</pre>,fieldName=' . $fieldName . ' not found!');
} else {
// Missing field entry, may require debugging
- self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ':fieldname=' . $fieldName . ' not found!');
+ self::createDebugInstance(__CLASS__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldName=' . $fieldName . ' not found!');
}
// Return it
return $fieldValue;
}
+ /**
+ * Checks if given field is set
+ *
+ * @param $fieldName Field name to check
+ * @return $isSet Whether the given field name is set
+ * @throws NullPointerException If the result instance is null
+ */
+ public function isFieldSet ($fieldName) {
+ // 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();
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('[' . $this->__toString() . ':' . __LINE__ . '] fieldName=' . $fieldName . ',fieldArray=<pre>'.print_r($fieldArray, TRUE).'</pre>');
+
+ // Convert dashes to underscore
+ $fieldName = self::convertDashesToUnderscores($fieldName);
+
+ // Determine it
+ $isSet = isset($fieldArray[$fieldName]);
+
+ // Return result
+ return $isSet;
+ }
+
/**
* Flushs all pending updates to the database layer
*
$configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry();
// Create object instance
- $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry);
+ $wrapperInstance = DatabaseWrapperFactory::createWrapperByConfiguredName($configEntry);
// Yes, then send the whole result to the database layer
$wrapperInstance->doUpdateByResult($this->getResultInstance());
} else {
// Trigger an error
trigger_error($message . "<br />\n");
+ exit;
}
} else {
// @TODO Finish this part!
*/
public function getMilliTime () {
// Get the time of day as float
- $milliTime = gettimeofday(true);
+ $milliTime = gettimeofday(TRUE);
// Return it
return $milliTime;
*/
protected function isBase64Encoded ($encodedData) {
// Determine it
- $isBase64 = (@base64_decode($encodedData, true) !== FALSE);
+ $isBase64 = (@base64_decode($encodedData, TRUE) !== FALSE);
// Return it
return $isBase64;
*
* @return $responseType Analyzed response type
*/
- protected function getResponseTypeFromSystem () {
+ protected static function getResponseTypeFromSystem () {
// Default is console
$responseType = 'console';
// Is 'HTTP_HOST' set?
if (isset($_SERVER['HTTP_HOST'])) {
- // Then it is a HTTP response/request
- $responseType = 'http';
+ /*
+ * Then it is a HTML response/request as RSS and so on may be
+ * transfered over HTTP as well.
+ */
+ $responseType = 'html';
} // END - if
// Return it
*/
protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
// Generate it
- $cacheKey = sprintf("%s@%s",
+ $cacheKey = sprintf('%s@%s',
$this->__toString(),
$criteriaInstance->getCacheKey($onlyKeys)
);
*/
protected function getPrintableExecutionTime () {
// Caculate the execution time
- $executionTime = microtime(true) - $this->getStartupTime();
+ $executionTime = microtime(TRUE) - $this->getStartupTime();
// Pack it in nice braces
$executionTime = sprintf('[ %01.5f ] ', $executionTime);
}
/**
- * Hashes a given string with a simple but stronger hash function (no salts)
+ * Hashes a given string with a simple but stronger hash function (no salt)
+ * and hex-encode it.
*
* @param $str The string to be hashed
* @return $hash The hash from string $str
*/
- public function hashString ($str) {
+ public static final function hash ($str) {
// Hash given string with (better secure) hasher
- $hash = mhash(MHASH_SHA256, $str);
+ $hash = bin2hex(mhash(MHASH_SHA256, $str));
// Return it
return $hash;
}
+ /**
+ * "Getter" for length of hash() output. This will be "cached" to speed up
+ * things.
+ *
+ * @return $length Length of hash() output
+ */
+ public static final function getHashLength () {
+ // Is it cashed?
+ if (is_null(self::$hashLength)) {
+ // No, then hash a string and save its length.
+ self::$hashLength = strlen(self::hash('abc123'));
+ } // END - if
+
+ // Return it
+ return self::$hashLength;
+ }
+
/**
* Checks whether the given number is really a number (only chars 0-9).
*
* @return $isset Whether the given key is set
*/
protected final function isGenericArrayElementSet ($keyGroup, $subGroup, $key, $element) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
// Is it there?
$isset = isset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
* @return $isset Whether the given key is set
*/
protected final function isGenericArrayKeySet ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Is it there?
$isset = isset($this->genericArray[$keyGroup][$subGroup][$key]);
* @return $isset Whether the given group is set
*/
protected final function isGenericArrayGroupSet ($keyGroup, $subGroup) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
// Is it there?
$isset = isset($this->genericArray[$keyGroup][$subGroup]);
if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
// No, then abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+ exit;
} // END - if
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], TRUE));
+
// Return it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' returning!' . PHP_EOL);
return $this->genericArray[$keyGroup][$subGroup];
}
* @return void
*/
protected final function unsetGenericArrayKey ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Remove it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' unset!' . PHP_EOL);
unset($this->genericArray[$keyGroup][$subGroup][$key]);
}
* @return void
*/
protected final function unsetGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
// Remove it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' unset!' . PHP_EOL);
unset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
}
* @param $value Value to add/append
* @return void
*/
- protected final function appendStringToGenericArrayElement ($keyGroup, $subGroup, $key, $value, $appendGlue = '') {
+ protected final function appendStringToGenericArrayKey ($keyGroup, $subGroup, $key, $value, $appendGlue = '') {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE) . ',appendGlue=' . $appendGlue);
+
// Is it already there?
if ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Append it
}
/**
- * Initializes given generic array
+ * Append a string to a given generic array element
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @param $element Element to check
+ * @param $value Value to add/append
+ * @return void
+ */
+ protected final function appendStringToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value, $appendGlue = '') {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE) . ',appendGlue=' . $appendGlue);
+
+ // Is it already there?
+ if ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+ // Append it
+ $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . (string) $value;
+ } else {
+ // Add it
+ $this->genericArray[$keyGroup][$subGroup][$key][$element] = (string) $value;
+ }
+ }
+
+ /**
+ * Initializes given generic array group
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to use
+ * @param $forceInit Optionally force initialization
+ * @return void
+ */
+ protected final function initGenericArrayGroup ($keyGroup, $subGroup, $forceInit = FALSE) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',forceInit=' . intval($forceInit));
+
+ // Is it already set?
+ if (($forceInit === FALSE) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
+ // Already initialized
+ trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' already initialized.');
+ exit;
+ } // END - if
+
+ // Initialize it
+ $this->genericArray[$keyGroup][$subGroup] = array();
+ }
+
+ /**
+ * Initializes given generic array key
*
* @param $keyGroup Main group for the key
* @param $subGroup Sub group for the key
* @return void
*/
protected final function initGenericArrayKey ($keyGroup, $subGroup, $key, $forceInit = FALSE) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',forceInit=' . intval($forceInit));
+
// Is it already set?
if (($forceInit === FALSE) && ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key))) {
// Already initialized
trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' already initialized.');
+ exit;
} // END - if
// Initialize it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . PHP_EOL);
$this->genericArray[$keyGroup][$subGroup][$key] = array();
}
+ /**
+ * Initializes given generic array element
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to use
+ * @param $element Element to use
+ * @param $forceInit Optionally force initialization
+ * @return void
+ */
+ protected final function initGenericArrayElement ($keyGroup, $subGroup, $key, $element, $forceInit = FALSE) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',forceInit=' . intval($forceInit));
+
+ // Is it already set?
+ if (($forceInit === FALSE) && ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element))) {
+ // Already initialized
+ trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' already initialized.');
+ exit;
+ } // END - if
+
+ // Initialize it
+ $this->genericArray[$keyGroup][$subGroup][$key][$element] = array();
+ }
+
/**
* Pushes an element to a generic key
*
* @param $value Value to add/append
* @return $count Number of array elements
*/
- protected final function pushValueToGenericArrayElement ($keyGroup, $subGroup, $key, $value) {
+ protected final function pushValueToGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
// Is it set?
if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Initialize array
} // END - if
// Then push it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE) . PHP_EOL);
$count = array_push($this->genericArray[$keyGroup][$subGroup][$key], $value);
// Return count
return $count;
}
+ /**
+ * Pushes an element to a generic array element
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to use
+ * @param $element Element to check
+ * @param $value Value to add/append
+ * @return $count Number of array elements
+ */
+ protected final function pushValueToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
+ // Is it set?
+ if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+ // Initialize array
+ $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
+ } // END - if
+
+ // Then push it
+ $count = array_push($this->genericArray[$keyGroup][$subGroup][$key][$element], $value);
+
+ // Return count
+ //* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
+ //* DEBUG: */ print(__METHOD__ . ': count=' . $count . PHP_EOL);
+ return $count;
+ }
+
/**
* Pops an element from a generic group
*
* @return $value Last "popped" value
*/
protected final function popGenericArrayElement ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Is it set?
if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Not found
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
+ exit;
} // END - if
// Then "pop" it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' pop-ing entry ...' . PHP_EOL);
$value = array_pop($this->genericArray[$keyGroup][$subGroup][$key]);
// Return value
* @return $value Last "popped" value
*/
protected final function shiftGenericArrayElement ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Is it set?
if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Not found
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
+ exit;
} // END - if
// Then "shift" it
- //* DEBUG: */ print(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' shifting entry ...' . PHP_EOL);
$value = array_shift($this->genericArray[$keyGroup][$subGroup][$key]);
// Return value
//* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
- //* DEBUG: */ print(__METHOD__ . ': value[' . gettype($value) . ']=' . $value . PHP_EOL);
+ //* DEBUG: */ print(__METHOD__ . ': value[' . gettype($value) . ']=' . print_r($value, TRUE) . PHP_EOL);
return $value;
}
* @return $count Count of given group
*/
protected final function countGenericArray ($keyGroup) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
+
// Is it there?
if (!isset($this->genericArray[$keyGroup])) {
// Abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' not found.');
+ exit;
} // END - if
// Then count it
$count = count($this->genericArray[$keyGroup]);
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
+
// Return it
return $count;
}
* @return $count Count of given group
*/
protected final function countGenericArrayGroup ($keyGroup, $subGroup) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
// Is it there?
if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
// Abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+ exit;
} // END - if
// Then count it
$count = count($this->genericArray[$keyGroup][$subGroup]);
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',count=' . $count);
+
// Return it
return $count;
}
* @return $count Count of given key
*/
protected final function countGenericArrayElements ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Is it there?
if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+ exit;
} elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
// Not valid
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' is not an array.');
+ exit;
}
// Then count it
$count = count($this->genericArray[$keyGroup][$subGroup][$key]);
- //* DEBUG: */ print(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count . PHP_EOL);
+
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
// Return it
return $count;
* @return $array Whole generic array group
*/
protected final function getGenericArray ($keyGroup) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
+
// Is it there?
if (!isset($this->genericArray[$keyGroup])) {
// Then abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' does not exist.');
+ exit;
} // END - if
// Return it
* @return void
*/
protected final function setGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
// Set value here
$this->genericArray[$keyGroup][$subGroup][$key] = $value;
}
* @return $value Mixed value from generic array element
*/
protected final function getGenericArrayKey ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Is it there?
if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
// Then abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' does not exist.');
+ exit;
} // END - if
// Return it
* @return void
*/
protected final function setGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
+ // Debug message
+ //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
// Then set it
$this->genericArray[$keyGroup][$subGroup][$key][$element] = $value;
}
* @return $value Mixed value from generic array element
*/
protected final function getGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
// Is it there?
if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
// Then abort here
trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' does not exist.');
+ exit;
} // END - if
// Return it
* @return $isValid Whether given sub group is valid
*/
protected final function isValidGenericArrayGroup ($keyGroup, $subGroup) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
// Determine it
$isValid = (($this->isGenericArrayGroupSet($keyGroup, $subGroup)) && (is_array($this->getGenericSubArray($keyGroup, $subGroup))));
* @return $isValid Whether given sub group is valid
*/
protected final function isValidGenericArrayKey ($keyGroup, $subGroup, $key) {
+ // Debug message
+ //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
// Determine it
$isValid = (($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) && (is_array($this->getGenericArrayKey($keyGroup, $subGroup, $key))));
// Return it
return $isValid;
}
+
+ /**
+ * Initializes the web output instance
+ *
+ * @return void
+ */
+ protected function initWebOutputInstance () {
+ // Get application instance
+ $applicationInstance = Registry::getRegistry()->getInstance('app');
+
+ // Is this a response instance?
+ if ($this instanceof Responseable) {
+ // Then set it in application instance
+ $applicationInstance->setResponseInstance($this);
+ } // END - if
+
+ // Init web output instance
+ $outputInstance = ObjectFactory::createObjectByConfiguredName('output_class', array($applicationInstance));
+
+ // Set it locally
+ $this->setWebOutputInstance($outputInstance);
+ }
+
+ /**
+ * Translates boolean TRUE to 'Y' and FALSE to 'N'
+ *
+ * @param $boolean Boolean value
+ * @return $translated Translated boolean value
+ */
+ public static final function translateBooleanToYesNo ($boolean) {
+ // Make sure it is really boolean
+ assert(is_bool($boolean));
+
+ // "Translate" it
+ $translated = ($boolean === TRUE) ? 'Y' : 'N';
+
+ // ... and return it
+ return $translated;
+ }
+
+ /**
+ * Encodes raw data (almost any type) by "serializing" it and then pack it
+ * into a "binary format".
+ *
+ * @param $rawData Raw data (almost any type)
+ * @return $encoded Encoded data
+ */
+ protected function encodeData ($rawData) {
+ // Make sure no objects or resources pass through
+ assert(!is_object($rawData));
+ assert(!is_resource($rawData));
+
+ // First "serialize" it (json_encode() is faster than serialize())
+ $encoded = $this->packString(json_encode($rawData));
+
+ // And return it
+ return $encoded;
+ }
+
+ /**
+ * Pack a string into a "binary format". Please execuse me that this is
+ * widely undocumented. :-(
+ *
+ * @param $str Unpacked string
+ * @return $packed Packed string
+ * @todo Improve documentation
+ */
+ protected function packString ($str) {
+ // Debug message
+ //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('str=' . $str . ' - CALLED!');
+
+ // First compress the string (gzcompress is okay)
+ $str = gzcompress($str);
+
+ // Init variable
+ $packed = '';
+
+ // And start the "encoding" loop
+ for ($idx = 0; $idx < strlen($str); $idx += $this->packingData[$this->archArrayElement]['step']) {
+ $big = 0;
+ for ($i = 0; $i < $this->packingData[$this->archArrayElement]['step']; $i++) {
+ $factor = ($this->packingData[$this->archArrayElement]['step'] - 1 - $i);
+
+ if (($idx + $i) <= strlen($str)) {
+ $ord = ord(substr($str, ($idx + $i), 1));
+
+ $add = $ord * pow(256, $factor);
+
+ $big += $add;
+
+ //print 'idx=' . $idx . ',i=' . $i . ',ord=' . $ord . ',factor=' . $factor . ',add=' . $add . ',big=' . $big . PHP_EOL;
+ } // END - if
+ } // END - for
+
+ $l = ($big & $this->packingData[$this->archArrayElement]['left']) >>$this->packingData[$this->archArrayElement]['factor'];
+ $r = $big & $this->packingData[$this->archArrayElement]['right'];
+
+ $chunk = str_pad(pack($this->packingData[$this->archArrayElement]['format'], $l, $r), 8, '0', STR_PAD_LEFT);
+ //* NOISY-DEBUG */ print 'big=' . $big . ',chunk('.strlen($chunk) . ')='.md5($chunk).PHP_EOL;
+
+ $packed .= $chunk;
+ } // END - for
+
+ // Return it
+ //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('packed=' . $packed . ' - EXIT!');
+ return $packed;
+ }
+
+ /**
+ * Checks whether the given file/path is in open_basedir(). This does not
+ * gurantee that the file is actually readable and/or writeable. If you need
+ * such gurantee then please use isReadableFile() instead.
+ *
+ * @param $filePathName Name of the file/path to be checked
+ * @return $isReachable Whether it is within open_basedir()
+ */
+ public static function isReachableFilePath ($filePathName) {
+ // Is not reachable by default
+ $isReachable = FALSE;
+
+ // Get open_basedir parameter
+ $openBaseDir = ini_get('open_basedir');
+
+ // Is it set?
+ if (!empty($openBaseDir)) {
+ // Check all entries
+ foreach (explode(PATH_SEPARATOR, $openBaseDir) as $dir) {
+ // Check on existence
+ if (substr($filePathName, 0, strlen($dir)) == $dir) {
+ // Is reachable
+ $isReachable = TRUE;
+ } // END - if
+ } // END - foreach
+ } else {
+ // If open_basedir is not set, all is allowed
+ $isReachable = TRUE;
+ }
+
+ // Return status
+ return $isReachable;
+ }
+
+ /**
+ * Checks whether the give file is within open_basedir() (done by
+ * isReachableFilePath()), is actually a file and is readable.
+ *
+ * @param $fileName Name of the file to be checked
+ * @return $isReadable Whether the file is readable (and therefor exists)
+ */
+ public static function isReadableFile ($fileName) {
+ // Default is not readable
+ $isReadable = FALSE;
+
+ // Is within parameters, so check if it is a file and readable
+ $isReadable = ((self::isReachableFilePath($fileName)) && (file_exists($fileName)) && (is_file($fileName)) && (is_readable($fileName)));
+
+ // Return status
+ return $isReadable;
+ }
}
// [EOF]