* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
class ImageControllerResolver extends BaseControllerResolver implements ControllerResolver {
/**
* Last successfull resolved controller (name)
*/
private $lastControllerName = "";
/**
* Last successfull resolved controller (instance)
*/
private $lastControllerInstance = null;
/**
* Protected constructor
*
* @return void
*/
protected function __construct () {
// Call parent constructor
parent::__construct(__CLASS__);
// Set prefix to "Image"
$this->setControllerPrefix("Image");
}
/**
* Creates an instance of a resolver class with a given command
*
* @param $controllerName The controller we shall resolve
* @param $appInstance An instance of a manageable application helper class
* @return $resolverInstance The prepared controller resolver instance
* @throws EmptyVariableException Thrown if default command is not set
* @throws InvalidControllerException Thrown if default controller is invalid
*/
public final static function createImageControllerResolver ($controllerName, ManageableApplication $appInstance) {
// Create the new instance
$resolverInstance = new ImageControllerResolver();
// Is the variable $controllerName set and the command is valid?
if (empty($controllerName)) {
// Then thrown an exception here
throw new EmptyVariableException(array($resolverInstance, 'commandName'), self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
} elseif ($resolverInstance->isControllerValid($controllerName) === false) {
// Invalid command found
throw new InvalidControllerException(array($resolverInstance, $controllerName), self::EXCEPTION_INVALID_CONTROLLER);
}
// Set the application instance
$resolverInstance->setApplicationInstance($appInstance);
// Set command name
$resolverInstance->setControllerName($controllerName);
// Return the prepared instance
return $resolverInstance;
}
/**
* Resolves the default controller of the given command
*
* @return $controllerInstance A controller instance for the default
* command
* @throws InvalidControllerInstanceException Thrown if $controllerInstance
* is invalid
*/
public function resolveController () {
// Init variables
$controllerName = "";
$controllerInstance = null;
// Get the command name
$controllerName = $this->getControllerName();
// Get the command
$controllerInstance = $this->loadController($controllerName);
// And validate it
if ((!is_object($controllerInstance)) || (!$controllerInstance instanceof Controller)) {
// This command has an invalid instance!
throw new InvalidControllerInstanceException(array($this, $controllerName), self::EXCEPTION_INVALID_CONTROLLER);
} // END - if
// Set last controller
$this->lastControllerInstance = $controllerInstance;
// Return the maybe resolved instance
return $controllerInstance;
}
/**
* "Loads" a given controller and instances it if not yet cached. If the
* controller was not found one of the default controllers will be used
* depending on wether news shall be displayed.
*
* @param $controllerName A controller name we shall look for
* @return $controllerInstance A loaded controller instance
* @throws InvalidControllerException Thrown if even the requested
* controller class is missing (bad!)
*/
private function loadController ($controllerName) {
// Cache default command
$defaultController = $this->getConfigInstance()->readConfig('default_image_command');
// Init controller instance
$controllerInstance = null;
// Default controller
$this->setClassName($defaultController);
// Generate the class name
//* DEBUG: */ echo __METHOD__.": Controller=".$controllerName;
if ($controllerName != $defaultController) {
// Create controller class name
$this->setClassName(sprintf("Image%sController",
$this->convertToClassName($controllerName)
));
} // END - if
//* DEBUG: */ echo ", controller=".$this->getClassName()."
\n";
// Is this class loaded?
if (!class_exists($this->getClassName())) {
// Class not found, so or throw an exception
throw new InvalidControllerException(array($this, $controllerName), self::EXCEPTION_INVALID_CONTROLLER);
} // END - if
// Initiate the resolver and controller
$resolverInstance = ObjectFactory::createObjectByConfiguredName('image_cmd_resolver_class', array($controllerName, $this->getApplicationInstance()));
$controllerInstance = ObjectFactory::createObjectByName($this->getClassName(), array($resolverInstance));
// Remove resolver
unset($resolverInstance);
// Return the result
return $controllerInstance;
}
}
// [EOF]
?>