CC-2166: Packaging Improvements. Moved the Zend app into airtime_mvc. It is now installed to /var/www/airtime. Storage is now set to /srv/airtime/stor. Utils are now installed to /usr/lib/airtime/utils/. Added install/airtime-dircheck.php as a simple test to see if everything is install/uninstalled correctly.

This commit is contained in:
Paul Baranowski 2011-04-14 18:55:04 -04:00
parent 514777e8d2
commit b11cbd8159
4546 changed files with 138 additions and 51 deletions

View file

@ -0,0 +1,242 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/** Zend_Server_Interface */
require_once 'Zend/Server/Interface.php';
/**
* Zend_Server_Definition
*/
require_once 'Zend/Server/Definition.php';
/**
* Zend_Server_Method_Definition
*/
require_once 'Zend/Server/Method/Definition.php';
/**
* Zend_Server_Method_Callback
*/
require_once 'Zend/Server/Method/Callback.php';
/**
* Zend_Server_Method_Prototype
*/
require_once 'Zend/Server/Method/Prototype.php';
/**
* Zend_Server_Method_Parameter
*/
require_once 'Zend/Server/Method/Parameter.php';
/**
* Zend_Server_Abstract
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
abstract class Zend_Server_Abstract implements Zend_Server_Interface
{
/**
* @deprecated
* @var array List of PHP magic methods (lowercased)
*/
protected static $magic_methods = array(
'__call',
'__clone',
'__construct',
'__destruct',
'__get',
'__isset',
'__set',
'__set_state',
'__sleep',
'__tostring',
'__unset',
'__wakeup',
);
/**
* @var bool Flag; whether or not overwriting existing methods is allowed
*/
protected $_overwriteExistingMethods = false;
/**
* @var Zend_Server_Definition
*/
protected $_table;
/**
* Constructor
*
* Setup server description
*
* @return void
*/
public function __construct()
{
$this->_table = new Zend_Server_Definition();
$this->_table->setOverwriteExistingMethods($this->_overwriteExistingMethods);
}
/**
* Returns a list of registered methods
*
* Returns an array of method definitions.
*
* @return Zend_Server_Definition
*/
public function getFunctions()
{
return $this->_table;
}
/**
* Lowercase a string
*
* Lowercase's a string by reference
*
* @deprecated
* @param string $string value
* @param string $key
* @return string Lower cased string
*/
public static function lowerCase(&$value, &$key)
{
trigger_error(__CLASS__ . '::' . __METHOD__ . '() is deprecated and will be removed in a future version', E_USER_NOTICE);
return $value = strtolower($value);
}
/**
* Build callback for method signature
*
* @param Zend_Server_Reflection_Function_Abstract $reflection
* @return Zend_Server_Method_Callback
*/
protected function _buildCallback(Zend_Server_Reflection_Function_Abstract $reflection)
{
$callback = new Zend_Server_Method_Callback();
if ($reflection instanceof Zend_Server_Reflection_Method) {
$callback->setType($reflection->isStatic() ? 'static' : 'instance')
->setClass($reflection->getDeclaringClass()->getName())
->setMethod($reflection->getName());
} elseif ($reflection instanceof Zend_Server_Reflection_Function) {
$callback->setType('function')
->setFunction($reflection->getName());
}
return $callback;
}
/**
* Build a method signature
*
* @param Zend_Server_Reflection_Function_Abstract $reflection
* @param null|string|object $class
* @return Zend_Server_Method_Definition
* @throws Zend_Server_Exception on duplicate entry
*/
protected function _buildSignature(Zend_Server_Reflection_Function_Abstract $reflection, $class = null)
{
$ns = $reflection->getNamespace();
$name = $reflection->getName();
$method = empty($ns) ? $name : $ns . '.' . $name;
if (!$this->_overwriteExistingMethods && $this->_table->hasMethod($method)) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Duplicate method registered: ' . $method);
}
$definition = new Zend_Server_Method_Definition();
$definition->setName($method)
->setCallback($this->_buildCallback($reflection))
->setMethodHelp($reflection->getDescription())
->setInvokeArguments($reflection->getInvokeArguments());
foreach ($reflection->getPrototypes() as $proto) {
$prototype = new Zend_Server_Method_Prototype();
$prototype->setReturnType($this->_fixType($proto->getReturnType()));
foreach ($proto->getParameters() as $parameter) {
$param = new Zend_Server_Method_Parameter(array(
'type' => $this->_fixType($parameter->getType()),
'name' => $parameter->getName(),
'optional' => $parameter->isOptional(),
));
if ($parameter->isDefaultValueAvailable()) {
$param->setDefaultValue($parameter->getDefaultValue());
}
$prototype->addParameter($param);
}
$definition->addPrototype($prototype);
}
if (is_object($class)) {
$definition->setObject($class);
}
$this->_table->addMethod($definition);
return $definition;
}
/**
* Dispatch method
*
* @param Zend_Server_Method_Definition $invocable
* @param array $params
* @return mixed
*/
protected function _dispatch(Zend_Server_Method_Definition $invocable, array $params)
{
$callback = $invocable->getCallback();
$type = $callback->getType();
if ('function' == $type) {
$function = $callback->getFunction();
return call_user_func_array($function, $params);
}
$class = $callback->getClass();
$method = $callback->getMethod();
if ('static' == $type) {
return call_user_func_array(array($class, $method), $params);
}
$object = $invocable->getObject();
if (!is_object($object)) {
$invokeArgs = $invocable->getInvokeArguments();
if (!empty($invokeArgs)) {
$reflection = new ReflectionClass($class);
$object = $reflection->newInstanceArgs($invokeArgs);
} else {
$object = new $class;
}
}
return call_user_func_array(array($object, $method), $params);
}
/**
* Map PHP type to protocol type
*
* @param string $type
* @return string
*/
abstract protected function _fixType($type);
}

View file

