package com.github.bingoohuang.springrestclient.utils; import com.mashape.unirest.http.HttpResponse; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class VoidFuture implements Future<Void>, ResponseAware { private final Future<HttpResponse<?>> future; private final RestReq restReq; private HttpResponse<?> response; public VoidFuture(Future<HttpResponse<?>> future, final RestReq restReq) { this.future = future; this.restReq = restReq; } @Override public boolean cancel(boolean mayInterruptIfRunning) { return future.cancel(mayInterruptIfRunning); } @Override public boolean isCancelled() { return future.isCancelled(); } @Override public boolean isDone() { return future.isDone(); } @Override public Void get() throws InterruptedException, ExecutionException { return processReturnVoid(future.get()); } @Override public Void get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return processReturnVoid(future.get(timeout, unit)); } private Void processReturnVoid(HttpResponse<?> response) throws ExecutionException { this.response = response; if (restReq.isSuccessful(response)) return null; try { throw restReq.processStatusExceptionMappings(response); } catch (Throwable throwable) { throw new ExecutionException(throwable); } } @Override public HttpResponse<?> getResponse() { if (response != null) return response; try { return future.get(); } catch (Exception e) { throw new RuntimeException(e); } } }