Skip to content

Commit

Permalink
Merge pull request #18 from spotify/krka/completionstage
Browse files Browse the repository at this point in the history
Add CompletableFuturesExtra.toListenableFuture(CompletionStage)
  • Loading branch information
spkrka committed Nov 11, 2015
2 parents da64237 + 802111d commit 0939ee9
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
13 changes: 13 additions & 0 deletions src/main/java/com/spotify/futures/CompletableFuturesExtra.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.google.common.util.concurrent.ListenableFuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

public class CompletableFuturesExtra {

Expand Down Expand Up @@ -50,6 +51,18 @@ public static <V> CompletableFuture<V> toCompletableFuture(
*/
public static <V> ListenableFuture<V> toListenableFuture(
CompletableFuture<V> future) {
return toListenableFuture((CompletionStage<V>) future);
}

/**
* Wrap a {@link CompletionStage} in a {@link ListenableFuture}. The returned future will
* complete with the same result or failure as the original future.
*
* @param future The {@link CompletionStage} to wrap in a {@link ListenableFuture}.
* @return A {@link ListenableFuture} that completes when the original future completes.
*/
public static <V> ListenableFuture<V> toListenableFuture(
CompletionStage<V> future) {
if (future instanceof ListenableToCompletableFutureWrapper) {
return ((ListenableToCompletableFutureWrapper<V>) future).unwrap();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,22 @@
import com.google.common.util.concurrent.ListenableFuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.BiConsumer;

class CompletableToListenableFutureWrapper<V>
extends AbstractFuture<V>
implements ListenableFuture<V>, BiConsumer<V, Throwable> {

private final CompletableFuture<V> future;
private final CompletionStage<V> future;

CompletableToListenableFutureWrapper(final CompletableFuture<V> future) {
CompletableToListenableFutureWrapper(final CompletionStage<V> future) {
this.future = future;
future.whenComplete(this);
}

public CompletableFuture<V> unwrap() {
return future;
return future.toCompletableFuture();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.mockito.runners.MockitoJUnitRunner;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ExecutionException;
import java.util.function.BiConsumer;

Expand Down Expand Up @@ -49,6 +50,13 @@ public void testToCompletableFutureUnwrap() {
assertThat(unwrapped, is(sameInstance(listenable)));
}

@Test
public void testToCompletableFutureUnwrapWithStage() {
final CompletionStage<String> wrapped = toCompletableFuture(listenable);
final ListenableFuture<String> unwrapped = toListenableFuture(wrapped);
assertThat(unwrapped, is(sameInstance(listenable)));
}

@Test
public void testToCompletableFutureSuccess() throws ExecutionException, InterruptedException {
@SuppressWarnings("unchecked") final BiConsumer<String, Throwable> consumer = mock(BiConsumer.class);
Expand Down

0 comments on commit 0939ee9

Please sign in to comment.