<?php
include_once(AMFPHP_BASE . "shared/util/MethodTable.php");
/**
* A built-in amfphp service that allows introspection into services and their methods.
* Remove from production servers
*/
class DiscoveryService
{
/**
* Get the list of services
* @returns An array of array ready to be bound to a Tree
*/
function getServices()
{
NetDebug::trace("In getServices");
$this->_omit = array();
$this->_path = dirname(dirname(realpath(__FILE__))) . '/';
$services = $this->_listServices();
//Now sort on key
ksort($services);
$out = array();
foreach($services as $key => $val)
{
if($key == "zzz_default")
{
foreach($val as $key2 => $val2)
{
$out[] = array("label" => $val2[0], "data" => $val2[1]);
}
}
else
{
$children = array();
foreach($val as $key2 => $val2)
{
$children[] = array("label" => $val2[0], "data" => $val2[1]);
}
$out[] = array("label" => $key, "children" => $children, "open" => true);
}
}
return $out;
}
/**
* Describe a service and all its methods
* @param $data An object containing 'label' and 'data' keys
*/
function describeService($data)
{
$className = $data['label'];
//Sanitize path
$path = str_replace('..', '', $data['data']);
//Generate the method table from this info
$this->_path = dirname(dirname(realpath(__FILE__))) . DIRECTORY_SEPARATOR;
$methodTable = MethodTable::create($this->_path . $path . $className . '.php', NULL, $classComment);
return array($methodTable, $classComment);
}
function _listServices($dir = "", $suffix = "")
{
if($dir == "")
{
$dir = $this->_path;
}
$services = array();
if(in_array($suffix, $this->_omit)){ return; }
if ($handle = opendir($dir . $suffix))
{
while (false !== ($file = readdir($handle)))
{
chdir(dirname(__FILE__));
if ($file != "." && $file != "..")
{
if(is_file($dir . $suffix . $file))
{
if(strpos($file, '.methodTable') !== FALSE)
{
continue;
}
$index = strrpos($file, '.');
$before = substr($file, 0, $index);
$after = substr($file, $index + 1);
if($after == 'php')
{
$loc = "zzz_default";
if($suffix != "")
{
$loc = str_replace(DIRECTORY_SEPARATOR,'.', substr($suffix, 0, -1));
}
if($services[$loc] == NULL)
{
$services[$loc] = array();
}
$services[$loc][] = array($before, $suffix);
//array_push($this->_classes, $before);
}
}
elseif(is_dir($dir . $suffix . $file))
{
$insideDir = $this->_listServices($dir, $suffix . $file . DIRECTORY_SEPARATOR);
if(is_array($insideDir))
{
$services = $services + $insideDir;
}
}
}
}
}else{
//echo("error");
}
closedir($handle);
return $services;
}
}
?>