PageRenderTime 79ms CodeModel.GetById 35ms app.highlight 11ms RepoModel.GetById 29ms app.codeStats 0ms

/library/Zend/Tool/Framework/Client/Abstract.php

https://bitbucket.org/hieronim1981/tunethemusic
PHP | 333 lines | 164 code | 59 blank | 110 comment | 25 complexity | f1c4a40033798eea450adb3c1f96b8f0 MD5 | raw file
  1<?php
  2/**
  3 * Zend Framework
  4 *
  5 * LICENSE
  6 *
  7 * This source file is subject to the new BSD license that is bundled
  8 * with this package in the file LICENSE.txt.
  9 * It is also available through the world-wide-web at this URL:
 10 * http://framework.zend.com/license/new-bsd
 11 * If you did not receive a copy of the license and are unable to
 12 * obtain it through the world-wide-web, please send an email
 13 * to license@zend.com so we can send you a copy immediately.
 14 *
 15 * @category   Zend
 16 * @package    Zend_Tool
 17 * @subpackage Framework
 18 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 19 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 20 * @version    $Id: Abstract.php 24593 2012-01-05 20:35:02Z matthew $
 21 */
 22
 23/**
 24 * @see Zend_Loader_Autoloader
 25 */
 26require_once 'Zend/Loader/Autoloader.php';
 27
 28/**
 29 * @see Zend_Tool_Framework_Registry_EnabledInterface
 30 */
 31require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php';
 32
 33/**
 34 * @category   Zend
 35 * @package    Zend_Tool
 36 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 37 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 38 */
 39abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framework_Registry_EnabledInterface
 40{
 41
 42    /**
 43     * @var Zend_Tool_Framework_Registry
 44     */
 45    protected $_registry = null;
 46
 47    /**
 48     * @var callback|null
 49     */
 50    protected $_interactiveCallback = null;
 51
 52    /**
 53     * @var bool
 54     */
 55    protected $_isInitialized = false;
 56
 57    /**
 58     * @var Zend_Log
 59     */
 60    protected $_debugLogger = null;
 61
 62    public function __construct($options = array())
 63    {
 64        // require autoloader
 65        Zend_Loader_Autoloader::getInstance();
 66
 67        // this might look goofy, but this is setting up the
 68        // registry for dependency injection into the client
 69        $registry = new Zend_Tool_Framework_Registry();
 70        $registry->setClient($this);
 71
 72        // NOTE: at this moment, $this->_registry should contain the registry object
 73
 74        if ($options) {
 75            $this->setOptions($options);
 76        }
 77    }
 78
 79    public function setOptions(Array $options)
 80    {
 81        foreach ($options as $optionName => $optionValue) {
 82            $setMethodName = 'set' . $optionName;
 83            if (method_exists($this, $setMethodName)) {
 84                $this->{$setMethodName}($optionValue);
 85            }
 86        }
 87    }
 88
 89    /**
 90     * getName() - Return the client name which can be used to
 91     * query the manifest if need be.
 92     *
 93     * @return string The client name
 94     */
 95    abstract public function getName();
 96
 97    /**
 98     * initialized() - This will initialize the client for use
 99     *
100     */
101    public function initialize()
102    {
103        // if its already initialized, no need to initialize again
104        if ($this->_isInitialized) {
105            return;
106        }
107
108        // run any preInit
109        $this->_preInit();
110
111        $manifest = $this->_registry->getManifestRepository();
112        $manifest->addManifest(new Zend_Tool_Framework_Client_Manifest());
113
114        // setup the debug log
115        if (!$this->_debugLogger instanceof Zend_Log) {
116            require_once 'Zend/Log.php';
117            require_once 'Zend/Log/Writer/Null.php';
118            $this->_debugLogger = new Zend_Log(new Zend_Log_Writer_Null());
119        }
120
121        // let the loader load, then the repositories process whats been loaded
122        $this->_registry->getLoader()->load();
123
124        // process the action repository
125        $this->_registry->getActionRepository()->process();
126
127        // process the provider repository
128        $this->_registry->getProviderRepository()->process();
129
130        // process the manifest repository
131        $this->_registry->getManifestRepository()->process();
132
133        if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) {
134            require_once 'Zend/Tool/Framework/Client/Interactive/InputHandler.php';
135        }
136
137        if ($this instanceof Zend_Tool_Framework_Client_Interactive_OutputInterface) {
138            $this->_registry->getResponse()->setContentCallback(array($this, 'handleInteractiveOutput'));
139        }
140
141    }
142
143
144    /**
145     * This method should be implemented by the client implementation to
146     * construct and set custom inflectors, request and response objects.
147     */
148    protected function _preInit()
149    {
150    }
151
152    /**
153     * This method *must* be implemented by the client implementation to
154     * parse out and setup the request objects action, provider and parameter
155     * information.
156     */
157    abstract protected function _preDispatch();
158
159    /**
160     * This method should be implemented by the client implementation to
161     * take the output of the response object and return it (in an client
162     * specific way) back to the Tooling Client.
163     */
164    protected function _postDispatch()
165    {
166    }
167
168    /**
169     * setRegistry() - Required by the Zend_Tool_Framework_Registry_EnabledInterface
170     * interface which ensures proper registry dependency resolution
171     *
172     * @param Zend_Tool_Framework_Registry_Interface $registry
173     * @return Zend_Tool_Framework_Client_Abstract
174     */
175    public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry)
176    {
177        $this->_registry = $registry;
178        return $this;
179    }
180
181    /**
182     * getRegistry();
183     *
184     * @return Zend_Tool_Framework_Registry_Interface
185     */
186    public function getRegistry()
187    {
188        return $this->_registry;
189    }
190
191    /**
192     * hasInteractiveInput() - Convienence method for determining if this
193     * client can handle interactive input, and thus be able to run the
194     * promptInteractiveInput
195     *
196     * @return bool
197     */
198    public function hasInteractiveInput()
199    {
200        return ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface);
201    }
202
203    public function promptInteractiveInput($inputRequest)
204    {
205        if (!$this->hasInteractiveInput()) {
206            require_once 'Zend/Tool/Framework/Client/Exception.php';
207            throw new Zend_Tool_Framework_Client_Exception('promptInteractive() cannot be called on a non-interactive client.');
208        }
209
210        $inputHandler = new Zend_Tool_Framework_Client_Interactive_InputHandler();
211        $inputHandler->setClient($this);
212        $inputHandler->setInputRequest($inputRequest);
213        return $inputHandler->handle();
214
215    }
216
217    /**
218     * This method should be called in order to "handle" a Tooling Client
219     * request that has come to the client that has been implemented.
220     */
221    public function dispatch()
222    {
223        $this->initialize();
224
225        try {
226
227            $this->_preDispatch();
228
229            if ($this->_registry->getRequest()->isDispatchable()) {
230
231                if ($this->_registry->getRequest()->getActionName() == null) {
232                    require_once 'Zend/Tool/Framework/Client/Exception.php';
233                    throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the action name.');
234                }
235
236                if ($this->_registry->getRequest()->getProviderName() == null) {
237                    require_once 'Zend/Tool/Framework/Client/Exception.php';
238                    throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the provider name.');
239                }
240
241                $this->_handleDispatch();
242
243            }
244
245        } catch (Exception $exception) {
246            $this->_registry->getResponse()->setException($exception);
247        }
248
249        $this->_postDispatch();
250    }
251
252    public function convertToClientNaming($string)
253    {
254        return $string;
255    }
256
257    public function convertFromClientNaming($string)
258    {
259        return $string;
260    }
261
262    protected function _handleDispatch()
263    {
264        // get the provider repository
265        $providerRepository = $this->_registry->getProviderRepository();
266
267        $request = $this->_registry->getRequest();
268
269        // get the dispatchable provider signature
270        $providerSignature = $providerRepository->getProviderSignature($request->getProviderName());
271
272        // get the actual provider
273        $provider = $providerSignature->getProvider();
274
275        // ensure that we can pretend if this is a pretend request
276        if ($request->isPretend() && (!$provider instanceof Zend_Tool_Framework_Provider_Pretendable)) {
277            require_once 'Zend/Tool/Framework/Client/Exception.php';
278            throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - provider does not support pretend');
279        }
280
281        // get the action name
282        $actionName = $this->_registry->getRequest()->getActionName();
283        $specialtyName = $this->_registry->getRequest()->getSpecialtyName();
284
285        if (!$actionableMethod = $providerSignature->getActionableMethodByActionName($actionName, $specialtyName)) {
286            require_once 'Zend/Tool/Framework/Client/Exception.php';
287            throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - actionable method not found');
288        }
289
290        // get the actual method and param information
291        $methodName       = $actionableMethod['methodName'];
292        $methodParameters = $actionableMethod['parameterInfo'];
293
294        // get the provider params
295        $requestParameters = $this->_registry->getRequest()->getProviderParameters();
296
297        // @todo This seems hackish, determine if there is a better way
298        $callParameters = array();
299        foreach ($methodParameters as $methodParameterName => $methodParameterValue) {
300            if (!array_key_exists($methodParameterName, $requestParameters) && $methodParameterValue['optional'] == false) {
301                if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) {
302                    $promptSting = $this->getMissingParameterPromptString($provider, $actionableMethod['action'], $methodParameterValue['name']);
303                    $parameterPromptValue = $this->promptInteractiveInput($promptSting)->getContent();
304                    if ($parameterPromptValue == null) {
305                        require_once 'Zend/Tool/Framework/Client/Exception.php';
306                        throw new Zend_Tool_Framework_Client_Exception('Value supplied for required parameter "' . $methodParameterValue['name'] . '" is empty');
307                    }
308                    $callParameters[] = $parameterPromptValue;
309                } else {
310                    require_once 'Zend/Tool/Framework/Client/Exception.php';
311                    throw new Zend_Tool_Framework_Client_Exception('A required parameter "' . $methodParameterValue['name'] . '" was not supplied.');
312                }
313            } else {
314                $callParameters[] = (array_key_exists($methodParameterName, $requestParameters)) ? $requestParameters[$methodParameterName] : $methodParameterValue['default'];
315            }
316        }
317
318        $this->_handleDispatchExecution($provider, $methodName, $callParameters);
319    }
320
321    protected function _handleDispatchExecution($class, $methodName, $callParameters)
322    {
323        if (method_exists($class, $methodName)) {
324            call_user_func_array(array($class, $methodName), $callParameters);
325        } elseif (method_exists($class, $methodName . 'Action')) {
326            call_user_func_array(array($class, $methodName . 'Action'), $callParameters);
327        } else {
328            require_once 'Zend/Tool/Framework/Client/Exception.php';
329            throw new Zend_Tool_Framework_Client_Exception('Not a supported method.');
330        }
331    }
332
333}