JavaRpcConnection.java

package eu.javaexperience.rpc.javaclient;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import eu.javaexperience.datareprez.DataObject;
import eu.javaexperience.datareprez.DataReceiver;
import eu.javaexperience.datareprez.DataSender;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.reflect.Mirror;
import eu.javaexperience.rpc.RpcProtocolHandler;
import eu.javaexperience.rpc.bidirectional.BidirectionalRpcDefaultProtocol;
import eu.javaexperience.rpc.bidirectional.BidirectionalRpcProtocolHandler;

/**
 * T: object represents the connection, can be a socket or just an URL, String, FileDescriptor etc.
 * */
public class JavaRpcConnection<C>
{
	protected final C connection;
	protected final BidirectionalRpcDefaultProtocol protocol;
	protected final DataSender sender;
	protected final DataReceiver receiver;
	
	//TODO packet queue
	@Deprecated
	public final GetBy1<DataObject, DataObject> transaction;
	
	public JavaRpcConnection(C connection, BidirectionalRpcDefaultProtocol protocol, DataSender ds, DataReceiver rec)
	{
		this.connection = connection;
		this.sender = ds;
		this.receiver = rec;
		this.protocol = protocol;
		this.transaction = new GetBy1<DataObject, DataObject>()
		{
			@Override
			public DataObject getBy(DataObject a)
			{
				try
				{
					synchronized(this)
					{
						sender.send(a);
						return receiver.receiveDataObject();
					}
				}
				catch(Exception e)
				{
					Mirror.propagateAnyway(e);
					return null;
				}
			}
		}; 
	}
	
	public static JavaRpcConnection<Socket> tcpConnect(String ip, int port, BidirectionalRpcDefaultProtocol proto) throws UnknownHostException, IOException
	{
		Socket socket = new Socket(ip, port);
		
		final DataReceiver rec = proto.getDefaultCommunicationProtocolPrototype().newDataReceiver(socket.getInputStream());
		final DataSender send = proto.getDefaultCommunicationProtocolPrototype().newDataSender(socket.getOutputStream());
		
		return new JavaRpcConnection<Socket>(socket, proto, send, rec);
	}

	public BidirectionalRpcProtocolHandler getProtocol()
	{
		return protocol;
	}
}