From a75dcb275665a4cf621088d6665e60d0f2f189e0 Mon Sep 17 00:00:00 2001 From: Travis Haagen Date: Mon, 1 Feb 2016 15:07:28 -0800 Subject: [PATCH] Made it easier to use custom ChannelId instances with Channel implementations that rely on the AbstractChannel(Channel parent) constructor. Motivation: The AbstractChannel(Channel parent) constructor was previously hard-coded to always call DefaultChannelId.newInstance(), and this made it difficult to use a custom ChannelId implementation with some commonly used Channel implementations. Modifications: Introduced newId() method in AbstractChannel, which by default returns DefaultChannelId.newInstance() but can be overridden by subclasses. Added ensureDefaultChannelId() test to AbstractChannelTest, to ensure the prior behavior of calling DefaultChannelId.newInstance() still holds with the AbstractChannel(Channel parent) constructor. Result: AbstractChannel now has the protected newId() method, but there is no functional difference. --- .../main/java/io/netty/channel/AbstractChannel.java | 10 +++++++++- .../java/io/netty/channel/AbstractChannelTest.java | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index ab8084adaf..269c69b38b 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -78,7 +78,7 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha */ protected AbstractChannel(Channel parent) { this.parent = parent; - id = DefaultChannelId.newInstance(); + id = newId(); unsafe = newUnsafe(); pipeline = new DefaultChannelPipeline(this); } @@ -101,6 +101,14 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha return id; } + /** + * Returns a new {@link DefaultChannelId} instance. Subclasses may override this method to assign custom + * {@link ChannelId}s to {@link Channel}s that use the {@link AbstractChannel#AbstractChannel(Channel)} constructor. + */ + protected ChannelId newId() { + return DefaultChannelId.newInstance(); + } + @Override public boolean isWritable() { ChannelOutboundBuffer buf = unsafe.outboundBuffer(); diff --git a/transport/src/test/java/io/netty/channel/AbstractChannelTest.java b/transport/src/test/java/io/netty/channel/AbstractChannelTest.java index 0c44f1f5ce..a788f76a2b 100644 --- a/transport/src/test/java/io/netty/channel/AbstractChannelTest.java +++ b/transport/src/test/java/io/netty/channel/AbstractChannelTest.java @@ -22,6 +22,8 @@ import org.easymock.IAnswer; import org.junit.Test; import static org.easymock.EasyMock.*; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; public class AbstractChannelTest { @@ -90,6 +92,13 @@ public class AbstractChannelTest { verify(handler); } + @Test + public void ensureDefaultChannelId() { + TestChannel channel = new TestChannel(); + final ChannelId channelId = channel.id(); + assertThat(channelId, instanceOf(DefaultChannelId.class)); + } + private static void registerChannel(EventLoop eventLoop, Channel channel) throws Exception { DefaultChannelPromise future = new DefaultChannelPromise(channel); channel.unsafe().register(eventLoop, future);