Continued:
[core.git] / framework / main / classes / controller / class_BaseController.php
index c871c0e31fe553e237b000bd5d4207c5a7738e29..421ba3b2fee9ddd9457a1cec5c9b5801962d410a 100644 (file)
@@ -3,14 +3,19 @@
 namespace Org\Mxchange\CoreFramework\Controller;
 
 // Import framework stuff
-use Org\Mxchange\CoreFramework\Chain\Filter\InvalidFilterChainException;
-use Org\Mxchange\CoreFramework\Factory\ObjectFactory;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
 use Org\Mxchange\CoreFramework\Filter\Filterable;
+use Org\Mxchange\CoreFramework\Generic\FrameworkInterface;
 use Org\Mxchange\CoreFramework\Object\BaseFrameworkSystem;
-use Org\Mxchange\CoreFramework\Registry\GenericRegistry;
+use Org\Mxchange\CoreFramework\Registry\Object\ObjectRegistry;
 use Org\Mxchange\CoreFramework\Registry\Registerable;
 use Org\Mxchange\CoreFramework\Request\Requestable;
 use Org\Mxchange\CoreFramework\Response\Responseable;
+use Org\Mxchange\CoreFramework\Traits\Resolver\ResolverTrait;
+
+// Import SPL stuff
+use \BadMethodCallException;
+use \InvalidArgumentException;
 
 /**
  * A generic controller class. You should extend this base class if you want to
@@ -19,7 +24,7 @@ use Org\Mxchange\CoreFramework\Response\Responseable;
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -37,17 +42,21 @@ use Org\Mxchange\CoreFramework\Response\Responseable;
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 abstract class BaseController extends BaseFrameworkSystem implements Registerable {
+       // Load traits
+       use ResolverTrait;
+
        // Exception constants
        const EXCEPTION_FILTER_CHAIN_INVALID = 0xf10;
 
        // Names of controller's own filter chains
        const FILTER_CHAIN_PRE_COMMAND  = 'controller_pre_command';
        const FILTER_CHAIN_POST_COMMAND = 'controller_post_command';
+       const FILTER_CHAIN_SHUTDOWN     = 'shutdown';
 
        /**
         * Generic filter chains
         */
-       private $filterChains = array();
+       private $filterChains = [];
 
        /**
         * Protected constructor
@@ -55,16 +64,25 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @param       $className      Name of the class
         * @return      void
         */