@ -0,0 +1,147 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Cache.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Zend_Server_Cache: cache server definitions
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Cache
{
/**
* @var array Methods to skip when caching server
*/
protected static $_skipMethods = array();
/**
* Cache a file containing the dispatch list.
*
* Serializes the server definition stores the information
* in $filename.
*
* Returns false on any error (typically, inability to write to file), true
* on success.
*
* @param string $filename
* @param Zend_Server_Interface $server
* @return bool
*/
public static function save($filename, Zend_Server_Interface $server)
{
if (!is_string($filename)
|| (!file_exists($filename) && !is_writable(dirname($filename))))
{
return false;
}
$methods = $server->getFunctions();
if ($methods instanceof Zend_Server_Definition) {
$definition = new Zend_Server_Definition();
foreach ($methods as $method) {
if (in_array($method->getName(), self::$_skipMethods)) {
continue;
}
$definition->addMethod($method);
}
$methods = $definition;
}
if (0 === @file_put_contents($filename, serialize($methods))) {
return false;
}
return true;
}
/**
* Load server definition from a file
*
* Unserializes a stored server definition from $filename. Returns false if
* it fails in any way, true on success.
*
* Useful to prevent needing to build the server definition on each
* request. Sample usage:
*
* <code>
* if (!Zend_Server_Cache::get($filename, $server)) {
* require_once 'Some/Service/Class.php';
* require_once 'Another/Service/Class.php';
*
* // Attach Some_Service_Class with namespace 'some'
* $server->attach('Some_Service_Class', 'some');
*
* // Attach Another_Service_Class with namespace 'another'
* $server->attach('Another_Service_Class', 'another');
*
* Zend_Server_Cache::save($filename, $server);
* }
*
* $response = $server->handle();
* echo $response;
* </code>
*
* @param string $filename
* @param Zend_Server_Interface $server
* @return bool
*/
public static function get($filename, Zend_Server_Interface $server)
{
if (!is_string($filename)
|| !file_exists($filename)
|| !is_readable($filename))
{
return false;
}
if (false === ($dispatch = @file_get_contents($filename))) {
return false;
}
if (false === ($dispatchArray = @unserialize($dispatch))) {
return false;
}
$server->loadFunctions($dispatchArray);
return true;
}
/**
* Remove a cache file
*
* @param string $filename
* @return boolean
*/
public static function delete($filename)
{
if (is_string($filename) && file_exists($filename)) {
unlink($filename);
return true;
}
return false;
}
}

View file

@ -0,0 +1,267 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Definition.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Server methods metadata
*
* @todo Implement iterator
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Definition implements Countable, Iterator
{
/**
* @var array Array of Zend_Server_Method_Definition objects
*/
protected $_methods = array();
/**
* @var bool Whether or not overwriting existing methods is allowed
*/
protected $_overwriteExistingMethods = false;
/**
* Constructor
*
* @param null|array $methods
* @return void
*/
public function __construct($methods = null)
{
if (is_array($methods)) {
$this->setMethods($methods);
}
}
/**
* Set flag indicating whether or not overwriting existing methods is allowed
*
* @param mixed $flag
* @return void
*/
public function setOverwriteExistingMethods($flag)
{
$this->_overwriteExistingMethods = (bool) $flag;
return $this;
}
/**
* Add method to definition
*
* @param array|Zend_Server_Method_Definition $method
* @param null|string $name
* @return Zend_Server_Definition
* @throws Zend_Server_Exception if duplicate or invalid method provided
*/
public function addMethod($method, $name = null)
{
if (is_array($method)) {
require_once 'Zend/Server/Method/Definition.php';
$method = new Zend_Server_Method_Definition($method);
} elseif (!$method instanceof Zend_Server_Method_Definition) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Invalid method provided');
}
if (is_numeric($name)) {
$name = null;
}
if (null !== $name) {
$method->setName($name);
} else {
$name = $method->getName();
}
if (null === $name) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('No method name provided');
}
if (!$this->_overwriteExistingMethods && array_key_exists($name, $this->_methods)) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception(sprintf('Method by name of "%s" already exists', $name));
}
$this->_methods[$name] = $method;
return $this;
}
/**
* Add multiple methods
*
* @param array $methods Array of Zend_Server_Method_Definition objects or arrays
* @return Zend_Server_Definition
*/
public function addMethods(array $methods)
{
foreach ($methods as $key => $method) {
$this->addMethod($method, $key);
}
return $this;
}
/**
* Set all methods at once (overwrite)
*
* @param array $methods Array of Zend_Server_Method_Definition objects or arrays
* @return Zend_Server_Definition
*/
public function setMethods(array $methods)
{
$this->clearMethods();
$this->addMethods($methods);
return $this;
}
/**
* Does the definition have the given method?
*
* @param string $method
* @return bool
*/
public function hasMethod($method)
{
return array_key_exists($method, $this->_methods);
}
/**
* Get a given method definition
*
* @param string $method
* @return null|Zend_Server_Method_Definition
*/
public function getMethod($method)
{
if ($this->hasMethod($method)) {
return $this->_methods[$method];
}
return false;
}
/**
* Get all method definitions
*
* @return array Array of Zend_Server_Method_Definition objects
*/
public function getMethods()
{
return $this->_methods;
}
/**
* Remove a method definition
*
* @param string $method
* @return Zend_Server_Definition
*/
public function removeMethod($method)
{
if ($this->hasMethod($method)) {
unset($this->_methods[$method]);
}
return $this;
}
/**
* Clear all method definitions
*
* @return Zend_Server_Definition
*/
public function clearMethods()
{
$this->_methods = array();
return $this;
}
/**
* Cast definition to an array
*
* @return array
*/
public function toArray()
{
$methods = array();
foreach ($this->getMethods() as $key => $method) {
$methods[$key] = $method->toArray();
}
return $methods;
}
/**
* Countable: count of methods
*
* @return int
*/
public function count()
{
return count($this->_methods);
}
/**
* Iterator: current item
*
* @return mixed
*/
public function current()
{
return current($this->_methods);
}
/**
* Iterator: current item key
*
* @return int|string
*/
public function key()
{
return key($this->_methods);
}
/**
* Iterator: advance to next method
*
* @return void
*/
public function next()
{
return next($this->_methods);
}
/**
* Iterator: return to first method
*
* @return void
*/
public function rewind()
{
return reset($this->_methods);
}
/**
* Iterator: is the current index valid?
*
* @return bool
*/
public function valid()
{
return (bool) $this->current();
}
}

View file

