From: Roland Häder <roland@mxchange.org>
Date: Mon, 27 Feb 2023 04:59:23 +0000 (+0100)
Subject: Continued:
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=9ad41b1a5047ba120036230e61e9d519bcb72a86;p=core.git

Continued:
- added more checks on parameter
- added more debug lines
---

diff --git a/framework/main/classes/handler/class_BaseHandler.php b/framework/main/classes/handler/class_BaseHandler.php
index 47bfc2d5..a492266c 100644
--- a/framework/main/classes/handler/class_BaseHandler.php
+++ b/framework/main/classes/handler/class_BaseHandler.php
@@ -4,9 +4,13 @@ namespace Org\Mxchange\CoreFramework\Handler;
 
 // Import framework stuff
 use Org\Mxchange\CoreFramework\Criteria\Storing\StoreableCriteria;
+use Org\Mxchange\CoreFramework\Generic\FrameworkInterface;
 use Org\Mxchange\CoreFramework\Handler\DataSet\HandleableDataSet;
 use Org\Mxchange\CoreFramework\Object\BaseFrameworkSystem;
 
+// Import SPL stuff
+use \InvalidArgumentException;
+
 /**
  * A general Handler
  *
@@ -43,7 +47,11 @@ abstract class BaseHandler extends BaseFrameworkSystem implements HandleableData
 	 */
 	protected function __construct (string $className) {
 		// Call parent constructor
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HANDLER: className=%s - CONSTRUCTED!', $className));
 		parent::__construct($className);
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-HANDLER: EXIT!');
 	}
 
 	/**
@@ -74,6 +82,15 @@ abstract class BaseHandler extends BaseFrameworkSystem implements HandleableData
 	 * @todo	Rewrite this to use DHT
 	 */
 	public function addArrayToDataSet (StoreableCriteria $dataSetInstance, array $messageData) {
+		// Check parameter
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HANDLER: dataSetInstance=%s,messageData()=%d - CALLED!', $dataSetInstance->__toString(), count($messageData)));
+		if (count($messageData) == 0) {
+			// Throw IAE
+			throw new InvalidArgumentException('Parameter "messageData" is an empty array', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+		}
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-HANDLER: EXIT!');
 	}
 
 }