-       protected function __construct ($className) {
+       protected function __construct (string $className) {
                // Call parent constructor
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: className=%s - CONSTRUCTED!', $className));
                parent::__construct($className);
 
                // Initialize both filter chains
-               $this->initFilterChain(self::FILTER_CHAIN_PRE_COMMAND);
-               $this->initFilterChain(self::FILTER_CHAIN_POST_COMMAND);
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('BASE-CONTROLLER: Initializing filter chains ...');
+               foreach([self::FILTER_CHAIN_PRE_COMMAND, self::FILTER_CHAIN_POST_COMMAND] as $filterChain) {
+                       // Init it
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: Invoking this->initFilterChain(=%s) ...', $filterChain));
+                       $this->initFilterChain($filterChain);
+               }
 
                // Add this controller to the registry
-               GenericRegistry::getRegistry()->addInstance('controller', $this);
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Registering this=%s ...', $this->__toString()));
+               ObjectRegistry::getRegistry('generic')->addInstance('controller', $this);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -76,6 +94,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        public function executeGenericPrePostCommand (Requestable $requestInstance, Responseable $responseInstance) {
                // Get the command instance from the resolver by sending a request instance to the resolver
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
                $commandInstance = $this->getResolverInstance()->resolveCommandByRequest($requestInstance);
 
                // Add more filters by the command
@@ -85,7 +104,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
                $this->executePreFilters($requestInstance, $responseInstance);
 
                // This request was valid! :-D
-               $requestInstance->requestIsValid();
+               $requestInstance->setIsRequestValid(TRUE);
 
                // Execute the command
                $commandInstance->execute($requestInstance, $responseInstance);
@@ -95,6 +114,9 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
 
                // Flush the response out
                $responseInstance->flushBuffer();
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -107,10 +129,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        public function genericHanleRequestLoginFailedRedirect (Requestable $requestInstance, Responseable $responseInstance) {
                // Get the "form action"
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
                $formAction = $requestInstance->getRequestElement('form');
 
                // Get command instance from resolver
-               $commandInstance = $this->getResolverInstance()->resolveCommand($formAction);
+               $commandInstance = $this->getResolverInstance()->resolveCommand('Org\Mxchange\CoreFramework\Command\Failed', $formAction);
 
                // Add more filters by the command
                $commandInstance->addExtraFilters($this, $requestInstance);
@@ -124,7 +147,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
                        $responseInstance->redirectToConfiguredUrl('login_failed');
 
                        // Exit here
-                       exit();
+                       exit;
                }
 
                /*
@@ -137,10 +160,13 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
 
                        // Execute *very* generic post filters
                        $this->executePostFilters($requestInstance, $responseInstance);
-               } // END - if
+               }
 
                // Flush the buffer out
                $responseInstance->flushBuffer();
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -153,6 +179,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        public function genericHanleRequestLoginAreaFailedRedirect (Requestable $requestInstance, Responseable $responseInstance) {
                // Get the command instance from the resolver by sending a request instance to the resolver
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
                $commandInstance = $this->getResolverInstance()->resolveCommandByRequest($requestInstance);
 
                // Add more filters by the command
@@ -167,11 +194,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
                        $responseInstance->redirectToConfiguredUrl('login_failed');
 
                        // Exit here
-                       exit();
+                       exit;
                }
 
                // This request was valid! :-D
-               $requestInstance->requestIsValid();
+               $requestInstance->setIsRequestValid(TRUE);
 
                // Execute the command
                $commandInstance->execute($requestInstance, $responseInstance);
@@ -181,6 +208,9 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
 
                // Flush the response out
                $responseInstance->flushBuffer();
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -188,11 +218,26 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         *
         * @param       $filterChain    Name of the filter chain
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter has an invalid value
+        * @throws      BadMethodCallException  If the given filter chain is already initialized
         */
-       protected function initFilterChain ($filterChain) {
-               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ' init: START');
+       protected function initFilterChain (string $filterChain) {
+               // Check parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s - CALLED!', $filterChain));
+               if (empty($filterChain)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (isset($this->filterChains[$filterChain])) {
+                       // Throw BMCE
+                       throw new BadMethodCallException(sprintf('filterChain=%s is already initialized', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL);
+               }
+
+               // Initialize filter chain
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Initializing filterChain=%s ...', $filterChain));
                $this->filterChains[$filterChain] = ObjectFactory::createObjectByConfiguredName('filter_chain_class');
-               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ' init: FINISHED');
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -201,20 +246,26 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @param       $filterChain    Chain of the filter
         * @param       $filterInstance         An instance of a filter
         * @return      void
-        * @throws      InvalidFilterChainException     If the filter chain is invalid
+        * @throws      InvalidArgumentException        If a parameter has an invalid value
+        * @throws      BadMethodCallException  If the given filter chain is not yet initialized
         */
-       protected function addFilter ($filterChain, Filterable $filterInstance) {
-               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ',' . $filterInstance->__toString(). ' add: START');
-
-               // Test if the filter is there
-               if (!isset($this->filterChains[$filterChain])) {
-                       // Throw an exception here
-                       throw new InvalidFilterChainException(array($this, $filterChain), self::EXCEPTION_FILTER_CHAIN_INVALID);
-               } // END - if
+       protected function addFilter (string $filterChain, Filterable $filterInstance) {
+               // Check parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s,filterInstance=%s - CALLED!', $filterChain, $filterInstance->__toString()));
+               if (empty($filterChain)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!isset($this->filterChains[$filterChain])) {
+                       // Throw IAE
+                       throw new BadMethodCallException(sprintf('filterChain=%s is not a valid chain', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL);
+               }
 
                // Add the filter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Adding filterInstance=%s to filterChain=%s ...', $filterInstance->__toString(), $filterChain));
                $this->filterChains[$filterChain]->addFilter($filterInstance);
-               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ',' . $filterInstance->__toString(). ' add: FINISH');
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -225,7 +276,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        public function addPreFilter (Filterable $filterInstance) {
                // Add the pre filter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString()));
                $this->addFilter(self::FILTER_CHAIN_PRE_COMMAND, $filterInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -235,8 +290,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @return      void
         */
        public function addPostFilter (Filterable $filterInstance) {
-               // Add the post filter
+               // Add post filter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString()));
                $this->addFilter(self::FILTER_CHAIN_POST_COMMAND, $filterInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -246,7 +305,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @return      void
         */
        public function addShutdownFilter (Filterable $filterInstance) {
-               $this->addFilter('shutdown', $filterInstance);
+               // Add shutdown filter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString()));
+               $this->addFilter(self::FILTER_CHAIN_SHUTDOWN, $filterInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -256,17 +320,25 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @param       $requestInstance        An instance of a Requestable class
         * @param       $responseInstance       An instance of a Responseable class
         * @return      void
-        * @throws      InvalidFilterChainException     If the filter chain is invalid
+        * @throws      InvalidArgumentException        If the filter chain is invalid
         */
-       protected function executeFilters ($filterChain, Requestable $requestInstance, Responseable $responseInstance) {
-               // Test if the filter is there
-               if (!isset($this->filterChains[$filterChain])) {
+       protected function executeFilters (string $filterChain, Requestable $requestInstance, Responseable $responseInstance) {
+               // Check parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s,requestInstance=%s,responseInstance=%s - CALLED!', $filterChain, $requestInstance->__toString(), $responseInstance->__toString()));
+               if (empty($filterChain)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!isset($this->filterChains[$filterChain])) {
                        // Throw an exception here
-                       throw new InvalidFilterChainException(array($this, $filterChain), self::EXCEPTION_FILTER_CHAIN_INVALID);
-               } // END - if
+                       throw new BadMethodCallException(sprintf('filterChain=%s is not a valid chain', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL);
+               }
 
                // Run all filters
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Processing filterChain=%s...', $filterChain));
                $this->filterChains[$filterChain]->processFilters($requestInstance, $responseInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -278,7 +350,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        protected function executePreFilters (Requestable $requestInstance, Responseable $responseInstance) {
                // Execute all pre filters
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
                $this->executeFilters(self::FILTER_CHAIN_PRE_COMMAND, $requestInstance, $responseInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -290,7 +366,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         */
        protected function executePostFilters (Requestable $requestInstance, Responseable $responseInstance) {
                // Execute all post filters
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
                $this->executeFilters(self::FILTER_CHAIN_POST_COMMAND, $requestInstance, $responseInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
        /**
@@ -301,7 +381,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl
         * @return      void
         */
        public function executeShutdownFilters (Requestable $requestInstance, Responseable $responseInstance) {
-               $this->executeFilters('shutdown', $requestInstance, $responseInstance);
+               // Execute all shutdown filter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString()));
+               $this->executeFilters(self::FILTER_CHAIN_SHUTDOWN, $requestInstance, $responseInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!');
        }
 
 }