@ -0,0 +1,35 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Exception
*/
require_once 'Zend/Exception.php';
/**
* Zend_Server_Reflection exceptions
*
* @package Zend_Server
* @subpackage Reflection
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Exception extends Zend_Exception
{
}

View file

@ -0,0 +1,118 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Interface
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
interface Zend_Server_Interface
{
/**
* Attach a function as a server method
*
* Namespacing is primarily for xmlrpc, but may be used with other
* implementations to prevent naming collisions.
*
* @param string $function
* @param string $namespace
* @param null|array Optional array of arguments to pass to callbacks at
* dispatch.
* @return void
*/
public function addFunction($function, $namespace = '');
/**
* Attach a class to a server
*
* The individual implementations should probably allow passing a variable
* number of arguments in, so that developers may define custom runtime
* arguments to pass to server methods.
*
* Namespacing is primarily for xmlrpc, but could be used for other
* implementations as well.
*
* @param mixed $class Class name or object instance to examine and attach
* to the server.
* @param string $namespace Optional namespace with which to prepend method
* names in the dispatch table.
* methods in the class will be valid callbacks.
* @param null|array Optional array of arguments to pass to callbacks at
* dispatch.
* @return void
*/
public function setClass($class, $namespace = '', $argv = null);
/**
* Generate a server fault
*
* @param mixed $fault
* @param int $code
* @return mixed
*/
public function fault($fault = null, $code = 404);
/**
* Handle a request
*
* Requests may be passed in, or the server may automagically determine the
* request based on defaults. Dispatches server request to appropriate
* method and returns a response
*
* @param mixed $request
* @return mixed
*/
public function handle($request = false);
/**
* Return a server definition array
*
* Returns a server definition array as created using
* {@link * Zend_Server_Reflection}. Can be used for server introspection,
* documentation, or persistence.
*
* @access public
* @return array
*/
public function getFunctions();
/**
* Load server definition
*
* Used for persistence; loads a construct as returned by {@link getFunctions()}.
*
* @param array $array
* @return void
*/
public function loadFunctions($definition);
/**
* Set server persistence
*
* @todo Determine how to implement this
* @param int $mode
* @return void
*/
public function setPersistence($mode);
}

View file

@ -0,0 +1,205 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Callback.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Method callback metadata
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Method_Callback
{
/**
* @var string Class name for class method callback
*/
protected $_class;
/**
* @var string Function name for function callback
*/
protected $_function;
/**
* @var string Method name for class method callback
*/
protected $_method;
/**
* @var string Callback type
*/
protected $_type;
/**
* @var array Valid callback types
*/
protected $_types = array('function', 'static', 'instance');
/**
* Constructor
*
* @param null|array $options
* @return void
*/
public function __construct($options = null)
{
if ((null !== $options) && is_array($options)) {
$this->setOptions($options);
}
}
/**
* Set object state from array of options
*
* @param array $options
* @return Zend_Server_Method_Callback
*/
public function setOptions(array $options)
{
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
return $this;
}
/**
* Set callback class
*
* @param string $class
* @return Zend_Server_Method_Callback
*/
public function setClass($class)
{
if (is_object($class)) {
$class = get_class($class);
}
$this->_class = $class;
return $this;
}
/**
* Get callback class
*
* @return string|null
*/
public function getClass()
{
return $this->_class;
}
/**
* Set callback function
*
* @param string $function
* @return Zend_Server_Method_Callback
*/
public function setFunction($function)
{
$this->_function = (string) $function;
$this->setType('function');
return $this;
}
/**
* Get callback function
*
* @return null|string
*/
public function getFunction()
{
return $this->_function;
}
/**
* Set callback class method
*
* @param string $method
* @return Zend_Server_Method_Callback
*/
public function setMethod($method)
{
$this->_method = $method;
return $this;
}
/**
* Get callback class method
*
* @return null|string
*/
public function getMethod()
{
return $this->_method;
}
/**
* Set callback type
*
* @param string $type
* @return Zend_Server_Method_Callback
* @throws Zend_Server_Exception
*/
public function setType($type)
{
if (!in_array($type, $this->_types)) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Invalid method callback type passed to ' . __CLASS__ . '::' . __METHOD__);
}
$this->_type = $type;
return $this;
}
/**
* Get callback type
*
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* Cast callback to array
*
* @return array
*/
public function toArray()
{
$type = $this->getType();
$array = array(
'type' => $type,
);
if ('function' == $type) {
$array['function'] = $this->getFunction();
} else {
$array['class'] = $this->getClass();
$array['method'] = $this->getMethod();
}
return $array;
}
}

View file

@ -0,0 +1,293 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Definition.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Method definition metadata
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Method_Definition
{
/**
* @var Zend_Server_Method_Callback
*/
protected $_callback;
/**
* @var array
*/
protected $_invokeArguments = array();
/**
* @var string
*/
protected $_methodHelp = '';
/**
* @var string
*/
protected $_name;
/**
* @var null|object
*/
protected $_object;
/**
* @var array Array of Zend_Server_Method_Prototype objects
*/
protected $_prototypes = array();
/**
* Constructor
*
* @param null|array $options
* @return void
*/
public function __construct($options = null)
{
if ((null !== $options) && is_array($options)) {
$this->setOptions($options);
}
}
/**
* Set object state from options
*
* @param array $options
* @return Zend_Server_Method_Definition
*/
public function setOptions(array $options)
{
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
return $this;
}
/**
* Set method name
*
* @param string $name
* @return Zend_Server_Method_Definition
*/
public function setName($name)
{
$this->_name = (string) $name;
return $this;
}
/**
* Get method name
*
* @return string
*/
public function getName()
{
return $this->_name;
}
/**
* Set method callback
*
* @param array|Zend_Server_Method_Callback $callback
* @return Zend_Server_Method_Definition
*/
public function setCallback($callback)
{
if (is_array($callback)) {
require_once 'Zend/Server/Method/Callback.php';
$callback = new Zend_Server_Method_Callback($callback);
} elseif (!$callback instanceof Zend_Server_Method_Callback) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Invalid method callback provided');
}
$this->_callback = $callback;
return $this;
}
/**
* Get method callback
*
* @return Zend_Server_Method_Callback
*/
public function getCallback()
{
return $this->_callback;
}
/**
* Add prototype to method definition
*
* @param array|Zend_Server_Method_Prototype $prototype
* @return Zend_Server_Method_Definition
*/
public function addPrototype($prototype)
{
if (is_array($prototype)) {
require_once 'Zend/Server/Method/Prototype.php';
$prototype = new Zend_Server_Method_Prototype($prototype);
} elseif (!$prototype instanceof Zend_Server_Method_Prototype) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Invalid method prototype provided');
}
$this->_prototypes[] = $prototype;
return $this;
}
/**
* Add multiple prototypes at once
*
* @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
* @return Zend_Server_Method_Definition
*/
public function addPrototypes(array $prototypes)
{
foreach ($prototypes as $prototype) {
$this->addPrototype($prototype);
}
return $this;
}
/**
* Set all prototypes at once (overwrites)
*
* @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
* @return Zend_Server_Method_Definition
*/
public function setPrototypes(array $prototypes)
{
$this->_prototypes = array();
$this->addPrototypes($prototypes);
return $this;
}
/**
* Get all prototypes
*
* @return array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
*/
public function getPrototypes()
{
return $this->_prototypes;
}
/**
* Set method help
*
* @param string $methodHelp
* @return Zend_Server_Method_Definition
*/
public function setMethodHelp($methodHelp)
{
$this->_methodHelp = (string) $methodHelp;
return $this;
}
/**
* Get method help
*
* @return string
*/
public function getMethodHelp()
{
return $this->_methodHelp;
}
/**
* Set object to use with method calls
*
* @param object $object
* @return Zend_Server_Method_Definition
*/
public function setObject($object)
{
if (!is_object($object) && (null !== $object)) {
require_once 'Zend/Server/Exception.php';
throw new Zend_Server_Exception('Invalid object passed to ' . __CLASS__ . '::' . __METHOD__);
}
$this->_object = $object;
return $this;
}
/**
* Get object to use with method calls
*
* @return null|object
*/
public function getObject()
{
return $this->_object;
}
/**
* Set invoke arguments
*
* @param array $invokeArguments
* @return Zend_Server_Method_Definition
*/
public function setInvokeArguments(array $invokeArguments)
{
$this->_invokeArguments = $invokeArguments;
return $this;
}
/**
* Retrieve invoke arguments
*
* @return array
*/
public function getInvokeArguments()
{
return $this->_invokeArguments;
}
/**
* Serialize to array
*
* @return array
*/
public function toArray()
{
$prototypes = $this->getPrototypes();
$signatures = array();
foreach ($prototypes as $prototype) {
$signatures[] = $prototype->toArray();
}
return array(
'name' => $this->getName(),
'callback' => $this->getCallback()->toArray(),
'prototypes' => $signatures,
'methodHelp' => $this->getMethodHelp(),
'invokeArguments' => $this->getInvokeArguments(),
'object' => $this->getObject(),
);
}
}

