* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
* @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 BaseControllerResolver extends BaseResolver {
/**
* Prefix for local, remote or other resolver
*/
private $controllerPrefix = '';
/**
* Validated controller name
*/
private $controllerName = '';
/**
* Protected constructor
*
* @param $className Name of the real class
* @return void
*/
protected function __construct ($className) {
// Call parent constructor
parent::__construct($className);
}
/**
* Setter for controller prefix
*
* @param $controllerPrefix Last validated controllerPrefix
* @return void
*/
protected final function setControllerPrefix ($controllerPrefix) {
$this->controllerPrefix = $controllerPrefix;
}
/**
* Getter for controller prefix
*
* @param $controllerPrefix Last validated controllerPrefix
* @return void
*/
protected final function getControllerPrefix () {
return $this->controllerPrefix;
}
/**
* Setter for controller name
*
* @param $controllerName Last validated controller name
* @return void
*/
protected final function setControllerName ($controllerName) {
$this->controllerName = $controllerName;
}
/**
* Getter for controller name
*
* @return $controllerName Last validated controller name
*/
public final function getControllerName () {
return $this->controllerName;
}
/**
* "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!)
*/
protected function loadController ($controllerName) {
// Cache default command
$defaultController = $this->getConfigInstance()->getConfigEntry('default_' . strtolower($this->getControllerPrefix()) . '_command');
// Init controller instance
$controllerInstance = null;
// Default controller
$this->setClassName($this->getControllerPrefix() . 'DefaultNewsController');
// Generate the class name
//* DEBUG: */ echo __METHOD__.": Controller=".$controllerName;
if ($controllerName != $defaultController) {
// Create controller class name
$className = $this->getControllerPrefix() . '' . $this->convertToClassName($controllerName) . 'Controller';
// ... and set it
$this->setClassName($className);
} else {
// No news at main command or non-news command
$this->setClassName($this->getControllerPrefix() . 'DefaultNewsController');
}
//* DEBUG: */ echo ", controller=".$this->getClassName()."
\n";
// Is this class loaded?
if (!class_exists($this->getClassName())) {
// Throw an exception here
throw new InvalidControllerException(array($this, $controllerName), self::EXCEPTION_INVALID_CONTROLLER);
} // END - if
// Set default resolver config name
$resolverConfigEntry = '';
// Try to read a config entry for our resolver including controller name... ;-)
$resolverConfigEntry = sprintf("%s_cmd_%s_resolver_class", strtolower($this->getControllerPrefix()), strtolower($controllerName));
// Get the config, this will throw an exception if there is no special command resolver
$resolverClass = $this->getConfigInstance()->getConfigEntry($resolverConfigEntry);
// Initiate the resolver and controller
$resolverInstance = ObjectFactory::createObjectByConfiguredName(
$resolverConfigEntry,
array(
$controllerName,
$this->getApplicationInstance()
)
);
$controllerInstance = ObjectFactory::createObjectByName(
$this->getClassName(),
array($resolverInstance)
);
// Return the result
return $controllerInstance;
}
/**
* Checks wether the given controller is valid
*
* @param $controllerName The default controller we shall execute
* @return $isValid Wether the given controller is valid
* @throws EmptyVariableException Thrown if given controller is not set
* @throws DefaultControllerException Thrown if default controller was not found
*/
public function isControllerValid ($controllerName) {
// By default nothing shall be valid
$isValid = false;
// Is a controller set?
if (empty($controllerName)) {
// Then thrown an exception here
throw new EmptyVariableException(array($this, 'controllerName'), self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
} // END - if
// Create class name
$className = $this->controllerPrefix . $this->convertToClassName($controllerName) . 'Controller';
// Now, let us create the full name of the controller class
$this->setClassName($className);
// Try it hard to get an controller
while ($isValid === false) {
// Is this class already loaded?
if (class_exists($this->getClassName())) {
// This class does exist. :-)
$isValid = true;
} elseif ($this->getClassName() != $this->controllerPrefix.'DefaultNewsController') {
// Set default controller
$this->setClassName($this->controllerPrefix . 'DefaultNewsController');
} else {
// All is tried, give it up here
throw new DefaultControllerException($this, self::EXCEPTION_DEFAULT_CONTROLLER_GONE);
}
} // END - while
// Return the result
return $isValid;
}
}
// [EOF]
?>