<?php
vendor("cakeswx".DS."php".DS."core".DS."amf".DS."util".DS."CakeMethodTable");
/**
 * A built-in amfphp service that allows introspection into services and their methods.
 * Remove from production servers
 */
class DiscoveryService extends AppController
{
	var $name = '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" => Inflector::camelize($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 = CakeMethodTable::create($this->_path . $path . Inflector::underscore($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;
	}
}
?>