View file

@ -0,0 +1,214 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Parameter.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Method parameter metadata
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Method_Parameter
{
/**
* @var mixed Default parameter value
*/
protected $_defaultValue;
/**
* @var string Parameter description
*/
protected $_description = '';
/**
* @var string Parameter variable name
*/
protected $_name;
/**
* @var bool Is parameter optional?
*/
protected $_optional = false;
/**
* @var string Parameter type
*/
protected $_type = 'mixed';
/**
* Constructor
*
* @param null|array $options
* @return void
*/
public function __construct($options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
/**
* Set object state from array of options
*
* @param array $options
* @return Zend_Server_Method_Parameter
*/
public function setOptions(array $options)
{
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
return $this;
}
/**
* Set default value
*
* @param mixed $defaultValue
* @return Zend_Server_Method_Parameter
*/
public function setDefaultValue($defaultValue)
{
$this->_defaultValue = $defaultValue;
return $this;
}
/**
* Retrieve default value
*
* @return mixed
*/
public function getDefaultValue()
{
return $this->_defaultValue;
}
/**
* Set description
*
* @param string $description
* @return Zend_Server_Method_Parameter
*/
public function setDescription($description)
{
$this->_description = (string) $description;
return $this;
}
/**
* Retrieve description
*
* @return string
*/
public function getDescription()
{
return $this->_description;
}
/**
* Set name
*
* @param string $name
* @return Zend_Server_Method_Parameter
*/
public function setName($name)
{
$this->_name = (string) $name;
return $this;
}
/**
* Retrieve name
*
* @return string
*/
public function getName()
{
return $this->_name;
}
/**
* Set optional flag
*
* @param bool $flag
* @return Zend_Server_Method_Parameter
*/
public function setOptional($flag)
{
$this->_optional = (bool) $flag;
return $this;
}
/**
* Is the parameter optional?
*
* @return bool
*/
public function isOptional()
{
return $this->_optional;
}
/**
* Set parameter type
*
* @param string $type
* @return Zend_Server_Method_Parameter
*/
public function setType($type)
{
$this->_type = (string) $type;
return $this;
}
/**
* Retrieve parameter type
*
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* Cast to array
*
* @return array
*/
public function toArray()
{
return array(
'type' => $this->getType(),
'name' => $this->getName(),
'optional' => $this->isOptional(),
'defaultValue' => $this->getDefaultValue(),
'description' => $this->getDescription(),
);
}
}

View file

@ -0,0 +1,208 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Prototype.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
/**
* Method prototype metadata
*
* @category Zend
* @package Zend_Server
* @subpackage Method
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Method_Prototype
{
/**
* @var string Return type
*/
protected $_returnType = 'void';
/**
* @var array Map parameter names to parameter index
*/
protected $_parameterNameMap = array();
/**
* @var array Method parameters
*/
protected $_parameters = array();
/**
* Constructor
*
* @param null|array $options
* @return void
*/
public function __construct($options = null)
{
if ((null !== $options) && is_array($options)) {
$this->setOptions($options);
}
}
/**
* Set return value
*
* @param string $returnType
* @return Zend_Server_Method_Prototype
*/
public function setReturnType($returnType)
{
$this->_returnType = $returnType;
return $this;
}
/**
* Retrieve return type
*
* @return string
*/
public function getReturnType()
{
return $this->_returnType;
}
/**
* Add a parameter
*
* @param string $parameter
* @return Zend_Server_Method_Prototype
*/
public function addParameter($parameter)
{
if ($parameter instanceof Zend_Server_Method_Parameter) {
$this->_parameters[] = $parameter;
if (null !== ($name = $parameter->getName())) {
$this->_parameterNameMap[$name] = count($this->_parameters) - 1;
}
} else {
require_once 'Zend/Server/Method/Parameter.php';
$parameter = new Zend_Server_Method_Parameter(array(
'type' => (string) $parameter,
));
$this->_parameters[] = $parameter;
}
return $this;
}
/**
* Add parameters
*
* @param array $parameter
* @return Zend_Server_Method_Prototype
*/
public function addParameters(array $parameters)
{
foreach ($parameters as $parameter) {
$this->addParameter($parameter);
}
return $this;
}
/**
* Set parameters
*
* @param array $parameters
* @return Zend_Server_Method_Prototype
*/
public function setParameters(array $parameters)
{
$this->_parameters = array();
$this->_parameterNameMap = array();
$this->addParameters($parameters);
return $this;
}
/**
* Retrieve parameters as list of types
*
* @return array
*/
public function getParameters()
{
$types = array();
foreach ($this->_parameters as $parameter) {
$types[] = $parameter->getType();
}
return $types;
}
/**
* Get parameter objects
*
* @return array
*/
public function getParameterObjects()
{
return $this->_parameters;
}
/**
* Retrieve a single parameter by name or index
*
* @param string|int $index
* @return null|Zend_Server_Method_Parameter
*/
public function getParameter($index)
{
if (!is_string($index) && !is_numeric($index)) {
return null;
}
if (array_key_exists($index, $this->_parameterNameMap)) {
$index = $this->_parameterNameMap[$index];
}
if (array_key_exists($index, $this->_parameters)) {
return $this->_parameters[$index];
}
return null;
}
/**
* Set object state from array
*
* @param array $options
* @return Zend_Server_Method_Prototype
*/
public function setOptions(array $options)
{
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
return $this;
}
/**
* Serialize to array
*
* @return array
*/
public function toArray()
{
return array(
'returnType' => $this->getReturnType(),
'parameters' => $this->getParameters(),
);
}
}

