All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.freemanan.starter.grpc.extensions.jsontranscoder.FutureAdapter Maven / Gradle / Ivy

package com.freemanan.starter.grpc.extensions.jsontranscoder;

import static com.google.common.util.concurrent.MoreExecutors.directExecutor;

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.CompletableFuture;

/**
 * {@link CompletableFuture} adapter for {@link ListenableFuture}.
 *
 * @param  The type of the future result
 */
public class FutureAdapter {

    private final CompletableFuture completableFuture;

    private FutureAdapter(ListenableFuture listenableFuture) {
        this.completableFuture = new CompletableFuture() {
            @Override
            public boolean cancel(boolean mayInterruptIfRunning) {
                boolean cancelled = listenableFuture.cancel(mayInterruptIfRunning);
                super.cancel(cancelled);
                return cancelled;
            }
        };

        Futures.addCallback(
                listenableFuture,
                new FutureCallback() {
                    @Override
                    public void onSuccess(T result) {
                        completableFuture.complete(result);
                    }

                    @Override
                    public void onFailure(Throwable ex) {
                        completableFuture.completeExceptionally(ex);
                    }
                },
                directExecutor());
    }

    private CompletableFuture getCompletableFuture() {
        return completableFuture;
    }

    /**
     * Converts a {@link ListenableFuture} to a {@link CompletableFuture}.
     *
     * @param listenableFuture The listenable future to adapt
     * @param               The type of the future result
     * @return The adapted {@link CompletableFuture}
     */
    public static  CompletableFuture toCompletable(ListenableFuture listenableFuture) {
        FutureAdapter listenableFutureAdapter = new FutureAdapter<>(listenableFuture);
        return listenableFutureAdapter.getCompletableFuture();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy