diff --git a/transport/src/main/java/io/netty/channel/ChannelFuture.java b/transport/src/main/java/io/netty/channel/ChannelFuture.java index a464d04bcb..8649bbbd7d 100644 --- a/transport/src/main/java/io/netty/channel/ChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/ChannelFuture.java @@ -250,6 +250,14 @@ public interface ChannelFuture extends Future { */ ChannelFuture addListener(ChannelFutureListener listener); + /** + * Adds the specified listeners to this future. The + * specified listeners are notified when this future is + * {@linkplain #isDone() done}. If this future is already + * completed, the specified listeners are notified immediately. + */ + ChannelFuture addListeners(ChannelFutureListener... listeners); + /** * Removes the specified listener from this future. * The specified listener is no longer notified when this @@ -259,6 +267,15 @@ public interface ChannelFuture extends Future { */ ChannelFuture removeListener(ChannelFutureListener listener); + /** + * Removes the specified listeners from this future. + * The specified listeners are no longer notified when this + * future is {@linkplain #isDone() done}. If the specified + * listeners are not associated with this future, this method + * does nothing and returns silently. + */ + ChannelFuture removeListeners(ChannelFutureListener... listeners); + /** * Waits for this future until it is done, and rethrows the cause of the failure if this future * failed. If the cause of the failure is a checked exception, it is wrapped with a new diff --git a/transport/src/main/java/io/netty/channel/CompleteChannelFuture.java b/transport/src/main/java/io/netty/channel/CompleteChannelFuture.java index 8aef62c3a1..b1fc7bb5d9 100644 --- a/transport/src/main/java/io/netty/channel/CompleteChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/CompleteChannelFuture.java @@ -46,12 +46,32 @@ public abstract class CompleteChannelFuture implements ChannelFuture { return this; } + @Override + public ChannelFuture addListeners(ChannelFutureListener... listeners) { + if (listeners == null) { + throw new NullPointerException("listeners"); + } + for (ChannelFutureListener l: listeners) { + if (l == null) { + break; + } + DefaultChannelFuture.notifyListener(this, l); + } + return this; + } + @Override public ChannelFuture removeListener(ChannelFutureListener listener) { // NOOP return this; } + @Override + public ChannelFuture removeListeners(ChannelFutureListener... listeners) { + // NOOP + return this; + } + @Override public ChannelFuture await() throws InterruptedException { if (Thread.interrupted()) { diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java b/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java index a41e393686..2a9d583d6c 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelFuture.java @@ -143,6 +143,21 @@ public class DefaultChannelFuture extends FlushCheckpoint implements ChannelFutu return this; } + @Override + public ChannelFuture addListeners(ChannelFutureListener... listeners) { + if (listeners == null) { + throw new NullPointerException("listeners"); + } + + for (ChannelFutureListener l: listeners) { + if (l == null) { + break; + } + addListener(l); + } + return this; + } + @Override public ChannelFuture removeListener(ChannelFutureListener listener) { if (listener == null) { @@ -170,6 +185,21 @@ public class DefaultChannelFuture extends FlushCheckpoint implements ChannelFutu return this; } + @Override + public ChannelFuture removeListeners(ChannelFutureListener... listeners) { + if (listeners == null) { + throw new NullPointerException("listeners"); + } + + for (ChannelFutureListener l: listeners) { + if (l == null) { + break; + } + removeListener(l); + } + return this; + } + @Override public ChannelFuture sync() throws InterruptedException { await(); diff --git a/transport/src/main/java/io/netty/channel/VoidChannelFuture.java b/transport/src/main/java/io/netty/channel/VoidChannelFuture.java index c9c8a7f2f2..abfae676a0 100644 --- a/transport/src/main/java/io/netty/channel/VoidChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/VoidChannelFuture.java @@ -41,12 +41,24 @@ public class VoidChannelFuture implements ChannelFuture.Unsafe { return this; } + @Override + public ChannelFuture addListeners(final ChannelFutureListener... listeners) { + fail(); + return this; + } + @Override public ChannelFuture removeListener(ChannelFutureListener listener) { // NOOP return this; } + @Override + public ChannelFuture removeListeners(ChannelFutureListener... listeners) { + // NOOP + return this; + } + @Override public ChannelFuture await() throws InterruptedException { if (Thread.interrupted()) {