package org.rzo.netty.ahessian.rpc.callback;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.rzo.netty.ahessian.Constants;
import org.rzo.netty.ahessian.rpc.message.HessianRPCCallMessage;
import org.rzo.netty.ahessian.rpc.server.HessianRPCServiceHandler;
public class ServerCallbackProxy implements InvocationHandler, Constants
{
private boolean _done = false;
private HessianRPCServiceHandler _handler;
private HessianRPCCallMessage _message;
private ClientCallback _clientCallback;
boolean _closed = false;
public ServerCallbackProxy(HessianRPCServiceHandler handler, HessianRPCCallMessage message, ClientCallback clientCallback)
{
_message = message;
_clientCallback = clientCallback;
_handler = handler;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if (_closed)
throw new RuntimeException("cannot invoke callback after call to setDone(true)");
String methodName = method.getName();
if ("setDone".equals(methodName) && args.length == 1 && (args[0] instanceof Boolean))
{
_done = ((Boolean)args[0]).booleanValue();
return null;
}
if ("isDone".equals(method.getName()) && (args == null || args.length == 0))
{
return (Boolean)_done;
}
if ("isValid".equals(method.getName()) && (args == null || args.length == 0))
{
return (Boolean)_message.isValid();
}
CallbackReplyMessage reply = new CallbackReplyMessage(methodName, args, null, _message);
reply.setCallId((Long) _message.getHeaders().get(CALL_ID_HEADER_KEY));
reply.setGroup((Integer) _message.getHeaders().get(GROUP_HEADER_KEY));
reply.setCallbackId(_clientCallback.getId());
reply.setCallbackArgs(args);
reply.setCallbackMethod(methodName);
if (_done)
reply.setCallbackDone(true);
_handler.writeResult(reply);
if (_done)
_closed = true;
return null;
}
}