]> git.mxchange.org Git - core.git/commitdiff
Continued:
authorRoland Häder <roland@mxchange.org>
Fri, 10 Feb 2023 07:48:08 +0000 (08:48 +0100)
committerRoland Häder <roland@mxchange.org>
Fri, 10 Feb 2023 07:48:08 +0000 (08:48 +0100)
- added more checks on parameter and thrown proper exceptions

framework/main/classes/class_BaseFrameworkSystem.php

index 31ee5443b198f948a24b2c71043e5f0ed250a9b2..dcabe48ca702cf25c3594556b2c0586a444db987 100644 (file)
@@ -22,10 +22,11 @@ use Org\Mxchange\CoreFramework\Stream\Output\OutputStreamer;
 use Org\Mxchange\CoreFramework\Utils\Strings\StringUtils;
 
 // Import SPL stuff
-use \stdClass;
+use \BadMethodCallException;
 use \InvalidArgumentException;
 use \ReflectionClass;
 use \SplFileInfo;
+use \stdClass;
 
 /**
  * The simulator system class is the super class of all other classes. This
@@ -404,11 +405,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @return      $debugInstance  Instance to class DebugConsoleOutput or DebugWebOutput
         */
        public final function getDebugInstance () {
-               // Get debug instance
-               $debugInstance = GenericRegistry::getRegistry()->getInstance('debug');
-
-               // Return it
-               return $debugInstance;
+               return GenericRegistry::getRegistry()->getInstance('debug');
        }
 
        /**
@@ -427,8 +424,7 @@ abstract class BaseFrameworkSystem extends stdClass implements FrameworkInterfac
         * @return      $webOutputInstance - Instance to class WebOutput
         */
        public final function getWebOutputInstance () {
-               $webOutputInstance = GenericRegistry::getRegistry()->getInstance('web_output');
-               return $webOutputInstance;
+               return GenericRegistry::getRegistry()->getInstance('web_output');
        }
 
        /**
@@ -759,9 +755,12 @@ Loaded includes:
         * @return      $entry  An array with database entries
         * @throws      NullPointerException    If the database result is not found
         * @throws      InvalidDatabaseResultException  If the database result is invalid
-        * @todo        Monolithic method, should be moved to proper classes
+        * @deprecated  Monolithic method, should be moved to proper classes
         */
        protected final function getDatabaseEntry () {
+               // This method is deprecated
+               $this->deprecationWarning('Monolithic method, should be moved to proper classes');
+
                // Is there an instance?
                if (!$this->getResultInstance() instanceof SearchableResult) {
                        // Throw an exception here
@@ -793,8 +792,19 @@ Loaded includes:
         * @param       $fieldName              Field name which we shall get
         * @return      $fieldValue             Field value from the user
         * @throws      NullPointerException    If the result instance is null
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @deprecated  Monolithic method, should be moved to proper classes
         */
        public final function getField (string $fieldName) {
+               // Check parameter
+               if (empty($fieldName)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "fieldName" is empty');
+               }
+
+               // This method is deprecated
+               $this->deprecationWarning('Monolithic method, should be moved to proper classes');
+
                // Default field value
                $fieldValue = NULL;
 
@@ -836,8 +846,15 @@ Loaded includes:
         * @param       $fieldName      Field name to check
         * @return      $isSet          Whether the given field name is set
         * @throws      NullPointerException    If the result instance is null
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        public function isFieldSet (string $fieldName) {
+               // Check parameter
+               if (empty($fieldName)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "fieldName" is empty');
+               }
+
                // Get result instance
                $resultInstance = $this->getResultInstance();
 
@@ -891,8 +908,15 @@ Loaded includes:
         *
         * @param       $phpExtension   The PHP extension we shall check
         * @return      $isLoaded       Whether the PHP extension is loaded
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        public final function isPhpExtensionLoaded (string $phpExtension) {
+               // Check parameter
+               if (empty($phpExtension)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "phpExtension" is empty');
+               }
+
                // Is it loaded?
                $isLoaded = in_array($phpExtension, get_loaded_extensions());
 
@@ -918,8 +942,15 @@ Loaded includes:
         * Idles (sleeps) for given milliseconds
         *
         * @return      $hasSlept       Whether it goes fine
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        public function idle (int $milliSeconds) {
+               // Check parameter
+               if ($milliSeconds < 1) {
+                       // Throw IAE
+                       throw new InvalidArgumentException(sprintf('milliSeconds=%d are not a reasonable value to idle', $milliSeconds));
+               }
+
                // Sleep is fine by default
                $hasSlept = true;
 
@@ -947,8 +978,15 @@ Loaded includes:
         *
         * @param       $encodedData    Encoded data we shall check
         * @return      $isBase64               Whether the encoded data is Base64
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected function isBase64Encoded (string $encodedData) {
+               // Check parameter
+               if (empty($encodedData)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "encodedData" is empty');
+               }
+
                // Determine it
                $isBase64 = (@base64_decode($encodedData, true) !== false);
 
@@ -986,8 +1024,24 @@ Loaded includes:
         * @param       $key            Key to check
         * @param       $element        Element to check
         * @return      $isset          Whether the given key is set
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function isGenericArrayElementSet (string $keyGroup, string $subGroup, $key, $element) {
+               // Check parameter
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               }
+
                // Is it there?
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
                $isset = isset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
@@ -1002,8 +1056,21 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to check
         * @return      $isset          Whether the given key is set
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function isGenericArrayKeySet (string $keyGroup, string $subGroup, $key) {
+               // Check parameter
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               }
+
                // Is it there?
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
                $isset = isset($this->genericArray[$keyGroup][$subGroup][$key]);
@@ -1012,17 +1079,26 @@ Loaded includes:
                return $isset;
        }
 
-
        /**
         * Determines if a group is set in the generic array
         *
         * @param       $keyGroup       Main group
         * @param       $subGroup       Sub group
         * @return      $isset          Whether the given group is set
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function isGenericArrayGroupSet (string $keyGroup, string $subGroup) {
-               // Is it there?
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               }
+
+               // Is it there?
                $isset = isset($this->genericArray[$keyGroup][$subGroup]);
 
                // Return it
@@ -1035,17 +1111,24 @@ Loaded includes:
         * @param       $keyGroup       Main key group
         * @param       $subGroup       Sub key group
         * @return      $array          An array with all array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function getGenericSubArray (string $keyGroup, string $subGroup) {
-               // Is it there?
-               if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
+               // Check parameter
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], true));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // No, then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found.', $keyGroup, $subGroup));
                }
 
                // Return it
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], true));
                return $this->genericArray[$keyGroup][$subGroup];
        }
 
@@ -1056,10 +1139,23 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function unsetGenericArrayKey (string $keyGroup, string $subGroup, $key) {
-               // Remove it
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               }
+
+               // Remove it
                unset($this->genericArray[$keyGroup][$subGroup][$key]);
        }
 
@@ -1071,10 +1167,24 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $element        Element to unset
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function unsetGenericArrayElement (string $keyGroup, string $subGroup, $key, $element) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               }
 
                // Remove it
                unset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
@@ -1088,18 +1198,29 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $value          Value to add/append
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function appendStringToGenericArrayKey (string $keyGroup, string $subGroup, $key, string $value, $appendGlue = '') {
-               // Debug message
+       protected final function appendStringToGenericArrayKey (string $keyGroup, string $subGroup, $key, string $value, string $appendGlue = '') {
+               // Check parameter
                //* 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);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               }
 
                // Is it already there?
                if ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Append it
-                       $this->genericArray[$keyGroup][$subGroup][$key] .= $appendGlue . (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key] .= $appendGlue . $value;
                } else {
                        // Add it
-                       $this->genericArray[$keyGroup][$subGroup][$key] = (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key] = $value;
                }
        }
 
@@ -1112,39 +1233,35 @@ Loaded includes:
         * @param       $element        Element to check
         * @param       $value          Value to add/append
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected final function appendStringToGenericArrayElement (string $keyGroup, string $subGroup, $key, $element, $value, $appendGlue = '') {
-               // Debug message
+       protected final function appendStringToGenericArrayElement (string $keyGroup, string $subGroup, $key, $element, string $value, string $appendGlue = '') {
+               // Check parameter
                //* 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);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               }
 
                // Is it already there?
                if ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Append it
-                       $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . (string) $value;
+                       $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . $value;
                } else {
                        // Add it
                        $this->setStringGenericArrayElement($keyGroup, $subGroup, $key, $element, $value);
                }
        }
 
-       /**
-        * Sets a string in 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 setStringGenericArrayElement (string $keyGroup, string $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);
-
-               // Set it
-               $this->genericArray[$keyGroup][$subGroup][$key][$element] = (string) $value;
-       }
-
        /**
         * Initializes given generic array group
         *
@@ -1153,16 +1270,21 @@ Loaded includes:
         * @param       $key            Key to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group has already been initialized
         */
        protected final function initGenericArrayGroup (string $keyGroup, string $subGroup, bool $forceInit = false) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',forceInit=' . intval($forceInit));
-
-               // Is it already set?
-               if (($forceInit === false) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (($forceInit === false) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' already initialized.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s already initialized.', $keyGroup, $subGroup));
                }
 
                // Initialize it
@@ -1177,16 +1299,24 @@ Loaded includes:
         * @param       $key            Key to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group has already been initialized
         */
        protected final function initGenericArrayKey (string $keyGroup, string $subGroup, $key, bool $forceInit = false) {
-               // Debug message
+               // Check parameter
                //* 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))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (($forceInit === false) && ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' already initialized.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s already initialized.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Initialize it
@@ -1202,16 +1332,27 @@ Loaded includes:
         * @param       $element        Element to use
         * @param       $forceInit      Optionally force initialization
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function initGenericArrayElement (string $keyGroup, string $subGroup, $key, $element, bool $forceInit = false) {
-               // Debug message
+               // Check parameter
                //* 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))) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               } elseif (($forceInit === false) && ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element))) {
                        // Already initialized
-                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' already initialized.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s,element[%s]=%s already initialized.', $keyGroup, $subGroup, gettype($key), $key, gettype($element), $element));
                }
 
                // Initialize it
@@ -1219,20 +1360,28 @@ Loaded includes:
        }
 
        /**
-        * Pushes an element to a generic key
+        * Pushes an element to a generic key. If the key isn't found, it will be initialized.
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to use
         * @param       $value          Value to add/append
         * @return      $count          Number of array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function pushValueToGenericArrayKey (string $keyGroup, string $subGroup, $key, $value) {
-               // Debug message
+               // Check parameter
                //* 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)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Initialize array
                        $this->initGenericArrayKey($keyGroup, $subGroup, $key);
                }
@@ -1247,7 +1396,7 @@ Loaded includes:
        }
 
        /**
-        * Pushes an element to a generic array element
+        * Pushes an element to a generic array element. If the key isn't found, it will be initialized.
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
@@ -1255,13 +1404,24 @@ Loaded includes:
         * @param       $element        Element to check
         * @param       $value          Value to add/append
         * @return      $count          Number of array elements
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function pushValueToGenericArrayElement (string $keyGroup, string $subGroup, $key, $element, $value) {
-               // Debug message
+               // Check parameter
                //* 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)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Initialize array
                        $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
                }
@@ -1282,16 +1442,24 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      $value          Last "popped" value
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function popGenericArrayElement (string $keyGroup, string $subGroup, $key) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it set?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Then "pop" it
@@ -1309,17 +1477,25 @@ Loaded includes:
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
-        * @return      $value          Last "popped" value
+        * @return      $value          Last "shifted" value
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function shiftGenericArrayElement (string $keyGroup, string $subGroup, $key) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it set?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Then "shift" it
@@ -1336,25 +1512,25 @@ Loaded includes:
         *
         * @param       $keyGroup       Main group for the key
         * @return      $count          Count of given group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key group isn't there but this method is invoked
         */
        protected final function countGenericArray (string $keyGroup) {
-               // Debug message
+               // Check parameter
                //* 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;
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (!isset($this->genericArray[$keyGroup])) {
+                       // Not found
+                       throw new BadMethodCallException(sprintf('keyGroup=%s not found.', $keyGroup));
                }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup]);
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
-
                // Return it
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
                return $count;
        }
 
