package io.vertx.ext.unit.impl;

import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.Promise;
import io.vertx.ext.unit.Completion;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

Author:Julien Viet
/** * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */
public class CompletionImpl<T> implements Completion<T> { protected final CompletableFuture<T> completable = new CompletableFuture<>(); @Override public void resolve(Promise<T> future) { completable.whenComplete((done, err) -> { if (err != null) { future.fail(err); } else { future.complete(); } }); } @Override public void resolve(Future future) { completable.whenComplete((done, err) -> { if (err != null) { future.fail(err); } else { future.complete(); } }); } @Override public boolean isCompleted() { return completable.isDone(); } @Override public boolean isSucceeded() { return isCompleted() && !isFailed(); } @Override public boolean isFailed() { return completable.isCompletedExceptionally(); } @Override public void handler(Handler<AsyncResult<T>> completionHandler) { Promise<T> completion = Promise.promise(); completion.future().setHandler(completionHandler); resolve(completion); } @Override public void await() { try { completable.get(); } catch (ExecutionException ignore) { } catch (InterruptedException e) { Thread.currentThread().interrupt(); Helper.uncheckedThrow(e); } } @Override public void await(long timeoutMillis) { try { completable.get(timeoutMillis, TimeUnit.MILLISECONDS); } catch (ExecutionException ignore) { } catch (InterruptedException e) { Thread.currentThread().interrupt(); Helper.uncheckedThrow(e); } catch (TimeoutException e) { Helper.uncheckedThrow(new TimeoutException("Timed out")); } } @Override public void awaitSuccess() { try { completable.get(); } catch (ExecutionException result) { Helper.uncheckedThrow(result.getCause()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); Helper.uncheckedThrow(e); } } @Override public void awaitSuccess(long timeoutMillis) { try { completable.get(timeoutMillis, TimeUnit.MILLISECONDS); } catch (ExecutionException result) { Helper.uncheckedThrow(result.getCause()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); Helper.uncheckedThrow(e); } catch (TimeoutException e) { Helper.uncheckedThrow(new TimeoutException("Timed out")); } } }