X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=e1f0d55fb45eef10e1124b9789d621785dbf9473;hp=161710f552f119e0faa8ceefb0c3288cfa5e91fe;hb=fbd656cb3ca44cd60893ad06983c43d908ad1e29;hpb=14bdac2c495c6f7b2408ecb75a7a3798f0881cc4 diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 161710f5..e1f0d55f 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -5,7 +5,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 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.shipsimu.org * @@ -24,14 +24,9 @@ */ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** - * Length of count - */ - const LENGTH_COUNT = 20; - - /** - * Length of position + * Length of output from hash() */ - const LENGTH_POSITION = 20; + private static $hashLength = NULL; /** * The real class name @@ -121,7 +116,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Instance of the stacker */ - private $stackerInstance = NULL; + private $stackInstance = NULL; /** * A Compressor instance @@ -134,7 +129,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { private $parserInstance = NULL; /** - * A ProtocolHandler instance + * A HandleableProtocol instance */ private $protocolInstance = NULL; @@ -153,6 +148,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $sourceInstance = NULL; + /** + * An instance of a UrlSource class + */ + private $urlSourceInstance = NULL; + /** * An instance of a InputStream class */ @@ -189,69 +189,59 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { private $pointerInstance = NULL; /** - * An instance of an index + * An instance of an Indexable class */ private $indexInstance = NULL; /** - * Thousands separator - */ - private $thousands = '.'; // German - - /** - * Decimal separator - */ - private $decimals = ','; // German - - /** - * Socket resource + * An instance of a Block class */ - private $socketResource = FALSE; + private $blockInstance = NULL; /** - * Package data + * A Minable instance */ - private $packageData = array(); + private $minableInstance = NULL; /** - * Generic array + * A FrameworkDirectory instance */ - private $genericArray = array(); + private $directoryInstance = NULL; /** - * Length of output from hash() + * Listener instance */ - private static $hashLength = NULL; + private $listenerInstance = NULL; /** - * Counter for total entries + * Thousands separator */ - private $totalEntries = 0; + private $thousands = '.'; // German /** - * Current seek position + * Decimal separator */ - private $seekPosition = 0; + private $decimals = ','; // German /** - * Size of header + * Socket resource */ - private $headerSize = 0; + private $socketResource = FALSE; /** - * File header + * Regular expression to use for validation */ - private $header = array(); + private $regularExpression = ''; /** - * Seek positions for gaps ("fragmentation") + * Package data */ - private $gaps = array(); + private $packageData = array(); /** - * Seek positions for damaged entries (e.g. mismatching hash sum, ...) + * Generic array */ - private $damagedEntries = array(); + private $genericArray = array(); /*********************** * Exception codes.... * @@ -988,20 +978,20 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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; } /** @@ -1043,19 +1033,19 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * 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; @@ -1101,6 +1091,27 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 * @@ -1123,7 +1134,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for a Sourceable instance * - * @param $sourceInstance The Sourceable instance + * @param $sourceInstance An instance of a Sourceable class * @return void */ protected final function setSourceInstance (Sourceable $sourceInstance) { @@ -1133,12 +1144,31 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Getter for a Sourceable instance * - * @return $sourceInstance The Sourceable instance + * @return $sourceInstance An instance of a Sourceable class */ protected final function getSourceInstance () { return $this->sourceInstance; } + /** + * Setter for a UrlSource 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 * @@ -1274,24 +1304,40 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Setter for InputOutputPointer instance + * Setter for FilePointer instance * - * @param $pointerInstance An instance of an InputOutputPointer class + * @param $pointerInstance An instance of an FilePointer class * @return void */ - protected final function setPointerInstance (InputOutputPointer $pointerInstance) { + protected final function setPointerInstance (FilePointer $pointerInstance) { $this->pointerInstance = $pointerInstance; } /** - * Getter for InputOutputPointer instance + * Getter for FilePointer instance * - * @return $pointerInstance An instance of an InputOutputPointer class + * @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 * @@ -1311,6 +1357,82 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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; + } + /** * Checks whether an object equals this object. You should overwrite this * method to implement own equality checks @@ -1387,7 +1509,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * 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 @@ -1410,7 +1532,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // END - if // Initialize the template engine - $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + $templateInstance = ObjectFactory::createObjectByConfiguredName('html_template_class'); // Return the prepared instance return $templateInstance; @@ -1548,7 +1670,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Try it try { // Get a debugger instance - $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class')); + $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_' . $this->getResponseTypeFromSystem() . '_class')); } catch (NullPointerException $e) { // Didn't work, no instance there exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage()); @@ -1788,7 +1910,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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 @@ -1834,7 +1957,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $fieldValue = $fieldArray[$fieldName]; } 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 @@ -2106,8 +2229,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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 @@ -2827,296 +2953,42 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Translates boolean TRUE to 'Y' and FALSE to 'N' + * Initializes the web output instance * - * @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; - } - - /** - * Initializes counter for valid entries, arrays for damaged entries and - * an array for gap seek positions. If you call this method on your own, - * please re-analyze the file structure. So you are better to call - * analyzeFile() instead of this method. - * - * @return void - */ - protected function initCountersGapsArray () { - // Init counter and seek position - $this->setCounter(0); - $this->setSeekPosition(0); - - // Init arrays - $this->gaps = array(); - $this->damagedEntries = array(); - } - - /** - * Getter for total entries - * - * @return $totalEntries Total entries in this file - */ - protected final function getCounter () { - // Get it - return $this->totalEntries; - } - - /** - * Setter for total entries - * - * @param $totalEntries Total entries in this file - * @return void - */ - protected final function setCounter ($counter) { - // Set it - $this->totalEntries = $counter; - } - - /** - * Increment counter - * - * @return void - */ - protected final function incrementCounter () { - // Get it - $this->totalEntries++; - } - - /** - * Getter for header size - * - * @return $totalEntries Size of file header - */ - protected final function getHeaderSize () { - // Get it - return $this->headerSize; - } - - /** - * Setter for header size - * - * @param $headerSize Size of file header - * @return void - */ - protected final function setHeaderSize ($headerSize) { - // Set it - $this->headerSize = $headerSize; - } - - /** - * Getter for header array - * - * @return $totalEntries Size of file header - */ - protected final function getHeade () { - // Get it - return $this->header; - } - - /** - * Setter for header - * - * @param $header Array for a file header * @return void */ - protected final function setHeader (array $header) { - // Set it - $this->header = $header; - } - - /** - * Getter for seek position - * - * @return $seekPosition Current seek position (stored here in object) - */ - protected final function getSeekPosition () { - // Get it - return $this->seekPosition; - } - - /** - * Setter for seek position - * - * @param $seekPosition Current seek position (stored here in object) - * @return void - */ - protected final function setSeekPosition ($seekPosition) { - // And set it - $this->seekPosition = $seekPosition; - } - - /** - * Updates seekPosition attribute from file to avoid to much access on file. - * - * @return void - */ - protected function updateSeekPosition () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); - - // Get key (= seek position) - $seekPosition = $this->getIteratorInstance()->key(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Setting seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); - - // And set it here - $this->setSeekPosition($seekPosition); - - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); - } - - /** - * Checks whether the file header is initialized - * - * @return $isInitialized Whether the file header is initialized - */ - protected function isFileHeaderInitialized () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); - - // Is the method there? - assert(is_callable(array($this, 'readFileHeader'))); - - // Default is not initialized - $isInitialized = FALSE; + protected function initWebOutputInstance () { + // Get application instance + $applicationInstance = Registry::getRegistry()->getInstance('app'); - // Is the file initialized? - if ($this->isFileInitialized()) { - // Some bytes has been written, so rewind to start of it. - $rewindStatus = $this->getIteratorInstance()->rewind(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] rewindStatus=%s', __METHOD__, __LINE__, $rewindStatus)); - - // Is the rewind() call successfull? - if ($rewindStatus != 1) { - // Something bad happened - self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Could not rewind().', __METHOD__, __LINE__)); - } // END - if - - // Read file header - $this->readFileHeader(); - - // The above method does already check the header - $isInitialized = TRUE; + // Is this a response instance? + if ($this instanceof Responseable) { + // Then set it in application instance + $applicationInstance->setResponseInstance($this); } // END - if - // Return result - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); - return $isInitialized; - } - - /** - * Checks whether the assigned file has been initialized - * - * @return $isInitialized Whether the file's size is zero - */ - protected function isFileInitialized () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); - - // Get it from iterator which holds the pointer instance. If FALSE is returned - $fileSize = $this->getIteratorInstance()->size(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] fileSize=%s', __METHOD__, __LINE__, $fileSize)); - - /* - * The returned file size should not be FALSE or NULL as this means - * that the pointer class does not work correctly. - */ - assert(is_int($fileSize)); - - // Is more than 0 returned? - $isInitialized = ($fileSize > 0); - - // Return result - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized))); - return $isInitialized; - } - - /** - * Creates the assigned file - * - * @return void - */ - protected function createFileHeader () { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); - - // The method flushFileHeader() must be callable - assert(is_callable(array($this, 'flushFileHeader'))); - - // The file's header should not be initialized here - assert(!$this->isFileHeaderInitialized()); - - // Simple flush file header which will create it. - $this->flushFileHeader(); - - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__)); - } - - /** - * Writes data at given position - * - * @param $seekPosition Seek position - * @param $data Data to be written - * @return void - */ - protected function writeData ($seekPosition, $data) { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s,data()=%s - CALLED!', __METHOD__, __LINE__, $seekPosition, strlen($data))); - - // Write data at given position - $this->getIteratorInstance()->writeAtPosition($seekPosition, $data); - - // Update seek position - $this->updateSeekPosition(); + // Init web output instance + $outputInstance = ObjectFactory::createObjectByConfiguredName('output_class', array($applicationInstance)); - // Flush header - $this->flushFileHeader(); - - // Seek to old position - $this->seekToOldPosition(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + // Set it locally + $this->setWebOutputInstance($outputInstance); } /** - * Pre-allocates file (if enabled) with some space for later faster write access. + * Translates boolean TRUE to 'Y' and FALSE to 'N' * - * @param $type Type of the file - * @return void + * @param $boolean Boolean value + * @return $translated Translated boolean value */ - protected function preAllocateFile ($type) { - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__)); - - // caluclateMinimumFileEntryLength() must be callable - assert(is_callable(array($this, 'caluclateMinimumFileEntryLength'))); - - // Is it enabled? - if ($this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_enabled') != 'Y') { - // Not enabled - self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Not pre-allocating file.', __METHOD__, __LINE__)); - - // Don't continue here. - return; - } // END - if - - // Message to user - self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Pre-allocating file ...', __METHOD__, __LINE__)); - - // Calculate minimum length for one entry - $minLengthEntry = $this->caluclateMinimumFileEntryLength(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry)); - - // Calulcate seek position - $seekPosition = $minLengthEntry * $this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_count'); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s', __METHOD__, __LINE__, $seekPosition)); + public static final function translateBooleanToYesNo ($boolean) { + // Make sure it is really boolean + assert(is_bool($boolean)); - // Now simply write a NUL there. This will pre-allocate the file. - $this->writeData($seekPosition, chr(0)); + // "Translate" it + $translated = ($boolean === TRUE) ? 'Y' : 'N'; - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__)); + // ... and return it + return $translated; } }