X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fresolver%2Fcommand%2Fclass_BaseCommandResolver.php;h=c750238d5e36ca67bf34a160906b7eb7dcd85109;hp=ac9c0cab7b84f4ab65ef533db45a27f93d7bbd7a;hb=361d6012670869f819fa7ce7cebf74676815bf5d;hpb=49f84a522f0ccac3b70728cd41011a0be0eed8cf diff --git a/inc/classes/main/resolver/command/class_BaseCommandResolver.php b/inc/classes/main/resolver/command/class_BaseCommandResolver.php index ac9c0cab..c750238d 100644 --- a/inc/classes/main/resolver/command/class_BaseCommandResolver.php +++ b/inc/classes/main/resolver/command/class_BaseCommandResolver.php @@ -2,11 +2,11 @@ /** * A generic command resolver class * - * @author Roland Haeder + * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007 - 2009 Roland Haeder, this is free software + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team * @license GNU GPL 3.0 or any newer version - * @link http://www.ship-simu.org + * @link http://www.shipsimu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,16 +22,6 @@ * along with this program. If not, see . */ class BaseCommandResolver extends BaseResolver { - /** - * Prefix for local, remote or other resolver - */ - private $commandPrefix = ''; - - /** - * Validated command name - */ - private $commandName = ''; - /** * Protected constructor * @@ -44,44 +34,121 @@ class BaseCommandResolver extends BaseResolver { } /** - * Setter for command prefix + * "Loads" a given command and instances it if not yet cached * - * @param $commandPrefix Last validated commandPrefix - * @return void + * @param $commandName A command name we shall look for + * @return $commandInstance A loaded command instance + * @throws InvalidCommandException Thrown if even the default + * command class is missing (bad!) */ - protected final function setCommandPrefix ($commandPrefix) { - $this->commandPrefix = $commandPrefix; + protected function loadCommand ($commandName) { + // Init command instance + $commandInstance = NULL; + + // Create class name + $className = $this->getCapitalizedClassPrefix() . $this->convertToClassName($commandName) . 'Command'; + + // Create command class name + $this->setClassName($className); + + // Is this class loaded? + if (!class_exists($this->getClassName())) { + // Class not found, so throw an exception + throw new InvalidCommandException(array($this, $commandName), self::EXCEPTION_INVALID_COMMAND); + } // END - if + + // Initiate the command + $commandInstance = ObjectFactory::createObjectByName($this->getClassName(), array($this)); + + // Return the result + return $commandInstance; } /** - * Setter for command name + * Returns an command instance for a given request class or null if + * it was not found * - * @param $commandName Last validated command name - * @return void + * @param $requestInstance An instance of a request class + * @return $commandInstance An instance of the resolved command + * @throws InvalidCommandException Thrown if $commandName is + * invalid + * @throws InvalidCommandInstanceException Thrown if $commandInstance + * is an invalid instance */ - protected final function setCommandName ($commandName) { - $this->commandName = $commandName; + public function resolveCommandByRequest (Requestable $requestInstance) { + // Init variables + $commandName = ''; + $commandInstance = NULL; + + // This goes fine so let's resolve the command + $commandName = $requestInstance->getRequestElement('command'); + + // Is the command empty? Then fall back to default command + if (empty($commandName)) { + $commandName = $this->getConfigInstance()->getConfigEntry('default_' . self::getResponseTypeFromSystem() . '_command'); + } // END - if + + // Check if command is valid + if ($this->isCommandValid($commandName) === FALSE) { + // This command is invalid! + throw new InvalidCommandException(array($this, $commandName), self::EXCEPTION_INVALID_COMMAND); + } // END - if + + // Get the command + $commandInstance = $this->loadCommand($commandName); + + // And validate it + if ((!is_object($commandInstance)) || (!$commandInstance instanceof Commandable)) { + // This command has an invalid instance! + throw new InvalidCommandInstanceException(array($this, $commandName), self::EXCEPTION_INVALID_COMMAND); + } // END - if + + // Set last command + $this->setResolvedInstance($commandInstance); + + // Return the resolved command instance + return $commandInstance; } /** - * Getter for command name + * Resolves the command by its direct name and returns an instance of its class * - * @return $commandName Last validated command name + * @param $commandName The direct command name we shall resolve + * @return $commandInstance An instance of the command class + * @throws InvalidCommandException Thrown if $commandName is invalid */ - protected final function getCommandName () { - return $this->commandName; + public function resolveCommand ($commandName) { + // Initiate the instance variable + $commandInstance = NULL; + + // Is the command empty? Then fall back to default command + if (empty($commandName)) { + $commandName = $this->getConfigInstance()->getConfigEntry('default_' . self::getResponseTypeFromSystem() . '_command'); + } // END - if + + // Check if command is valid + if ($this->isCommandValid($commandName) === FALSE) { + // This command is invalid! + throw new InvalidCommandException(array($this, $commandName), self::EXCEPTION_INVALID_COMMAND); + } // END - if + + // Get the command + $commandInstance = $this->loadCommand($commandName); + + // Return the instance + return $commandInstance; } /** - * Checks wether the given command is valid + * Checks whether the given command is valid * * @param $commandName The default command we shall execute - * @return $isValid Wether the given command is valid + * @return $isValid Whether the given command is valid * @throws EmptyVariableException Thrown if given command is not set */ public function isCommandValid ($commandName) { // By default nothing shall be valid - $isValid = false; + $isValid = FALSE; // Is a command set? if (empty($commandName)) { @@ -90,7 +157,7 @@ class BaseCommandResolver extends BaseResolver { } // END - if // Create the full class name - $className = $this->commandPrefix . $this->convertToClassName($commandName) . 'Command'; + $className = $this->getCapitalizedClassPrefix() . $this->convertToClassName($commandName) . 'Command'; // Now, let us create the full name of the command class $this->setClassName($className); @@ -98,7 +165,7 @@ class BaseCommandResolver extends BaseResolver { // Is this class already loaded? if (class_exists($this->getClassName())) { // This class does exist. :-) - $isValid = true; + $isValid = TRUE; } // END - if // Set command name