From f3c940d20810635cda3e6c0f19ec3a9f621fe1ed Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Tue, 28 Aug 2012 13:03:41 +0900 Subject: [PATCH] Add ChannelPipeline.first/lastContext() / Cleanup --- .../io/netty/channel/ChannelPipeline.java | 14 +++ .../netty/channel/DefaultChannelPipeline.java | 89 ++++++++++--------- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/transport/src/main/java/io/netty/channel/ChannelPipeline.java b/transport/src/main/java/io/netty/channel/ChannelPipeline.java index f812d937ab..f33595dce0 100644 --- a/transport/src/main/java/io/netty/channel/ChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/ChannelPipeline.java @@ -454,6 +454,13 @@ public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundI */ ChannelHandler first(); + /** + * Returns the context of the first {@link ChannelHandler} in this pipeline. + * + * @return the context of the first handler. {@code null} if this pipeline is empty. + */ + ChannelHandlerContext firstContext(); + /** * Returns the last {@link ChannelHandler} in this pipeline. * @@ -461,6 +468,13 @@ public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundI */ ChannelHandler last(); + /** + * Returns the context of the last {@link ChannelHandler} in this pipeline. + * + * @return the context of the last handler. {@code null} if this pipeline is empty. + */ + ChannelHandlerContext lastContext(); + /** * Returns the {@link ChannelHandler} with the specified name in this * pipeline. diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index 7b8bd6a092..bf6d4aea66 100755 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -743,7 +743,7 @@ public class DefaultChannelPipeline implements ChannelPipeline { } @Override - public synchronized ChannelHandler first() { + public ChannelHandler first() { DefaultChannelHandlerContext first = head.next; if (first == null) { return null; @@ -752,7 +752,12 @@ public class DefaultChannelPipeline implements ChannelPipeline { } @Override - public synchronized ChannelHandler last() { + public ChannelHandlerContext firstContext() { + return head.next; + } + + @Override + public ChannelHandler last() { DefaultChannelHandlerContext last = tail; if (last == head || last == null) { return null; @@ -761,8 +766,17 @@ public class DefaultChannelPipeline implements ChannelPipeline { } @Override - public synchronized ChannelHandler get(String name) { - DefaultChannelHandlerContext ctx = name2ctx.get(name); + public ChannelHandlerContext lastContext() { + DefaultChannelHandlerContext last = tail; + if (last == head || last == null) { + return null; + } + return last; + } + + @Override + public ChannelHandler get(String name) { + ChannelHandlerContext ctx = context(name); if (ctx == null) { return null; } else { @@ -771,7 +785,7 @@ public class DefaultChannelPipeline implements ChannelPipeline { } @Override - public synchronized T get(Class handlerType) { + public T get(Class handlerType) { ChannelHandlerContext ctx = context(handlerType); if (ctx == null) { return null; @@ -781,93 +795,78 @@ public class DefaultChannelPipeline implements ChannelPipeline { } @Override - public synchronized ChannelHandlerContext context(String name) { + public ChannelHandlerContext context(String name) { if (name == null) { throw new NullPointerException("name"); } - return name2ctx.get(name); + + synchronized (this) { + return name2ctx.get(name); + } } @Override - public synchronized ChannelHandlerContext context(ChannelHandler handler) { + public ChannelHandlerContext context(ChannelHandler handler) { if (handler == null) { throw new NullPointerException("handler"); } - if (name2ctx.isEmpty()) { - return null; - } - DefaultChannelHandlerContext ctx = head; + + DefaultChannelHandlerContext ctx = head.next; for (;;) { + if (ctx == null) { + return null; + } + if (ctx.handler() == handler) { return ctx; } ctx = ctx.next; - if (ctx == null) { - break; - } } - return null; } @Override - public synchronized ChannelHandlerContext context( - Class handlerType) { + public ChannelHandlerContext context(Class handlerType) { if (handlerType == null) { throw new NullPointerException("handlerType"); } - if (name2ctx.isEmpty()) { - return null; - } DefaultChannelHandlerContext ctx = head.next; for (;;) { + if (ctx == null) { + return null; + } if (handlerType.isAssignableFrom(ctx.handler().getClass())) { return ctx; } - ctx = ctx.next; - if (ctx == null) { - break; - } } - return null; } @Override public List names() { List list = new ArrayList(); - if (name2ctx.isEmpty()) { - return list; - } - DefaultChannelHandlerContext ctx = head.next; for (;;) { + if (ctx == null) { + return list; + } list.add(ctx.name()); ctx = ctx.next; - if (ctx == null) { - break; - } } - return list; } @Override public Map toMap() { Map map = new LinkedHashMap(); - if (name2ctx.isEmpty()) { - return map; - } - DefaultChannelHandlerContext ctx = head.next; for (;;) { + if (ctx == null) { + return map; + } map.put(ctx.name(), ctx.handler()); ctx = ctx.next; - if (ctx == null) { - break; - } } - return map; } /** @@ -880,15 +879,21 @@ public class DefaultChannelPipeline implements ChannelPipeline { buf.append('{'); DefaultChannelHandlerContext ctx = head.next; for (;;) { + if (ctx == null) { + break; + } + buf.append('('); buf.append(ctx.name()); buf.append(" = "); buf.append(ctx.handler().getClass().getName()); buf.append(')'); + ctx = ctx.next; if (ctx == null) { break; } + buf.append(", "); } buf.append('}');