View file

@ -0,0 +1,111 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_Function
*/
require_once 'Zend/Server/Reflection/Function.php';
/**
* Zend_Server_Reflection_Class
*/
require_once 'Zend/Server/Reflection/Class.php';
/**
* Reflection for determining method signatures to use with server classes
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Reflection.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection
{
/**
* Perform class reflection to create dispatch signatures
*
* Creates a {@link Zend_Server_Reflection_Class} object for the class or
* object provided.
*
* If extra arguments should be passed to dispatchable methods, these may
* be provided as an array to $argv.
*
* @param string|object $class Class name or object
* @param null|array $argv Optional arguments to be used during the method call
* @param string $namespace Optional namespace with which to prefix the
* method name (used for the signature key). Primarily to avoid collisions,
* also for XmlRpc namespacing
* @return Zend_Server_Reflection_Class
* @throws Zend_Server_Reflection_Exception
*/
public static function reflectClass($class, $argv = false, $namespace = '')
{
if (is_object($class)) {
$reflection = new ReflectionObject($class);
} elseif (class_exists($class)) {
$reflection = new ReflectionClass($class);
} else {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid class or object passed to attachClass()');
}
if ($argv && !is_array($argv)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
}
return new Zend_Server_Reflection_Class($reflection, $namespace, $argv);
}
/**
* Perform function reflection to create dispatch signatures
*
* Creates dispatch prototypes for a function. It returns a
* {@link Zend_Server_Reflection_Function} object.
*
* If extra arguments should be passed to the dispatchable function, these
* may be provided as an array to $argv.
*
* @param string $function Function name
* @param null|array $argv Optional arguments to be used during the method call
* @param string $namespace Optional namespace with which to prefix the
* function name (used for the signature key). Primarily to avoid
* collisions, also for XmlRpc namespacing
* @return Zend_Server_Reflection_Function
* @throws Zend_Server_Reflection_Exception
*/
public static function reflectFunction($function, $argv = false, $namespace = '')
{
if (!is_string($function) || !function_exists($function)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid function "' . $function . '" passed to reflectFunction');
}
if ($argv && !is_array($argv)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
}
return new Zend_Server_Reflection_Function(new ReflectionFunction($function), $namespace, $argv);
}
}

View file

@ -0,0 +1,198 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_Method
*/
require_once 'Zend/Server/Reflection/Method.php';
/**
* Class/Object reflection
*
* Proxies calls to a ReflectionClass object, and decorates getMethods() by
* creating its own list of {@link Zend_Server_Reflection_Method}s.
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Class.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Class
{
/**
* Optional configuration parameters; accessible via {@link __get} and
* {@link __set()}
* @var array
*/
protected $_config = array();
/**
* Array of {@link Zend_Server_Reflection_Method}s
* @var array
*/
protected $_methods = array();
/**
* Namespace
* @var string
*/
protected $_namespace = null;
/**
* ReflectionClass object
* @var ReflectionClass
*/
protected $_reflection;
/**
* Constructor
*
* Create array of dispatchable methods, each a
* {@link Zend_Server_Reflection_Method}. Sets reflection object property.
*
* @param ReflectionClass $reflection
* @param string $namespace
* @param mixed $argv
* @return void
*/
public function __construct(ReflectionClass $reflection, $namespace = null, $argv = false)
{
$this->_reflection = $reflection;
$this->setNamespace($namespace);
foreach ($reflection->getMethods() as $method) {
// Don't aggregate magic methods
if ('__' == substr($method->getName(), 0, 2)) {
continue;
}
if ($method->isPublic()) {
// Get signatures and description
$this->_methods[] = new Zend_Server_Reflection_Method($this, $method, $this->getNamespace(), $argv);
}
}
}
/**
* Proxy reflection calls
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __call($method, $args)
{
if (method_exists($this->_reflection, $method)) {
return call_user_func_array(array($this->_reflection, $method), $args);
}
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid reflection method');
}
/**
* Retrieve configuration parameters
*
* Values are retrieved by key from {@link $_config}. Returns null if no
* value found.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
if (isset($this->_config[$key])) {
return $this->_config[$key];
}
return null;
}
/**
* Set configuration parameters
*
* Values are stored by $key in {@link $_config}.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function __set($key, $value)
{
$this->_config[$key] = $value;
}
/**
* Return array of dispatchable {@link Zend_Server_Reflection_Method}s.
*
* @access public
* @return array
*/
public function getMethods()
{
return $this->_methods;
}
/**
* Get namespace for this class
*
* @return string
*/
public function getNamespace()
{
return $this->_namespace;
}
/**
* Set namespace for this class
*
* @param string $namespace
* @return void
*/
public function setNamespace($namespace)
{
if (empty($namespace)) {
$this->_namespace = '';
return;
}
if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid namespace');
}
$this->_namespace = $namespace;
}
/**
* Wakeup from serialization
*
* Reflection needs explicit instantiation to work correctly. Re-instantiate
* reflection object on wakeup.
*
* @return void
*/
public function __wakeup()
{
$this->_reflection = new ReflectionClass($this->getName());
}
}

View file

