PhpRpcInterfaceGenerator.java

package eu.javaexperience.rpc.codegen;

import java.util.Collection;
import java.util.Map;

import eu.javaexperience.rpc.RpcFunction;
import eu.javaexperience.rpc.RpcRequest;
import eu.javaexperience.rpc.function.RpcFunctionParameter;

/**
 * Emlegy:
 * 		a - action //metódus sorszáma
 * 		0, 1, 2, 3 ... //paraméterek 
 * 
 * Visszajön
 * 
 * 		r - viszatérési érték
 * 		e - kivétel.toString()

class SocketCommunicator
{
	private $socket;
	
	public function __construct($host, $port)
	{
		$this->socket = fsockopen($host, $port);
	}
	
	public function __descruct()
	{
		socket_close($this->socket);
	}
	
	public function txrx($arr)
	{
		fwrite($this->socket, json_encode($arr).chr(10));
		
		$str = fgets($this->socket);
		if($str === false)
		{
			throw new Exception("Rpc connection closed");
		}
		$ret = json_decode($str, true);
		
		if(isset($ret['e']))
		{
			throw new Exception(var_export($ret['e'],true));
		}
		
		return $ret['r'];
	}
}


 * */
public class PhpRpcInterfaceGenerator
{
	public static RpcSourceBuilder<RpcFunctionParameter, RpcFunction<RpcRequest, RpcFunctionParameter>> BASIC_PHP_SOURCE_BUILDER = new RpcSourceBuilder<RpcFunctionParameter, RpcFunction<RpcRequest, RpcFunctionParameter>>()
	{
		@Override
		public String buildRpcClientSource(String compilationUnitName, Collection<RpcFunction<RpcRequest, RpcFunctionParameter>> functions, Map<String, Object> options)
		{
			StringBuilder sb = new StringBuilder();

			sb.append("class ");
			sb.append(compilationUnitName);
			
				sb.append("\n{\n\tprivate $conn;\n\n\tpublic function __construct($conn");
				
				sb.append(")\n\t{\n\t\t$this->conn = $conn;\n");
				
				sb.append("\t}\n\n");
				
				//metódusok
				for(RpcFunction<RpcRequest, RpcFunctionParameter> f:functions)
				{
					String comment = JavaRpcExportTools.renderFunctionComment(f);
					if(null != comment)
					{
						sb.append(JavaRpcExportTools.withTabIndent(comment, 1));
						sb.append("\n");
					}
					
					sb.append("\tpublic function ");
					sb.append(f.getMethodName());
					sb.append("(");
					
					RpcFunctionParameter[] params = f.getParameterClasses();
					for(int p=0;p<params.length;p++)
					{
						if(p != 0)
						{
							sb.append(", $");
						}
						else
						{
							sb.append("$");
						}
						sb.append((char)('a'+p));
					}
					
					sb.append(")\n\t{\n\t\t");
					
					if(f.getReturningClass() != null && !void.class.equals(f.getReturningClass()))
					{
						sb.append("return ");
					}
					
					
					sb.append("$this->conn->txrx(array(");
					
					sb.append("'f' => '");
					sb.append(f.getMethodName());
					sb.append("', 'p' => array(");
					for(int p=0;p<params.length;p++)
					{
						if(0 != p)
						{
							sb.append(", ");
						}
						sb.append(" $");
						sb.append((char)('a'+p));
					}
					
					sb.append(")));\n\t}\n\n");
				}
				
			sb.append("}");
			
			return sb.toString();
		}
	};
	
	private static void _()
	{
		StringBuilder sb = new StringBuilder();
		
		String comm = null;//methods[0].getComment();
		if(comm != null)
		{
			sb.append("\t/*");
			sb.append(comm.replace("\n", "\n\t *"));
			sb.append("\t*/\n");
		}
	}
}