
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