@ -0,0 +1,38 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* @see Zend_Server_Exception
*/
require_once 'Zend/Server/Exception.php';
/**
* Zend_Server_Reflection exceptions
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Exception extends Zend_Server_Exception
{
}

View file

@ -0,0 +1,39 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_Function_Abstract
*/
require_once 'Zend/Server/Reflection/Function/Abstract.php';
/**
* Function Reflection
*
* @uses Zend_Server_Reflection_Function_Abstract
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Function.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Function extends Zend_Server_Reflection_Function_Abstract
{
}

View file

@ -0,0 +1,502 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_Node
*/
require_once 'Zend/Server/Reflection/Node.php';
/**
* Zend_Server_Reflection_Parameter
*/
require_once 'Zend/Server/Reflection/Parameter.php';
/**
* Zend_Server_Reflection_Prototype
*/
require_once 'Zend/Server/Reflection/Prototype.php';
/**
* Function/Method Reflection
*
* Decorates a ReflectionFunction. Allows setting and retrieving an alternate
* 'service' name (i.e., the name to be used when calling via a service),
* setting and retrieving the description (originally set using the docblock
* contents), retrieving the callback and callback type, retrieving additional
* method invocation arguments, and retrieving the
* method {@link Zend_Server_Reflection_Prototype prototypes}.
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 20637 2010-01-25 22:33:22Z matthew $
*/
abstract class Zend_Server_Reflection_Function_Abstract
{
/**
* @var ReflectionFunction
*/
protected $_reflection;
/**
* Additional arguments to pass to method on invocation
* @var array
*/
protected $_argv = array();
/**
* Used to store extra configuration for the method (typically done by the
* server class, e.g., to indicate whether or not to instantiate a class).
* Associative array; access is as properties via {@link __get()} and
* {@link __set()}
* @var array
*/
protected $_config = array();
/**
* Declaring class (needed for when serialization occurs)
* @var string
*/
protected $_class;
/**
* Function/method description
* @var string
*/
protected $_description = '';
/**
* Namespace with which to prefix function/method name
* @var string
*/
protected $_namespace;
/**
* Prototypes
* @var array
*/
protected $_prototypes = array();
private $_return;
private $_returnDesc;
private $_paramDesc;
private $_sigParams;
private $_sigParamsDepth;
/**
* Constructor
*
* @param ReflectionFunction $r
*/
public function __construct(Reflector $r, $namespace = null, $argv = array())
{
// In PHP 5.1.x, ReflectionMethod extends ReflectionFunction. In 5.2.x,
// both extend ReflectionFunctionAbstract. So, we can't do normal type
// hinting in the prototype, but instead need to do some explicit
// testing here.
if ((!$r instanceof ReflectionFunction)
&& (!$r instanceof ReflectionMethod)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid reflection class');
}
$this->_reflection = $r;
// Determine namespace
if (null !== $namespace){
$this->setNamespace($namespace);
}
// Determine arguments
if (is_array($argv)) {
$this->_argv = $argv;
}
// If method call, need to store some info on the class
if ($r instanceof ReflectionMethod) {
$this->_class = $r->getDeclaringClass()->getName();
}
// Perform some introspection
$this->_reflect();
}
/**
* Create signature node tree
*
* Recursive method to build the signature node tree. Increments through
* each array in {@link $_sigParams}, adding every value of the next level
* to the current value (unless the current value is null).
*
* @param Zend_Server_Reflection_Node $parent
* @param int $level
* @return void
*/
protected function _addTree(Zend_Server_Reflection_Node $parent, $level = 0)
{
if ($level >= $this->_sigParamsDepth) {
return;
}
foreach ($this->_sigParams[$level] as $value) {
$node = new Zend_Server_Reflection_Node($value, $parent);
if ((null !== $value) && ($this->_sigParamsDepth > $level + 1)) {
$this->_addTree($node, $level + 1);
}
}
}
/**
* Build the signature tree
*
* Builds a signature tree starting at the return values and descending
* through each method argument. Returns an array of
* {@link Zend_Server_Reflection_Node}s.
*
* @return array
*/
protected function _buildTree()
{
$returnTree = array();
foreach ((array) $this->_return as $value) {
$node = new Zend_Server_Reflection_Node($value);
$this->_addTree($node);
$returnTree[] = $node;
}
return $returnTree;
}
/**
* Build method signatures
*
* Builds method signatures using the array of return types and the array of
* parameters types
*
* @param array $return Array of return types
* @param string $returnDesc Return value description
* @param array $params Array of arguments (each an array of types)
* @param array $paramDesc Array of parameter descriptions
* @return array
*/
protected function _buildSignatures($return, $returnDesc, $paramTypes, $paramDesc)
{
$this->_return = $return;
$this->_returnDesc = $returnDesc;
$this->_paramDesc = $paramDesc;
$this->_sigParams = $paramTypes;
$this->_sigParamsDepth = count($paramTypes);
$signatureTrees = $this->_buildTree();
$signatures = array();
$endPoints = array();
foreach ($signatureTrees as $root) {
$tmp = $root->getEndPoints();
if (empty($tmp)) {
$endPoints = array_merge($endPoints, array($root));
} else {
$endPoints = array_merge($endPoints, $tmp);
}
}
foreach ($endPoints as $node) {
if (!$node instanceof Zend_Server_Reflection_Node) {
continue;
}
$signature = array();
do {
array_unshift($signature, $node->getValue());
$node = $node->getParent();
} while ($node instanceof Zend_Server_Reflection_Node);
$signatures[] = $signature;
}
// Build prototypes
$params = $this->_reflection->getParameters();
foreach ($signatures as $signature) {
$return = new Zend_Server_Reflection_ReturnValue(array_shift($signature), $this->_returnDesc);
$tmp = array();
foreach ($signature as $key => $type) {
$param = new Zend_Server_Reflection_Parameter($params[$key], $type, (isset($this->_paramDesc[$key]) ? $this->_paramDesc[$key] : null));
$param->setPosition($key);
$tmp[] = $param;
}
$this->_prototypes[] = new Zend_Server_Reflection_Prototype($return, $tmp);
}
}
/**
* Use code reflection to create method signatures
*
* Determines the method help/description text from the function DocBlock
* comment. Determines method signatures using a combination of
* ReflectionFunction and parsing of DocBlock @param and @return values.
*
* @param ReflectionFunction $function
* @return array
*/
protected function _reflect()
{
$function = $this->_reflection;
$helpText = '';
$signatures = array();
$returnDesc = '';
$paramCount = $function->getNumberOfParameters();
$paramCountRequired = $function->getNumberOfRequiredParameters();
$parameters = $function->getParameters();
$docBlock = $function->getDocComment();
if (!empty($docBlock)) {
// Get help text
if (preg_match(':/\*\*\s*\r?\n\s*\*\s(.*?)\r?\n\s*\*(\s@|/):s', $docBlock, $matches))
{
$helpText = $matches[1];
$helpText = preg_replace('/(^\s*\*\s)/m', '', $helpText);
$helpText = preg_replace('/\r?\n\s*\*\s*(\r?\n)*/s', "\n", $helpText);
$helpText = trim($helpText);
}
// Get return type(s) and description
$return = 'void';
if (preg_match('/@return\s+(\S+)/', $docBlock, $matches)) {
$return = explode('|', $matches[1]);
if (preg_match('/@return\s+\S+\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
{
$value = $matches[1];
$value = preg_replace('/\s?\*\s/m', '', $value);
$value = preg_replace('/\s{2,}/', ' ', $value);
$returnDesc = trim($value);
}
}
// Get param types and description
if (preg_match_all('/@param\s+([^\s]+)/m', $docBlock, $matches)) {
$paramTypesTmp = $matches[1];
if (preg_match_all('/@param\s+\S+\s+(\$\S+)\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
{
$paramDesc = $matches[2];
foreach ($paramDesc as $key => $value) {
$value = preg_replace('/\s?\*\s/m', '', $value);
$value = preg_replace('/\s{2,}/', ' ', $value);
$paramDesc[$key] = trim($value);
}
}
}
} else {
$helpText = $function->getName();
$return = 'void';
}
// Set method description
$this->setDescription($helpText);
// Get all param types as arrays
if (!isset($paramTypesTmp) && (0 < $paramCount)) {
$paramTypesTmp = array_fill(0, $paramCount, 'mixed');
} elseif (!isset($paramTypesTmp)) {
$paramTypesTmp = array();
} elseif (count($paramTypesTmp) < $paramCount) {
$start = $paramCount - count($paramTypesTmp);
for ($i = $start; $i < $paramCount; ++$i) {
$paramTypesTmp[$i] = 'mixed';
}
}
// Get all param descriptions as arrays
if (!isset($paramDesc) && (0 < $paramCount)) {
$paramDesc = array_fill(0, $paramCount, '');
} elseif (!isset($paramDesc)) {
$paramDesc = array();
} elseif (count($paramDesc) < $paramCount) {
$start = $paramCount - count($paramDesc);
for ($i = $start; $i < $paramCount; ++$i) {
$paramDesc[$i] = '';
}
}
if (count($paramTypesTmp) != $paramCount) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception(
'Variable number of arguments is not supported for services (except optional parameters). '
. 'Number of function arguments must correspond to actual number of arguments described in a docblock.');
}
$paramTypes = array();
foreach ($paramTypesTmp as $i => $param) {
$tmp = explode('|', $param);
if ($parameters[$i]->isOptional()) {
array_unshift($tmp, null);
}
$paramTypes[] = $tmp;
}
$this->_buildSignatures($return, $returnDesc, $paramTypes, $paramDesc);
}
/**
* Proxy reflection calls
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __call($method, $args)
{
if (method_exists($this->_reflection, $method)) {
return call_user_func_array(array($this->_reflection, $method), $args);
}
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid reflection method ("' .$method. '")');
}
/**
* Retrieve configuration parameters
*
* Values are retrieved by key from {@link $_config}. Returns null if no
* value found.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
if (isset($this->_config[$key])) {
return $this->_config[$key];
}
return null;
}
/**
* Set configuration parameters
*
* Values are stored by $key in {@link $_config}.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function __set($key, $value)
{
$this->_config[$key] = $value;
}
/**
* Set method's namespace
*
* @param string $namespace
* @return void
*/
public function setNamespace($namespace)
{
if (empty($namespace)) {
$this->_namespace = '';
return;
}
if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid namespace');
}
$this->_namespace = $namespace;
}
/**
* Return method's namespace
*
* @return string
*/
public function getNamespace()
{
return $this->_namespace;
}
/**
* Set the description
*
* @param string $string
* @return void
*/
public function setDescription($string)
{
if (!is_string($string)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid description');
}
$this->_description = $string;
}
/**
* Retrieve the description
*
* @return void
*/
public function getDescription()
{
return $this->_description;
}
/**
* Retrieve all prototypes as array of
* {@link Zend_Server_Reflection_Prototype Zend_Server_Reflection_Prototypes}
*
* @return array
*/
public function getPrototypes()
{
return $this->_prototypes;
}
/**
* Retrieve additional invocation arguments
*
* @return array
*/
public function getInvokeArguments()
{
return $this->_argv;
}
/**
* Wakeup from serialization
*
* Reflection needs explicit instantiation to work correctly. Re-instantiate
* reflection object on wakeup.
*
* @return void
*/
public function __wakeup()
{
if ($this->_reflection instanceof ReflectionMethod) {
$class = new ReflectionClass($this->_class);
$this->_reflection = new ReflectionMethod($class->newInstance(), $this->getName());
} else {
$this->_reflection = new ReflectionFunction($this->getName());
}
}
}

View file

@ -0,0 +1,110 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_Function_Abstract
*/
require_once 'Zend/Server/Reflection/Function/Abstract.php';
/**
* Method Reflection
*
* @uses Zend_Server_Reflection_Function_Abstract
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Method.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Method extends Zend_Server_Reflection_Function_Abstract
{
/**
* Parent class name
* @var string
*/
protected $_class;
/**
* Parent class reflection
* @var Zend_Server_Reflection_Class
*/
protected $_classReflection;
/**
* Constructor
*
* @param Zend_Server_Reflection_Class $class
* @param ReflectionMethod $r
* @param string $namespace
* @param array $argv
* @return void
*/
public function __construct(Zend_Server_Reflection_Class $class, ReflectionMethod $r, $namespace = null, $argv = array())
{
$this->_classReflection = $class;
$this->_reflection = $r;
$classNamespace = $class->getNamespace();
// Determine namespace
if (!empty($namespace)) {
$this->setNamespace($namespace);
} elseif (!empty($classNamespace)) {
$this->setNamespace($classNamespace);
}
// Determine arguments
if (is_array($argv)) {
$this->_argv = $argv;
}
// If method call, need to store some info on the class
$this->_class = $class->getName();
// Perform some introspection
$this->_reflect();
}
/**
* Return the reflection for the class that defines this method
*
* @return Zend_Server_Reflection_Class
*/
public function getDeclaringClass()
{
return $this->_classReflection;
}
/**
* Wakeup from serialization
*
* Reflection needs explicit instantiation to work correctly. Re-instantiate
* reflection object on wakeup.
*
* @return void
*/
public function __wakeup()
{
$this->_classReflection = new Zend_Server_Reflection_Class(new ReflectionClass($this->_class), $this->getNamespace(), $this->getInvokeArguments());
$this->_reflection = new ReflectionMethod($this->_classReflection->getName(), $this->getName());
}
}

View file

@ -0,0 +1,201 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Node Tree class for Zend_Server reflection operations
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @version $Id: Node.php 20096 2010-01-06 02:05:09Z bkarwin $
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Server_Reflection_Node
{
/**
* Node value
* @var mixed
*/
protected $_value = null;
/**
* Array of child nodes (if any)
* @var array
*/
protected $_children = array();
/**
* Parent node (if any)
* @var Zend_Server_Reflection_Node
*/
protected $_parent = null;
/**
* Constructor
*
* @param mixed $value
* @param Zend_Server_Reflection_Node $parent Optional
* @return Zend_Server_Reflection_Node
*/
public function __construct($value, Zend_Server_Reflection_Node $parent = null)
{
$this->_value = $value;
if (null !== $parent) {
$this->setParent($parent, true);
}
return $this;
}
/**
* Set parent node
*
* @param Zend_Server_Reflection_Node $node
* @param boolean $new Whether or not the child node is newly created
* and should always be attached
* @return void
*/
public function setParent(Zend_Server_Reflection_Node $node, $new = false)
{
$this->_parent = $node;
if ($new) {
$node->attachChild($this);
return;
}
}
/**
* Create and attach a new child node
*
* @param mixed $value
* @access public
* @return Zend_Server_Reflection_Node New child node
*/
public function createChild($value)
{
$child = new self($value, $this);
return $child;
}
/**
* Attach a child node
*
* @param Zend_Server_Reflection_Node $node
* @return void
*/
public function attachChild(Zend_Server_Reflection_Node $node)
{
$this->_children[] = $node;
if ($node->getParent() !== $this) {
$node->setParent($this);
}
}
/**
* Return an array of all child nodes
*
* @return array
*/
public function getChildren()
{
return $this->_children;
}
/**
* Does this node have children?
*
* @return boolean
*/
public function hasChildren()
{
return count($this->_children) > 0;
}
/**
* Return the parent node
*
* @return null|Zend_Server_Reflection_Node
*/
public function getParent()
{
return $this->_parent;
}
/**
* Return the node's current value
*
* @return mixed
*/
public function getValue()
{
return $this->_value;
}
/**
* Set the node value
*
* @param mixed $value
* @return void
*/
public function setValue($value)
{
$this->_value = $value;
}
/**
* Retrieve the bottommost nodes of this node's tree
*
* Retrieves the bottommost nodes of the tree by recursively calling
* getEndPoints() on all children. If a child is null, it returns the parent
* as an end point.
*
* @return array
*/
public function getEndPoints()
{
$endPoints = array();
if (!$this->hasChildren()) {
return $endPoints;
}
foreach ($this->_children as $child) {
$value = $child->getValue();
if (null === $value) {
$endPoints[] = $this;
} elseif ((null !== $value)
&& $child->hasChildren())
{
$childEndPoints = $child->getEndPoints();
if (!empty($childEndPoints)) {
$endPoints = array_merge($endPoints, $childEndPoints);
}
} elseif ((null !== $value) && !$child->hasChildren()) {
$endPoints[] = $child;
}
}
return $endPoints;
}
}

View file

@ -0,0 +1,161 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Parameter Reflection
*
* Decorates a ReflectionParameter to allow setting the parameter type
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Parameter.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Parameter
{
/**
* @var ReflectionParameter
*/
protected $_reflection;
/**
* Parameter position
* @var int
*/
protected $_position;
/**
* Parameter type
* @var string
*/
protected $_type;
/**
* Parameter description
* @var string
*/
protected $_description;
/**
* Constructor
*
* @param ReflectionParameter $r
* @param string $type Parameter type
* @param string $description Parameter description
*/
public function __construct(ReflectionParameter $r, $type = 'mixed', $description = '')
{
$this->_reflection = $r;
$this->setType($type);
$this->setDescription($description);
}
/**
* Proxy reflection calls
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __call($method, $args)
{
if (method_exists($this->_reflection, $method)) {
return call_user_func_array(array($this->_reflection, $method), $args);
}
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid reflection method');
}
/**
* Retrieve parameter type
*
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* Set parameter type
*
* @param string|null $type
* @return void
*/
public function setType($type)
{
if (!is_string($type) && (null !== $type)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid parameter type');
}
$this->_type = $type;
}
/**
* Retrieve parameter description
*
* @return string
*/
public function getDescription()
{
return $this->_description;
}
/**
* Set parameter description
*
* @param string|null $description
* @return void
*/
public function setDescription($description)
{
if (!is_string($description) && (null !== $description)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid parameter description');
}
$this->_description = $description;
}
/**
* Set parameter position
*
* @param int $index
* @return void
*/
public function setPosition($index)
{
$this->_position = (int) $index;
}
/**
* Return parameter position
*
* @return int
*/
public function getPosition()
{
return $this->_position;
}
}

View file

@ -0,0 +1,103 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Zend_Server_Reflection_ReturnValue
*/
require_once 'Zend/Server/Reflection/ReturnValue.php';
/**
* Zend_Server_Reflection_Parameter
*/
require_once 'Zend/Server/Reflection/Parameter.php';
/**
* Method/Function prototypes
*
* Contains accessors for the return value and all method arguments.
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Prototype.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_Prototype
{
/**
* Constructor
*
* @param Zend_Server_Reflection_ReturnValue $return
* @param array $params
* @return void
*/
public function __construct(Zend_Server_Reflection_ReturnValue $return, $params = null)
{
$this->_return = $return;
if (!is_array($params) && (null !== $params)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid parameters');
}
if (is_array($params)) {
foreach ($params as $param) {
if (!$param instanceof Zend_Server_Reflection_Parameter) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('One or more params are invalid');
}
}
}
$this->_params = $params;
}
/**
* Retrieve return type
*
* @return string
*/
public function getReturnType()
{
return $this->_return->getType();
}
/**
* Retrieve the return value object
*
* @access public
* @return Zend_Server_Reflection_ReturnValue
*/
public function getReturnValue()
{
return $this->_return;
}
/**
* Retrieve method parameters
*
* @return array Array of {@link Zend_Server_Reflection_Parameter}s
*/
public function getParameters()
{
return $this->_params;
}
}