@@ -1364,25 +1540,28 @@ Loaded includes:
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @return      $count          Count of given group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function countGenericArrayGroup (string $keyGroup, string $subGroup) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
-
-               // Is it there?
-               if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // Abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found.', $keyGroup, $subGroup));
                }
 
                // 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
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',count=' . $count);
                return $count;
        }
 
@@ -1391,31 +1570,36 @@ Loaded includes:
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
-        * @para        $key            Key to count
+        * @param       $key            Key to count
         * @return      $count          Count of given key
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function countGenericArrayElements (string $keyGroup, string $subGroup, $key) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it there?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                } elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
                        // Not valid
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' is not an array.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s is not a valid key/sub group.', $keyGroup, $subGroup));
                }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup][$subGroup][$key]);
 
-               // Debug message
-               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
-
                // Return it
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
                return $count;
        }
 
@@ -1424,16 +1608,18 @@ Loaded includes:
         *
         * @param       $keyGroup       Key group to get
         * @return      $array          Whole generic array group
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function getGenericArray (string $keyGroup) {
-               // Debug message
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
-
-               // Is it there?
-               if (!isset($this->genericArray[$keyGroup])) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (!isset($this->genericArray[$keyGroup])) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' does not exist.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s not found', $keyGroup));
                }
 
                // Return it
