/* * Copyright 2009-2016 Weibo, Inc. * * 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.weibo.api.motan.transport.netty; import java.io.IOException; import com.weibo.api.motan.codec.AbstractCodec; import com.weibo.api.motan.common.MotanConstants; import com.weibo.api.motan.core.extension.SpiMeta; import com.weibo.api.motan.exception.MotanErrorMsgConstant; import com.weibo.api.motan.exception.MotanFrameworkException; import com.weibo.api.motan.protocol.rpc.DefaultRpcCodec; import com.weibo.api.motan.rpc.DefaultResponse; import com.weibo.api.motan.rpc.Response; import com.weibo.api.motan.transport.Channel; @SpiMeta(name = "mockMotan") public class MockDefaultRpcCodec extends AbstractCodec { private DefaultRpcCodec codec = new DefaultRpcCodec(); private static final byte MASK = 0x07; @Override public byte[] encode(Channel channel, Object message) throws IOException { return codec.encode(channel, message); } @Override public Object decode(Channel channel, String remoteIp, byte[] buffer) throws IOException { Object result = codec.decode(channel, remoteIp, buffer); if (result instanceof Response) { DefaultResponse object = (DefaultResponse) result; byte flag = buffer[3]; byte dataType = (byte) (flag & MASK); boolean isResponse = (dataType != MotanConstants.FLAG_REQUEST); if (object.getException() == null) { if (isResponse && object.getValue().equals("error")) { DefaultResponse response = (DefaultResponse) object; response.setException(new MotanFrameworkException("decode error: response dataType not support " + dataType, MotanErrorMsgConstant.FRAMEWORK_DECODE_ERROR)); return response; } else { throw new MotanFrameworkException(MotanErrorMsgConstant.FRAMEWORK_DECODE_ERROR); } } return object; } return result; } }