View file

@ -0,0 +1,110 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Server
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* Return value reflection
*
* Stores the return value type and description
*
* @category Zend
* @package Zend_Server
* @subpackage Reflection
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: ReturnValue.php 20096 2010-01-06 02:05:09Z bkarwin $
*/
class Zend_Server_Reflection_ReturnValue
{
/**
* Return value type
* @var string
*/
protected $_type;
/**
* Return value description
* @var string
*/
protected $_description;
/**
* Constructor
*
* @param string $type Return value type
* @param string $description Return value type
*/
public function __construct($type = 'mixed', $description = '')
{
$this->setType($type);
$this->setDescription($description);
}
/**
* Retrieve parameter type
*
* @return string
*/
public function getType()
{
return $this->_type;
}
/**
* Set parameter type
*
* @param string|null $type
* @return void
*/
public function setType($type)
{
if (!is_string($type) && (null !== $type)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid parameter type');
}
$this->_type = $type;
}
/**
* Retrieve parameter description
*
* @return string
*/
public function getDescription()
{
return $this->_description;
}
/**
* Set parameter description
*
* @param string|null $description
* @return void
*/
public function setDescription($description)
{
if (!is_string($description) && (null !== $description)) {
require_once 'Zend/Server/Reflection/Exception.php';
throw new Zend_Server_Reflection_Exception('Invalid parameter description');
}
$this->_description = $description;
}
}