/* * Copyright 1999-2011 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.dubbo.remoting; import java.lang.reflect.InvocationTargetException; import com.alibaba.dubbo.common.bytecode.NoSuchMethodException; import com.alibaba.dubbo.common.bytecode.Wrapper; import com.alibaba.dubbo.remoting.exchange.ExchangeChannel; import com.alibaba.dubbo.remoting.exchange.support.Replier; /** * RpcMessageHandler. * * @author qian.lei */ public class RpcMessageHandler implements Replier<RpcMessage> { public static interface ServiceProvider{ Object getImplementation(String service); } private final static ServiceProvider DEFAULT_PROVIDER = new ServiceProvider(){ public Object getImplementation(String service) { String impl = service + "Impl"; try { Class<?> cl = Thread.currentThread().getContextClassLoader().loadClass(impl); return cl.newInstance(); } catch(Exception e) { e.printStackTrace(); } return null; } }; private ServiceProvider mProvider; public RpcMessageHandler() { this(DEFAULT_PROVIDER); } public RpcMessageHandler(ServiceProvider prov) { mProvider = prov; } public Class<RpcMessage> interest() { return RpcMessage.class; } public Object reply(ExchangeChannel channel, RpcMessage msg) throws RemotingException { String desc = msg.getMethodDesc(); Object[] args = msg.getArguments(); Object impl = mProvider.getImplementation(msg.getClassName()); Wrapper wrap = Wrapper.getWrapper(impl.getClass()); try { return new MockResult(wrap.invokeMethod(impl, desc, msg.getParameterTypes(), args)); } catch(NoSuchMethodException e) { throw new RemotingException(channel, "Service method not found."); } catch(InvocationTargetException e) { return new MockResult(e.getTargetException()); } } }