@@ -1448,10 +1634,25 @@ Loaded includes:
         * @param       $key            Key to unset
         * @param       $value          Mixed value from generic array element
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function setGenericArrayKey (string $keyGroup, string $subGroup, $key, $value) {
-               // Debug message
+               // Check parameters
                //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, true));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
+                       // Then abort here
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s not found', $keyGroup));
+               }
 
                // Set value here
                $this->genericArray[$keyGroup][$subGroup][$key] = $value;
@@ -1464,16 +1665,24 @@ Loaded includes:
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to unset
         * @return      $value          Mixed value from generic array element
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function getGenericArrayKey (string $keyGroup, string $subGroup, $key) {
-               // Debug message
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
-
-               // Is it there?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' does not exist.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key));
                }
 
                // Return it
@@ -1489,10 +1698,27 @@ Loaded includes:
         * @param       $element        Element to set
         * @param       $value          Value to set
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function setGenericArrayElement (string $keyGroup, string $subGroup, $key, $element, $value) {
-               // Debug message
+               // Check parameter
                //* 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));
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+                       // Initialize array
+                       $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
+               }
 
                // Then set it
                $this->genericArray[$keyGroup][$subGroup][$key][$element] = $value;
@@ -1506,16 +1732,27 @@ Loaded includes:
         * @param       $key            Key to look for
         * @param       $element        Element to look for
         * @return      $value          Mixed value from generic array element