diff --git a/framework/main/classes/handler/tasks/class_TaskHandler.php b/framework/main/classes/handler/tasks/class_TaskHandler.php
index 792073e1..93963c8a 100644
--- a/framework/main/classes/handler/tasks/class_TaskHandler.php
+++ b/framework/main/classes/handler/tasks/class_TaskHandler.php
@@ -56,10 +56,15 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	private function __construct () {
 		// Call parent constructor
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: CONSTRUCTWD!');
 		parent::__construct(__CLASS__);
 
 		// Set handler name
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Setting handlerName=task ...');
 		$this->setHandlerName('task');
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 	/**
@@ -69,10 +74,11 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public static final function createTaskHandler () {
 		// Get new instance
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: CALLED!');
 		$handlerInstance = new TaskHandler();
 
 		// Output debug message
-		self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Initializing task handler.');
+		self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Initializing task handler.');
 
 		// Init the task list
 		$handlerInstance->setListInstance(ObjectFactory::createObjectByConfiguredName('task_list_class'));
@@ -88,9 +94,10 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 		$handlerInstance->registerTask('idle_loop', $taskInstance);
 
 		// Output debug message
-		self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Task handler initialized.');
+		self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Task handler initialized.');
 
 		// Return the prepared instance
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER:handlerInstance=%s - EXIT!', $handlerInstance->__toString()));
 		return $handlerInstance;
 	}
 
@@ -104,6 +111,7 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	private function executeCurrentTask () {
 		// Update no task by default
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: CALLED!');
 		$updateTask = false;
 
 		// Is the current task valid?
@@ -116,14 +124,17 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 		$currentTask = $this->getListInstance()->getIterator()->current();
 
 		// Is the task not yet started?
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: currentTask()=%d', count($currentTask)));
 		if ($currentTask['task_started'] === false) {
 			// Determine difference between current time and registration
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: currentTask[id]=%s has not started yet, checking ...', $currentTask['id']));
 			$diff = ($this->getMilliTime() - $currentTask['task_registered']) * 1000;
 
 			// Should we start now?
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: diff=%d,currentTask[task_startup_delay]=%d', $diff, $currentTask['task_startup_delay']));
 			if ($diff < $currentTask['task_startup_delay']) {
 				// Skip this silently
-				//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Task ' . $currentTask['id'] . ' not started: diff=' . $diff . ',task_startup_delay=' . $currentTask['task_startup_delay']);
+				/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Task %s not started: diff=%d,task_startup_delay=%d', $currentTask['id'], $diff, $currentTask['task_startup_delay']));
 				return;
 			}
 
@@ -132,22 +143,25 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 			$updateTask = true;
 
 			// Debug message
-			self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Task ' . $currentTask['id'] . ' started with startup_delay=' . $currentTask['task_startup_delay'] . 'ms');
+			self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Task %s started with startup_delay=%dms', $currentTask['id'], $currentTask['task_startup_delay']));
 		}
 
 		// Get time difference from interval delay
 		$diff = ($this->getMilliTime() - $currentTask['task_last_activity']) * 1000;
 
 		// Is the interval delay reached?
-		//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Task ' . $currentTask['id'] . ' diff=' . $diff . ',task_interval_delay=' . $currentTask['task_interval_delay'] . ',task_max_runs=' . $currentTask['task_max_runs'] . ',task_total_runs=' . $currentTask['task_total_runs']);
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Task ' . $currentTask['id'] . ' diff=' . $diff . ',task_interval_delay=' . $currentTask['task_interval_delay'] . ',task_max_runs=' . $currentTask['task_max_runs'] . ',task_total_runs=' . $currentTask['task_total_runs']);
 		if ((($diff < $currentTask['task_interval_delay']) && ($currentTask['task_max_runs'] == 0)) || (($currentTask['task_max_runs'] > 0) && ($currentTask['task_total_runs'] == $currentTask['task_max_runs']))) {
 			// Should we update the task from startup?
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: currentTask[id]=%s has reached interval ... updateTask=%d', $currentTask['id'], intval($updateTask)));
 			if ($updateTask === true) {
 				// Update the task before leaving
+				/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Updating task %s ...', $currentTask['id']));
 				$this->updateTask($currentTask);
 			}
 
 			// Skip this silently
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Task %s has been updated - EXIT!', $currentTask['id']));
 			return;
 		}
 
@@ -158,11 +172,16 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 		$currentTask['task_total_runs']++;
 
 		// Update the task
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Updating task %s ...', $currentTask['id']));
 		$this->updateTask($currentTask);
 
 		// And visit/run it
 		// @TODO Messurement can be added around this call
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Invoking currentTask[task_instance]->accept(%s), task_instance=%s ...', $this->getVisitorInstance()->__toString(), $currentTask['task_instance']->__toString()));
 		$currentTask['task_instance']->accept($this->getVisitorInstance());
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 	/**
@@ -173,13 +192,19 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	private function updateTask (array $taskEntry) {
 		// Get the key from current iteration
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: taskEntry()=%d - CALLED!', count($taskEntry)));
 		$key = $this->getListInstance()->getIterator()->key();
 
 		// Get the hash from key
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: key=%s', $key));
 		$hash = $this->getListInstance()->getHashByIndex($key);
 
 		// Update the entry
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Invoking this->listInstance->updateCurrentEntryByHash(%s,taskEntry()=%d) ...', $hash, count($taskEntry)));
 		$this->getListInstance()->updateCurrentEntryByHash($hash, $taskEntry);
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 	/**
@@ -189,14 +214,12 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 * @return	void
 	 */
 	private function unregisterTask (array $taskData) {
-		// Debug output
-		//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Removing task ' . $taskData['id'] . ' from queue - CALLED!');
-
 		// Remove the entry
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Removing task %s from queue - CALLED!', $taskData['id']));
 		$this->getListInstance()->removeEntry('tasks', $taskData);
 
-		// Debug output
-		//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Removing task ' . $taskData['id'] . ' from queue - EXIT!');
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Removing task %s from queue - EXIT!', $taskData['id']));
 	 }
 
 	/**
@@ -207,24 +230,29 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public function searchTask (Taskable $taskInstance) {
 		// Default is an empty (not found) task name
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: taskInstance=%s - CALLED!', $taskInstance->__toString()));
 		$taskName = '';
 
 		// Get whole list
 		$taskList = $this->getListInstance()->getArrayFromList('tasks');
 
 		// Search all instances
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: taskList()=%d', count($taskList)));
 		foreach ($taskList as $currentTask) {
 			// Does it match given task instance?
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: currentTask[id=%s', $currentTask['id']));
 			if ($currentTask['task_instance']->equals($taskInstance)) {
 				// Found it
 				$taskName = $currentTask['id'];
 
 				// Abort here
+				/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: taskName=%s - BREAK!', $taskName));
 				break;
 			}
 		}
 
 		// Return found name
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: taskName=%s - EXIT!', $taskName));
 		return $taskName;
 	}
 
@@ -239,6 +267,7 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public function registerTask (string $taskName, Taskable $taskInstance) {
 		// Is the parameter valid
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: taskName=%s,taskInstance - CALLED!', $taskName, $taskInstance->__toString()));
 		if (empty($taskName)) {
 			// Task name cannot be empty
 			throw new InvalidArgumentException('Parameter "taskName" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
@@ -250,6 +279,7 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 		$maxRuns = FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('task_' . $taskName . '_max_runs');
 
 		// If the task is 'idle_loop', a deplay of zero seconds is fine
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: intervalDelay=%d,startupDelay=%d,maxRuns=%d', $intervalDelay, $startupDelay, $maxRuns));
 		if ($intervalDelay < 0) {
 			// Invalid configuration value
 			throw new UnexpectedValueException(sprintf('taskName=%s has intervalDelay=%d below zero', $taskName, $intervalDelay), FrameworkInterface::EXCEPTION_UNEXPECTED_VALUE);
@@ -294,15 +324,20 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 		];
 
 		// Add the entry
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Invoking this->listInstance->addEntry(tasks,taskEntry()=%d) ...', count($taskEntry)));
 		$this->getListInstance()->addEntry('tasks', $taskEntry);
 
 		// Debug message
-		self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Task registered: taskName=' . $taskName .
-			' (taskInstance=' . $taskInstance->__toString() . ')' .
-			', startupDelay=' . $taskEntry['task_startup_delay'] . 'ms' .
-			', intervalDelay=' . $taskEntry['task_interval_delay'] . 'ms' .
-			', maxRuns=' . $taskEntry['task_max_runs'] . ' ...'
-		);
+		self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Task registered: taskName=%s (taskInstance=%s), startupDelay=%dms, intervalDelay=%dms, maxRuns=%d ...',
+			$taskName,
+			$taskInstance->__toString(),
+			$taskEntry['task_startup_delay'],
+			$taskEntry['task_interval_delay'],
+			$taskEntry['task_max_runs'],
+		));
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 	/**
@@ -312,9 +347,11 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public function hasTasksLeft () {
 		// Do we have tasks there?
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: CALLED!');
 		$tasksLeft = ($this->getListInstance()->count() > 0);
 
 		// Return result
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: tasksLeft=%d - EXIT!', intval($tasksLeft)));
 		return $tasksLeft;
 	}
 
@@ -328,16 +365,23 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public function handleTasks () {
 		// Should we rewind?
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: CALLED!');
 		if (!$this->getListInstance()->getIterator()->valid()) {
 			// Rewind to the beginning for next loop
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: Invoking this->listInstance->iterator->rewind() ...');
 			$this->getListInstance()->getIterator()->rewind();
 		}
 
 		// Try to execute the task
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: Invoking this->executeCurrentTask() ...');
 		$this->executeCurrentTask();
 
 		// Go to next entry
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: Invoking this->listInstance->iterator->next() ...');
 		$this->getListInstance()->getIterator()->next();
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 	/**
@@ -348,15 +392,15 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 	 */
 	public function doShutdown () {
 		// Always rewind to the beginning for next loop
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: Invoking this->listInstance->iterator->rewind() - CALLED!');
 		$this->getListInstance()->getIterator()->rewind();
 
-		// Debug message
-		self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Shutting down all ' . $this->getListInstance()->count() . ' tasks...');
-
 		// Remember all tasks that has been shutdown for removal
+		self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Shutting down all %d tasks...', $this->getListInstance()->count()));
 		$tasks = [];
 
 		// Instance a visitor
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Setting visitorInstance=shutdown_task_visitor_class from configuration ...');
 		$this->setVisitorInstance(ObjectFactory::createObjectByConfiguredName('shutdown_task_visitor_class'));
 
 		// Shutdown all tasks in once go
@@ -364,26 +408,28 @@ class TaskHandler extends BaseHandler implements Registerable, HandleableTask {
 			// Get current entry
 			$currentTask = $this->getListInstance()->getIterator()->current();
 
-			// Output debug message
-			self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Shutting down task ' . $currentTask['id'] . ' (taskInstance=' . $currentTask['task_instance']->__toString() . ') ...');
-
 			// Shutdown the task
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('TASK-HANDLER: Shutting down task ' . $currentTask['id'] . ' (taskInstance=' . $currentTask['task_instance']->__toString() . ') ...');
 			$currentTask['task_instance']->accept($this->getVisitorInstance());
 
 			// Remember this task
 			array_push($tasks, $currentTask);
 
 			// Advance to next one
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: Invoking this->listInstance->iterator->next() ...');
 			$this->getListInstance()->getIterator()->next();
 		}
 
-		// Debug message
-		self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('TASK-HANDLER: Shutdown of all tasks completed.');
-
 		// Remove all tasks
-		foreach ($tasks as $entry) {
-			$this->unregisterTask($entry);
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('TASK-HANDLER: Shutdown of all tasks completed. tasks()=%d', count($tasks)));
+		foreach ($tasks as $taskEntry) {
+			// Unregister this task
+			/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('TASK-HANDLER: Invokint this->unregisterTask(taskEntry()=%d) ...', count($taskEntry)));
+			$this->unregisterTask($taskEntry);
 		}
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('TASK-HANDLER: EXIT!');
 	}
 
 }
