1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.codec.delimited.serialization;
21
22 import java.nio.ByteBuffer;
23
24 import org.apache.mina.codec.ProtocolEncoderException;
25 import org.apache.mina.codec.delimited.ByteBufferEncoder;
26 import org.apache.thrift.TBase;
27 import org.apache.thrift.TException;
28 import org.apache.thrift.TSerializer;
29 import org.apache.thrift.protocol.TBinaryProtocol;
30
31
32
33
34
35
36
37
38 public class ThriftMessageEncoder<INPUT extends TBase<?, ?>> extends ByteBufferEncoder<INPUT> {
39 private final TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
40
41 private INPUT lastMessage;
42
43 private byte[] lastBuffer;
44
45 public static <L extends TBase<?, ?>> ThriftMessageEncoder<L> newInstance(Class<L> clazz) {
46 return new ThriftMessageEncoder<L>();
47 }
48
49 private byte[] prepareBuffer(INPUT message) throws TException {
50 if (message != lastMessage) {
51 lastBuffer = serializer.serialize(message);
52 this.lastMessage = message;
53 }
54 return lastBuffer;
55 }
56
57
58
59
60 @Override
61 public int getEncodedSize(INPUT message) {
62 try {
63 return prepareBuffer(message).length;
64 } catch (TException e) {
65 return 0;
66 }
67 }
68
69
70
71
72 @Override
73 public void writeTo(INPUT message, ByteBuffer buffer) {
74 try {
75 buffer.put(prepareBuffer(message));
76 } catch (TException e) {
77 throw new ProtocolEncoderException(e);
78 }
79 }
80 }