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 @Override
41 protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
42 if (msg instanceof MemcacheMessage) {
43 if (expectingMoreContent) {
44 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
45 }
46
47 @SuppressWarnings({ "unchecked", "CastConflictsWithInstanceof" })
48 final M m = (M) msg;
49 out.add(encodeMessage(ctx, m));
50 }
51
52 if (msg instanceof MemcacheContent || msg instanceof ByteBuf || msg instanceof FileRegion) {
53 int contentLength = contentLength(msg);
54 if (contentLength > 0) {
55 out.add(encodeAndRetain(msg));
56 } else {
57 out.add(Unpooled.EMPTY_BUFFER);
58 }
59
60 expectingMoreContent = !(msg instanceof LastMemcacheContent);
61 }
62 }
63
64 @Override
65 public boolean acceptOutboundMessage(Object msg) throws Exception {
66 return msg instanceof MemcacheObject || msg instanceof ByteBuf || msg instanceof FileRegion;
67 }
68
69
70
71
72
73
74
75
76 protected abstract ByteBuf encodeMessage(ChannelHandlerContext ctx, M msg);
77
78
79
80
81
82
83
84 private static int contentLength(Object msg) {
85 if (msg instanceof MemcacheContent) {
86 return ((MemcacheContent) msg).content().readableBytes();
87 }
88 if (msg instanceof ByteBuf) {
89 return ((ByteBuf) msg).readableBytes();
90 }
91 if (msg instanceof FileRegion) {
92 return (int) ((FileRegion) msg).count();
93 }
94 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
95 }
96
97
98
99
100
101
102
103 private static Object encodeAndRetain(Object msg) {
104 if (msg instanceof ByteBuf) {
105 return ((ByteBuf) msg).retain();
106 }
107 if (msg instanceof MemcacheContent) {
108 return ((MemcacheContent) msg).content().retain();
109 }
110 if (msg instanceof FileRegion) {
111 return ((FileRegion) msg).retain();
112 }
113 throw new IllegalStateException("unexpected message type: " + StringUtil.simpleClassName(msg));
114 }
115
116 }