diff --git a/framework/main/classes/helper/class_BaseHelper.php b/framework/main/classes/helper/class_BaseHelper.php
index 5c6ab752..f32b3618 100644
--- a/framework/main/classes/helper/class_BaseHelper.php
+++ b/framework/main/classes/helper/class_BaseHelper.php
@@ -91,7 +91,11 @@ abstract class BaseHelper extends BaseFrameworkSystem {
 	 */
 	protected function __construct (string $className) {
 		// Call parent constructor
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HELPER: className=%s - CONSTRUCTED!', $className));
 		parent::__construct($className);
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-HELPER: EXIT!');
 	}
 
 	/**
@@ -99,9 +103,21 @@ abstract class BaseHelper extends BaseFrameworkSystem {
 	 *
 	 * @param	$newContent		New content to add
 	 * @return	void
+	 * @throws	InvalidArgumentException	If a parameter has an invalid value
 	 */
 	protected final function addContent (string $newContent) {
+		// Check variable
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HELPER: newContent=%s - CALLED!', $newContent));
+		if (empty(trim($newContent))) {
+			// Throw IAE
+			throw new InvalidArgumentException('Parameter "newContent" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+		}
+
+		// Append content with EOL
 		$this->content .= trim($newContent) . PHP_EOL;
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HELPER: this->content()=%d - EXIT!', strlen($this->content)));
 	}
 
 	/**
@@ -109,10 +125,21 @@ abstract class BaseHelper extends BaseFrameworkSystem {
 	 *
 	 * @param	$content	Content to to the base
 	 * @return	void
+	 * @throws	InvalidArgumentException	If a parameter has an invalid value
 	 */
 	protected function addHeaderContent (string $content) {
+		// Check variable
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HELPER: content=%s - CALLED!', $content));
+		if (empty(trim($content))) {
+			// Throw IAE
+			throw new InvalidArgumentException('Parameter "content" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+		}
+
 		// Add the header content
 		$this->groups['header']['content'] = trim($content);
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-HELPER: EXIT!');
 	}
 
 	/**
@@ -120,10 +147,21 @@ abstract class BaseHelper extends BaseFrameworkSystem {
 	 *
 	 * @param	$content	Content to to the base
 	 * @return	void
+	 * @throws	InvalidArgumentException	If a parameter has an invalid value
 	 */
 	protected function addFooterContent (string $content) {
+		// Check variable
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-HELPER: content=%s - CALLED!', $content));
+		if (empty(trim($content))) {
+			// Throw IAE
+			throw new InvalidArgumentException('Parameter "content" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+		}
+
 		// Add the footer content
 		$this->groups['footer']['content'] = trim($content);
+
+		// Trace message
+		/* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-HELPER: EXIT!');
 	}
 
 	/**