001
014
015 package com.liferay.portal.fabric.netty.codec.serialization;
016
017 import com.liferay.portal.fabric.netty.util.NettyUtil;
018 import com.liferay.portal.kernel.io.ProtectedAnnotatedObjectInputStream;
019
020 import io.netty.buffer.ByteBuf;
021 import io.netty.buffer.ByteBufInputStream;
022 import io.netty.channel.ChannelHandler;
023 import io.netty.channel.ChannelHandlerContext;
024 import io.netty.channel.ChannelPipeline;
025 import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
026
027 import java.io.ObjectInputStream;
028
029 import java.util.Map.Entry;
030
031
034 public class AnnotatedObjectDecoder extends LengthFieldBasedFrameDecoder {
035
036 public static final String NAME = AnnotatedObjectDecoder.class.getName();
037
038 public AnnotatedObjectDecoder() {
039 super(Integer.MAX_VALUE, 0, 4, 0, 4);
040 }
041
042 public void addFirst(
043 ObjectDecodeChannelInboundHandler<?>...
044 objectDecodeChannelInboundHandlers) {
045
046 _channelPipeline.addFirst(objectDecodeChannelInboundHandlers);
047 }
048
049 public void addFirst(
050 String name, ObjectDecodeChannelInboundHandler<?>
051 objectDecodeChannelInboundHandler) {
052
053 _channelPipeline.addFirst(name, objectDecodeChannelInboundHandler);
054 }
055
056 public void addLast(
057 ObjectDecodeChannelInboundHandler<?>...
058 objectDecodeChannelInboundHandlers) {
059
060 _channelPipeline.addLast(objectDecodeChannelInboundHandlers);
061 }
062
063 public void addLast(
064 String name, ObjectDecodeChannelInboundHandler<?>
065 objectDecodeChannelInboundHandler) {
066
067 _channelPipeline.addLast(name, objectDecodeChannelInboundHandler);
068 }
069
070 public <T extends ObjectDecodeChannelInboundHandler<?>> T remove(
071 Class<T> handlerType) {
072
073 return _channelPipeline.remove(handlerType);
074 }
075
076 public void remove(
077 ObjectDecodeChannelInboundHandler<?>
078 objectDecodeChannelInboundHandler) {
079
080 _channelPipeline.remove(objectDecodeChannelInboundHandler);
081 }
082
083 public ObjectDecodeChannelInboundHandler<?> remove(String name) {
084 return (ObjectDecodeChannelInboundHandler<?>)
085 _channelPipeline.remove(name);
086 }
087
088 public ObjectDecodeChannelInboundHandler<?> removeFirst() {
089 return (ObjectDecodeChannelInboundHandler<?>)
090 _channelPipeline.removeFirst();
091 }
092
093 public ObjectDecodeChannelInboundHandler<?> removeLast() {
094 return (ObjectDecodeChannelInboundHandler<?>)
095 _channelPipeline.removeLast();
096 }
097
098 @Override
099 protected Object decode(
100 ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf)
101 throws Exception {
102
103 ByteBuf decodeByteBuf = (ByteBuf)super.decode(
104 channelHandlerContext, byteBuf);
105
106 if (decodeByteBuf == null) {
107 return null;
108 }
109
110 ObjectInputStream objectInputStream =
111 new ProtectedAnnotatedObjectInputStream(
112 new ByteBufInputStream(decodeByteBuf));
113
114 Object object = objectInputStream.readObject();
115
116 for (Entry<String, ChannelHandler> entry : _channelPipeline) {
117 ObjectDecodeChannelInboundHandler<?>
118 objectDecodeChannelInboundHandler =
119 (ObjectDecodeChannelInboundHandler<?>)entry.getValue();
120
121 object = objectDecodeChannelInboundHandler.channelRead(
122 channelHandlerContext, object, byteBuf);
123 }
124
125 return object;
126 }
127
128 @Override
129 protected ByteBuf extractFrame(
130 ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, int index,
131 int length) {
132
133 return byteBuf.slice(index, length);
134 }
135
136 private final ChannelPipeline _channelPipeline =
137 NettyUtil.createEmptyChannelPipeline();
138
139 }