Introduced isFieldSet().
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index 4207299b8f159ec5852ecb81d219a4882193d8d8..2e42a794b12018efe454f560730ca1a54d9e6d3a 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @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.shipsimu.org
  *
  * 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
         */
@@ -111,7 +116,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        /**
         * Instance of the stacker
         */
-       private $stackerInstance = NULL;
+       private $stackInstance = NULL;
 
        /**
         * A Compressor instance
@@ -124,7 +129,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $parserInstance = NULL;
 
        /**
-        * A ProtocolHandler instance
+        * A HandleableProtocol instance
         */
        private $protocolInstance = NULL;
 
@@ -144,12 +149,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        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;
 
@@ -173,6 +183,36 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        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;
+
        /**
         * Thousands separator
         */
@@ -188,6 +228,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $socketResource = FALSE;
 
+       /**
+        * Regular expression to use for validation
+        */
+       private $regularExpression = '';
+
        /**
         * Package data
         */
@@ -198,6 +243,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $genericArray = array();
 
+       /**
+        * Command name
+        */
+       private $commandName = '';
+
+       /**
+        * Controller name
+        */
+       private $controllerName = '';
+
        /***********************
         * Exception codes.... *
         ***********************/
@@ -249,6 +304,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        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;
@@ -259,7 +315,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        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_FILTER_CHAIN_INTERCEPTED     = 0x03a;
 
        /**
         * Hexadecimal->Decimal translation array
@@ -355,6 +411,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } else {
                        // Do not call this twice
                        trigger_error(__METHOD__ . ': Called twice.');
+                       exit;
                }
        }
 
@@ -455,7 +512,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                $this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
                        $name,
                        gettype($value),
-                       $value
+                       print_r($value, TRUE)
                ));
        }
 
@@ -931,20 +988,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;
        }
 
        /**
@@ -986,19 +1043,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;
@@ -1044,6 +1101,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
         *
@@ -1066,7 +1144,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) {
@@ -1076,47 +1154,66 @@ 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;
        }
 
        /**
-        * Getter for a InputStreamable instance
+        * 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
         *
-        * @param       $inputStreamInstance    The InputStreamable 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;
        }
 
@@ -1216,6 +1313,174 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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;
+       }
+
+       /**
+        * 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;
+       }
+
        /**
         * Checks whether an object equals this object. You should overwrite this
         * method to implement own equality checks
@@ -1292,7 +1557,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
@@ -1315,7 +1580,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;
@@ -1410,6 +1675,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } else {
                        // Trigger an error
                        trigger_error($stubMessage);
+                       exit;
                }
        }
 
@@ -1444,20 +1710,29 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @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'));
+                       } 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;
@@ -1683,7 +1958,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
@@ -1721,21 +1997,55 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, TRUE).'</pre>');
 
                // Convert dashes to underscore
-               $fieldName = $this->convertDashesToUnderscores($fieldName);
+               $fieldName2 = $this->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 = $this->convertDashesToUnderscores($fieldName);
+
+               // Determine it
+               $isSet = isset($fieldArray[$fieldName]);
+
+               // Return result
+               return $isSet;
+       }
+
        /**
         * Flushs all pending updates to the database layer
         *
@@ -1775,6 +2085,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        } else {
                                // Trigger an error
                                trigger_error($message . "<br />\n");
+                               exit;
                        }
                } else {
                        // @TODO Finish this part!
@@ -1994,14 +2305,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         *
         * @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
@@ -2017,7 +2331,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
                // Generate it
-               $cacheKey = sprintf("%s@%s",
+               $cacheKey = sprintf('%s@%s',
                        $this->__toString(),
                        $criteriaInstance->getCacheKey($onlyKeys)
                );
@@ -2053,19 +2367,37 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * 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).
         *
@@ -2198,6 +2530,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // No, then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+                       exit;
                } // END - if
 
                // Debug message
@@ -2304,6 +2637,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (($forceInit === FALSE) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
                        // Already initialized
                        trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' already initialized.');
+                       exit;
                } // END - if
 
                // Initialize it
@@ -2327,6 +2661,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2351,6 +2686,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2430,6 +2766,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2457,6 +2794,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2482,6 +2820,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (!isset($this->genericArray[$keyGroup])) {
                        // Abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' not found.');
+                       exit;
                } // END - if
 
                // Then count it
@@ -2509,6 +2848,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // Abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+                       exit;
                } // END - if
 
                // Then count it
@@ -2537,9 +2877,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2566,6 +2908,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (!isset($this->genericArray[$keyGroup])) {
                        // Then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' does not exist.');
+                       exit;
                } // END - if
 
                // Return it
@@ -2605,6 +2948,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2646,6 +2990,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                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
@@ -2688,6 +3033,45 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // 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;
+       }
 }
 
 // [EOF]