package com.supaham.commons.utils; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; import javax.annotation.Nonnull; /** * Utility methods for working with {@link Future} instances. This class contains methods such as * {@link #onSuccess(ListenableFuture, SuccessCallback)}, * {@link #onFailure(ListenableFuture, FailureCallback)}, and more. * * @since 0.3.3 */ public class CommonFutures { public static <V> CommonFutureBuilder<V> builder(@Nonnull ListenableFuture<V> future) { Preconditions.checkNotNull(future, "future cannot be null."); return new CommonFutureBuilder<>(future); } @Nonnull public static <V> ListenableFuture<V> onSuccess(@Nonnull final ListenableFuture<V> future, @Nonnull final SuccessCallback<V> callback) { Preconditions.checkNotNull(future, "future cannot be null."); Preconditions.checkNotNull(callback, "callback cannot be null."); Futures.addCallback(future, new FutureCallback<V>() { @Override public void onSuccess(V result) { callback.success(result); } @Override public void onFailure(Throwable t) {} }); return future; } @Nonnull public static <V> ListenableFuture<V> onFailure(@Nonnull final ListenableFuture<V> future, @Nonnull final FailureCallback callback) { Preconditions.checkNotNull(future, "future cannot be null."); Preconditions.checkNotNull(callback, "callback cannot be null."); Futures.addCallback(future, new FutureCallback<V>() { @Override public void onSuccess(V result) {} @Override public void onFailure(@Nonnull Throwable t) { callback.failure(t); } }); return future; } public interface SuccessCallback<V> { void success(V result); } public interface FailureCallback { void failure(Throwable t); } public static final class CommonFutureBuilder<V> { private final ListenableFuture<V> future; private CommonFutureBuilder(ListenableFuture<V> future) { this.future = future; } public ListenableFuture<V> get() { return this.future; } public CommonFutureBuilder<V> onSuccess(@Nonnull final SuccessCallback<V> callback) { CommonFutures.onSuccess(this.future, callback); return this; } public CommonFutureBuilder<V> onFailure(@Nonnull final FailureCallback callback) { CommonFutures.onFailure(this.future, callback); return this; } } }