package com.github.wangxuehui.rpc.snrpc.serializer;
import java.util.List;
import com.github.wangxuehui.rpc.serializer.jdk.JdkObjectSerializer;
import com.github.wangxuehui.rpc.serializer.protobuf.ProtobufSerializer;
import com.github.wangxuehui.rpc.serializer.protostuff.ProtostuffSerializer;
import com.github.wangxuehui.rpc.snrpc.conf.SnRpcConfig;
import com.github.wangxuehui.rpc.serializer.fasterxml.FasterxmlSerializer;
import com.github.wangxuehui.rpc.serializer.jackson.JacksonSerializer;
import com.github.wangxuehui.rpc.serializer.kryo.KryoSerializer;
import com.github.wangxuehui.rpc.snrpc.util.Const;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
/**
* @author skyim E-mail:wxh64788665@gmail.com
* 类说明
*/
public class SnRpcResponseDecoder extends ByteToMessageDecoder{
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
List<Object> out) throws Exception {
// TODO Auto-generated method stub
if(in.readableBytes() < 4) {
return;
}
in.markReaderIndex();
int dataLength = in.readInt();
if(dataLength<0) {
ctx.close();
}
if(in.readableBytes() < dataLength){
in.resetReaderIndex();
return ;
}
byte[] body = new byte[dataLength];
in.readBytes(body);
SnRpcResponse snRpcResponse = null;
SnRpcConfig snRpcConfig = SnRpcConfig.getInstance();
String type = snRpcConfig.getProperty("snrpc.serializataion.type", "5");
if(Const.SERIALIZATION_PROTOBUF.equals(type)){
final ProtobufSerializer protobuf = new ProtobufSerializer();
snRpcResponse = protobuf.deserialize(body, SnRpcResponse.class);
}else if(Const.SERIALIZATION_KRYO.equals(type)){
final KryoSerializer kryo = new KryoSerializer();
snRpcResponse = kryo.deserialize(body, SnRpcResponse.class);
}else if(Const.SERIALIZATION_PROTOSTUFF.equals(type)){
final ProtostuffSerializer protostuff = new ProtostuffSerializer();
snRpcResponse = protostuff.deserialize(body, SnRpcResponse.class);
}else if(Const.SERIALIZATION_FASTERXML.equals(type)){
final FasterxmlSerializer fastxml = new FasterxmlSerializer();
snRpcResponse = fastxml.deserialize(body, SnRpcResponse.class);
}else if(Const.SERIALIZATION_JACKSON.equals(type)){
final JacksonSerializer jackson = new JacksonSerializer();
snRpcResponse = jackson.deserialize(body, SnRpcResponse.class);
}else if(Const.SERIALIZATION_JDK.equals(type)){
final JdkObjectSerializer jdk = new JdkObjectSerializer();
snRpcResponse = jdk.deserialize(body, SnRpcResponse.class);
}else {
final ProtobufSerializer protobuf = new ProtobufSerializer();
snRpcResponse = protobuf.deserialize(body, SnRpcResponse.class);
}
out.add(snRpcResponse);
}
}