/* * Copyright 2018 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.util.concurrent; import io.netty.util.internal.ObjectUtil; import io.netty.util.internal.StringUtil; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; final class RunnableFutureAdapter implements RunnableFuture { private final Promise promise; private final Callable task; RunnableFutureAdapter(Promise promise, Callable task) { this.promise = ObjectUtil.checkNotNull(promise, "promise"); this.task = ObjectUtil.checkNotNull(task, "task"); } @Override public boolean isSuccess() { return promise.isSuccess(); } @Override public boolean isCancellable() { return promise.isCancellable(); } @Override public Throwable cause() { return promise.cause(); } @Override public RunnableFuture addListener(GenericFutureListener> listener) { promise.addListener(listener); return this; } @Override public RunnableFuture addListeners(GenericFutureListener>... listeners) { promise.addListeners(listeners); return this; } @Override public RunnableFuture removeListener(GenericFutureListener> listener) { promise.removeListener(listener); return this; } @Override public RunnableFuture removeListeners(GenericFutureListener>... listeners) { promise.removeListeners(listeners); return this; } @Override public RunnableFuture sync() throws InterruptedException { promise.sync(); return this; } @Override public RunnableFuture syncUninterruptibly() { promise.syncUninterruptibly(); return this; } @Override public RunnableFuture await() throws InterruptedException { promise.await(); return this; } @Override public RunnableFuture awaitUninterruptibly() { promise.awaitUninterruptibly(); return this; } @Override public boolean await(long timeout, TimeUnit unit) throws InterruptedException { return promise.await(timeout, unit); } @Override public boolean await(long timeoutMillis) throws InterruptedException { return promise.await(timeoutMillis); } @Override public boolean awaitUninterruptibly(long timeout, TimeUnit unit) { return promise.awaitUninterruptibly(timeout, unit); } @Override public boolean awaitUninterruptibly(long timeoutMillis) { return promise.awaitUninterruptibly(timeoutMillis); } @Override public V getNow() { return promise.getNow(); } @Override public void run() { try { if (promise.setUncancellable()) { V result = task.call(); promise.setSuccess(result); } } catch (Throwable e) { promise.setFailure(e); } } @Override public boolean cancel(boolean mayInterruptIfRunning) { return promise.cancel(mayInterruptIfRunning); } @Override public boolean isCancelled() { return promise.isCancelled(); } @Override public boolean isDone() { return promise.isDone(); } @Override public V get() throws InterruptedException, ExecutionException { return promise.get(); } @Override public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return promise.get(timeout, unit); } @Override public String toString() { StringBuilder buf = new StringBuilder(64) .append(StringUtil.simpleClassName(this)) .append('@') .append(Integer.toHexString(hashCode())); if (!isDone()) { buf.append("(incomplete)"); } else { Throwable cause = cause(); if (cause != null) { buf.append("(failure: ") .append(cause) .append(')'); } else { Object result = getNow(); if (result == null) { buf.append("(success)"); } else { buf.append("(success: ") .append(result) .append(')'); } } } return buf.append(" task: ") .append(task) .append(')').toString(); } }