From 92a688e5b2938b7251441335a657df36bb5e9eea Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Wed, 16 May 2012 23:02:06 +0900 Subject: [PATCH] Retrofit the codec framework with the new API (in progress) - Replaced FrameDecoder and OneToOne(Encoder|Decoder) with: - (Stream|Message)To(String|Message)(Encoder|Decoder) - Moved the classes in 'codec.frame' up to 'codec' - Fixed some bugs found while running unit tests --- .../codec/http/HttpChunkAggregator.java | 2 +- .../codec/http/HttpMessageDecoder.java | 2 +- .../codec/http/HttpRequestDecoder.java | 2 +- .../codec/http/HttpResponseDecoder.java | 2 +- .../websocketx/WebSocket00FrameDecoder.java | 2 +- .../websocketx/WebSocket08FrameDecoder.java | 4 +- .../websocketx/WebSocket08FrameEncoder.java | 2 +- .../WebSocketClientHandshaker00.java | 4 +- .../WebSocketClientHandshaker08.java | 4 +- .../WebSocketClientHandshaker13.java | 4 +- .../WebSocketServerHandshaker00.java | 2 +- .../WebSocketServerHandshaker08.java | 2 +- .../WebSocketServerHandshaker13.java | 2 +- .../codec/rtsp/RtspMessageDecoder.java | 2 +- .../codec/rtsp/RtspRequestDecoder.java | 2 +- .../codec/rtsp/RtspResponseDecoder.java | 2 +- .../handler/codec/spdy/SpdyFrameDecoder.java | 2 +- .../handler/codec/spdy/SpdyHttpDecoder.java | 2 +- .../WebSocketServerHandshaker00Test.java | 2 +- .../WebSocketServerHandshaker08Test.java | 2 +- .../WebSocketServerHandshaker13Test.java | 2 +- .../spdy/AbstractSocketSpdyEchoTest.java | 8 +- .../{frame => }/CorruptedFrameException.java | 7 +- .../DelimiterBasedFrameDecoder.java | 16 +- .../handler/codec/{frame => }/Delimiters.java | 2 +- .../{frame => }/FixedLengthFrameDecoder.java | 40 +- .../LengthFieldBasedFrameDecoder.java | 67 ++-- .../{frame => }/LengthFieldPrepender.java | 40 +- .../codec/MessageToMessageDecoder.java | 51 +++ .../codec/MessageToMessageEncoder.java | 109 ++++++ .../handler/codec/MessageToStreamEncoder.java | 45 +++ .../handler/codec/StreamToMessageDecoder.java | 69 ++++ .../handler/codec/StreamToStreamDecoder.java | 73 ++++ .../handler/codec/StreamToStreamEncoder.java | 43 ++ .../{frame => }/TooLongFrameException.java | 2 +- .../handler/codec/base64/Base64Decoder.java | 33 +- .../handler/codec/base64/Base64Encoder.java | 26 +- .../handler/codec/bytes/ByteArrayDecoder.java | 34 +- .../handler/codec/bytes/ByteArrayEncoder.java | 27 +- .../codec/compression/ZlibDecoder.java | 85 ++-- .../codec/compression/ZlibEncoder.java | 180 +++++---- .../codec/embedder/AbstractCodecEmbedder.java | 177 ++------- .../handler/codec/embedder/CodecEmbedder.java | 2 +- .../codec/embedder/DecoderEmbedder.java | 30 +- .../codec/embedder/EmbeddedChannel.java | 122 ++++-- .../embedder/EmbeddedChannelFactory.java | 40 -- .../codec/embedder/EmbeddedEventLoop.java | 88 +++++ .../codec/embedder/EncoderEmbedder.java | 20 +- .../handler/codec/frame/FrameDecoder.java | 366 ------------------ .../handler/codec/oneone/OneToOneDecoder.java | 81 ---- .../handler/codec/oneone/OneToOneEncoder.java | 76 ---- .../handler/codec/oneone/package-info.java | 23 -- .../codec/{frame => }/package-info.java | 2 +- .../codec/protobuf/ProtobufDecoder.java | 32 +- .../codec/protobuf/ProtobufEncoder.java | 21 +- .../ProtobufVarint32FrameDecoder.java | 25 +- .../ProtobufVarint32LengthFieldPrepender.java | 38 +- .../codec/replay/ReplayingDecoder.java | 2 +- .../handler/codec/replay/package-info.java | 2 +- .../codec/serialization/ObjectDecoder.java | 2 +- .../handler/codec/string/StringDecoder.java | 6 +- .../handler/codec/string/StringEncoder.java | 4 +- .../codec/bytes/ByteArrayDecoderTest.java | 40 +- .../codec/bytes/ByteArrayEncoderTest.java | 28 +- .../frame/DelimiterBasedFrameDecoderTest.java | 3 + .../LengthFieldBasedFrameDecoderTest.java | 2 + .../netty/example/echo/EchoClientHandler.java | 2 +- .../netty/example/echo/EchoServerHandler.java | 3 +- .../example/factorial/BigIntegerDecoder.java | 4 +- .../example/factorial/FactorialClient.java | 2 +- .../file/HttpStaticFileServerHandler.java | 4 +- .../io/netty/example/local/LocalExample.java | 2 +- .../example/localtime/LocalTimeClient.java | 2 +- .../PortUnificationServerHandler.java | 10 +- .../proxy/HexDumpProxyInboundHandler.java | 2 +- .../securechat/SecureChatClientHandler.java | 2 +- .../SecureChatClientPipelineFactory.java | 4 +- .../securechat/SecureChatServerHandler.java | 2 +- .../SecureChatServerPipelineFactory.java | 4 +- .../io/netty/example/stdio/StdioLogger.java | 4 +- .../telnet/TelnetClientPipelineFactory.java | 4 +- .../telnet/TelnetServerPipelineFactory.java | 4 +- .../java/io/netty/handler/ssl/SslHandler.java | 2 +- .../handler/timeout/IdleStateHandler.java | 2 +- .../handler/timeout/ReadTimeoutHandler.java | 2 +- .../socket/AbstractDatagramMulticastTest.java | 4 +- .../socket/AbstractDatagramTest.java | 4 +- .../AbstractSocketClientBootstrapTest.java | 8 +- ...tSocketCompatibleObjectStreamEchoTest.java | 12 +- .../socket/AbstractSocketEchoTest.java | 4 +- .../AbstractSocketFixedLengthEchoTest.java | 10 +- .../AbstractSocketObjectStreamEchoTest.java | 12 +- .../AbstractSocketServerBootstrapTest.java | 6 +- .../socket/AbstractSocketSslEchoTest.java | 14 +- .../socket/AbstractSocketStringEchoTest.java | 20 +- .../nio/NioClientSocketShutdownTimeTest.java | 2 +- .../nio/NioServerSocketShutdownTimeTest.java | 2 +- .../socket/http/HttpTunnelClientChannel.java | 2 +- .../socket/http/HttpTunnelServerChannel.java | 4 +- .../socket/http/FakeServerSocketChannel.java | 2 +- .../HttpTunnelServerChannelFactoryTest.java | 2 +- .../netty/channel/sctp/SctpChannelImpl.java | 4 +- .../channel/sctp/SctpNotificationHandler.java | 2 +- .../channel/sctp/SctpServerChannelImpl.java | 4 +- .../io/netty/channel/sctp/SctpWorker.java | 4 +- .../AbstractSocketClientBootstrapTest.java | 16 +- ...tSocketCompatibleObjectStreamEchoTest.java | 20 +- .../transport/AbstractSocketEchoTest.java | 12 +- .../AbstractSocketFixedLengthEchoTest.java | 18 +- .../AbstractSocketObjectStreamEchoTest.java | 20 +- .../AbstractSocketServerBootstrapTest.java | 6 +- .../transport/AbstractSocketSslEchoTest.java | 22 +- .../AbstractSocketStringEchoTest.java | 28 +- .../sctp/SctpMultiHomingEchoTest.java | 12 +- .../sctp/SctpMultiStreamingEchoTest.java | 4 +- .../io/netty/channel/AbstractChannel.java | 38 ++ .../netty/channel/ChannelBufferHolders.java | 11 + .../netty/channel/DefaultChannelPipeline.java | 13 +- .../netty/channel/ServerChannelBootstrap.java | 3 +- .../socket/nio/AbstractNioChannel.java | 35 -- .../channel/socket/nio/NioSocketChannel.java | 3 +- 121 files changed, 1260 insertions(+), 1423 deletions(-) rename codec/src/main/java/io/netty/handler/codec/{frame => }/CorruptedFrameException.java (92%) rename codec/src/main/java/io/netty/handler/codec/{frame => }/DelimiterBasedFrameDecoder.java (96%) rename codec/src/main/java/io/netty/handler/codec/{frame => }/Delimiters.java (97%) rename codec/src/main/java/io/netty/handler/codec/{frame => }/FixedLengthFrameDecoder.java (72%) rename codec/src/main/java/io/netty/handler/codec/{frame => }/LengthFieldBasedFrameDecoder.java (90%) rename codec/src/main/java/io/netty/handler/codec/{frame => }/LengthFieldPrepender.java (81%) create mode 100644 codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java create mode 100644 codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java create mode 100644 codec/src/main/java/io/netty/handler/codec/MessageToStreamEncoder.java create mode 100644 codec/src/main/java/io/netty/handler/codec/StreamToMessageDecoder.java create mode 100644 codec/src/main/java/io/netty/handler/codec/StreamToStreamDecoder.java create mode 100644 codec/src/main/java/io/netty/handler/codec/StreamToStreamEncoder.java rename codec/src/main/java/io/netty/handler/codec/{frame => }/TooLongFrameException.java (97%) delete mode 100644 codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannelFactory.java create mode 100644 codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedEventLoop.java delete mode 100644 codec/src/main/java/io/netty/handler/codec/frame/FrameDecoder.java delete mode 100644 codec/src/main/java/io/netty/handler/codec/oneone/OneToOneDecoder.java delete mode 100644 codec/src/main/java/io/netty/handler/codec/oneone/OneToOneEncoder.java delete mode 100644 codec/src/main/java/io/netty/handler/codec/oneone/package-info.java rename codec/src/main/java/io/netty/handler/codec/{frame => }/package-info.java (96%) diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java index 26510c20bc..7e0b65fb25 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpChunkAggregator.java @@ -29,7 +29,7 @@ import io.netty.channel.ChannelPipeline; import io.netty.channel.Channels; import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.util.CharsetUtil; /** diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpMessageDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpMessageDecoder.java index d8f5adffd1..0c5c962493 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpMessageDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpMessageDecoder.java @@ -22,7 +22,7 @@ import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.replay.ReplayingDecoder; /** diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpRequestDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpRequestDecoder.java index 9d2d0665d1..1d4f496d6e 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpRequestDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpRequestDecoder.java @@ -17,7 +17,7 @@ package io.netty.handler.codec.http; import io.netty.buffer.ChannelBuffer; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; /** diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpResponseDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpResponseDecoder.java index cabd4452de..21f39c5dbc 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpResponseDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpResponseDecoder.java @@ -17,7 +17,7 @@ package io.netty.handler.codec.http; import io.netty.buffer.ChannelBuffer; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; /** diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java index 69ca9776cf..df008eed42 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java @@ -18,7 +18,7 @@ package io.netty.handler.codec.http.websocketx; import io.netty.buffer.ChannelBuffer; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.replay.ReplayingDecoder; import io.netty.handler.codec.replay.VoidEnum; diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameDecoder.java index b590c11d8a..2aca19d07a 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameDecoder.java @@ -58,8 +58,8 @@ import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.CorruptedFrameException; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.CorruptedFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.replay.ReplayingDecoder; import io.netty.logging.InternalLogger; import io.netty.logging.InternalLoggerFactory; diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java index 242b4f125d..f1ece13b70 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java @@ -59,7 +59,7 @@ import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.oneone.OneToOneEncoder; import io.netty.logging.InternalLogger; import io.netty.logging.InternalLoggerFactory; diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker00.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker00.java index d4d26e45a6..09b8a9d7af 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker00.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker00.java @@ -155,7 +155,7 @@ public class WebSocketClientHandshaker00 extends WebSocketClientHandshaker { ChannelFuture future = channel.write(request); - channel.getPipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket00FrameEncoder()); + channel.pipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket00FrameEncoder()); return future; } @@ -210,7 +210,7 @@ public class WebSocketClientHandshaker00 extends WebSocketClientHandshaker { String protocol = response.getHeader(Names.SEC_WEBSOCKET_PROTOCOL); setActualSubprotocol(protocol); - channel.getPipeline().replace(HttpResponseDecoder.class, "ws-decoder", new WebSocket00FrameDecoder()); + channel.pipeline().replace(HttpResponseDecoder.class, "ws-decoder", new WebSocket00FrameDecoder()); setHandshakeComplete(); } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker08.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker08.java index f9d122903a..1d82325be5 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker08.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker08.java @@ -136,7 +136,7 @@ public class WebSocketClientHandshaker08 extends WebSocketClientHandshaker { ChannelFuture future = channel.write(request); - channel.getPipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket08FrameEncoder(true)); + channel.pipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket08FrameEncoder(true)); return future; } @@ -186,7 +186,7 @@ public class WebSocketClientHandshaker08 extends WebSocketClientHandshaker { expectedChallengeResponseString)); } - channel.getPipeline().replace(HttpResponseDecoder.class, "ws-decoder", + channel.pipeline().replace(HttpResponseDecoder.class, "ws-decoder", new WebSocket08FrameDecoder(false, allowExtensions)); setHandshakeComplete(); diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker13.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker13.java index 19cfd1abbb..870068be06 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker13.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketClientHandshaker13.java @@ -136,7 +136,7 @@ public class WebSocketClientHandshaker13 extends WebSocketClientHandshaker { ChannelFuture future = channel.write(request); - channel.getPipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket13FrameEncoder(true)); + channel.pipeline().replace(HttpRequestEncoder.class, "ws-encoder", new WebSocket13FrameEncoder(true)); return future; } @@ -186,7 +186,7 @@ public class WebSocketClientHandshaker13 extends WebSocketClientHandshaker { expectedChallengeResponseString)); } - channel.getPipeline().replace(HttpResponseDecoder.class, "ws-decoder", + channel.pipeline().replace(HttpResponseDecoder.class, "ws-decoder", new WebSocket13FrameDecoder(false, allowExtensions)); setHandshakeComplete(); diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00.java index 4af7445fd5..6d3da03dc2 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00.java @@ -163,7 +163,7 @@ public class WebSocketServerHandshaker00 extends WebSocketServerHandshaker { } // Upgrade the connection and send the handshake response. - ChannelPipeline p = channel.getPipeline(); + ChannelPipeline p = channel.pipeline(); if (p.get(HttpChunkAggregator.class) != null) { p.remove(HttpChunkAggregator.class); } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08.java index 5fabceaf86..a9286374f8 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08.java @@ -137,7 +137,7 @@ public class WebSocketServerHandshaker08 extends WebSocketServerHandshaker { ChannelFuture future = channel.write(res); // Upgrade the connection and send the handshake response. - ChannelPipeline p = channel.getPipeline(); + ChannelPipeline p = channel.pipeline(); if (p.get(HttpChunkAggregator.class) != null) { p.remove(HttpChunkAggregator.class); } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13.java index f8debb39c9..52749657b2 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13.java @@ -138,7 +138,7 @@ public class WebSocketServerHandshaker13 extends WebSocketServerHandshaker { ChannelFuture future = channel.write(res); // Upgrade the connection and send the handshake response. - ChannelPipeline p = channel.getPipeline(); + ChannelPipeline p = channel.pipeline(); if (p.get(HttpChunkAggregator.class) != null) { p.remove(HttpChunkAggregator.class); } diff --git a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspMessageDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspMessageDecoder.java index bab1f73977..674e4d1744 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspMessageDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspMessageDecoder.java @@ -18,8 +18,8 @@ package io.netty.handler.codec.rtsp; import io.netty.buffer.ChannelBuffer; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.embedder.DecoderEmbedder; -import io.netty.handler.codec.frame.TooLongFrameException; import io.netty.handler.codec.http.HttpChunkAggregator; import io.netty.handler.codec.http.HttpMessage; import io.netty.handler.codec.http.HttpMessageDecoder; diff --git a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspRequestDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspRequestDecoder.java index 5514bd63f6..6007f5f1d0 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspRequestDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspRequestDecoder.java @@ -16,7 +16,7 @@ package io.netty.handler.codec.rtsp; import io.netty.buffer.ChannelBuffer; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.http.DefaultHttpRequest; import io.netty.handler.codec.http.HttpMessage; import io.netty.handler.codec.http.HttpRequest; diff --git a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspResponseDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspResponseDecoder.java index 246b842f94..012343bb3c 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspResponseDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/rtsp/RtspResponseDecoder.java @@ -16,7 +16,7 @@ package io.netty.handler.codec.rtsp; import io.netty.buffer.ChannelBuffer; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.http.DefaultHttpResponse; import io.netty.handler.codec.http.HttpMessage; import io.netty.handler.codec.http.HttpResponse; diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java index 0ee869b07c..a34e89c91d 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java @@ -19,7 +19,7 @@ import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.handler.codec.FrameDecoder; import static io.netty.handler.codec.spdy.SpdyCodecUtil.*; diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java index a16ab9fccd..7ceae7ff2c 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHttpDecoder.java @@ -24,7 +24,7 @@ import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.Channels; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.http.DefaultHttpRequest; import io.netty.handler.codec.http.DefaultHttpResponse; import io.netty.handler.codec.http.HttpHeaders; diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00Test.java b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00Test.java index 8e98282542..08dffd0999 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00Test.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker00Test.java @@ -55,7 +55,7 @@ public class WebSocketServerHandshaker00Test { Channel channelMock = EasyMock.createMock(Channel.class); DefaultChannelPipeline pipeline = createPipeline(); - EasyMock.expect(channelMock.getPipeline()).andReturn(pipeline); + EasyMock.expect(channelMock.pipeline()).andReturn(pipeline); // capture the http response in order to verify the headers Capture res = new Capture(); diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08Test.java b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08Test.java index 6ca8a495d1..b61afb3efc 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08Test.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker08Test.java @@ -51,7 +51,7 @@ public class WebSocketServerHandshaker08Test { Channel channelMock = EasyMock.createMock(Channel.class); DefaultChannelPipeline pipeline = createPipeline(); - EasyMock.expect(channelMock.getPipeline()).andReturn(pipeline); + EasyMock.expect(channelMock.pipeline()).andReturn(pipeline); // capture the http response in order to verify the headers Capture res = new Capture(); diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13Test.java b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13Test.java index 257e484fa5..b9168eb096 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13Test.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/WebSocketServerHandshaker13Test.java @@ -51,7 +51,7 @@ public class WebSocketServerHandshaker13Test { Channel channelMock = EasyMock.createMock(Channel.class); DefaultChannelPipeline pipeline = createPipeline(); - EasyMock.expect(channelMock.getPipeline()).andReturn(pipeline); + EasyMock.expect(channelMock.pipeline()).andReturn(pipeline); // capture the http response in order to verify the headers Capture res = new Capture(); diff --git a/codec-http/src/test/java/io/netty/handler/codec/spdy/AbstractSocketSpdyEchoTest.java b/codec-http/src/test/java/io/netty/handler/codec/spdy/AbstractSocketSpdyEchoTest.java index 971dcaedec..b956844a6d 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/spdy/AbstractSocketSpdyEchoTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/spdy/AbstractSocketSpdyEchoTest.java @@ -157,11 +157,11 @@ public abstract class AbstractSocketSpdyEchoTest { EchoHandler sh = new EchoHandler(true); EchoHandler ch = new EchoHandler(false); - sb.getPipeline().addLast("decoder", new SpdyFrameDecoder()); - sb.getPipeline().addLast("encoder", new SpdyFrameEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("decoder", new SpdyFrameDecoder()); + sb.pipeline().addLast("encoder", new SpdyFrameEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/codec/src/main/java/io/netty/handler/codec/frame/CorruptedFrameException.java b/codec/src/main/java/io/netty/handler/codec/CorruptedFrameException.java similarity index 92% rename from codec/src/main/java/io/netty/handler/codec/frame/CorruptedFrameException.java rename to codec/src/main/java/io/netty/handler/codec/CorruptedFrameException.java index cc6d96b0c4..38326d949f 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/CorruptedFrameException.java +++ b/codec/src/main/java/io/netty/handler/codec/CorruptedFrameException.java @@ -13,11 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; /** - * An {@link Exception} which is thrown when the received frame data can not - * be decoded by a {@link FrameDecoder} implementation. + * An {@link Exception} which is thrown when the received frame data could not be decoded by + * an inbound handler. + * * @apiviz.hidden */ public class CorruptedFrameException extends Exception { diff --git a/codec/src/main/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/DelimiterBasedFrameDecoder.java similarity index 96% rename from codec/src/main/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java rename to codec/src/main/java/io/netty/handler/codec/DelimiterBasedFrameDecoder.java index 202bc66957..636336b559 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/DelimiterBasedFrameDecoder.java @@ -13,12 +13,11 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; import io.netty.buffer.ChannelBuffer; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.Channels; +import io.netty.channel.ChannelInboundHandlerContext; /** * A decoder that splits the received {@link ChannelBuffer}s by one or more @@ -56,7 +55,7 @@ import io.netty.channel.Channels; * * @apiviz.uses io.netty.handler.codec.frame.Delimiters - - useful */ -public class DelimiterBasedFrameDecoder extends FrameDecoder { +public class DelimiterBasedFrameDecoder extends StreamToMessageDecoder { private final ChannelBuffer[] delimiters; private final int maxFrameLength; @@ -188,8 +187,7 @@ public class DelimiterBasedFrameDecoder extends FrameDecoder { } @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { + public ChannelBuffer decode(ChannelInboundHandlerContext ctx, ChannelBuffer buffer) throws Exception { // Try all delimiters and choose the delimiter which yields the shortest frame. int minFrameLength = Integer.MAX_VALUE; ChannelBuffer minDelim = null; @@ -256,14 +254,12 @@ public class DelimiterBasedFrameDecoder extends FrameDecoder { private void fail(ChannelHandlerContext ctx, long frameLength) { if (frameLength > 0) { - Channels.fireExceptionCaught( - ctx.channel(), + ctx.fireExceptionCaught( new TooLongFrameException( "frame length exceeds " + maxFrameLength + ": " + frameLength + " - discarded")); } else { - Channels.fireExceptionCaught( - ctx.channel(), + ctx.fireExceptionCaught( new TooLongFrameException( "frame length exceeds " + maxFrameLength + " - discarding")); diff --git a/codec/src/main/java/io/netty/handler/codec/frame/Delimiters.java b/codec/src/main/java/io/netty/handler/codec/Delimiters.java similarity index 97% rename from codec/src/main/java/io/netty/handler/codec/frame/Delimiters.java rename to codec/src/main/java/io/netty/handler/codec/Delimiters.java index 8ffc2a5255..5a692c15e8 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/Delimiters.java +++ b/codec/src/main/java/io/netty/handler/codec/Delimiters.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; diff --git a/codec/src/main/java/io/netty/handler/codec/frame/FixedLengthFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/FixedLengthFrameDecoder.java similarity index 72% rename from codec/src/main/java/io/netty/handler/codec/frame/FixedLengthFrameDecoder.java rename to codec/src/main/java/io/netty/handler/codec/FixedLengthFrameDecoder.java index 602b724238..a8eb60adfa 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/FixedLengthFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/FixedLengthFrameDecoder.java @@ -13,13 +13,13 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBufferFactory; import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelInboundHandlerContext; /** * A decoder that splits the received {@link ChannelBuffer}s by the fixed number @@ -37,7 +37,7 @@ import io.netty.channel.ChannelHandlerContext; * +-----+-----+-----+ * */ -public class FixedLengthFrameDecoder extends FrameDecoder { +public class FixedLengthFrameDecoder extends StreamToMessageDecoder { private final int frameLength; private final boolean allocateFullBuffer; @@ -63,25 +63,23 @@ public class FixedLengthFrameDecoder extends FrameDecoder { this.frameLength = frameLength; this.allocateFullBuffer = allocateFullBuffer; } - + @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { - if (buffer.readableBytes() < frameLength) { + public ChannelBufferHolder newInboundBuffer( + ChannelInboundHandlerContext ctx) throws Exception { + if (allocateFullBuffer) { + return ChannelBufferHolders.byteBuffer(ChannelBuffers.dynamicBuffer(frameLength)); + } else { + return super.newInboundBuffer(ctx); + } + } + + @Override + public ChannelBuffer decode(ChannelInboundHandlerContext ctx, ChannelBuffer in) throws Exception { + if (in.readableBytes() < frameLength) { return null; } else { - return buffer.readBytes(frameLength); + return in.readBytes(frameLength); } } - - @Override - protected ChannelBuffer newCumulationBuffer(ChannelHandlerContext ctx, int minimumCapacity) { - ChannelBufferFactory factory = ctx.channel().getConfig().getBufferFactory(); - if (allocateFullBuffer) { - return ChannelBuffers.dynamicBuffer( - factory.getDefaultOrder(), frameLength, ctx.channel().getConfig().getBufferFactory()); - } - return super.newCumulationBuffer(ctx, minimumCapacity); - } - } diff --git a/codec/src/main/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/LengthFieldBasedFrameDecoder.java similarity index 90% rename from codec/src/main/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java rename to codec/src/main/java/io/netty/handler/codec/LengthFieldBasedFrameDecoder.java index 38bf777fd9..b1a4c7cc58 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/LengthFieldBasedFrameDecoder.java @@ -13,13 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBufferFactory; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.Channels; +import io.netty.channel.ChannelInboundHandlerContext; import io.netty.handler.codec.serialization.ObjectDecoder; /** @@ -181,7 +180,7 @@ import io.netty.handler.codec.serialization.ObjectDecoder; * * @see LengthFieldPrepender */ -public class LengthFieldBasedFrameDecoder extends FrameDecoder { +public class LengthFieldBasedFrameDecoder extends StreamToMessageDecoder { private final int maxFrameLength; private final int lengthFieldOffset; @@ -309,55 +308,53 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { } @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { - + public ChannelBuffer decode(ChannelInboundHandlerContext ctx, ChannelBuffer in) throws Exception { if (discardingTooLongFrame) { long bytesToDiscard = this.bytesToDiscard; - int localBytesToDiscard = (int) Math.min(bytesToDiscard, buffer.readableBytes()); - buffer.skipBytes(localBytesToDiscard); + int localBytesToDiscard = (int) Math.min(bytesToDiscard, in.readableBytes()); + in.skipBytes(localBytesToDiscard); bytesToDiscard -= localBytesToDiscard; this.bytesToDiscard = bytesToDiscard; failIfNecessary(ctx, false); return null; } - if (buffer.readableBytes() < lengthFieldEndOffset) { + if (in.readableBytes() < lengthFieldEndOffset) { return null; } - int actualLengthFieldOffset = buffer.readerIndex() + lengthFieldOffset; + int actualLengthFieldOffset = in.readerIndex() + lengthFieldOffset; long frameLength; switch (lengthFieldLength) { case 1: - frameLength = buffer.getUnsignedByte(actualLengthFieldOffset); + frameLength = in.getUnsignedByte(actualLengthFieldOffset); break; case 2: - frameLength = buffer.getUnsignedShort(actualLengthFieldOffset); + frameLength = in.getUnsignedShort(actualLengthFieldOffset); break; case 3: - frameLength = buffer.getUnsignedMedium(actualLengthFieldOffset); + frameLength = in.getUnsignedMedium(actualLengthFieldOffset); break; case 4: - frameLength = buffer.getUnsignedInt(actualLengthFieldOffset); + frameLength = in.getUnsignedInt(actualLengthFieldOffset); break; case 8: - frameLength = buffer.getLong(actualLengthFieldOffset); + frameLength = in.getLong(actualLengthFieldOffset); break; default: throw new Error("should not reach here"); } if (frameLength < 0) { - buffer.skipBytes(lengthFieldEndOffset); + in.skipBytes(lengthFieldEndOffset); throw new CorruptedFrameException( "negative pre-adjustment length field: " + frameLength); } frameLength += lengthAdjustment + lengthFieldEndOffset; - + if (frameLength < lengthFieldEndOffset) { - buffer.skipBytes(lengthFieldEndOffset); + in.skipBytes(lengthFieldEndOffset); throw new CorruptedFrameException( "Adjusted frame length (" + frameLength + ") is less " + "than lengthFieldEndOffset: " + lengthFieldEndOffset); @@ -367,31 +364,31 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { // Enter the discard mode and discard everything received so far. discardingTooLongFrame = true; tooLongFrameLength = frameLength; - bytesToDiscard = frameLength - buffer.readableBytes(); - buffer.skipBytes(buffer.readableBytes()); + bytesToDiscard = frameLength - in.readableBytes(); + in.skipBytes(in.readableBytes()); failIfNecessary(ctx, true); return null; } // never overflows because it's less than maxFrameLength int frameLengthInt = (int) frameLength; - if (buffer.readableBytes() < frameLengthInt) { + if (in.readableBytes() < frameLengthInt) { return null; } if (initialBytesToStrip > frameLengthInt) { - buffer.skipBytes(frameLengthInt); + in.skipBytes(frameLengthInt); throw new CorruptedFrameException( "Adjusted frame length (" + frameLength + ") is less " + "than initialBytesToStrip: " + initialBytesToStrip); } - buffer.skipBytes(initialBytesToStrip); + in.skipBytes(initialBytesToStrip); // extract frame - int readerIndex = buffer.readerIndex(); + int readerIndex = in.readerIndex(); int actualFrameLength = frameLengthInt - initialBytesToStrip; - ChannelBuffer frame = extractFrame(buffer, readerIndex, actualFrameLength); - buffer.readerIndex(readerIndex + actualFrameLength); + ChannelBuffer frame = extractFrame(in, readerIndex, actualFrameLength); + in.readerIndex(readerIndex + actualFrameLength); return frame; } @@ -402,14 +399,14 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { long tooLongFrameLength = this.tooLongFrameLength; this.tooLongFrameLength = 0; discardingTooLongFrame = false; - if ((!failFast) || - (failFast && firstDetectionOfTooLongFrame)) { + if (!failFast || + failFast && firstDetectionOfTooLongFrame) { fail(ctx, tooLongFrameLength); } } else { // Keep discarding and notify handlers if necessary. if (failFast && firstDetectionOfTooLongFrame) { - fail(ctx, this.tooLongFrameLength); + fail(ctx, tooLongFrameLength); } } @@ -417,13 +414,13 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { /** * Extract the sub-region of the specified buffer. This method is called by - * {@link #decode(ChannelHandlerContext, Channel, ChannelBuffer)} for each + * {@link #decode(ChannelInboundHandlerContext, ChannelBuffer)} for each * frame. The default implementation returns a copy of the sub-region. * For example, you could override this method to use an alternative * {@link ChannelBufferFactory}. *

* If you are sure that the frame and its content are not accessed after - * the current {@link #decode(ChannelHandlerContext, Channel, ChannelBuffer)} + * the current {@link #decode(ChannelInboundHandlerContext, ChannelBuffer)} * call returns, you can even avoid memory copy by returning the sliced * sub-region (i.e. return buffer.slice(index, length)). * It's often useful when you convert the extracted frame into an object. @@ -438,14 +435,12 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { private void fail(ChannelHandlerContext ctx, long frameLength) { if (frameLength > 0) { - Channels.fireExceptionCaught( - ctx.channel(), + ctx.fireExceptionCaught( new TooLongFrameException( "Adjusted frame length exceeds " + maxFrameLength + ": " + frameLength + " - discarded")); } else { - Channels.fireExceptionCaught( - ctx.channel(), + ctx.fireExceptionCaught( new TooLongFrameException( "Adjusted frame length exceeds " + maxFrameLength + " - discarding")); diff --git a/codec/src/main/java/io/netty/handler/codec/frame/LengthFieldPrepender.java b/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java similarity index 81% rename from codec/src/main/java/io/netty/handler/codec/frame/LengthFieldPrepender.java rename to codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java index 55c0c9e391..8addc5a0b7 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/LengthFieldPrepender.java +++ b/codec/src/main/java/io/netty/handler/codec/LengthFieldPrepender.java @@ -13,18 +13,14 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; - -import static io.netty.buffer.ChannelBuffers.*; - -import java.nio.ByteOrder; +package io.netty.handler.codec; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBufferFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.oneone.OneToOneEncoder; +import io.netty.channel.ChannelOutboundHandlerContext; + +import java.nio.ByteOrder; /** * An encoder that prepends the length of the message. The length value is @@ -55,7 +51,7 @@ import io.netty.handler.codec.oneone.OneToOneEncoder; * */ @Sharable -public class LengthFieldPrepender extends OneToOneEncoder { +public class LengthFieldPrepender extends MessageToStreamEncoder { private final int lengthFieldLength; private final boolean lengthIncludesLengthFieldLength; @@ -101,48 +97,44 @@ public class LengthFieldPrepender extends OneToOneEncoder { } @Override - protected Object encode( - ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer)) { - return msg; - } - - ChannelBuffer body = (ChannelBuffer) msg; - ChannelBuffer header = channel.getConfig().getBufferFactory().getBuffer(body.order(), lengthFieldLength); + public void encode( + ChannelOutboundHandlerContext ctx, + ChannelBuffer msg, ChannelBuffer out) throws Exception { int length = lengthIncludesLengthFieldLength? - body.readableBytes() + lengthFieldLength : body.readableBytes(); + msg.readableBytes() + lengthFieldLength : msg.readableBytes(); switch (lengthFieldLength) { case 1: if (length >= 256) { throw new IllegalArgumentException( "length does not fit into a byte: " + length); } - header.writeByte((byte) length); + out.writeByte((byte) length); break; case 2: if (length >= 65536) { throw new IllegalArgumentException( "length does not fit into a short integer: " + length); } - header.writeShort((short) length); + out.writeShort((short) length); break; case 3: if (length >= 16777216) { throw new IllegalArgumentException( "length does not fit into a medium integer: " + length); } - header.writeMedium(length); + out.writeMedium(length); break; case 4: - header.writeInt(length); + out.writeInt(length); break; case 8: - header.writeLong(length); + out.writeLong(length); break; default: throw new Error("should not reach here"); } - return wrappedBuffer(header, body); + + out.writeBytes(msg, msg.readerIndex(), msg.readableBytes()); } } diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java new file mode 100644 index 0000000000..f09122ed68 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java @@ -0,0 +1,51 @@ +package io.netty.handler.codec; + +import static io.netty.handler.codec.MessageToMessageEncoder.*; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInboundHandlerContext; + +import java.util.Queue; + +public abstract class MessageToMessageDecoder extends ChannelInboundHandlerAdapter { + + @Override + public ChannelBufferHolder newInboundBuffer( + ChannelInboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.messageBuffer(); + } + + @Override + public void inboundBufferUpdated(ChannelInboundHandlerContext ctx) + throws Exception { + Queue in = ctx.in().messageBuffer(); + boolean decoded = false; + for (;;) { + try { + I msg = in.poll(); + if (msg == null) { + break; + } + + O emsg = decode(ctx, msg); + if (emsg == null) { + throw new IllegalArgumentException( + "decode() returned null. unsupported message type? " + + msg.getClass().getName()); + } + + if (unfoldAndAdd(ctx, ctx.nextIn(), emsg)) { + decoded = true; + } + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + } + if (decoded) { + ctx.fireInboundBufferUpdated(); + } + } + + public abstract O decode(ChannelInboundHandlerContext ctx, I msg) throws Exception; +} diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java new file mode 100644 index 0000000000..0554a88733 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java @@ -0,0 +1,109 @@ +package io.netty.handler.codec; + +import io.netty.buffer.ChannelBuffer; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelOutboundHandlerContext; + +import java.util.Queue; + +public abstract class MessageToMessageEncoder extends ChannelOutboundHandlerAdapter { + + @Override + public ChannelBufferHolder newOutboundBuffer( + ChannelOutboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.messageBuffer(); + } + + @Override + public void flush(ChannelOutboundHandlerContext ctx, ChannelFuture future) throws Exception { + Queue in = ctx.prevOut().messageBuffer(); + boolean encoded = false; + for (;;) { + try { + I msg = in.poll(); + if (msg == null) { + break; + } + + O emsg = encode(ctx, msg); + if (emsg == null) { + throw new IllegalArgumentException( + "encode() returned null. unsupported message type? " + + msg.getClass().getName()); + } + + if (unfoldAndAdd(ctx, ctx.out(), emsg)) { + encoded = true; + } + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + } + + if (encoded) { + ctx.flush(future); + } + } + + public abstract O encode(ChannelOutboundHandlerContext ctx, I msg) throws Exception; + + static boolean unfoldAndAdd( + ChannelHandlerContext ctx, ChannelBufferHolder dst, Object msg) throws Exception { + if (msg == null) { + return false; + } + + if (msg instanceof Object[]) { + Object[] array = (Object[]) msg; + if (array.length == 0) { + return false; + } + + boolean added = false; + for (Object m: array) { + if (m == null) { + break; + } + if (unfoldAndAdd(ctx, dst, m)) { + added = true; + } + } + return added; + } + + if (msg instanceof Iterable) { + boolean added = false; + @SuppressWarnings("unchecked") + Iterable i = (Iterable) msg; + for (Object m: i) { + if (m == null) { + break; + } + if (unfoldAndAdd(ctx, dst, m)) { + added = true; + } + } + return added; + } + + if (dst.hasMessageBuffer()) { + dst.messageBuffer().add(msg); + } else if (msg instanceof ChannelBuffer) { + ChannelBuffer buf = (ChannelBuffer) msg; + if (!buf.readable()) { + return false; + } + dst.byteBuffer().writeBytes(buf, buf.readerIndex(), buf.readableBytes()); + } else { + throw new IllegalArgumentException( + "message cannot be written to byte buffer if it is not " + + ChannelBuffer.class.getSimpleName() + '.'); + } + + return true; + } +} diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToStreamEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToStreamEncoder.java new file mode 100644 index 0000000000..5d1b2503cd --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/MessageToStreamEncoder.java @@ -0,0 +1,45 @@ +package io.netty.handler.codec; + +import io.netty.buffer.ChannelBuffer; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelOutboundHandlerContext; + +import java.util.Queue; + +public abstract class MessageToStreamEncoder extends ChannelOutboundHandlerAdapter { + + @Override + public ChannelBufferHolder newOutboundBuffer( + ChannelOutboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.messageBuffer(); + } + + @Override + public void flush(ChannelOutboundHandlerContext ctx, ChannelFuture future) throws Exception { + Queue in = ctx.prevOut().messageBuffer(); + ChannelBuffer out = ctx.out().byteBuffer(); + + int oldOutSize = out.readableBytes(); + for (;;) { + I msg = in.poll(); + if (msg == null) { + break; + } + + try { + encode(ctx, msg, out); + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + } + + if (out.readableBytes() > oldOutSize) { + ctx.flush(future); + } + } + + public abstract void encode(ChannelOutboundHandlerContext ctx, I msg, ChannelBuffer out) throws Exception; +} diff --git a/codec/src/main/java/io/netty/handler/codec/StreamToMessageDecoder.java b/codec/src/main/java/io/netty/handler/codec/StreamToMessageDecoder.java new file mode 100644 index 0000000000..06ec9c3da7 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/StreamToMessageDecoder.java @@ -0,0 +1,69 @@ +package io.netty.handler.codec; + +import static io.netty.handler.codec.MessageToMessageEncoder.*; +import io.netty.buffer.ChannelBuffer; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInboundHandlerContext; + +public abstract class StreamToMessageDecoder extends ChannelInboundHandlerAdapter { + + @Override + public ChannelBufferHolder newInboundBuffer( + ChannelInboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.byteBuffer(); + } + + @Override + public void inboundBufferUpdated(ChannelInboundHandlerContext ctx) throws Exception { + callDecode(ctx); + } + + @Override + public void channelInactive(ChannelInboundHandlerContext ctx) throws Exception { + ChannelBuffer in = ctx.in().byteBuffer(); + if (!in.readable()) { + callDecode(ctx); + } + + try { + if (unfoldAndAdd(ctx, ctx.nextIn(), decodeLast(ctx, in))) { + in.discardReadBytes(); + ctx.fireInboundBufferUpdated(); + } + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + + ctx.fireChannelInactive(); + } + + private void callDecode(ChannelInboundHandlerContext ctx) { + ChannelBuffer in = ctx.in().byteBuffer(); + + boolean decoded = false; + for (;;) { + try { + if (unfoldAndAdd(ctx, ctx.nextIn(), decode(ctx, in))) { + decoded = true; + } else { + break; + } + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + } + + if (decoded) { + in.discardReadBytes(); + ctx.fireInboundBufferUpdated(); + } + } + + public abstract O decode(ChannelInboundHandlerContext ctx, ChannelBuffer in) throws Exception; + + public O decodeLast(ChannelInboundHandlerContext ctx, ChannelBuffer in) throws Exception { + return decode(ctx, in); + } +} diff --git a/codec/src/main/java/io/netty/handler/codec/StreamToStreamDecoder.java b/codec/src/main/java/io/netty/handler/codec/StreamToStreamDecoder.java new file mode 100644 index 0000000000..9e2fbf3979 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/StreamToStreamDecoder.java @@ -0,0 +1,73 @@ +package io.netty.handler.codec; + +import io.netty.buffer.ChannelBuffer; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInboundHandlerContext; + +public abstract class StreamToStreamDecoder extends ChannelInboundHandlerAdapter { + + @Override + public ChannelBufferHolder newInboundBuffer( + ChannelInboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.byteBuffer(); + } + + @Override + public void inboundBufferUpdated(ChannelInboundHandlerContext ctx) throws Exception { + callDecode(ctx); + } + + @Override + public void channelInactive(ChannelInboundHandlerContext ctx) throws Exception { + ChannelBuffer in = ctx.in().byteBuffer(); + if (!in.readable()) { + callDecode(ctx); + } + + ChannelBuffer out = ctx.nextIn().byteBuffer(); + int oldOutSize = out.readableBytes(); + try { + decodeLast(ctx, in, out); + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + + if (out.readableBytes() > oldOutSize) { + in.discardReadBytes(); + ctx.fireInboundBufferUpdated(); + } + + ctx.fireChannelInactive(); + } + + private void callDecode(ChannelInboundHandlerContext ctx) { + ChannelBuffer in = ctx.in().byteBuffer(); + ChannelBuffer out = ctx.nextIn().byteBuffer(); + + int oldOutSize = out.readableBytes(); + while (in.readable()) { + int oldInSize = in.readableBytes(); + try { + decode(ctx, in, out); + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + if (oldInSize == in.readableBytes()) { + break; + } + } + + if (out.readableBytes() > oldOutSize) { + in.discardReadBytes(); + ctx.fireInboundBufferUpdated(); + } + } + + public abstract void decode(ChannelInboundHandlerContext ctx, ChannelBuffer in, ChannelBuffer out) throws Exception; + + public void decodeLast(ChannelInboundHandlerContext ctx, ChannelBuffer in, ChannelBuffer out) throws Exception { + decode(ctx, in, out); + } +} diff --git a/codec/src/main/java/io/netty/handler/codec/StreamToStreamEncoder.java b/codec/src/main/java/io/netty/handler/codec/StreamToStreamEncoder.java new file mode 100644 index 0000000000..906a314217 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/StreamToStreamEncoder.java @@ -0,0 +1,43 @@ +package io.netty.handler.codec; + +import io.netty.buffer.ChannelBuffer; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelOutboundHandlerContext; + +public abstract class StreamToStreamEncoder extends ChannelOutboundHandlerAdapter { + + @Override + public ChannelBufferHolder newOutboundBuffer( + ChannelOutboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.byteBuffer(); + } + + @Override + public void flush(ChannelOutboundHandlerContext ctx, ChannelFuture future) throws Exception { + ChannelBuffer in = ctx.prevOut().byteBuffer(); + ChannelBuffer out = ctx.out().byteBuffer(); + + int oldOutSize = out.readableBytes(); + while (in.readable()) { + int oldInSize = in.readableBytes(); + try { + encode(ctx, in, out); + } catch (Throwable t) { + ctx.fireExceptionCaught(t); + } + if (oldInSize == in.readableBytes()) { + break; + } + } + + if (out.readableBytes() > oldOutSize) { + in.discardReadBytes(); + ctx.flush(future); + } + } + + public abstract void encode(ChannelOutboundHandlerContext ctx, ChannelBuffer in, ChannelBuffer out) throws Exception; +} diff --git a/codec/src/main/java/io/netty/handler/codec/frame/TooLongFrameException.java b/codec/src/main/java/io/netty/handler/codec/TooLongFrameException.java similarity index 97% rename from codec/src/main/java/io/netty/handler/codec/frame/TooLongFrameException.java rename to codec/src/main/java/io/netty/handler/codec/TooLongFrameException.java index c1e7c6e644..70412aac6f 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/TooLongFrameException.java +++ b/codec/src/main/java/io/netty/handler/codec/TooLongFrameException.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; /** * An {@link Exception} which is thrown when the length of the frame diff --git a/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java b/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java index 523cfbb6d9..f82ef1dfb1 100644 --- a/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java +++ b/codec/src/main/java/io/netty/handler/codec/base64/Base64Decoder.java @@ -16,21 +16,18 @@ package io.netty.handler.codec.base64; import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; -import io.netty.handler.codec.frame.FrameDecoder; -import io.netty.handler.codec.oneone.OneToOneDecoder; -import io.netty.util.CharsetUtil; +import io.netty.channel.ChannelInboundHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; +import io.netty.handler.codec.MessageToMessageDecoder; +import io.netty.handler.codec.StreamToMessageDecoder; /** * Decodes a Base64-encoded {@link ChannelBuffer} or US-ASCII {@link String} * into a {@link ChannelBuffer}. Please note that this decoder must be used - * with a proper {@link FrameDecoder} such as {@link DelimiterBasedFrameDecoder} + * with a proper {@link StreamToMessageDecoder} such as {@link DelimiterBasedFrameDecoder} * if you are using a stream-based transport such as TCP/IP. A typical decoder * setup for TCP/IP would be: *
@@ -47,7 +44,7 @@ import io.netty.util.CharsetUtil;
  * @apiviz.uses io.netty.handler.codec.base64.Base64
  */
 @Sharable
-public class Base64Decoder extends OneToOneDecoder {
+public class Base64Decoder extends MessageToMessageDecoder {
 
     private final Base64Dialect dialect;
 
@@ -63,17 +60,7 @@ public class Base64Decoder extends OneToOneDecoder {
     }
 
     @Override
-    protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg)
-            throws Exception {
-        if (msg instanceof String) {
-            msg = ChannelBuffers.copiedBuffer((String) msg, CharsetUtil.US_ASCII);
-        } else if (!(msg instanceof ChannelBuffer)) {
-            return msg;
-        }
-
-        ChannelBuffer src = (ChannelBuffer) msg;
-        return Base64.decode(
-                src, src.readerIndex(), src.readableBytes(), dialect);
+    public ChannelBuffer decode(ChannelInboundHandlerContext ctx, ChannelBuffer msg) throws Exception {
+        return Base64.decode(msg, msg.readerIndex(), msg.readableBytes(), dialect);
     }
-
 }
diff --git a/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java b/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java
index b53917897a..13988041d6 100644
--- a/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java
+++ b/codec/src/main/java/io/netty/handler/codec/base64/Base64Encoder.java
@@ -16,13 +16,12 @@
 package io.netty.handler.codec.base64;
 
 import io.netty.buffer.ChannelBuffer;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelPipeline;
 import io.netty.channel.ChannelHandler.Sharable;
-import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
-import io.netty.handler.codec.frame.Delimiters;
-import io.netty.handler.codec.oneone.OneToOneEncoder;
+import io.netty.channel.ChannelOutboundHandlerContext;
+import io.netty.channel.ChannelPipeline;
+import io.netty.handler.codec.DelimiterBasedFrameDecoder;
+import io.netty.handler.codec.Delimiters;
+import io.netty.handler.codec.MessageToMessageEncoder;
 
 /**
  * Encodes a {@link ChannelBuffer} into a Base64-encoded {@link ChannelBuffer}.
@@ -41,7 +40,7 @@ import io.netty.handler.codec.oneone.OneToOneEncoder;
  * @apiviz.uses io.netty.handler.codec.base64.Base64
  */
 @Sharable
-public class Base64Encoder extends OneToOneEncoder {
+public class Base64Encoder extends MessageToMessageEncoder {
 
     private final boolean breakLines;
     private final Base64Dialect dialect;
@@ -64,15 +63,8 @@ public class Base64Encoder extends OneToOneEncoder {
     }
 
     @Override
-    protected Object encode(ChannelHandlerContext ctx, Channel channel,
-            Object msg) throws Exception {
-        if (!(msg instanceof ChannelBuffer)) {
-            return msg;
-        }
-
-        ChannelBuffer src = (ChannelBuffer) msg;
-        return Base64.encode(
-                src, src.readerIndex(), src.readableBytes(),
-                breakLines, dialect);
+    public ChannelBuffer encode(ChannelOutboundHandlerContext ctx,
+            ChannelBuffer msg) throws Exception {
+        return Base64.encode(msg, msg.readerIndex(), msg.readableBytes(), breakLines, dialect);
     }
 }
diff --git a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java
index c8ef66f2c4..0e99f3772e 100644
--- a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java
+++ b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayDecoder.java
@@ -16,13 +16,12 @@
 package io.netty.handler.codec.bytes;
 
 import io.netty.buffer.ChannelBuffer;
-import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerContext;
 import io.netty.channel.ChannelPipeline;
-import io.netty.channel.MessageEvent;
-import io.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;
-import io.netty.handler.codec.frame.LengthFieldPrepender;
-import io.netty.handler.codec.oneone.OneToOneDecoder;
+import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
+import io.netty.handler.codec.LengthFieldPrepender;
+import io.netty.handler.codec.MessageToMessageDecoder;
 
 /**
  * Decodes a received {@link ChannelBuffer} into an array of bytes.
@@ -49,31 +48,26 @@ import io.netty.handler.codec.oneone.OneToOneDecoder;
  * }
  * 
*/ -public class ByteArrayDecoder extends OneToOneDecoder { +public class ByteArrayDecoder extends MessageToMessageDecoder { @Override - protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer)) { - return msg; - } - ChannelBuffer buf = (ChannelBuffer) msg; + public byte[] decode(ChannelInboundHandlerContext ctx, ChannelBuffer msg) throws Exception { byte[] array; - if (buf.hasArray()) { - if (buf.arrayOffset() == 0 && buf.readableBytes() == buf.capacity()) { + if (msg.hasArray()) { + if (msg.arrayOffset() == 0 && msg.readableBytes() == msg.capacity()) { // we have no offset and the length is the same as the capacity. Its safe to reuse the array without copy it first - array = buf.array(); + array = msg.array(); } else { // copy the ChannelBuffer to a byte array - array = new byte[buf.readableBytes()]; - buf.getBytes(0, array); + array = new byte[msg.readableBytes()]; + msg.getBytes(0, array); } } else { // copy the ChannelBuffer to a byte array - - array = new byte[buf.readableBytes()]; - buf.getBytes(0, array); + array = new byte[msg.readableBytes()]; + msg.getBytes(0, array); } + return array; } - } diff --git a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java index 819ba39f7d..4998642370 100644 --- a/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/bytes/ByteArrayEncoder.java @@ -15,16 +15,16 @@ */ package io.netty.handler.codec.bytes; -import static io.netty.buffer.ChannelBuffers.wrappedBuffer; - import io.netty.buffer.ChannelBuffer; -import io.netty.channel.Channel; +import io.netty.buffer.ChannelBuffers; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.channel.MessageEvent; -import io.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.frame.LengthFieldPrepender; -import io.netty.handler.codec.oneone.OneToOneEncoder; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.MessageToMessageEncoder; /** * Encodes the requested array of bytes into a {@link ChannelBuffer}. @@ -51,14 +51,15 @@ import io.netty.handler.codec.oneone.OneToOneEncoder; * } * */ -public class ByteArrayEncoder extends OneToOneEncoder { +public class ByteArrayEncoder extends MessageToMessageEncoder { @Override - protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof byte[])) { - return msg; - } - return wrappedBuffer((byte[]) msg); + public ChannelBufferHolder newOutboundBuffer(ChannelOutboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.messageBuffer(); } + @Override + public ChannelBuffer encode(ChannelOutboundHandlerContext ctx, byte[] msg) throws Exception { + return ChannelBuffers.wrappedBuffer(msg); + } } diff --git a/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java b/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java index b3ae3c4a8c..14b56b201d 100644 --- a/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java @@ -16,10 +16,8 @@ package io.netty.handler.codec.compression; import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.oneone.OneToOneDecoder; +import io.netty.channel.ChannelInboundHandlerContext; +import io.netty.handler.codec.StreamToStreamDecoder; import io.netty.util.internal.jzlib.JZlib; import io.netty.util.internal.jzlib.ZStream; @@ -29,7 +27,7 @@ import io.netty.util.internal.jzlib.ZStream; * @apiviz.landmark * @apiviz.has io.netty.handler.codec.compression.ZlibWrapper */ -public class ZlibDecoder extends OneToOneDecoder { +public class ZlibDecoder extends StreamToStreamDecoder { private final ZStream z = new ZStream(); private byte[] dictionary; @@ -93,39 +91,62 @@ public class ZlibDecoder extends OneToOneDecoder { } @Override - protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer) || finished) { - return msg; - } + public void decode( + ChannelInboundHandlerContext ctx, + ChannelBuffer in, ChannelBuffer out) throws Exception { synchronized (z) { try { // Configure input. - ChannelBuffer compressed = (ChannelBuffer) msg; - byte[] in = new byte[compressed.readableBytes()]; - compressed.readBytes(in); - z.next_in = in; - z.next_in_index = 0; - z.avail_in = in.length; + int inputLength = in.readableBytes(); + boolean inHasArray = in.hasArray(); + z.avail_in = inputLength; + if (inHasArray) { + z.next_in = in.array(); + z.next_in_index = in.arrayOffset() + in.readerIndex(); + } else { + byte[] array = new byte[inputLength]; + in.readBytes(array); + z.next_in = array; + z.next_in_index = 0; + } + int oldNextInIndex = z.next_in_index; // Configure output. - byte[] out = new byte[in.length << 1]; - ChannelBuffer decompressed = ChannelBuffers.dynamicBuffer( - compressed.order(), out.length, - ctx.channel().getConfig().getBufferFactory()); - z.next_out = out; - z.next_out_index = 0; - z.avail_out = out.length; - + int maxOutputLength = inputLength << 1; + boolean outHasArray = out.hasArray(); + if (!outHasArray) { + z.next_out = new byte[maxOutputLength]; + } loop: for (;;) { - // Decompress 'in' into 'out' - int resultCode = z.inflate(JZlib.Z_SYNC_FLUSH); - if (z.next_out_index > 0) { - decompressed.writeBytes(out, 0, z.next_out_index); - z.avail_out = out.length; + z.avail_out = maxOutputLength; + if (outHasArray) { + out.ensureWritableBytes(maxOutputLength); + z.next_out = out.array(); + z.next_out_index = out.arrayOffset() + out.writerIndex(); + } else { + z.next_out_index = 0; + } + int oldNextOutIndex = z.next_out_index; + + // Decompress 'in' into 'out' + int resultCode; + try { + resultCode = z.inflate(JZlib.Z_SYNC_FLUSH); + } finally { + if (inHasArray) { + in.skipBytes(z.next_in_index - oldNextInIndex); + } + } + int outputLength = z.next_out_index - oldNextOutIndex; + if (outputLength > 0) { + if (outHasArray) { + out.writerIndex(out.writerIndex() + outputLength); + } else { + out.writeBytes(z.next_out, 0, outputLength); + } } - z.next_out_index = 0; switch (resultCode) { case JZlib.Z_NEED_DICT: @@ -153,12 +174,6 @@ public class ZlibDecoder extends OneToOneDecoder { ZlibUtil.fail(z, "decompression failure", resultCode); } } - - if (decompressed.writerIndex() != 0) { // readerIndex is always 0 - return decompressed; - } else { - return null; - } } finally { // Deference the external references explicitly to tell the VM that // the allocated byte arrays are temporary so that the call stack diff --git a/codec/src/main/java/io/netty/handler/codec/compression/ZlibEncoder.java b/codec/src/main/java/io/netty/handler/codec/compression/ZlibEncoder.java index 395aa343d9..8d3b34aca7 100644 --- a/codec/src/main/java/io/netty/handler/codec/compression/ZlibEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/compression/ZlibEncoder.java @@ -15,29 +15,25 @@ */ package io.netty.handler.codec.compression; -import java.util.concurrent.atomic.AtomicBoolean; - import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelEvent; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelStateEvent; -import io.netty.channel.Channels; -import io.netty.channel.LifeCycleAwareChannelHandler; -import io.netty.handler.codec.oneone.OneToOneEncoder; +import io.netty.channel.ChannelOutboundHandlerContext; +import io.netty.handler.codec.StreamToStreamEncoder; import io.netty.util.internal.jzlib.JZlib; import io.netty.util.internal.jzlib.ZStream; +import java.util.concurrent.atomic.AtomicBoolean; + /** * Compresses a {@link ChannelBuffer} using the deflate algorithm. * @apiviz.landmark * @apiviz.has io.netty.handler.codec.compression.ZlibWrapper */ -public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChannelHandler { +public class ZlibEncoder extends StreamToStreamEncoder { private static final byte[] EMPTY_ARRAY = new byte[0]; @@ -247,11 +243,19 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne } public ChannelFuture close() { + return close(ctx().channel().newFuture()); + } + + public ChannelFuture close(ChannelFuture future) { + return finishEncode(ctx(), future); + } + + private ChannelHandlerContext ctx() { ChannelHandlerContext ctx = this.ctx; if (ctx == null) { throw new IllegalStateException("not added to a pipeline"); } - return finishEncode(ctx, null); + return ctx; } public boolean isClosed() { @@ -259,39 +263,65 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne } @Override - protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer) || finished.get()) { - return msg; + public void encode(ChannelOutboundHandlerContext ctx, + ChannelBuffer in, ChannelBuffer out) throws Exception { + if (finished.get()) { + return; } - ChannelBuffer result; synchronized (z) { try { // Configure input. - ChannelBuffer uncompressed = (ChannelBuffer) msg; - byte[] in = new byte[uncompressed.readableBytes()]; - uncompressed.readBytes(in); - z.next_in = in; - z.next_in_index = 0; - z.avail_in = in.length; + int inputLength = in.readableBytes(); + boolean inHasArray = in.hasArray(); + z.avail_in = inputLength; + if (inHasArray) { + z.next_in = in.array(); + z.next_in_index = in.arrayOffset() + in.readerIndex(); + } else { + byte[] array = new byte[inputLength]; + in.readBytes(array); + z.next_in = array; + z.next_in_index = 0; + } + int oldNextInIndex = z.next_in_index; // Configure output. - byte[] out = new byte[(int) Math.ceil(in.length * 1.001) + 12]; - z.next_out = out; - z.next_out_index = 0; - z.avail_out = out.length; + int maxOutputLength = (int) Math.ceil(inputLength * 1.001) + 12; + boolean outHasArray = out.hasArray(); + z.avail_out = maxOutputLength; + if (outHasArray) { + out.ensureWritableBytes(maxOutputLength); + z.next_out = out.array(); + z.next_out_index = out.arrayOffset() + out.writerIndex(); + } else { + byte[] array = new byte[maxOutputLength]; + z.next_out = array; + z.next_out_index = 0; + } + int oldNextOutIndex = z.next_out_index; // Note that Z_PARTIAL_FLUSH has been deprecated. - int resultCode = z.deflate(JZlib.Z_SYNC_FLUSH); + int resultCode; + try { + resultCode = z.deflate(JZlib.Z_SYNC_FLUSH); + } finally { + if (inHasArray) { + in.skipBytes(z.next_in_index - oldNextInIndex); + } + } + if (resultCode != JZlib.Z_OK) { ZlibUtil.fail(z, "compression failure", resultCode); } - if (z.next_out_index != 0) { - result = ctx.channel().getConfig().getBufferFactory().getBuffer( - uncompressed.order(), out, 0, z.next_out_index); - } else { - result = ChannelBuffers.EMPTY_BUFFER; + int outputLength = z.next_out_index - oldNextOutIndex; + if (outputLength > 0) { + if (outHasArray) { + out.writerIndex(out.writerIndex() + outputLength); + } else { + out.writeBytes(z.next_out, 0, outputLength); + } } } finally { // Deference the external references explicitly to tell the VM that @@ -302,39 +332,39 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne z.next_out = null; } } - - return result; } @Override - public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent evt) - throws Exception { - if (evt instanceof ChannelStateEvent) { - ChannelStateEvent e = (ChannelStateEvent) evt; - switch (e.getState()) { - case OPEN: - case CONNECTED: - case BOUND: - if (Boolean.FALSE.equals(e.getValue()) || e.getValue() == null) { - finishEncode(ctx, evt); - return; - } + public void disconnect( + final ChannelOutboundHandlerContext ctx, + final ChannelFuture future) throws Exception { + finishEncode(ctx, ctx.newFuture()).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture f) throws Exception { + ctx.disconnect(future); } - } - - super.handleDownstream(ctx, evt); + }); } - private ChannelFuture finishEncode(final ChannelHandlerContext ctx, final ChannelEvent evt) { - if (!finished.compareAndSet(false, true)) { - if (evt != null) { - ctx.sendDownstream(evt); + @Override + public void close( + final ChannelOutboundHandlerContext ctx, + final ChannelFuture future) throws Exception { + finishEncode(ctx, ctx.newFuture()).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture f) throws Exception { + ctx.close(future); } - return Channels.succeededFuture(ctx.channel()); + }); + } + + private ChannelFuture finishEncode(ChannelHandlerContext ctx, ChannelFuture future) { + if (!finished.compareAndSet(false, true)) { + future.setSuccess(); + return future; } ChannelBuffer footer; - ChannelFuture future; synchronized (z) { try { // Configure input. @@ -351,20 +381,11 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne // Write the ADLER32 checksum (stream footer). int resultCode = z.deflate(JZlib.Z_FINISH); if (resultCode != JZlib.Z_OK && resultCode != JZlib.Z_STREAM_END) { - future = Channels.failedFuture( - ctx.channel(), - ZlibUtil.exception(z, "compression failure", resultCode)); - footer = null; + future.setFailure(ZlibUtil.exception(z, "compression failure", resultCode)); + return future; } else if (z.next_out_index != 0) { - future = Channels.future(ctx.channel()); - footer = - ctx.channel().getConfig().getBufferFactory().getBuffer( - out, 0, z.next_out_index); + footer = ChannelBuffers.wrappedBuffer(out, 0, z.next_out_index); } else { - // Note that we should never use a SucceededChannelFuture - // here just in case any downstream handler or a sink wants - // to notify a write error. - future = Channels.future(ctx.channel()); footer = ChannelBuffers.EMPTY_BUFFER; } } finally { @@ -379,19 +400,7 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne } } - if (footer != null) { - Channels.write(ctx, future, footer); - } - - if (evt != null) { - future.addListener(new ChannelFutureListener() { - @Override - public void operationComplete(ChannelFuture future) throws Exception { - ctx.sendDownstream(evt); - } - }); - } - + ctx.write(footer, future); return future; } @@ -399,19 +408,4 @@ public class ZlibEncoder extends OneToOneEncoder implements LifeCycleAwareChanne public void beforeAdd(ChannelHandlerContext ctx) throws Exception { this.ctx = ctx; } - - @Override - public void afterAdd(ChannelHandlerContext ctx) throws Exception { - // Unused - } - - @Override - public void beforeRemove(ChannelHandlerContext ctx) throws Exception { - // Unused - } - - @Override - public void afterRemove(ChannelHandlerContext ctx) throws Exception { - // Unused - } } diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/AbstractCodecEmbedder.java b/codec/src/main/java/io/netty/handler/codec/embedder/AbstractCodecEmbedder.java index b90a2bf46e..9d30684bac 100644 --- a/codec/src/main/java/io/netty/handler/codec/embedder/AbstractCodecEmbedder.java +++ b/codec/src/main/java/io/netty/handler/codec/embedder/AbstractCodecEmbedder.java @@ -15,96 +15,44 @@ */ package io.netty.handler.codec.embedder; -import static io.netty.channel.Channels.*; +import io.netty.channel.Channel; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; +import io.netty.channel.ChannelException; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInboundHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoop; import java.lang.reflect.Array; import java.util.ConcurrentModificationException; import java.util.LinkedList; import java.util.Queue; -import io.netty.channel.Channels; -import io.netty.buffer.ChannelBufferFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelEvent; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelPipelineException; -import io.netty.channel.ChannelSink; -import io.netty.channel.ChannelUpstreamHandler; -import io.netty.channel.DefaultChannelPipeline; -import io.netty.channel.ExceptionEvent; -import io.netty.channel.MessageEvent; - /** * A skeletal {@link CodecEmbedder} implementation. */ abstract class AbstractCodecEmbedder implements CodecEmbedder { - private final Channel channel; - private final ChannelPipeline pipeline; - private final EmbeddedChannelSink sink = new EmbeddedChannelSink(); + private static final EventLoop loop = new EmbeddedEventLoop(); - final Queue productQueue = new LinkedList(); + private final Queue productQueue = new LinkedList(); + private final Channel channel = new EmbeddedChannel(productQueue); /** * Creates a new embedder whose pipeline is composed of the specified * handlers. */ protected AbstractCodecEmbedder(ChannelHandler... handlers) { - pipeline = new EmbeddedChannelPipeline(); - configurePipeline(handlers); - channel = new EmbeddedChannel(pipeline, sink); - fireInitialEvents(); - } - - /** - * Creates a new embedder whose pipeline is composed of the specified - * handlers. - * - * @param bufferFactory the {@link ChannelBufferFactory} to be used when - * creating a new buffer. - */ - protected AbstractCodecEmbedder(ChannelBufferFactory bufferFactory, ChannelHandler... handlers) { - this(handlers); - getChannel().getConfig().setBufferFactory(bufferFactory); - } - - private void fireInitialEvents() { - // Fire the typical initial events. - fireChannelOpen(channel); - fireChannelBound(channel, channel.getLocalAddress()); - fireChannelConnected(channel, channel.getRemoteAddress()); - } - - private void configurePipeline(ChannelHandler... handlers) { - if (handlers == null) { - throw new NullPointerException("handlers"); - } - - if (handlers.length == 0) { - throw new IllegalArgumentException( - "handlers should contain at least one " + - ChannelHandler.class.getSimpleName() + '.'); - } - - for (int i = 0; i < handlers.length; i ++) { - ChannelHandler h = handlers[i]; - if (h == null) { - throw new NullPointerException("handlers[" + i + "]"); - } - pipeline.addLast(String.valueOf(i), handlers[i]); - } - pipeline.addLast("SINK", sink); + channel.pipeline().addLast(handlers); + channel.pipeline().addLast(new LastHandler()); + loop.register(channel); } @Override public boolean finish() { - close(channel); - fireChannelDisconnected(channel); - fireChannelUnbound(channel); - fireChannelClosed(channel); + channel.pipeline().close().syncUninterruptibly(); return !productQueue.isEmpty(); } @@ -112,7 +60,7 @@ abstract class AbstractCodecEmbedder implements CodecEmbedder { * Returns the virtual {@link Channel} which will be used as a mock * during encoding and decoding. */ - protected final Channel getChannel() { + protected final Channel channel() { return channel; } @@ -125,15 +73,27 @@ abstract class AbstractCodecEmbedder implements CodecEmbedder { } @Override - @SuppressWarnings("unchecked") public final E poll() { - return (E) productQueue.poll(); + return product(productQueue.poll()); } @Override - @SuppressWarnings("unchecked") public final E peek() { - return (E) productQueue.peek(); + return product(productQueue.peek()); + } + + @SuppressWarnings("unchecked") + private E product(Object p) { + if (p instanceof Throwable) { + if (p instanceof RuntimeException) { + throw (RuntimeException) p; + } + if (p instanceof Error) { + throw (Error) p; + } + throw new ChannelException((Throwable) p); + } + return (E) p; } @Override @@ -186,73 +146,20 @@ abstract class AbstractCodecEmbedder implements CodecEmbedder { } @Override - public ChannelPipeline getPipeline() { - return pipeline; + public ChannelPipeline pipeline() { + return channel.pipeline(); } - private final class EmbeddedChannelSink implements ChannelSink, ChannelUpstreamHandler { - EmbeddedChannelSink() { + private final class LastHandler extends ChannelInboundHandlerAdapter { + @Override + public ChannelBufferHolder newInboundBuffer( + ChannelInboundHandlerContext ctx) throws Exception { + return ChannelBufferHolders.messageBuffer(productQueue); } @Override - public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) { - handleEvent(e); - } - - @Override - public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) { - handleEvent(e); - } - - private void handleEvent(ChannelEvent e) { - if (e instanceof MessageEvent) { - boolean offered = productQueue.offer(((MessageEvent) e).getMessage()); - assert offered; - } else if (e instanceof ExceptionEvent) { - throw new CodecEmbedderException(((ExceptionEvent) e).cause()); - } - - // Swallow otherwise. - } - - @Override - public void exceptionCaught( - ChannelPipeline pipeline, ChannelEvent e, - ChannelPipelineException cause) throws Exception { - Throwable actualCause = cause.getCause(); - if (actualCause == null) { - actualCause = cause; - } - - throw new CodecEmbedderException(actualCause); - } - - @Override - public ChannelFuture execute(ChannelPipeline pipeline, Runnable task) { - try { - task.run(); - return Channels.succeededFuture(pipeline.channel()); - } catch (Throwable t) { - return Channels.failedFuture(pipeline.channel(), t); - } - } - } - - private static final class EmbeddedChannelPipeline extends DefaultChannelPipeline { - - EmbeddedChannelPipeline() { - } - - @Override - protected void notifyHandlerException(ChannelEvent e, Throwable t) { - while (t instanceof ChannelPipelineException && t.getCause() != null) { - t = t.getCause(); - } - if (t instanceof CodecEmbedderException) { - throw (CodecEmbedderException) t; - } else { - throw new CodecEmbedderException(t); - } + public void exceptionCaught(ChannelInboundHandlerContext ctx, Throwable cause) throws Exception { + productQueue.add(cause); } } } diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/CodecEmbedder.java b/codec/src/main/java/io/netty/handler/codec/embedder/CodecEmbedder.java index f16f7a0177..babfe0fd46 100644 --- a/codec/src/main/java/io/netty/handler/codec/embedder/CodecEmbedder.java +++ b/codec/src/main/java/io/netty/handler/codec/embedder/CodecEmbedder.java @@ -95,5 +95,5 @@ public interface CodecEmbedder { /** * Returns the {@link ChannelPipeline} that handles the input. */ - ChannelPipeline getPipeline(); + ChannelPipeline pipeline(); } diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/DecoderEmbedder.java b/codec/src/main/java/io/netty/handler/codec/embedder/DecoderEmbedder.java index 8f47941447..30d5814d78 100644 --- a/codec/src/main/java/io/netty/handler/codec/embedder/DecoderEmbedder.java +++ b/codec/src/main/java/io/netty/handler/codec/embedder/DecoderEmbedder.java @@ -15,13 +15,11 @@ */ package io.netty.handler.codec.embedder; -import static io.netty.channel.Channels.*; - import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBufferFactory; import io.netty.buffer.ChannelBuffers; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelUpstreamHandler; import io.netty.handler.codec.base64.Base64Decoder; import io.netty.handler.codec.string.StringDecoder; @@ -51,24 +49,20 @@ public class DecoderEmbedder extends AbstractCodecEmbedder { * Creates a new embedder whose pipeline is composed of the specified * handlers. */ - public DecoderEmbedder(ChannelUpstreamHandler... handlers) { + public DecoderEmbedder(ChannelHandler... handlers) { super(handlers); } - /** - * Creates a new embedder whose pipeline is composed of the specified - * handlers. - * - * @param bufferFactory the {@link ChannelBufferFactory} to be used when - * creating a new buffer. - */ - public DecoderEmbedder(ChannelBufferFactory bufferFactory, ChannelUpstreamHandler... handlers) { - super(bufferFactory, handlers); - } - @Override public boolean offer(Object input) { - fireMessageReceived(getChannel(), input); - return !super.isEmpty(); + ChannelBufferHolder in = pipeline().nextIn(); + if (in.hasByteBuffer()) { + in.byteBuffer().writeBytes((ChannelBuffer) input); + } else { + in.messageBuffer().add(input); + } + + pipeline().fireInboundBufferUpdated(); + return !isEmpty(); } } diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannel.java b/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannel.java index 6998da6b01..294e4b8628 100644 --- a/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannel.java +++ b/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannel.java @@ -15,53 +15,131 @@ */ package io.netty.handler.codec.embedder; -import java.net.SocketAddress; - +import io.netty.buffer.ChannelBuffer; import io.netty.channel.AbstractChannel; +import io.netty.channel.ChannelBufferHolder; +import io.netty.channel.ChannelBufferHolders; import io.netty.channel.ChannelConfig; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelSink; import io.netty.channel.DefaultChannelConfig; +import io.netty.channel.EventLoop; + +import java.io.IOException; +import java.net.SocketAddress; +import java.util.Queue; -/** - * TODO Make EmbeddedChannel implement ChannelConfig and ChannelSink to reduce overhead. - * TODO Do not extend AbstractChannel to reduce overhead and remove the internal-use-only constructor in AbstractChannel. - */ class EmbeddedChannel extends AbstractChannel { - private static final Integer DUMMY_ID = Integer.valueOf(0); - - private final ChannelConfig config; + private final ChannelConfig config = new DefaultChannelConfig(); + private final ChannelBufferHolder firstOut = ChannelBufferHolders.byteBuffer(); private final SocketAddress localAddress = new EmbeddedSocketAddress(); private final SocketAddress remoteAddress = new EmbeddedSocketAddress(); + private final Queue productQueue; + private int state; // 0 = OPEN, 1 = ACTIVE, 2 = CLOSED + private final java.nio.channels.Channel javaChannel = new java.nio.channels.Channel() { + @Override + public boolean isOpen() { + return state < 2; + } - EmbeddedChannel(ChannelPipeline pipeline, ChannelSink sink) { - super(DUMMY_ID, null, EmbeddedChannelFactory.INSTANCE, pipeline, sink); - config = new DefaultChannelConfig(); + @Override + public void close() throws IOException { + // NOOP + } + }; + + EmbeddedChannel(Queue productQueue) { + super(null, null); + this.productQueue = productQueue; } @Override - public ChannelConfig getConfig() { + public ChannelConfig config() { return config; } @Override - public SocketAddress getLocalAddress() { - return localAddress; + public boolean isActive() { + return state == 1; } @Override - public SocketAddress getRemoteAddress() { - return remoteAddress; + protected boolean isCompatible(EventLoop loop) { + return loop instanceof EmbeddedEventLoop; } @Override - public boolean isBound() { + protected java.nio.channels.Channel javaChannel() { + return javaChannel; + } + + @Override + @SuppressWarnings("unchecked") + protected ChannelBufferHolder firstOut() { + return (ChannelBufferHolder) firstOut; + } + + @Override + protected SocketAddress localAddress0() { + return isActive()? localAddress : null; + } + + @Override + protected SocketAddress remoteAddress0() { + return isActive()? remoteAddress : null; + } + + @Override + protected void doRegister() throws Exception { + state = 1; + } + + @Override + protected void doBind(SocketAddress localAddress) throws Exception { + // NOOP + } + + @Override + protected boolean doConnect(SocketAddress remoteAddress, SocketAddress localAddress) throws Exception { return true; } @Override - public boolean isConnected() { - return true; + protected void doFinishConnect() throws Exception { + // NOOP + } + + @Override + protected void doDisconnect() throws Exception { + doClose(); + } + + @Override + protected void doClose() throws Exception { + state = 2; + } + + @Override + protected void doDeregister() throws Exception { + // NOOP + } + + @Override + protected int doRead() throws Exception { + return 0; + } + + @Override + protected int doFlush(boolean lastSpin) throws Exception { + ChannelBuffer buf = firstOut().byteBuffer(); + int length = buf.readableBytes(); + if (length > 0) { + productQueue.add(buf.readBytes(length)); + } + return length; + } + + @Override + protected boolean inEventLoopDrivenFlush() { + return false; } } diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannelFactory.java b/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannelFactory.java deleted file mode 100644 index c7a8e197fb..0000000000 --- a/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedChannelFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2011 The Netty Project - * - * The Netty Project licenses this file to you under the Apache License, - * version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -package io.netty.handler.codec.embedder; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelFactory; -import io.netty.channel.ChannelPipeline; - -/** - */ -final class EmbeddedChannelFactory implements ChannelFactory { - - static final ChannelFactory INSTANCE = new EmbeddedChannelFactory(); - - private EmbeddedChannelFactory() { - } - - @Override - public Channel newChannel(ChannelPipeline pipeline) { - throw new UnsupportedOperationException(); - } - - @Override - public void releaseExternalResources() { - // No external resources - } -} diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedEventLoop.java b/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedEventLoop.java new file mode 100644 index 0000000000..0e525e0084 --- /dev/null +++ b/codec/src/main/java/io/netty/handler/codec/embedder/EmbeddedEventLoop.java @@ -0,0 +1,88 @@ +package io.netty.handler.codec.embedder; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.EventLoop; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.AbstractExecutorService; +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +class EmbeddedEventLoop extends AbstractExecutorService implements + EventLoop { + + @Override + public ScheduledFuture schedule(Runnable command, long delay, + TimeUnit unit) { + throw new UnsupportedOperationException(); + } + + @Override + public ScheduledFuture schedule(Callable callable, long delay, + TimeUnit unit) { + throw new UnsupportedOperationException(); + } + + @Override + public ScheduledFuture scheduleAtFixedRate(Runnable command, + long initialDelay, long period, TimeUnit unit) { + throw new UnsupportedOperationException(); + } + + @Override + public ScheduledFuture scheduleWithFixedDelay(Runnable command, + long initialDelay, long delay, TimeUnit unit) { + throw new UnsupportedOperationException(); + } + + @Override + public void shutdown() { + // NOOP + } + + @Override + public List shutdownNow() { + return Collections.emptyList(); + } + + @Override + public boolean isShutdown() { + return false; + } + + @Override + public boolean isTerminated() { + return false; + } + + @Override + public boolean awaitTermination(long timeout, TimeUnit unit) + throws InterruptedException { + Thread.sleep(unit.toMillis(timeout)); + return false; + } + + @Override + public void execute(Runnable command) { + command.run(); + } + + @Override + public ChannelFuture register(Channel channel) { + return register(channel, channel.newFuture()); + } + + @Override + public ChannelFuture register(Channel channel, ChannelFuture future) { + channel.unsafe().register(this, future); + return future; + } + + @Override + public boolean inEventLoop() { + return true; + } +} diff --git a/codec/src/main/java/io/netty/handler/codec/embedder/EncoderEmbedder.java b/codec/src/main/java/io/netty/handler/codec/embedder/EncoderEmbedder.java index d4a5d856cd..8dcc39b701 100644 --- a/codec/src/main/java/io/netty/handler/codec/embedder/EncoderEmbedder.java +++ b/codec/src/main/java/io/netty/handler/codec/embedder/EncoderEmbedder.java @@ -15,11 +15,8 @@ */ package io.netty.handler.codec.embedder; -import static io.netty.channel.Channels.*; - import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBufferFactory; -import io.netty.channel.ChannelDownstreamHandler; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.base64.Base64Encoder; import io.netty.handler.codec.string.StringEncoder; @@ -51,24 +48,13 @@ public class EncoderEmbedder extends AbstractCodecEmbedder { * Creates a new embedder whose pipeline is composed of the specified * handlers. */ - public EncoderEmbedder(ChannelDownstreamHandler... handlers) { + public EncoderEmbedder(ChannelHandler... handlers) { super(handlers); } - /** - * Creates a new embedder whose pipeline is composed of the specified - * handlers. - * - * @param bufferFactory the {@link ChannelBufferFactory} to be used when - * creating a new buffer. - */ - public EncoderEmbedder(ChannelBufferFactory bufferFactory, ChannelDownstreamHandler... handlers) { - super(bufferFactory, handlers); - } - @Override public boolean offer(Object input) { - write(getChannel(), input).setSuccess(); + channel().write(input); return !isEmpty(); } } diff --git a/codec/src/main/java/io/netty/handler/codec/frame/FrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/frame/FrameDecoder.java deleted file mode 100644 index bb9d304e47..0000000000 --- a/codec/src/main/java/io/netty/handler/codec/frame/FrameDecoder.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright 2011 The Netty Project - * - * The Netty Project licenses this file to you under the Apache License, - * version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -package io.netty.handler.codec.frame; - -import java.net.SocketAddress; - -import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBufferFactory; -import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelStateEvent; -import io.netty.channel.ChannelUpstreamHandler; -import io.netty.channel.Channels; -import io.netty.channel.ExceptionEvent; -import io.netty.channel.MessageEvent; -import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.replay.ReplayingDecoder; - -/** - * Decodes the received {@link ChannelBuffer}s into a meaningful frame object. - *

- * In a stream-based transport such as TCP/IP, packets can be fragmented and - * reassembled during transmission even in a LAN environment. For example, - * let us assume you have received three packets: - *

- * +-----+-----+-----+
- * | ABC | DEF | GHI |
- * +-----+-----+-----+
- * 
- * because of the packet fragmentation, a server can receive them like the - * following: - *
- * +----+-------+---+---+
- * | AB | CDEFG | H | I |
- * +----+-------+---+---+
- * 
- *

- * {@link FrameDecoder} helps you defrag the received packets into one or more - * meaningful frames that could be easily understood by the - * application logic. In case of the example above, your {@link FrameDecoder} - * implementation could defrag the received packets like the following: - *

- * +-----+-----+-----+
- * | ABC | DEF | GHI |
- * +-----+-----+-----+
- * 
- *

- * The following code shows an example handler which decodes a frame whose - * first 4 bytes header represents the length of the frame, excluding the - * header. - *

- * MESSAGE FORMAT
- * ==============
- *
- * Offset:  0        4                   (Length + 4)
- *          +--------+------------------------+
- * Fields:  | Length | Actual message content |
- *          +--------+------------------------+
- *
- * DECODER IMPLEMENTATION
- * ======================
- *
- * public class IntegerHeaderFrameDecoder extends {@link FrameDecoder} {
- *
- *   {@code @Override}
- *   protected Object decode({@link ChannelHandlerContext} ctx,
- *                           {@link Channel channel},
- *                           {@link ChannelBuffer} buf) throws Exception {
- *
- *     // Make sure if the length field was received.
- *     if (buf.readableBytes() < 4) {
- *        // The length field was not received yet - return null.
- *        // This method will be invoked again when more packets are
- *        // received and appended to the buffer.
- *        return null;
- *     }
- *
- *     // The length field is in the buffer.
- *
- *     // Mark the current buffer position before reading the length field
- *     // because the whole frame might not be in the buffer yet.
- *     // We will reset the buffer position to the marked position if
- *     // there's not enough bytes in the buffer.
- *     buf.markReaderIndex();
- *
- *     // Read the length field.
- *     int length = buf.readInt();
- *
- *     // Make sure if there's enough bytes in the buffer.
- *     if (buf.readableBytes() < length) {
- *        // The whole bytes were not received yet - return null.
- *        // This method will be invoked again when more packets are
- *        // received and appended to the buffer.
- *
- *        // Reset to the marked position to read the length field again
- *        // next time.
- *        buf.resetReaderIndex();
- *
- *        return null;
- *     }
- *
- *     // There's enough bytes in the buffer. Read it.
- *     {@link ChannelBuffer} frame = buf.readBytes(length);
- *
- *     // Successfully decoded a frame.  Return the decoded frame.
- *     return frame;
- *   }
- * }
- * 
- * - *

Returning a POJO rather than a {@link ChannelBuffer}

- *

- * Please note that you can return an object of a different type than - * {@link ChannelBuffer} in your {@code decode()} and {@code decodeLast()} - * implementation. For example, you could return a - * POJO so that the next - * {@link ChannelUpstreamHandler} receives a {@link MessageEvent} which - * contains a POJO rather than a {@link ChannelBuffer}. - * - *

Replacing a decoder with another decoder in a pipeline

- *

- * If you are going to write a protocol multiplexer, you will probably want to - * replace a {@link FrameDecoder} (protocol detector) with another - * {@link FrameDecoder} or {@link ReplayingDecoder} (actual protocol decoder). - * It is not possible to achieve this simply by calling - * {@link ChannelPipeline#replace(ChannelHandler, String, ChannelHandler)}, but - * some additional steps are required: - *

- * public class FirstDecoder extends {@link FrameDecoder} {
- *
- *     public FirstDecoder() {
- *         super(true); // Enable unfold
- *     }
- *
- *     {@code @Override}
- *     protected Object decode({@link ChannelHandlerContext} ctx,
- *                             {@link Channel} channel,
- *                             {@link ChannelBuffer} buf) {
- *         ...
- *         // Decode the first message
- *         Object firstMessage = ...;
- *
- *         // Add the second decoder
- *         ctx.getPipeline().addLast("second", new SecondDecoder());
- *
- *         // Remove the first decoder (me)
- *         ctx.getPipeline().remove(this);
- *
- *         if (buf.readable()) {
- *             // Hand off the remaining data to the second decoder
- *             return new Object[] { firstMessage, buf.readBytes(buf.readableBytes()) };
- *         } else {
- *             // Nothing to hand off
- *             return firstMessage;
- *         }
- *     }
- * }
- * 
- * @apiviz.landmark - */ -public abstract class FrameDecoder extends SimpleChannelUpstreamHandler { - - private final boolean unfold; - private ChannelBuffer cumulation; - - protected FrameDecoder() { - this(false); - } - - protected FrameDecoder(boolean unfold) { - this.unfold = unfold; - } - - @Override - public void messageReceived( - ChannelHandlerContext ctx, MessageEvent e) throws Exception { - - Object m = e.getMessage(); - if (!(m instanceof ChannelBuffer)) { - ctx.sendUpstream(e); - return; - } - - ChannelBuffer input = (ChannelBuffer) m; - if (!input.readable()) { - return; - } - - if (cumulation == null) { - // the cumulation buffer is not created yet so just pass the input to callDecode(...) method - callDecode(ctx, e.channel(), input, e.getRemoteAddress()); - if (input.readable()) { - // seems like there is something readable left in the input buffer. So create the cumulation buffer and copy the input into it - (this.cumulation = newCumulationBuffer(ctx, input.readableBytes())).writeBytes(input); - } - } else { - ChannelBuffer cumulation = this.cumulation; - assert cumulation.readable(); - if (cumulation.writableBytes() < input.readableBytes()) { - cumulation.discardReadBytes(); - } - cumulation.writeBytes(input); - callDecode(ctx, e.channel(), cumulation, e.getRemoteAddress()); - if (!cumulation.readable()) { - this.cumulation = null; - } - } - } - - @Override - public void channelDisconnected( - ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { - cleanup(ctx, e); - } - - @Override - public void channelClosed( - ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { - cleanup(ctx, e); - } - - @Override - public void exceptionCaught( - ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { - ctx.sendUpstream(e); - } - - /** - * Decodes the received packets so far into a frame. - * - * @param ctx the context of this handler - * @param channel the current channel - * @param buffer the cumulative buffer of received packets so far. - * Note that the buffer might be empty, which means you - * should not make an assumption that the buffer contains - * at least one byte in your decoder implementation. - * - * @return the decoded frame if a full frame was received and decoded. - * {@code null} if there's not enough data in the buffer to decode a frame. - */ - protected abstract Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception; - - /** - * Decodes the received data so far into a frame when the channel is - * disconnected. - * - * @param ctx the context of this handler - * @param channel the current channel - * @param buffer the cumulative buffer of received packets so far. - * Note that the buffer might be empty, which means you - * should not make an assumption that the buffer contains - * at least one byte in your decoder implementation. - * - * @return the decoded frame if a full frame was received and decoded. - * {@code null} if there's not enough data in the buffer to decode a frame. - */ - protected Object decodeLast( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { - return decode(ctx, channel, buffer); - } - - private void callDecode( - ChannelHandlerContext context, Channel channel, - ChannelBuffer cumulation, SocketAddress remoteAddress) throws Exception { - - while (cumulation.readable()) { - int oldReaderIndex = cumulation.readerIndex(); - Object frame = decode(context, channel, cumulation); - if (frame == null) { - if (oldReaderIndex == cumulation.readerIndex()) { - // Seems like more data is required. - // Let us wait for the next notification. - break; - } else { - // Previous data has been discarded. - // Probably it is reading on. - continue; - } - } else if (oldReaderIndex == cumulation.readerIndex()) { - throw new IllegalStateException( - "decode() method must read at least one byte " + - "if it returned a frame (caused by: " + getClass() + ")"); - } - - unfoldAndFireMessageReceived(context, remoteAddress, frame); - } - } - - private void unfoldAndFireMessageReceived(ChannelHandlerContext context, SocketAddress remoteAddress, Object result) { - if (unfold) { - if (result instanceof Object[]) { - for (Object r: (Object[]) result) { - Channels.fireMessageReceived(context, r, remoteAddress); - } - } else if (result instanceof Iterable) { - for (Object r: (Iterable) result) { - Channels.fireMessageReceived(context, r, remoteAddress); - } - } else { - Channels.fireMessageReceived(context, result, remoteAddress); - } - } else { - Channels.fireMessageReceived(context, result, remoteAddress); - } - } - - private void cleanup(ChannelHandlerContext ctx, ChannelStateEvent e) - throws Exception { - try { - ChannelBuffer cumulation = this.cumulation; - if (cumulation == null) { - return; - } - - this.cumulation = null; - - if (cumulation.readable()) { - // Make sure all frames are read before notifying a closed channel. - callDecode(ctx, ctx.channel(), cumulation, null); - } - - // Call decodeLast() finally. Please note that decodeLast() is - // called even if there's nothing more to read from the buffer to - // notify a user that the connection was closed explicitly. - Object partialFrame = decodeLast(ctx, ctx.channel(), cumulation); - if (partialFrame != null) { - unfoldAndFireMessageReceived(ctx, null, partialFrame); - } - } finally { - ctx.sendUpstream(e); - } - } - - /** - * Create a new {@link ChannelBuffer} which is used for the cumulation. - * Be aware that this MUST be a dynamic buffer. Sub-classes may override - * this to provide a dynamic {@link ChannelBuffer} which has some - * pre-allocated size that better fit their need. - * - * @param ctx {@link ChannelHandlerContext} for this handler - * @return buffer the {@link ChannelBuffer} which is used for cumulation - */ - protected ChannelBuffer newCumulationBuffer( - ChannelHandlerContext ctx, int minimumCapacity) { - ChannelBufferFactory factory = ctx.channel().getConfig().getBufferFactory(); - return ChannelBuffers.dynamicBuffer( - factory.getDefaultOrder(), Math.max(minimumCapacity, 256), factory); - } -} diff --git a/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneDecoder.java b/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneDecoder.java deleted file mode 100644 index 74a466d30e..0000000000 --- a/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneDecoder.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2011 The Netty Project - * - * The Netty Project licenses this file to you under the Apache License, - * version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -package io.netty.handler.codec.oneone; - -import static io.netty.channel.Channels.*; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelEvent; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.ChannelUpstreamHandler; -import io.netty.channel.MessageEvent; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; -import io.netty.handler.codec.frame.FrameDecoder; - -/** - * Transforms a received message into another message. Please note that this - * decoder must be used with a proper {@link FrameDecoder} such as - * {@link DelimiterBasedFrameDecoder} or you must implement proper framing - * mechanism by yourself if you are using a stream-based transport such as - * TCP/IP. A typical setup for TCP/IP would be: - *
- * {@link ChannelPipeline} pipeline = ...;
- *
- * // Decoders
- * pipeline.addLast("frameDecoder", new {@link DelimiterBasedFrameDecoder}(80, {@link Delimiters#nulDelimiter()}));
- * pipeline.addLast("customDecoder", new {@link OneToOneDecoder}() { ... });
- *
- * // Encoder
- * pipeline.addLast("customEncoder", new {@link OneToOneEncoder}() { ... });
- * 
- * @apiviz.landmark - */ -public abstract class OneToOneDecoder implements ChannelUpstreamHandler { - - /** - * Creates a new instance with the current system character set. - */ - protected OneToOneDecoder() { - } - - @Override - public void handleUpstream( - ChannelHandlerContext ctx, ChannelEvent evt) throws Exception { - if (!(evt instanceof MessageEvent)) { - ctx.sendUpstream(evt); - return; - } - - MessageEvent e = (MessageEvent) evt; - Object originalMessage = e.getMessage(); - Object decodedMessage = decode(ctx, e.channel(), originalMessage); - if (originalMessage == decodedMessage) { - ctx.sendUpstream(evt); - } else if (decodedMessage != null) { - fireMessageReceived(ctx, decodedMessage, e.getRemoteAddress()); - } - } - - /** - * Transforms the specified received message into another message and return - * the transformed message. Return {@code null} if the received message - * is supposed to be discarded. - */ - protected abstract Object decode( - ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception; -} diff --git a/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneEncoder.java b/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneEncoder.java deleted file mode 100644 index a193d3320e..0000000000 --- a/codec/src/main/java/io/netty/handler/codec/oneone/OneToOneEncoder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2011 The Netty Project - * - * The Netty Project licenses this file to you under the Apache License, - * version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -package io.netty.handler.codec.oneone; - -import static io.netty.channel.Channels.*; - -import io.netty.buffer.ChannelBuffers; -import io.netty.channel.Channel; -import io.netty.channel.ChannelDownstreamHandler; -import io.netty.channel.ChannelEvent; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.MessageEvent; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; - -/** - * Transforms a write request into another write request. A typical setup for - * TCP/IP would be: - *
- * {@link ChannelPipeline} pipeline = ...;
- *
- * // Decoders
- * pipeline.addLast("frameDecoder", new {@link DelimiterBasedFrameDecoder}(80, {@link Delimiters#nulDelimiter()}));
- * pipeline.addLast("customDecoder", new {@link OneToOneDecoder}() { ... });
- *
- * // Encoder
- * pipeline.addLast("customEncoder", new {@link OneToOneEncoder}() { ... });
- * 
- * @apiviz.landmark - */ -public abstract class OneToOneEncoder implements ChannelDownstreamHandler { - - protected OneToOneEncoder() { - } - - @Override - public void handleDownstream( - ChannelHandlerContext ctx, ChannelEvent evt) throws Exception { - if (!(evt instanceof MessageEvent)) { - ctx.sendDownstream(evt); - return; - } - - MessageEvent e = (MessageEvent) evt; - Object originalMessage = e.getMessage(); - Object encodedMessage = encode(ctx, e.channel(), originalMessage); - if (originalMessage == encodedMessage) { - ctx.sendDownstream(evt); - } else if (encodedMessage != null) { - write(ctx, e.getFuture(), encodedMessage, e.getRemoteAddress()); - } - } - - /** - * Transforms the specified message into another message and return the - * transformed message. Note that you can not return {@code null}, unlike - * you can in {@link OneToOneDecoder#decode(ChannelHandlerContext, Channel, Object)}; - * you must return something, at least {@link ChannelBuffers#EMPTY_BUFFER}. - */ - protected abstract Object encode( - ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception; -} diff --git a/codec/src/main/java/io/netty/handler/codec/oneone/package-info.java b/codec/src/main/java/io/netty/handler/codec/oneone/package-info.java deleted file mode 100644 index 2fe0c7ea83..0000000000 --- a/codec/src/main/java/io/netty/handler/codec/oneone/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2011 The Netty Project - * - * The Netty Project licenses this file to you under the Apache License, - * version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -/** - * Simplistic abstract classes which help implement encoder and decoder that - * transform an object into another object and vice versa. - * - * @apiviz.exclude \.codec\.(?!oneone)[a-z0-9]+\. - */ -package io.netty.handler.codec.oneone; diff --git a/codec/src/main/java/io/netty/handler/codec/frame/package-info.java b/codec/src/main/java/io/netty/handler/codec/package-info.java similarity index 96% rename from codec/src/main/java/io/netty/handler/codec/frame/package-info.java rename to codec/src/main/java/io/netty/handler/codec/package-info.java index e09b779a79..a61d6925f5 100644 --- a/codec/src/main/java/io/netty/handler/codec/frame/package-info.java +++ b/codec/src/main/java/io/netty/handler/codec/package-info.java @@ -24,4 +24,4 @@ * @apiviz.exclude \.codec\.[a-eg-z][a-z0-9]*\. * @apiviz.exclude \.ssl\. */ -package io.netty.handler.codec.frame; +package io.netty.handler.codec; diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java index e15c13fa6c..55359384ec 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoder.java @@ -17,15 +17,13 @@ package io.netty.handler.codec.protobuf; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBufferInputStream; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.channel.MessageEvent; -import io.netty.handler.codec.frame.FrameDecoder; -import io.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.frame.LengthFieldPrepender; -import io.netty.handler.codec.oneone.OneToOneDecoder; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.MessageToMessageDecoder; import com.google.protobuf.ExtensionRegistry; import com.google.protobuf.Message; @@ -64,7 +62,7 @@ import com.google.protobuf.MessageLite; * @apiviz.landmark */ @Sharable -public class ProtobufDecoder extends OneToOneDecoder { +public class ProtobufDecoder extends MessageToMessageDecoder { private final MessageLite prototype; private final ExtensionRegistry extensionRegistry; @@ -85,29 +83,23 @@ public class ProtobufDecoder extends OneToOneDecoder { } @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer)) { - return msg; - } - - ChannelBuffer buf = (ChannelBuffer) msg; - if (buf.hasArray()) { - final int offset = buf.readerIndex(); + public MessageLite decode(ChannelInboundHandlerContext ctx, ChannelBuffer msg) throws Exception { + if (msg.hasArray()) { + final int offset = msg.readerIndex(); if (extensionRegistry == null) { return prototype.newBuilderForType().mergeFrom( - buf.array(), buf.arrayOffset() + offset, buf.readableBytes()).build(); + msg.array(), msg.arrayOffset() + offset, msg.readableBytes()).build(); } else { return prototype.newBuilderForType().mergeFrom( - buf.array(), buf.arrayOffset() + offset, buf.readableBytes(), extensionRegistry).build(); + msg.array(), msg.arrayOffset() + offset, msg.readableBytes(), extensionRegistry).build(); } } else { if (extensionRegistry == null) { return prototype.newBuilderForType().mergeFrom( - new ChannelBufferInputStream((ChannelBuffer) msg)).build(); + new ChannelBufferInputStream(msg)).build(); } else { return prototype.newBuilderForType().mergeFrom( - new ChannelBufferInputStream((ChannelBuffer) msg), extensionRegistry).build(); + new ChannelBufferInputStream(msg), extensionRegistry).build(); } } } diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufEncoder.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufEncoder.java index 6f1607acdf..ea5687285e 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufEncoder.java @@ -16,16 +16,14 @@ package io.netty.handler.codec.protobuf; import static io.netty.buffer.ChannelBuffers.*; - import io.netty.buffer.ChannelBuffer; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.MessageEvent; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.frame.LengthFieldPrepender; -import io.netty.handler.codec.oneone.OneToOneEncoder; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.MessageToMessageEncoder; import com.google.protobuf.Message; import com.google.protobuf.MessageLite; @@ -60,17 +58,16 @@ import com.google.protobuf.MessageLite; * @apiviz.landmark */ @Sharable -public class ProtobufEncoder extends OneToOneEncoder { +public class ProtobufEncoder extends MessageToMessageEncoder { @Override - protected Object encode( - ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { + public ChannelBuffer encode(ChannelOutboundHandlerContext ctx, Object msg) throws Exception { if (msg instanceof MessageLite) { return wrappedBuffer(((MessageLite) msg).toByteArray()); } if (msg instanceof MessageLite.Builder) { return wrappedBuffer(((MessageLite.Builder) msg).build().toByteArray()); } - return msg; + return null; } } diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32FrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32FrameDecoder.java index 38db813d69..cf73447e61 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32FrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32FrameDecoder.java @@ -16,10 +16,9 @@ package io.netty.handler.codec.protobuf; import io.netty.buffer.ChannelBuffer; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.CorruptedFrameException; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.channel.ChannelInboundHandlerContext; +import io.netty.handler.codec.CorruptedFrameException; +import io.netty.handler.codec.StreamToMessageDecoder; import com.google.protobuf.CodedInputStream; @@ -38,7 +37,7 @@ import com.google.protobuf.CodedInputStream; * * @see com.google.protobuf.CodedInputStream */ -public class ProtobufVarint32FrameDecoder extends FrameDecoder { +public class ProtobufVarint32FrameDecoder extends StreamToMessageDecoder { // TODO maxFrameLength + safe skip + fail-fast option // (just like LengthFieldBasedFrameDecoder) @@ -50,27 +49,27 @@ public class ProtobufVarint32FrameDecoder extends FrameDecoder { } @Override - protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { - buffer.markReaderIndex(); + public ChannelBuffer decode(ChannelInboundHandlerContext ctx, ChannelBuffer in) throws Exception { + in.markReaderIndex(); final byte[] buf = new byte[5]; for (int i = 0; i < buf.length; i ++) { - if (!buffer.readable()) { - buffer.resetReaderIndex(); + if (!in.readable()) { + in.resetReaderIndex(); return null; } - buf[i] = buffer.readByte(); + buf[i] = in.readByte(); if (buf[i] >= 0) { int length = CodedInputStream.newInstance(buf, 0, i + 1).readRawVarint32(); if (length < 0) { throw new CorruptedFrameException("negative length: " + length); } - if (buffer.readableBytes() < length) { - buffer.resetReaderIndex(); + if (in.readableBytes() < length) { + in.resetReaderIndex(); return null; } else { - return buffer.readBytes(length); + return in.readBytes(length); } } } diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java index d224c288a1..1d367d42aa 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java @@ -15,14 +15,11 @@ */ package io.netty.handler.codec.protobuf; -import static io.netty.buffer.ChannelBuffers.*; - import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBufferOutputStream; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.oneone.OneToOneEncoder; +import io.netty.channel.ChannelOutboundHandlerContext; +import io.netty.handler.codec.MessageToStreamEncoder; import com.google.protobuf.CodedOutputStream; @@ -41,7 +38,7 @@ import com.google.protobuf.CodedOutputStream; * @see com.google.protobuf.CodedOutputStream */ @Sharable -public class ProtobufVarint32LengthFieldPrepender extends OneToOneEncoder { +public class ProtobufVarint32LengthFieldPrepender extends MessageToStreamEncoder { /** * Creates a new instance. @@ -50,23 +47,18 @@ public class ProtobufVarint32LengthFieldPrepender extends OneToOneEncoder { } @Override - protected Object encode(ChannelHandlerContext ctx, Channel channel, - Object msg) throws Exception { - if (!(msg instanceof ChannelBuffer)) { - return msg; - } + public void encode( + ChannelOutboundHandlerContext ctx, ChannelBuffer msg, ChannelBuffer out) throws Exception { + ChannelBuffer body = msg; + int bodyLen = body.readableBytes(); + int headerLen = CodedOutputStream.computeRawVarint32Size(bodyLen); + out.ensureWritableBytes(headerLen + bodyLen); - ChannelBuffer body = (ChannelBuffer) msg; - int length = body.readableBytes(); - ChannelBuffer header = - channel.getConfig().getBufferFactory().getBuffer( - body.order(), - CodedOutputStream.computeRawVarint32Size(length)); - CodedOutputStream codedOutputStream = CodedOutputStream - .newInstance(new ChannelBufferOutputStream(header)); - codedOutputStream.writeRawVarint32(length); - codedOutputStream.flush(); - return wrappedBuffer(header, body); + CodedOutputStream headerOut = + CodedOutputStream.newInstance(new ChannelBufferOutputStream(out)); + headerOut.writeRawVarint32(bodyLen); + headerOut.flush(); + + out.writeBytes(body); } - } diff --git a/codec/src/main/java/io/netty/handler/codec/replay/ReplayingDecoder.java b/codec/src/main/java/io/netty/handler/codec/replay/ReplayingDecoder.java index 78cf2d90db..f017f5c8bc 100644 --- a/codec/src/main/java/io/netty/handler/codec/replay/ReplayingDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/replay/ReplayingDecoder.java @@ -29,7 +29,7 @@ import io.netty.channel.Channels; import io.netty.channel.ExceptionEvent; import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.handler.codec.FrameDecoder; /** * A specialized variation of {@link FrameDecoder} which enables implementation diff --git a/codec/src/main/java/io/netty/handler/codec/replay/package-info.java b/codec/src/main/java/io/netty/handler/codec/replay/package-info.java index 500ab3514e..39da245c7d 100644 --- a/codec/src/main/java/io/netty/handler/codec/replay/package-info.java +++ b/codec/src/main/java/io/netty/handler/codec/replay/package-info.java @@ -15,7 +15,7 @@ */ /** - * Specialized variation of {@link io.netty.handler.codec.frame.FrameDecoder} + * Specialized variation of {@link io.netty.handler.codec.FrameDecoder} * which enables implementation of a non-blocking decoder in the blocking I/O * paradigm. * diff --git a/codec/src/main/java/io/netty/handler/codec/serialization/ObjectDecoder.java b/codec/src/main/java/io/netty/handler/codec/serialization/ObjectDecoder.java index 64a2f9049b..1cf322cf5a 100644 --- a/codec/src/main/java/io/netty/handler/codec/serialization/ObjectDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/serialization/ObjectDecoder.java @@ -22,7 +22,7 @@ import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBufferInputStream; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; /** * A decoder which deserializes the received {@link ChannelBuffer}s into Java diff --git a/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java b/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java index 9759ecb5d2..a76f8d03db 100644 --- a/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/string/StringDecoder.java @@ -23,9 +23,9 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.channel.MessageEvent; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; +import io.netty.handler.codec.FrameDecoder; import io.netty.handler.codec.oneone.OneToOneDecoder; /** diff --git a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java index 3d227902ae..3dd75f9712 100644 --- a/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/string/StringEncoder.java @@ -25,8 +25,8 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.channel.MessageEvent; import io.netty.channel.ChannelHandler.Sharable; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.oneone.OneToOneEncoder; /** diff --git a/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayDecoderTest.java b/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayDecoderTest.java index a03575c9aa..a3797a25ab 100644 --- a/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayDecoderTest.java +++ b/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayDecoderTest.java @@ -15,13 +15,13 @@ */ package io.netty.handler.codec.bytes; -import static org.hamcrest.core.Is.is; -import static io.netty.buffer.ChannelBuffers.wrappedBuffer; -import static org.junit.Assert.assertThat; +import static io.netty.buffer.ChannelBuffers.*; +import static org.hamcrest.core.Is.*; +import static org.junit.Assert.*; +import io.netty.handler.codec.embedder.DecoderEmbedder; import java.util.Random; -import io.netty.handler.codec.embedder.DecoderEmbedder; import org.junit.Before; import org.junit.Test; @@ -35,27 +35,31 @@ public class ByteArrayDecoderTest { public void setUp() { embedder = new DecoderEmbedder(new ByteArrayDecoder()); } - - @Test - public void testDecode() { + + @Test + public void testDecode() { byte[] b = new byte[2048]; new Random().nextBytes(b); embedder.offer(wrappedBuffer(b)); assertThat(embedder.poll(), is(b)); - } - - @Test - public void testDecodeEmpty() { + } + + @Test + public void testDecodeEmpty() { byte[] b = new byte[0]; embedder.offer(wrappedBuffer(b)); assertThat(embedder.poll(), is(b)); - } - - @Test - public void testDecodeOtherType() { + } + + @Test + public void testDecodeOtherType() { String str = "Meep!"; embedder.offer(str); - assertThat(embedder.poll(), is((Object) str)); - } - + try { + embedder.poll(); + fail(); + } catch (ClassCastException e) { + // Expected + } + } } diff --git a/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayEncoderTest.java b/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayEncoderTest.java index d841e8c3f1..6d5e778177 100644 --- a/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayEncoderTest.java +++ b/codec/src/test/java/io/netty/handler/codec/bytes/ByteArrayEncoderTest.java @@ -15,14 +15,15 @@ */ package io.netty.handler.codec.bytes; -import static org.hamcrest.core.Is.is; -import static io.netty.buffer.ChannelBuffers.wrappedBuffer; -import static org.junit.Assert.assertThat; +import static io.netty.buffer.ChannelBuffers.*; +import static org.hamcrest.core.Is.*; +import static org.hamcrest.core.IsNull.*; +import static org.junit.Assert.*; +import io.netty.buffer.ChannelBuffer; +import io.netty.handler.codec.embedder.EncoderEmbedder; import java.util.Random; -import io.netty.buffer.ChannelBuffer; -import io.netty.handler.codec.embedder.EncoderEmbedder; import org.junit.Before; import org.junit.Test; @@ -38,25 +39,30 @@ public class ByteArrayEncoderTest { } @Test - public void testDecode() { + public void testEncode() { byte[] b = new byte[2048]; new Random().nextBytes(b); embedder.offer(b); assertThat(embedder.poll(), is(wrappedBuffer(b))); } - + @Test - public void testDecodeEmpty() { + public void testEncodeEmpty() { byte[] b = new byte[0]; embedder.offer(b); - assertThat(embedder.poll(), is(wrappedBuffer(b))); + assertThat(embedder.poll(), nullValue()); } @Test - public void testDecodeOtherType() { + public void testEncodeOtherType() { String str = "Meep!"; embedder.offer(str); - assertThat(embedder.poll(), is((Object) str)); + try { + embedder.poll(); + fail(); + } catch (ClassCastException e) { + // Expected + } } } diff --git a/codec/src/test/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoderTest.java b/codec/src/test/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoderTest.java index d183af4ae9..4f57243d2d 100644 --- a/codec/src/test/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoderTest.java +++ b/codec/src/test/java/io/netty/handler/codec/frame/DelimiterBasedFrameDecoderTest.java @@ -17,6 +17,9 @@ package io.netty.handler.codec.frame; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.embedder.CodecEmbedderException; import io.netty.handler.codec.embedder.DecoderEmbedder; import io.netty.util.CharsetUtil; diff --git a/codec/src/test/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoderTest.java b/codec/src/test/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoderTest.java index 5d756bc232..7ec6c8ece0 100644 --- a/codec/src/test/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoderTest.java +++ b/codec/src/test/java/io/netty/handler/codec/frame/LengthFieldBasedFrameDecoderTest.java @@ -17,6 +17,8 @@ package io.netty.handler.codec.frame; import io.netty.buffer.ChannelBuffer; import io.netty.buffer.ChannelBuffers; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.embedder.CodecEmbedderException; import io.netty.handler.codec.embedder.DecoderEmbedder; import io.netty.util.CharsetUtil; diff --git a/example/src/main/java/io/netty/example/echo/EchoClientHandler.java b/example/src/main/java/io/netty/example/echo/EchoClientHandler.java index 2fdaab679b..56a48d3c29 100644 --- a/example/src/main/java/io/netty/example/echo/EchoClientHandler.java +++ b/example/src/main/java/io/netty/example/echo/EchoClientHandler.java @@ -52,7 +52,7 @@ public class EchoClientHandler extends ChannelInboundHandlerAdapter { @Override public ChannelBufferHolder newInboundBuffer(ChannelInboundHandlerContext ctx) { - return ChannelBufferHolders.byteBuffer(ChannelBuffers.dynamicBuffer()); + return ChannelBufferHolders.byteBuffer(); } @Override diff --git a/example/src/main/java/io/netty/example/echo/EchoServerHandler.java b/example/src/main/java/io/netty/example/echo/EchoServerHandler.java index e91beac377..0b388b182b 100644 --- a/example/src/main/java/io/netty/example/echo/EchoServerHandler.java +++ b/example/src/main/java/io/netty/example/echo/EchoServerHandler.java @@ -16,7 +16,6 @@ package io.netty.example.echo; import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBuffers; import io.netty.channel.ChannelBufferHolder; import io.netty.channel.ChannelBufferHolders; import io.netty.channel.ChannelInboundHandlerAdapter; @@ -35,7 +34,7 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public ChannelBufferHolder newInboundBuffer(ChannelInboundHandlerContext ctx) { - return ChannelBufferHolders.byteBuffer(ChannelBuffers.dynamicBuffer()); + return ChannelBufferHolders.byteBuffer(); } @Override diff --git a/example/src/main/java/io/netty/example/factorial/BigIntegerDecoder.java b/example/src/main/java/io/netty/example/factorial/BigIntegerDecoder.java index 872a74b6f1..edc121e2e5 100644 --- a/example/src/main/java/io/netty/example/factorial/BigIntegerDecoder.java +++ b/example/src/main/java/io/netty/example/factorial/BigIntegerDecoder.java @@ -20,8 +20,8 @@ import java.math.BigInteger; import io.netty.buffer.ChannelBuffer; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.frame.CorruptedFrameException; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.handler.codec.CorruptedFrameException; +import io.netty.handler.codec.FrameDecoder; /** * Decodes the binary representation of a {@link BigInteger} prepended diff --git a/example/src/main/java/io/netty/example/factorial/FactorialClient.java b/example/src/main/java/io/netty/example/factorial/FactorialClient.java index 926bb7cb18..bae4dde3e6 100644 --- a/example/src/main/java/io/netty/example/factorial/FactorialClient.java +++ b/example/src/main/java/io/netty/example/factorial/FactorialClient.java @@ -57,7 +57,7 @@ public class FactorialClient { // Get the handler instance to retrieve the answer. FactorialClientHandler handler = - (FactorialClientHandler) channel.getPipeline().last(); + (FactorialClientHandler) channel.pipeline().last(); // Print out the answer. System.err.format( diff --git a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java index b01e0859ef..71e7565f28 100644 --- a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java +++ b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java @@ -46,7 +46,7 @@ import io.netty.channel.ExceptionEvent; import io.netty.channel.FileRegion; import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.frame.TooLongFrameException; +import io.netty.handler.codec.TooLongFrameException; import io.netty.handler.codec.http.DefaultHttpResponse; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; @@ -171,7 +171,7 @@ public class HttpStaticFileServerHandler extends SimpleChannelUpstreamHandler { // Write the content. ChannelFuture writeFuture; - if (ch.getPipeline().get(SslHandler.class) != null) { + if (ch.pipeline().get(SslHandler.class) != null) { // Cannot use zero-copy with HTTPS. writeFuture = ch.write(new ChunkedFile(raf, 0, fileLength, 8192)); } else { diff --git a/example/src/main/java/io/netty/example/local/LocalExample.java b/example/src/main/java/io/netty/example/local/LocalExample.java index fe40dfad5a..6935bc3e1c 100644 --- a/example/src/main/java/io/netty/example/local/LocalExample.java +++ b/example/src/main/java/io/netty/example/local/LocalExample.java @@ -52,7 +52,7 @@ public class LocalExample { // Set up the default server-side event pipeline. EchoServerHandler handler = new EchoServerHandler(); - sb.getPipeline().addLast("handler", handler); + sb.pipeline().addLast("handler", handler); // Start up the server. sb.bind(socketAddress); diff --git a/example/src/main/java/io/netty/example/localtime/LocalTimeClient.java b/example/src/main/java/io/netty/example/localtime/LocalTimeClient.java index de3d816adf..6bfc3b59bb 100644 --- a/example/src/main/java/io/netty/example/localtime/LocalTimeClient.java +++ b/example/src/main/java/io/netty/example/localtime/LocalTimeClient.java @@ -62,7 +62,7 @@ public class LocalTimeClient { // Get the handler instance to initiate the request. LocalTimeClientHandler handler = - channel.getPipeline().get(LocalTimeClientHandler.class); + channel.pipeline().get(LocalTimeClientHandler.class); // Request and get the response. List response = handler.getLocalTimes(cities); diff --git a/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java b/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java index 101744c0ac..7613d07693 100644 --- a/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java +++ b/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java @@ -26,10 +26,10 @@ import io.netty.example.factorial.FactorialServerHandler; import io.netty.example.factorial.NumberEncoder; import io.netty.example.http.snoop.HttpSnoopServerHandler; import io.netty.example.securechat.SecureChatSslContextFactory; +import io.netty.handler.codec.FrameDecoder; import io.netty.handler.codec.compression.ZlibDecoder; import io.netty.handler.codec.compression.ZlibEncoder; import io.netty.handler.codec.compression.ZlibWrapper; -import io.netty.handler.codec.frame.FrameDecoder; import io.netty.handler.codec.http.HttpContentCompressor; import io.netty.handler.codec.http.HttpRequestDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; @@ -120,7 +120,7 @@ public class PortUnificationServerHandler extends FrameDecoder { } private void enableSsl(ChannelHandlerContext ctx) { - ChannelPipeline p = ctx.getPipeline(); + ChannelPipeline p = ctx.pipeline(); SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine(); @@ -132,7 +132,7 @@ public class PortUnificationServerHandler extends FrameDecoder { } private void enableGzip(ChannelHandlerContext ctx) { - ChannelPipeline p = ctx.getPipeline(); + ChannelPipeline p = ctx.pipeline(); p.addLast("gzipdeflater", new ZlibEncoder(ZlibWrapper.GZIP)); p.addLast("gzipinflater", new ZlibDecoder(ZlibWrapper.GZIP)); p.addLast("unificationB", new PortUnificationServerHandler(detectSsl, false)); @@ -140,7 +140,7 @@ public class PortUnificationServerHandler extends FrameDecoder { } private void switchToHttp(ChannelHandlerContext ctx) { - ChannelPipeline p = ctx.getPipeline(); + ChannelPipeline p = ctx.pipeline(); p.addLast("decoder", new HttpRequestDecoder()); p.addLast("encoder", new HttpResponseEncoder()); p.addLast("deflater", new HttpContentCompressor()); @@ -149,7 +149,7 @@ public class PortUnificationServerHandler extends FrameDecoder { } private void switchToFactorial(ChannelHandlerContext ctx) { - ChannelPipeline p = ctx.getPipeline(); + ChannelPipeline p = ctx.pipeline(); p.addLast("decoder", new BigIntegerDecoder()); p.addLast("encoder", new NumberEncoder()); p.addLast("handler", new FactorialServerHandler()); diff --git a/example/src/main/java/io/netty/example/proxy/HexDumpProxyInboundHandler.java b/example/src/main/java/io/netty/example/proxy/HexDumpProxyInboundHandler.java index 89da070d38..f07a1163f4 100644 --- a/example/src/main/java/io/netty/example/proxy/HexDumpProxyInboundHandler.java +++ b/example/src/main/java/io/netty/example/proxy/HexDumpProxyInboundHandler.java @@ -59,7 +59,7 @@ public class HexDumpProxyInboundHandler extends SimpleChannelUpstreamHandler { // Start the connection attempt. ClientBootstrap cb = new ClientBootstrap(cf); - cb.getPipeline().addLast("handler", new OutboundHandler(e.channel())); + cb.pipeline().addLast("handler", new OutboundHandler(e.channel())); ChannelFuture f = cb.connect(new InetSocketAddress(remoteHost, remotePort)); outboundChannel = f.channel(); diff --git a/example/src/main/java/io/netty/example/securechat/SecureChatClientHandler.java b/example/src/main/java/io/netty/example/securechat/SecureChatClientHandler.java index a7ddd77911..0abfbf5cfe 100644 --- a/example/src/main/java/io/netty/example/securechat/SecureChatClientHandler.java +++ b/example/src/main/java/io/netty/example/securechat/SecureChatClientHandler.java @@ -48,7 +48,7 @@ public class SecureChatClientHandler extends SimpleChannelUpstreamHandler { ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { // Get the SslHandler from the pipeline // which were added in SecureChatPipelineFactory. - SslHandler sslHandler = ctx.getPipeline().get(SslHandler.class); + SslHandler sslHandler = ctx.pipeline().get(SslHandler.class); // Begin handshake. sslHandler.handshake(); diff --git a/example/src/main/java/io/netty/example/securechat/SecureChatClientPipelineFactory.java b/example/src/main/java/io/netty/example/securechat/SecureChatClientPipelineFactory.java index 170e774767..6f38532a4f 100644 --- a/example/src/main/java/io/netty/example/securechat/SecureChatClientPipelineFactory.java +++ b/example/src/main/java/io/netty/example/securechat/SecureChatClientPipelineFactory.java @@ -21,8 +21,8 @@ import javax.net.ssl.SSLEngine; import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipelineFactory; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.ssl.SslHandler; diff --git a/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler.java b/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler.java index eb33f53401..58cdd44533 100644 --- a/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler.java +++ b/example/src/main/java/io/netty/example/securechat/SecureChatServerHandler.java @@ -57,7 +57,7 @@ public class SecureChatServerHandler extends SimpleChannelUpstreamHandler { // Get the SslHandler in the current pipeline. // We added it in SecureChatPipelineFactory. - final SslHandler sslHandler = ctx.getPipeline().get(SslHandler.class); + final SslHandler sslHandler = ctx.pipeline().get(SslHandler.class); // Get notified when SSL handshake is done. ChannelFuture handshakeFuture = sslHandler.handshake(); diff --git a/example/src/main/java/io/netty/example/securechat/SecureChatServerPipelineFactory.java b/example/src/main/java/io/netty/example/securechat/SecureChatServerPipelineFactory.java index 6b951eeb36..031f7632b2 100644 --- a/example/src/main/java/io/netty/example/securechat/SecureChatServerPipelineFactory.java +++ b/example/src/main/java/io/netty/example/securechat/SecureChatServerPipelineFactory.java @@ -21,8 +21,8 @@ import javax.net.ssl.SSLEngine; import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipelineFactory; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.ssl.SslHandler; diff --git a/example/src/main/java/io/netty/example/stdio/StdioLogger.java b/example/src/main/java/io/netty/example/stdio/StdioLogger.java index bfb8ef07ae..4161fff009 100755 --- a/example/src/main/java/io/netty/example/stdio/StdioLogger.java +++ b/example/src/main/java/io/netty/example/stdio/StdioLogger.java @@ -29,8 +29,8 @@ import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelHandler; import io.netty.channel.iostream.IoStreamAddress; import io.netty.channel.iostream.IoStreamChannelFactory; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; diff --git a/example/src/main/java/io/netty/example/telnet/TelnetClientPipelineFactory.java b/example/src/main/java/io/netty/example/telnet/TelnetClientPipelineFactory.java index 4009345dde..1341c456a3 100644 --- a/example/src/main/java/io/netty/example/telnet/TelnetClientPipelineFactory.java +++ b/example/src/main/java/io/netty/example/telnet/TelnetClientPipelineFactory.java @@ -19,8 +19,8 @@ import static io.netty.channel.Channels.*; import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipelineFactory; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; diff --git a/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java b/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java index 9328ee3938..e09f902e99 100644 --- a/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java +++ b/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java @@ -19,8 +19,8 @@ import static io.netty.channel.Channels.*; import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipelineFactory; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; diff --git a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java index 3544c01d3d..5000957458 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java +++ b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java @@ -47,7 +47,7 @@ import io.netty.channel.DownstreamMessageEvent; import io.netty.channel.ExceptionEvent; import io.netty.channel.LifeCycleAwareChannelHandler; import io.netty.channel.MessageEvent; -import io.netty.handler.codec.frame.FrameDecoder; +import io.netty.handler.codec.FrameDecoder; import io.netty.logging.InternalLogger; import io.netty.logging.InternalLoggerFactory; import io.netty.util.internal.NonReentrantLock; diff --git a/handler/src/main/java/io/netty/handler/timeout/IdleStateHandler.java b/handler/src/main/java/io/netty/handler/timeout/IdleStateHandler.java index e8c0926d22..ad595e775f 100644 --- a/handler/src/main/java/io/netty/handler/timeout/IdleStateHandler.java +++ b/handler/src/main/java/io/netty/handler/timeout/IdleStateHandler.java @@ -224,7 +224,7 @@ public class IdleStateHandler extends SimpleChannelUpstreamHandler @Override public void beforeAdd(ChannelHandlerContext ctx) throws Exception { - if (ctx.getPipeline().isAttached()) { + if (ctx.pipeline().isAttached()) { // channelOpen event has been fired already, which means // this.channelOpen() will not be invoked. // We have to initialize here instead. diff --git a/handler/src/main/java/io/netty/handler/timeout/ReadTimeoutHandler.java b/handler/src/main/java/io/netty/handler/timeout/ReadTimeoutHandler.java index e1bb8e6290..0bc92089b9 100644 --- a/handler/src/main/java/io/netty/handler/timeout/ReadTimeoutHandler.java +++ b/handler/src/main/java/io/netty/handler/timeout/ReadTimeoutHandler.java @@ -138,7 +138,7 @@ public class ReadTimeoutHandler extends SimpleChannelUpstreamHandler @Override public void beforeAdd(ChannelHandlerContext ctx) throws Exception { - if (ctx.getPipeline().isAttached()) { + if (ctx.pipeline().isAttached()) { // channelOpen event has been fired already, which means // this.channelOpen() will not be invoked. // We have to initialize here instead. diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramMulticastTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramMulticastTest.java index 725c5d25c4..b9746ef124 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramMulticastTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramMulticastTest.java @@ -68,8 +68,8 @@ public abstract class AbstractDatagramMulticastTest { ConnectionlessBootstrap cb = new ConnectionlessBootstrap(newClientSocketChannelFactory(executor)); MulticastTestHandler mhandler = new MulticastTestHandler(); - cb.getPipeline().addFirst("handler", mhandler); - sb.getPipeline().addFirst("handler", new SimpleChannelUpstreamHandler()); + cb.pipeline().addFirst("handler", mhandler); + sb.pipeline().addFirst("handler", new SimpleChannelUpstreamHandler()); int port = TestUtils.getFreePort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramTest.java index 3d7194ddfb..b88e41eb44 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractDatagramTest.java @@ -63,7 +63,7 @@ public abstract class AbstractDatagramTest { ConnectionlessBootstrap cb = new ConnectionlessBootstrap(newClientSocketChannelFactory(executor)); final CountDownLatch latch = new CountDownLatch(1); - sb.getPipeline().addFirst("handler", new SimpleChannelUpstreamHandler() { + sb.pipeline().addFirst("handler", new SimpleChannelUpstreamHandler() { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { @@ -74,7 +74,7 @@ public abstract class AbstractDatagramTest { } }); - cb.getPipeline().addFirst("handler", new SimpleChannelUpstreamHandler()); + cb.pipeline().addFirst("handler", new SimpleChannelUpstreamHandler()); Channel sc = sb.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0)); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketClientBootstrapTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketClientBootstrapTest.java index d044a3d4e1..1cac8d63f3 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketClientBootstrapTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketClientBootstrapTest.java @@ -62,7 +62,7 @@ public abstract class AbstractSocketClientBootstrapTest { public void testFailedConnectionAttempt() throws Exception { ClientBootstrap bootstrap = new ClientBootstrap(); bootstrap.setFactory(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption("remoteAddress", new InetSocketAddress("255.255.255.255", 1)); ChannelFuture future = bootstrap.connect(); future.awaitUninterruptibly(); @@ -81,7 +81,7 @@ public abstract class AbstractSocketClientBootstrapTest { ClientBootstrap bootstrap = new ClientBootstrap(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption( "remoteAddress", new InetSocketAddress( @@ -118,7 +118,7 @@ public abstract class AbstractSocketClientBootstrapTest { ClientBootstrap bootstrap = new ClientBootstrap(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption( "remoteAddress", new InetSocketAddress( @@ -151,7 +151,7 @@ public abstract class AbstractSocketClientBootstrapTest { ChannelPipelineFactory pipelineFactory = EasyMock.createMock(ChannelPipelineFactory.class); bootstrap.setPipelineFactory(pipelineFactory); - EasyMock.expect(pipelineFactory.getPipeline()).andThrow(new ChannelPipelineException()); + EasyMock.expect(pipelineFactory.pipeline()).andThrow(new ChannelPipelineException()); EasyMock.replay(pipelineFactory); bootstrap.connect(new InetSocketAddress(SocketAddresses.LOCALHOST, 1)); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketCompatibleObjectStreamEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketCompatibleObjectStreamEchoTest.java index 1a08d5c75f..c202f4399c 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketCompatibleObjectStreamEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketCompatibleObjectStreamEchoTest.java @@ -84,13 +84,13 @@ public abstract class AbstractSocketCompatibleObjectStreamEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("decoder", new CompatibleObjectDecoder()); - sb.getPipeline().addLast("encoder", new CompatibleObjectEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("decoder", new CompatibleObjectDecoder()); + sb.pipeline().addLast("encoder", new CompatibleObjectEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("decoder", new CompatibleObjectDecoder()); - cb.getPipeline().addLast("encoder", new CompatibleObjectEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("decoder", new CompatibleObjectDecoder()); + cb.pipeline().addLast("encoder", new CompatibleObjectEncoder()); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketEchoTest.java index 7cfe72d431..8a9ab53b48 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketEchoTest.java @@ -75,8 +75,8 @@ public abstract class AbstractSocketEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addFirst("handler", sh); - cb.getPipeline().addFirst("handler", ch); + sb.pipeline().addFirst("handler", sh); + cb.pipeline().addFirst("handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketFixedLengthEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketFixedLengthEchoTest.java index febbd5517f..5281d464ea 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketFixedLengthEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketFixedLengthEchoTest.java @@ -37,7 +37,7 @@ import io.netty.channel.ChannelStateEvent; import io.netty.channel.ExceptionEvent; import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.frame.FixedLengthFrameDecoder; +import io.netty.handler.codec.FixedLengthFrameDecoder; import io.netty.util.SocketAddresses; import io.netty.util.internal.ExecutorUtil; import org.junit.AfterClass; @@ -76,10 +76,10 @@ public abstract class AbstractSocketFixedLengthEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); - sb.getPipeline().addAfter("decoder", "handler", sh); - cb.getPipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); - cb.getPipeline().addAfter("decoder", "handler", ch); + sb.pipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); + sb.pipeline().addAfter("decoder", "handler", sh); + cb.pipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); + cb.pipeline().addAfter("decoder", "handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketObjectStreamEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketObjectStreamEchoTest.java index eddd961a40..5e4983f3ed 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketObjectStreamEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketObjectStreamEchoTest.java @@ -84,15 +84,15 @@ public abstract class AbstractSocketObjectStreamEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("decoder", new ObjectDecoder( + sb.pipeline().addLast("decoder", new ObjectDecoder( ClassResolvers.cacheDisabled(getClass().getClassLoader()))); - sb.getPipeline().addLast("encoder", new ObjectEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("encoder", new ObjectEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("decoder", new ObjectDecoder( + cb.pipeline().addLast("decoder", new ObjectDecoder( ClassResolvers.cacheDisabled(getClass().getClassLoader()))); - cb.getPipeline().addLast("encoder", new ObjectEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("encoder", new ObjectEncoder()); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketServerBootstrapTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketServerBootstrapTest.java index 63438d2be7..b4b8afd77d 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketServerBootstrapTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketServerBootstrapTest.java @@ -121,11 +121,11 @@ public abstract class AbstractSocketServerBootstrapTest { bootstrap.setOption("child.receiveBufferSize", 9753); bootstrap.setOption("child.sendBufferSize", 8642); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); Channel channel = bootstrap.bind(); ParentChannelHandler pch = - channel.getPipeline().get(ParentChannelHandler.class); + channel.pipeline().get(ParentChannelHandler.class); Socket socket = null; try { @@ -183,7 +183,7 @@ public abstract class AbstractSocketServerBootstrapTest { ChannelPipelineFactory pipelineFactory = EasyMock.createMock(ChannelPipelineFactory.class); bootstrap.setPipelineFactory(pipelineFactory); - EasyMock.expect(pipelineFactory.getPipeline()).andThrow(new ChannelPipelineException()); + EasyMock.expect(pipelineFactory.pipeline()).andThrow(new ChannelPipelineException()); EasyMock.replay(pipelineFactory); bootstrap.connect(new InetSocketAddress(SocketAddresses.LOCALHOST, 1)); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketSslEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketSslEchoTest.java index e7a0a148c4..7134ef5610 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketSslEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketSslEchoTest.java @@ -113,14 +113,14 @@ public abstract class AbstractSocketSslEchoTest { sb.setOption("receiveBufferSize", 1048576); sb.setOption("receiveBufferSize", 1048576); - sb.getPipeline().addFirst("ssl", new SslHandler(sse)); - sb.getPipeline().addLast("handler", sh); - cb.getPipeline().addFirst("ssl", new SslHandler(cse)); - cb.getPipeline().addLast("handler", ch); + sb.pipeline().addFirst("ssl", new SslHandler(sse)); + sb.pipeline().addLast("handler", sh); + cb.pipeline().addFirst("ssl", new SslHandler(cse)); + cb.pipeline().addLast("handler", ch); if (isExecutorRequired()) { - sb.getPipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); - cb.getPipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); + sb.pipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); + cb.pipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); } Channel sc = sb.bind(new InetSocketAddress(0)); @@ -137,7 +137,7 @@ public abstract class AbstractSocketSslEchoTest { assertTrue(ccf.isSuccess()); Channel cc = ccf.channel(); - ChannelFuture hf = cc.getPipeline().get(SslHandler.class).handshake(); + ChannelFuture hf = cc.pipeline().get(SslHandler.class).handshake(); hf.awaitUninterruptibly(); if (!hf.isSuccess()) { logger.error("Handshake failed", hf.cause()); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketStringEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketStringEchoTest.java index 704dd9b050..06c466aa45 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketStringEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/AbstractSocketStringEchoTest.java @@ -35,8 +35,8 @@ import io.netty.channel.ChannelStateEvent; import io.netty.channel.ExceptionEvent; import io.netty.channel.MessageEvent; import io.netty.channel.SimpleChannelUpstreamHandler; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; @@ -86,15 +86,15 @@ public abstract class AbstractSocketStringEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); - sb.getPipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); - sb.getPipeline().addBefore("decoder", "encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); - sb.getPipeline().addAfter("decoder", "handler", sh); + sb.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); + sb.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); + sb.pipeline().addBefore("decoder", "encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); + sb.pipeline().addAfter("decoder", "handler", sh); - cb.getPipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); - cb.getPipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); - cb.getPipeline().addBefore("decoder", "encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); - cb.getPipeline().addAfter("decoder", "handler", ch); + cb.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); + cb.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); + cb.pipeline().addBefore("decoder", "encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); + cb.pipeline().addAfter("decoder", "handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioClientSocketShutdownTimeTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioClientSocketShutdownTimeTest.java index dc55d17305..53fe8b3d95 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioClientSocketShutdownTimeTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioClientSocketShutdownTimeTest.java @@ -39,7 +39,7 @@ public class NioClientSocketShutdownTimeTest { ClientBootstrap b = new ClientBootstrap( new NioClientSocketChannelFactory(Executors.newCachedThreadPool())); - b.getPipeline().addLast("handler", new DummyHandler()); + b.pipeline().addLast("handler", new DummyHandler()); long startTime; long stopTime; diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioServerSocketShutdownTimeTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioServerSocketShutdownTimeTest.java index 991d573699..229231fc95 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioServerSocketShutdownTimeTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/nio/NioServerSocketShutdownTimeTest.java @@ -43,7 +43,7 @@ public class NioServerSocketShutdownTimeTest { bootstrap.setOption("child.sendBufferSize", 8642); DummyHandler handler = new DummyHandler(); - bootstrap.getPipeline().addLast("dummy", handler); + bootstrap.pipeline().addLast("dummy", handler); Channel channel = bootstrap.bind(); diff --git a/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelClientChannel.java b/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelClientChannel.java index 0ffaff1f20..5f35c04a63 100644 --- a/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelClientChannel.java +++ b/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelClientChannel.java @@ -232,7 +232,7 @@ final class HttpTunnelClientChannel extends AbstractChannel implements void setTunnelIdForPollChannel() { HttpTunnelClientPollHandler pollHandler = - pollChannel.getPipeline() + pollChannel.pipeline() .get(HttpTunnelClientPollHandler.class); pollHandler.setTunnelId(tunnelId); } diff --git a/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelServerChannel.java b/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelServerChannel.java index f9d01115a3..d4b5f8ae06 100644 --- a/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelServerChannel.java +++ b/transport-http/src/main/java/io/netty/channel/socket/http/HttpTunnelServerChannel.java @@ -61,7 +61,7 @@ final class HttpTunnelServerChannel extends AbstractServerChannel implements realChannel = factory.createRealChannel(this, messageSwitch); // TODO fix calling of overrideable getPipeline() from constructor HttpTunnelServerChannelSink sink = - (HttpTunnelServerChannelSink) getPipeline().getSink(); + (HttpTunnelServerChannelSink) pipeline().getSink(); sink.setRealChannel(realChannel); sink.setCloseListener(CLOSE_FUTURE_PROXY); config = new HttpTunnelServerChannelConfig(realChannel); @@ -107,7 +107,7 @@ final class HttpTunnelServerChannel extends AbstractServerChannel implements String newTunnelId, InetSocketAddress remoteAddress) { ChannelPipeline childPipeline = null; try { - childPipeline = getConfig().getPipelineFactory().getPipeline(); + childPipeline = getConfig().getPipelineFactory().pipeline(); } catch (Exception e) { throw new ChannelPipelineException( "Failed to initialize a pipeline.", e); diff --git a/transport-http/src/test/java/io/netty/channel/socket/http/FakeServerSocketChannel.java b/transport-http/src/test/java/io/netty/channel/socket/http/FakeServerSocketChannel.java index f6f8162c42..d7a519d0ff 100644 --- a/transport-http/src/test/java/io/netty/channel/socket/http/FakeServerSocketChannel.java +++ b/transport-http/src/test/java/io/netty/channel/socket/http/FakeServerSocketChannel.java @@ -79,7 +79,7 @@ public class FakeServerSocketChannel extends AbstractChannel implements public FakeSocketChannel acceptNewConnection( InetSocketAddress remoteAddress, ChannelSink sink) throws Exception { ChannelPipeline newPipeline = - getConfig().getPipelineFactory().getPipeline(); + getConfig().getPipelineFactory().pipeline(); FakeSocketChannel newChannel = new FakeSocketChannel(this, getFactory(), newPipeline, sink); newChannel.localAddress = localAddress; diff --git a/transport-http/src/test/java/io/netty/channel/socket/http/HttpTunnelServerChannelFactoryTest.java b/transport-http/src/test/java/io/netty/channel/socket/http/HttpTunnelServerChannelFactoryTest.java index 684ebe2298..152609d2dc 100644 --- a/transport-http/src/test/java/io/netty/channel/socket/http/HttpTunnelServerChannelFactoryTest.java +++ b/transport-http/src/test/java/io/netty/channel/socket/http/HttpTunnelServerChannelFactoryTest.java @@ -68,7 +68,7 @@ public class HttpTunnelServerChannelFactoryTest { ChannelPipeline pipeline = Channels.pipeline(); HttpTunnelServerChannel newChannel = factory.newChannel(pipeline); assertNotNull(newChannel); - assertSame(pipeline, newChannel.getPipeline()); + assertSame(pipeline, newChannel.pipeline()); } @Test diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelImpl.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelImpl.java index 6c55a1bd83..1faa593c3c 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelImpl.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelImpl.java @@ -161,14 +161,14 @@ class SctpChannelImpl extends AbstractNioChannel implements SctpChannel { @Override public ChannelFuture bindAddress(InetAddress localAddress) { ChannelFuture future = future(this); - getPipeline().sendDownstream(new SctpBindAddressEvent(this, future, localAddress)); + pipeline().sendDownstream(new SctpBindAddressEvent(this, future, localAddress)); return future; } @Override public ChannelFuture unbindAddress(InetAddress localAddress) { ChannelFuture future = future(this); - getPipeline().sendDownstream(new SctpUnbindAddressEvent(this, future, localAddress)); + pipeline().sendDownstream(new SctpUnbindAddressEvent(this, future, localAddress)); return future; } diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java index 9a4ec240ec..1d0edf440f 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpNotificationHandler.java @@ -36,7 +36,7 @@ class SctpNotificationHandler extends AbstractNotificationHandler { SctpNotificationHandler(SctpChannelImpl sctpChannel) { this.sctpChannel = sctpChannel; - pipeline = sctpChannel.getPipeline(); + pipeline = sctpChannel.pipeline(); } @Override diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpServerChannelImpl.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpServerChannelImpl.java index 5b54e77922..7e540e3111 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpServerChannelImpl.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpServerChannelImpl.java @@ -91,14 +91,14 @@ class SctpServerChannelImpl extends AbstractServerChannel @Override public ChannelFuture bindAddress(InetAddress localAddress) { ChannelFuture future = future(this); - getPipeline().sendDownstream(new SctpBindAddressEvent(this, future, localAddress)); + pipeline().sendDownstream(new SctpBindAddressEvent(this, future, localAddress)); return future; } @Override public ChannelFuture unbindAddress(InetAddress localAddress) { ChannelFuture future = future(this); - getPipeline().sendDownstream(new SctpUnbindAddressEvent(this, future, localAddress)); + pipeline().sendDownstream(new SctpUnbindAddressEvent(this, future, localAddress)); return future; } diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java index 2c11779ead..0006dc919e 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java @@ -133,9 +133,9 @@ public class SctpWorker extends NioWorker { if (acceptedSocket != null) { ChannelPipeline pipeline = - channel.getConfig().getPipelineFactory().getPipeline(); + channel.getConfig().getPipelineFactory().pipeline(); registerTask(new SctpAcceptedChannel(channel.getFactory(), pipeline, channel, - channel.getPipeline().getSink(), acceptedSocket, this), null); + channel.pipeline().getSink(), acceptedSocket, this), null); return true; } return false; diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketClientBootstrapTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketClientBootstrapTest.java index 6215e840be..3ad1a13814 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketClientBootstrapTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketClientBootstrapTest.java @@ -69,9 +69,9 @@ public abstract class AbstractSocketClientBootstrapTest { ClientBootstrap bootstrap = new ClientBootstrap(); bootstrap.setFactory(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - bootstrap.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + bootstrap.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption("remoteAddress", new InetSocketAddress("255.255.255.255", 1)); ChannelFuture future = bootstrap.connect(); future.awaitUninterruptibly(); @@ -96,9 +96,9 @@ public abstract class AbstractSocketClientBootstrapTest { ClientBootstrap bootstrap = new ClientBootstrap(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - bootstrap.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + bootstrap.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption( "remoteAddress", new InetSocketAddress( @@ -140,7 +140,7 @@ public abstract class AbstractSocketClientBootstrapTest { ClientBootstrap bootstrap = new ClientBootstrap(newClientSocketChannelFactory(executor)); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); bootstrap.setOption( "remoteAddress", new InetSocketAddress( @@ -175,7 +175,7 @@ public abstract class AbstractSocketClientBootstrapTest { ChannelPipelineFactory pipelineFactory = EasyMock.createMock(ChannelPipelineFactory.class); bootstrap.setPipelineFactory(pipelineFactory); - EasyMock.expect(pipelineFactory.getPipeline()).andThrow(new ChannelPipelineException()); + EasyMock.expect(pipelineFactory.pipeline()).andThrow(new ChannelPipelineException()); EasyMock.replay(pipelineFactory); bootstrap.connect(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 1)); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketCompatibleObjectStreamEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketCompatibleObjectStreamEchoTest.java index 7866eaece1..964bfb2693 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketCompatibleObjectStreamEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketCompatibleObjectStreamEchoTest.java @@ -83,17 +83,17 @@ public abstract class AbstractSocketCompatibleObjectStreamEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("decoder", new CompatibleObjectDecoder()); - sb.getPipeline().addLast("encoder", new CompatibleObjectEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("decoder", new CompatibleObjectDecoder()); + sb.pipeline().addLast("encoder", new CompatibleObjectEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("decoder", new CompatibleObjectDecoder()); - cb.getPipeline().addLast("encoder", new CompatibleObjectEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("decoder", new CompatibleObjectDecoder()); + cb.pipeline().addLast("encoder", new CompatibleObjectEncoder()); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketEchoTest.java index 8678225f71..d5434c199f 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketEchoTest.java @@ -76,13 +76,13 @@ public abstract class AbstractSocketEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketFixedLengthEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketFixedLengthEchoTest.java index 84d1a5fbf8..692af1dfcb 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketFixedLengthEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketFixedLengthEchoTest.java @@ -22,7 +22,7 @@ import io.netty.buffer.ChannelBuffers; import io.netty.channel.*; import io.netty.channel.sctp.codec.SctpFrameDecoder; import io.netty.channel.sctp.codec.SctpFrameEncoder; -import io.netty.handler.codec.frame.FixedLengthFrameDecoder; +import io.netty.handler.codec.FixedLengthFrameDecoder; import io.netty.testsuite.util.SctpTestUtil; import io.netty.util.internal.ExecutorUtil; import org.junit.AfterClass; @@ -75,16 +75,16 @@ public abstract class AbstractSocketFixedLengthEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); - sb.getPipeline().addAfter("decoder", "handler", sh); + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); + sb.pipeline().addAfter("decoder", "handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); - cb.getPipeline().addAfter("decoder", "handler", ch); + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("decoder", new FixedLengthFrameDecoder(1024)); + cb.pipeline().addAfter("decoder", "handler", ch); Channel sc = sb.bind(new InetSocketAddress(0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketObjectStreamEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketObjectStreamEchoTest.java index 1adac81186..8d40f97051 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketObjectStreamEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketObjectStreamEchoTest.java @@ -89,19 +89,19 @@ public abstract class AbstractSocketObjectStreamEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("decoder", new ObjectDecoder( + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("decoder", new ObjectDecoder( ClassResolvers.cacheDisabled(getClass().getClassLoader()))); - sb.getPipeline().addLast("encoder", new ObjectEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("encoder", new ObjectEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("decoder", new ObjectDecoder( + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("decoder", new ObjectDecoder( ClassResolvers.cacheDisabled(getClass().getClassLoader()))); - cb.getPipeline().addLast("encoder", new ObjectEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("encoder", new ObjectEncoder()); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketServerBootstrapTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketServerBootstrapTest.java index 242c02feb5..0ebd8d9e34 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketServerBootstrapTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketServerBootstrapTest.java @@ -118,11 +118,11 @@ public abstract class AbstractSocketServerBootstrapTest { bootstrap.setOption("child.receiveBufferSize", 9753); bootstrap.setOption("child.sendBufferSize", 8642); - bootstrap.getPipeline().addLast("dummy", new DummyHandler()); + bootstrap.pipeline().addLast("dummy", new DummyHandler()); Channel channel = bootstrap.bind(); ParentChannelHandler pch = - channel.getPipeline().get(ParentChannelHandler.class); + channel.pipeline().get(ParentChannelHandler.class); SctpChannel sctpChannel = SctpChannel.open(); try { @@ -183,7 +183,7 @@ public abstract class AbstractSocketServerBootstrapTest { ChannelPipelineFactory pipelineFactory = EasyMock.createMock(ChannelPipelineFactory.class); bootstrap.setPipelineFactory(pipelineFactory); - EasyMock.expect(pipelineFactory.getPipeline()).andThrow(new ChannelPipelineException()); + EasyMock.expect(pipelineFactory.pipeline()).andThrow(new ChannelPipelineException()); EasyMock.replay(pipelineFactory); bootstrap.connect(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 1)); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketSslEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketSslEchoTest.java index ea10d6b39f..a4ccea0e39 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketSslEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketSslEchoTest.java @@ -102,19 +102,19 @@ public abstract class AbstractSocketSslEchoTest { cse.setUseClientMode(true); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("ssl", new SslHandler(sse)); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("ssl", new SslHandler(sse)); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("ssl", new SslHandler(cse)); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("ssl", new SslHandler(cse)); + cb.pipeline().addLast("handler", ch); if (isExecutorRequired()) { - sb.getPipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); - cb.getPipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); + sb.pipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); + cb.pipeline().addFirst("executor", new ExecutionHandler(eventExecutor)); } Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); @@ -129,7 +129,7 @@ public abstract class AbstractSocketSslEchoTest { assertTrue(ccf.isSuccess()); Channel cc = ccf.channel(); - ChannelFuture hf = cc.getPipeline().get(SslHandler.class).handshake(); + ChannelFuture hf = cc.pipeline().get(SslHandler.class).handshake(); hf.awaitUninterruptibly(); if (!hf.isSuccess()) { logger.error("Handshake failed", hf.cause()); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketStringEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketStringEchoTest.java index cbdf706c47..154ae76717 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketStringEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/AbstractSocketStringEchoTest.java @@ -20,8 +20,8 @@ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.sctp.codec.SctpFrameDecoder; import io.netty.channel.sctp.codec.SctpFrameEncoder; -import io.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import io.netty.handler.codec.frame.Delimiters; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.testsuite.util.SctpTestUtil; @@ -85,19 +85,19 @@ public abstract class AbstractSocketStringEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addFirst("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addFirst("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); - sb.getPipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); - sb.getPipeline().addLast("encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addFirst("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addFirst("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); + sb.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); + sb.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addFirst("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addFirst("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); - cb.getPipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); - cb.getPipeline().addLast("encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addFirst("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addFirst("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(512, Delimiters.lineDelimiter())); + cb.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.ISO_8859_1)); + cb.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.ISO_8859_1)); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiHomingEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiHomingEchoTest.java index 3eb472ddb8..14f4934138 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiHomingEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiHomingEchoTest.java @@ -92,13 +92,13 @@ public class SctpMultiHomingEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - sb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + sb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("sctp-decoder", new SctpFrameDecoder()); - cb.getPipeline().addLast("sctp-encoder", new SctpFrameEncoder()); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("sctp-decoder", new SctpFrameDecoder()); + cb.pipeline().addLast("sctp-encoder", new SctpFrameEncoder()); + cb.pipeline().addLast("handler", ch); SctpServerChannel serverChannel = (SctpServerChannel) sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = serverChannel.getLocalAddress().getPort(); diff --git a/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiStreamingEchoTest.java b/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiStreamingEchoTest.java index 3c87ff82fd..51747e53db 100644 --- a/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiStreamingEchoTest.java +++ b/transport-sctp/src/test/java/io/netty/testsuite/transport/sctp/SctpMultiStreamingEchoTest.java @@ -92,9 +92,9 @@ public class SctpMultiStreamingEchoTest { EchoHandler sh = new EchoHandler(); EchoHandler ch = new EchoHandler(); - sb.getPipeline().addLast("handler", sh); + sb.pipeline().addLast("handler", sh); - cb.getPipeline().addLast("handler", ch); + cb.pipeline().addLast("handler", ch); Channel sc = sb.bind(new InetSocketAddress(SctpTestUtil.LOOP_BACK, 0)); int port = ((InetSocketAddress) sc.getLocalAddress()).getPort(); diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index dd6e3fcdc1..d5d07f3999 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -76,6 +76,8 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha private final ChannelFuture voidFuture = new VoidChannelFuture(this); private final CloseFuture closeFuture = new CloseFuture(this); + private volatile SocketAddress localAddress; + private volatile SocketAddress remoteAddress; private volatile EventLoop eventLoop; private volatile boolean registered; @@ -153,6 +155,42 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha return eventLoop; } + @Override + public SocketAddress localAddress() { + SocketAddress localAddress = this.localAddress; + if (localAddress == null) { + try { + this.localAddress = localAddress = unsafe().localAddress(); + } catch (Throwable t) { + // Sometimes fails on a closed socket in Windows. + return null; + } + } + return localAddress; + } + + protected void invalidateLocalAddress() { + localAddress = null; + } + + @Override + public SocketAddress remoteAddress() { + SocketAddress remoteAddress = this.remoteAddress; + if (remoteAddress == null) { + try { + this.remoteAddress = remoteAddress = unsafe().remoteAddress(); + } catch (Throwable t) { + // Sometimes fails on a closed socket in Windows. + return null; + } + } + return remoteAddress; + } + + protected void invalidateRemoteAddress() { + remoteAddress = null; + } + @Override public boolean isOpen() { return unsafe().ch().isOpen(); diff --git a/transport/src/main/java/io/netty/channel/ChannelBufferHolders.java b/transport/src/main/java/io/netty/channel/ChannelBufferHolders.java index d94c9988f4..f9d7dc5637 100644 --- a/transport/src/main/java/io/netty/channel/ChannelBufferHolders.java +++ b/transport/src/main/java/io/netty/channel/ChannelBufferHolders.java @@ -1,15 +1,26 @@ package io.netty.channel; import io.netty.buffer.ChannelBuffer; +import io.netty.buffer.ChannelBuffers; +import java.util.ArrayDeque; import java.util.Queue; public final class ChannelBufferHolders { + public static ChannelBufferHolder messageBuffer() { + return messageBuffer(new ArrayDeque()); + } + public static ChannelBufferHolder messageBuffer(Queue buffer) { return new ChannelBufferHolder(buffer); } + public static ChannelBufferHolder byteBuffer() { + // TODO: Use more efficient implementation. + return byteBuffer(ChannelBuffers.dynamicBuffer()); + } + public static ChannelBufferHolder byteBuffer(ChannelBuffer buffer) { return new ChannelBufferHolder(buffer); } diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index 11e209a7e0..0235e01e7f 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -580,6 +580,10 @@ public class DefaultChannelPipeline implements ChannelPipeline { @Override public ChannelBufferHolder out() { + DefaultChannelHandlerContext ctx = firstOutboundContext(); + if (ctx != null) { + return ctx.prevOut(); + } return channel().unsafe().out(); } @@ -899,12 +903,17 @@ public class DefaultChannelPipeline implements ChannelPipeline { } validateFuture(future); - if (message instanceof ChannelBuffer) { + if (out().hasMessageBuffer()) { + out().messageBuffer().add(message); + } else if (message instanceof ChannelBuffer) { ChannelBuffer m = (ChannelBuffer) message; out().byteBuffer().writeBytes(m, m.readerIndex(), m.readableBytes()); } else { - out().messageBuffer().add(message); + throw new IllegalArgumentException( + "cannot write a message whose type is not " + + ChannelBuffer.class.getSimpleName() + ": " + message.getClass().getName())); } + return flush(future); } diff --git a/transport/src/main/java/io/netty/channel/ServerChannelBootstrap.java b/transport/src/main/java/io/netty/channel/ServerChannelBootstrap.java index 2470929c30..2dd0c680b7 100644 --- a/transport/src/main/java/io/netty/channel/ServerChannelBootstrap.java +++ b/transport/src/main/java/io/netty/channel/ServerChannelBootstrap.java @@ -7,7 +7,6 @@ import io.netty.util.SocketAddresses; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.channels.ClosedChannelException; -import java.util.ArrayDeque; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -166,7 +165,7 @@ public class ServerChannelBootstrap { private class Acceptor extends ChannelInboundHandlerAdapter { @Override public ChannelBufferHolder newInboundBuffer(ChannelInboundHandlerContext ctx) { - return ChannelBufferHolders.messageBuffer(new ArrayDeque()); + return ChannelBufferHolders.messageBuffer(); } @Override diff --git a/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannel.java b/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannel.java index 0c987bdb5e..5163bdf5bc 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannel.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannel.java @@ -19,17 +19,12 @@ import io.netty.channel.AbstractChannel; import io.netty.channel.Channel; import io.netty.channel.EventLoop; -import java.net.InetSocketAddress; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; public abstract class AbstractNioChannel extends AbstractChannel { private final SelectableChannel ch; - - private volatile InetSocketAddress localAddress; - private volatile InetSocketAddress remoteAddress; - private volatile SelectionKey selectionKey; protected AbstractNioChannel(Channel parent, Integer id, SelectableChannel ch) { @@ -47,36 +42,6 @@ public abstract class AbstractNioChannel extends AbstractChannel { return selectionKey; } - @Override - public InetSocketAddress localAddress() { - InetSocketAddress localAddress = this.localAddress; - if (localAddress == null) { - try { - this.localAddress = localAddress = - (InetSocketAddress) unsafe().localAddress(); - } catch (Throwable t) { - // Sometimes fails on a closed socket in Windows. - return null; - } - } - return localAddress; - } - - @Override - public InetSocketAddress remoteAddress() { - InetSocketAddress remoteAddress = this.remoteAddress; - if (remoteAddress == null) { - try { - this.remoteAddress = remoteAddress = - (InetSocketAddress) unsafe().remoteAddress(); - } catch (Throwable t) { - // Sometimes fails on a closed socket in Windows. - return null; - } - } - return remoteAddress; - } - @Override protected boolean isCompatible(EventLoop loop) { return loop instanceof SingleThreadSelectorEventLoop; diff --git a/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java b/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java index 727ec63e39..04ff8dcf16 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/NioSocketChannel.java @@ -16,7 +16,6 @@ package io.netty.channel.socket.nio; import io.netty.buffer.ChannelBuffer; -import io.netty.buffer.ChannelBuffers; import io.netty.channel.Channel; import io.netty.channel.ChannelBufferHolder; import io.netty.channel.ChannelBufferHolders; @@ -36,7 +35,7 @@ public class NioSocketChannel extends AbstractNioChannel implements io.netty.cha private static final InternalLogger logger = InternalLoggerFactory.getInstance(NioSocketChannel.class); private final SocketChannelConfig config; - private final ChannelBufferHolder out = ChannelBufferHolders.byteBuffer(ChannelBuffers.dynamicBuffer()); + private final ChannelBufferHolder out = ChannelBufferHolders.byteBuffer(); private static SocketChannel newSocket() { try {