1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.memcache;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.buffer.Unpooled;
20 import io.netty.channel.ChannelHandlerContext;
21 import io.netty.channel.FileRegion;
22 import io.netty.handler.codec.MessageToMessageEncoder;
23 import io.netty.util.internal.StringUtil;
24 import io.netty.util.internal.UnstableApi;
25
26 import java.util.List;
27
28
29
30
31
32
33
34
35 @UnstableApi
36 public abstract class AbstractMemcacheObjectEncoder<M extends MemcacheMessage> extends MessageToMessageEncoder<Object> {
37
38 private boolean expectingMoreContent;
39
40 public AbstractMemcacheObjectEncoder() {
41 super(Object.class);
42 }
43
44 @Override
45 protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
46 if (msg instanceof MemcacheMessage) {
47 if (expectingMoreContent) {
48 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
49 }
50
51 @SuppressWarnings({ "unchecked", "CastConflictsWithInstanceof" })
52 final M m = (M) msg;
53 out.add(encodeMessage(ctx, m));
54 }
55
56 if (msg instanceof MemcacheContent || msg instanceof ByteBuf || msg instanceof FileRegion) {
57 int contentLength = contentLength(msg);
58 if (contentLength > 0) {
59 out.add(encodeAndRetain(msg));
60 } else {
61 out.add(Unpooled.EMPTY_BUFFER);
62 }
63
64 expectingMoreContent = !(msg instanceof LastMemcacheContent);
65 }
66 }
67
68 @Override
69 public boolean acceptOutboundMessage(Object msg) throws Exception {
70 return msg instanceof MemcacheObject || msg instanceof ByteBuf || msg instanceof FileRegion;
71 }
72
73
74
75
76
77
78
79
80 protected abstract ByteBuf encodeMessage(ChannelHandlerContext ctx, M msg);
81
82
83
84
85
86
87
88 private static int contentLength(Object msg) {
89 if (msg instanceof MemcacheContent) {
90 return ((MemcacheContent) msg).content().readableBytes();
91 }
92 if (msg instanceof ByteBuf) {
93 return ((ByteBuf) msg).readableBytes();
94 }
95 if (msg instanceof FileRegion) {
96 return (int) ((FileRegion) msg).count();
97 }
98 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
99 }
100
101
102
103
104
105
106
107 private static Object encodeAndRetain(Object msg) {
108 if (msg instanceof ByteBuf) {
109 return ((ByteBuf) msg).retain();
110 }
111 if (msg instanceof MemcacheContent) {
112 return ((MemcacheContent) msg).content().retain();
113 }
114 if (msg instanceof FileRegion) {
115 return ((FileRegion) msg).retain();
116 }
117 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
118 }
119
120 }