setClient($this); // NOTE: at this moment, $this->_registry should contain the registry object if ($options) { $this->setOptions($options); } } public function setOptions(Array $options) { foreach ($options as $optionName => $optionValue) { $setMethodName = 'set' . $optionName; if (method_exists($this, $setMethodName)) { $this->{$setMethodName}($optionValue); } } } /** * getName() - Return the client name which can be used to * query the manifest if need be. * * @return string The client name */ abstract public function getName(); /** * initialized() - This will initialize the client for use * */ public function initialize() { // if its already initialized, no need to initialize again if ($this->_isInitialized) { return; } // run any preInit $this->_preInit(); $manifest = $this->_registry->getManifestRepository(); $manifest->addManifest(new Zend_Tool_Framework_Client_Manifest()); // setup the debug log if (!$this->_debugLogger instanceof Zend_Log) { require_once 'Zend/Log.php'; require_once 'Zend/Log/Writer/Null.php'; $this->_debugLogger = new Zend_Log(new Zend_Log_Writer_Null()); } // let the loader load, then the repositories process whats been loaded $this->_registry->getLoader()->load(); // process the action repository $this->_registry->getActionRepository()->process(); // process the provider repository $this->_registry->getProviderRepository()->process(); // process the manifest repository $this->_registry->getManifestRepository()->process(); if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) { require_once 'Zend/Tool/Framework/Client/Interactive/InputHandler.php'; } if ($this instanceof Zend_Tool_Framework_Client_Interactive_OutputInterface) { $this->_registry->getResponse()->setContentCallback(array($this, 'handleInteractiveOutput')); } } /** * This method should be implemented by the client implementation to * construct and set custom inflectors, request and response objects. */ protected function _preInit() { } /** * This method *must* be implemented by the client implementation to * parse out and setup the request objects action, provider and parameter * information. */ abstract protected function _preDispatch(); /** * This method should be implemented by the client implementation to * take the output of the response object and return it (in an client * specific way) back to the Tooling Client. */ protected function _postDispatch() { } /** * setRegistry() - Required by the Zend_Tool_Framework_Registry_EnabledInterface * interface which ensures proper registry dependency resolution * * @param Zend_Tool_Framework_Registry_Interface $registry * @return Zend_Tool_Framework_Client_Abstract */ public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry) { $this->_registry = $registry; return $this; } /** * getRegistry(); * * @return Zend_Tool_Framework_Registry_Interface */ public function getRegistry() { return $this->_registry; } /** * hasInteractiveInput() - Convienence method for determining if this * client can handle interactive input, and thus be able to run the * promptInteractiveInput * * @return bool */ public function hasInteractiveInput() { return ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface); } public function promptInteractiveInput($inputRequest) { if (!$this->hasInteractiveInput()) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('promptInteractive() cannot be called on a non-interactive client.'); } $inputHandler = new Zend_Tool_Framework_Client_Interactive_InputHandler(); $inputHandler->setClient($this); $inputHandler->setInputRequest($inputRequest); return $inputHandler->handle(); } /** * This method should be called in order to "handle" a Tooling Client * request that has come to the client that has been implemented. */ public function dispatch() { $this->initialize(); try { $this->_preDispatch(); if ($this->_registry->getRequest()->isDispatchable()) { if ($this->_registry->getRequest()->getActionName() == null) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the action name.'); } if ($this->_registry->getRequest()->getProviderName() == null) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the provider name.'); } $this->_handleDispatch(); } } catch (Exception $exception) { $this->_registry->getResponse()->setException($exception); } $this->_postDispatch(); } public function convertToClientNaming($string) { return $string; } public function convertFromClientNaming($string) { return $string; } protected function _handleDispatch() { // get the provider repository $providerRepository = $this->_registry->getProviderRepository(); $request = $this->_registry->getRequest(); // get the dispatchable provider signature $providerSignature = $providerRepository->getProviderSignature($request->getProviderName()); // get the actual provider $provider = $providerSignature->getProvider(); // ensure that we can pretend if this is a pretend request if ($request->isPretend() && (!$provider instanceof Zend_Tool_Framework_Provider_Pretendable)) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - provider does not support pretend'); } // get the action name $actionName = $this->_registry->getRequest()->getActionName(); $specialtyName = $this->_registry->getRequest()->getSpecialtyName(); if (!$actionableMethod = $providerSignature->getActionableMethodByActionName($actionName, $specialtyName)) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - actionable method not found'); } // get the actual method and param information $methodName = $actionableMethod['methodName']; $methodParameters = $actionableMethod['parameterInfo']; // get the provider params $requestParameters = $this->_registry->getRequest()->getProviderParameters(); // @todo This seems hackish, determine if there is a better way $callParameters = array(); foreach ($methodParameters as $methodParameterName => $methodParameterValue) { if (!array_key_exists($methodParameterName, $requestParameters) && $methodParameterValue['optional'] == false) { if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) { $promptSting = $this->getMissingParameterPromptString($provider, $actionableMethod['action'], $methodParameterValue['name']); $parameterPromptValue = $this->promptInteractiveInput($promptSting)->getContent(); if ($parameterPromptValue == null) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Value supplied for required parameter "' . $methodParameterValue['name'] . '" is empty'); } $callParameters[] = $parameterPromptValue; } else { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('A required parameter "' . $methodParameterValue['name'] . '" was not supplied.'); } } else { $callParameters[] = (array_key_exists($methodParameterName, $requestParameters)) ? $requestParameters[$methodParameterName] : $methodParameterValue['default']; } } $this->_handleDispatchExecution($provider, $methodName, $callParameters); } protected function _handleDispatchExecution($class, $methodName, $callParameters) { if (method_exists($class, $methodName)) { call_user_func_array(array($class, $methodName), $callParameters); } elseif (method_exists($class, $methodName . 'Action')) { call_user_func_array(array($class, $methodName . 'Action'), $callParameters); } else { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('Not a supported method.'); } } }