package code.google.nfs.rpc.server; /** * nfs-rpc * Apache License * * http://code.google.com/p/nfs-rpc (c) 2011 */ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import code.google.nfs.rpc.Codecs; import code.google.nfs.rpc.RequestWrapper; import code.google.nfs.rpc.ResponseWrapper; /** * Direct Call RPC Server Handler * * @author <a href="mailto:bluedavy@gmail.com">bluedavy</a> */ public class SimpleProcessorServerHandler implements ServerHandler{ private static final Log LOGGER = LogFactory.getLog(SimpleProcessorServerHandler.class); private Map<String, ServerProcessor> processors = new ConcurrentHashMap<String, ServerProcessor>(); public void registerProcessor(String instanceName,Object instance){ processors.put(instanceName, (ServerProcessor)instance); } public ResponseWrapper handleRequest(final RequestWrapper request){ ResponseWrapper responseWrapper = new ResponseWrapper(request.getId(),request.getCodecType(),request.getProtocolType()); try{ String argType = null; if(request.getArgTypes() != null && request.getArgTypes()[0] != null){ argType = new String(request.getArgTypes()[0]); } Object requestObject = Codecs.getDecoder(request.getCodecType()).decode(argType,(byte[])request.getMessage()); responseWrapper.setResponse(processors.get(requestObject.getClass().getName()).handle(requestObject)); } catch(Exception e){ LOGGER.error("server direct call handler to handle request error",e); responseWrapper.setException(e); } return responseWrapper; } }