package org.rzo.netty.ahessian.rpc.server;
import java.lang.reflect.Method;
import org.rzo.netty.ahessian.rpc.message.HessianRPCCallMessage;
import org.rzo.netty.ahessian.rpc.message.HessianRPCReplyMessage;
/**
* The Class HessianSkeleton, extends the original HessianSkeleton,
* so that it can be used in a non-servlet environment
*
* TODO method name overloading. currently only overloading by number of arguments is supported
*/
public abstract class HessianSkeleton extends com.caucho.hessian4.server.HessianSkeleton implements Service
{
/** The _service. */
Object _service;
/** The _factory. */
HessianRPCServiceHandler _factory;
/**
* Instantiates a new hessian skeleton.
*
* @param service the service
* @param apiClass the api class
* @param factory the factory
*/
public HessianSkeleton(Object service, Class apiClass, HessianRPCServiceHandler factory)
{
super(apiClass);
_service = service;
_factory = factory;
}
/**
* Gets the method.
*
* @param message the message
*
* @return the method
*/
public Method getMethod(HessianRPCCallMessage message)
{
Object[] args = message.getArgs();
String methodName = message.getMethod();
Method method = null;
if (args == null || args.length == 0)
method = getMethod(mangleName(methodName, args));
if (method == null)
method = getMethod(message.getMethod());
return method;
}
public static String mangleName(String method, Object[] args)
{
if (args != null && args.length > 0)
{
StringBuffer sb = new StringBuffer();
sb.append(method);
sb.append('_');
sb.append(args.length);
return sb.toString();
}
return method;
}
/**
* Write result.
*
* @param message the message
*/
public void writeResult(HessianRPCReplyMessage message)
{
_factory.writeResult(message);
}
/* (non-Javadoc)
* @see org.rzo.netty.ahessian.rpc.server.Service#messageReceived(org.rzo.netty.ahessian.rpc.HessianRPCCallMessage)
*/
abstract public void messageReceived(HessianRPCCallMessage message);
}