BidirectionalRpcDefaultProtocol.java
package eu.javaexperience.rpc.bidirectional;
import eu.javaexperience.datareprez.DataArray;
import eu.javaexperience.datareprez.DataCommon;
import eu.javaexperience.datareprez.DataObject;
import eu.javaexperience.datareprez.DataReprezTools;
import eu.javaexperience.datareprez.convertFrom.DataWrapper;
import eu.javaexperience.datareprez.jsonImpl.DataObjectJsonImpl;
import eu.javaexperience.interfaces.simple.getBy.GetBy3;
import eu.javaexperience.reflect.Mirror.BelongTo;
import eu.javaexperience.reflect.Mirror.FieldSelector;
import eu.javaexperience.reflect.Mirror.Select;
import eu.javaexperience.reflect.Mirror.Visibility;
import eu.javaexperience.rpc.RpcDefaultProtocol;
import eu.javaexperience.rpc.RpcRequest;
import eu.javaexperience.rpc.RpcSession;
import eu.javaexperience.rpc.SimpleRpcRequest;
import eu.javaexperience.rpc.SimpleRpcSession;
public class BidirectionalRpcDefaultProtocol<S extends RpcSession> extends RpcDefaultProtocol implements BidirectionalRpcProtocolHandler<S>
{
public BidirectionalRpcDefaultProtocol(DataCommon proto)
{
this(proto, DEFAULT_RPC_DATA_WRAPPER);
}
public BidirectionalRpcDefaultProtocol(DataCommon proto, DataWrapper dataWrapper)
{
super(proto, dataWrapper);
}
@Override
public void putPacketTraceId(RpcRequest req, String tid)
{
req.getRequestData().putString("t", tid);
}
@Override
public void putRequestFunctionName(RpcRequest req, String functName)
{
req.getRequestData().putString("f", functName);
}
@Override
public void putParameters(RpcRequest req, Object[] params)
{
req.getRequestData().putArray("p", (DataArray) wrap(params));
}
@Override
public Object extractReturningValue(RpcRequest req)
{
if(!req.getResponseData().has("r"))
{
return null;
}
return req.getResponseData().get("r");
}
@Override
public Throwable extractException(RpcRequest req)
{
if(!req.getResponseData().has("e"))
{
return null;
}
Object ret = extract(req.getResponseData().get("e"));
if(null == ret)
{
return null;
}
return new ClientRequestException(((DataObject)ret).getImpl());
}
@Override
public void putThisParameter(RpcRequest req, Object thisParam)
{
DataReprezTools.put(req.getRequestData(), "_", thisParam);
}
@Override
public RpcRequest createClientRequest(RpcSession session)
{
return new SimpleRpcRequest(session);
}
public static final DataWrapper DEFAULT_RPC_DATA_WRAPPER = DataReprezTools.combineWrappers
(
DataReprezTools.WRAP_ARRAY_COLLECTION_MAP,
DataReprezTools.WRAP_DATA_LIKE,
DataReprezTools.WRAP_CLASS__OBJECT_WITH_PROPERTY,
DataReprezTools.createClassInstanceWrapper(new FieldSelector(true, Visibility.Public, BelongTo.Instance, Select.All, Select.IsNot, Select.All))
);
public static final DataWrapper DEFAULT_RPC_DATA_WRAPPER_WITH_CLASS = DataReprezTools.combineWrappers
(
DataReprezTools.WRAP_ARRAY_COLLECTION_MAP,
DataReprezTools.WRAP_ENUM,
DataReprezTools.WRAP_DATA_LIKE,
DataReprezTools.WRAP_CLASS__OBJECT_WITH_PROPERTY,
DataReprezTools.createClassInstanceWrapper(new FieldSelector(true, Visibility.Public, BelongTo.Instance, Select.All, Select.IsNot, Select.All), "class")
);
public static final BidirectionalRpcDefaultProtocol<SimpleRpcSession> DEFAULT_PROTOCOL_HANDLER = new BidirectionalRpcDefaultProtocol<>(new DataObjectJsonImpl(), DEFAULT_RPC_DATA_WRAPPER);
public static final BidirectionalRpcDefaultProtocol<SimpleRpcSession> DEFAULT_PROTOCOL_HANDLER_WITH_CLASS = new BidirectionalRpcDefaultProtocol<>(new DataObjectJsonImpl(), DEFAULT_RPC_DATA_WRAPPER_WITH_CLASS);
public static final BidirectionalRpcDefaultProtocol<SimpleRpcSession> createWithClassFetcher(DataWrapper dw, GetBy3<Object, BidirectionalRpcProtocolHandler, Class, DataObject> fetcher)
{
return new BidirectionalRpcDefaultProtocol<SimpleRpcSession>(new DataObjectJsonImpl(), dw)
{
@Override
protected Object createObject(Class request, DataObject obj) throws Exception
{
return fetcher.getBy(this, request, obj);
}
};
}
//DEFAULT_PROTOCOL_HANDLER_WITH_CLASS = new BidirectionalRpcDefaultProtocol<>(new DataObjectJsonImpl(), DEFAULT_RPC_DATA_WRAPPER_WITH_CLASS)
@Override
public void putNamespace(RpcRequest req, String namespace)
{
DataReprezTools.put(req.getRequestData(), "N", namespace);
}
}