package edu.uw.zookeeper.netty;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import edu.uw.zookeeper.common.Promise;
import edu.uw.zookeeper.common.PromiseTask;
public class ChannelFutureWrapper<V> extends PromiseTask<ChannelFuture, V> implements ChannelFutureListener {
public static <V> ChannelFutureWrapper<V> of(
ChannelFuture future,
V result) {
Promise<V> promise = newPromise();
return of(future, result, promise);
}
public static <V> ChannelFutureWrapper<V> of(
ChannelFuture future,
V result,
Promise<V> promise) {
ChannelFutureWrapper<V> wrapper = new ChannelFutureWrapper<V>(future, result, promise);
future.addListener(wrapper);
return wrapper;
}
protected final V result;
protected ChannelFutureWrapper(ChannelFuture future, V result, Promise<V> promise) {
super(future, promise);
this.result = result;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
if (super.cancel(mayInterruptIfRunning)) {
return task.cancel(mayInterruptIfRunning);
}
return false;
}
@Override
public void operationComplete(ChannelFuture future) {
assert (future.isDone());
if (future.isSuccess()) {
set(result);
} else {
if (future.isCancelled()) {
cancel(true);
} else {
setException(future.cause());
}
}
}
}