+        * @throws      InvalidArgumentException        If a parameter is not valid
+        * @throws      BadMethodCallException  If key/sub group isn't there but this method is invoked
         */
        protected final function getGenericArrayElement (string $keyGroup, string $subGroup, $key, $element) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
-
-               // Is it there?
-               if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               } elseif (empty($element)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "element" is empty');
+               } elseif (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Then abort here
-                       trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' does not exist.');
-                       exit;
+                       throw new BadMethodCallException(sprintf('keyGroup=%s,subGroup=%s,key[%s]=%s,element[%s]=%s not found.', $keyGroup, $subGroup, gettype($key), $key, gettype($element), $element));
                }
 
                // Return it
@@ -1528,10 +1765,18 @@ Loaded includes:
         * @param       $keyGroup       Key group to get
         * @param       $subGroup       Sub group for the key
         * @return      $isValid        Whether given sub group is valid
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
        protected final function isValidGenericArrayGroup (string $keyGroup, string $subGroup) {
-               // Debug message
+               // Check parameter
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               }
 
                // Determine it
                $isValid = (($this->isGenericArrayGroupSet($keyGroup, $subGroup)) && (is_array($this->getGenericSubArray($keyGroup, $subGroup))));
@@ -1549,8 +1794,18 @@ Loaded includes:
         * @return      $isValid        Whether given sub group is valid
         */
        protected final function isValidGenericArrayKey (string $keyGroup, string $subGroup, $key) {
-               // Debug message
+               // Check parameters
                //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+               if (empty($keyGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "keyGroup" is empty');
+               } elseif (empty($subGroup)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "subGroup" is empty');
+               } elseif (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty');
+               }
 
                // Determine it
                $isValid = (($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) && (is_array($this->getGenericArrayKey($keyGroup, $subGroup, $key))));