@Override public <T> CompletableFuture<T> execute(final SphereRequest<T> sphereRequest) { final CompletableFuture<String> tokenFuture = tokenSupplier.get(); return tokenFuture.thenCompose(token -> execute(sphereRequest, token)); }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { final CompletionStage<String> tokenFuture = tokenSupplier.get(); return tokenFuture.thenCompose(token -> execute(sphereRequest, token)); }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { rejectExcutionIfClosed("Client is already closed."); try { final int ttl = 1; return tokenSupplier.get().thenComposeAsync(token -> execute(sphereRequest, token, ttl)); } catch (final Throwable throwable) { return CompletableFutureUtils.failed(throwable); } }
@Override public <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest) { rejectExcutionIfClosed("Client is already closed."); try { final int ttl = 1; return tokenSupplier.get().thenComposeAsync(token -> execute(sphereRequest, token, ttl)); } catch (final Throwable throwable) { return CompletableFutureUtils.failed(throwable); } }
private <T> CompletableFuture<T> executeWithRecover(final SphereRequest<T> sphereRequest, final HttpRequest httpRequest, final int ttl) { final CompletionStage<T> intermediateResult = httpClient.execute(httpRequest).thenApplyAsync(httpResponse -> { try { return processHttpResponse(sphereRequest, objectMapper, config, httpResponse, httpRequest); } catch (final SphereException e) { fillExceptionWithData(sphereRequest, httpResponse, e, config, httpRequest); throw e; } }); final CompletableFuture<T> result = new CompletableFuture<T>(); intermediateResult.whenCompleteAsync((value, throwable) -> { if (throwable != null) { if (throwable.getCause() instanceof InvalidTokenException && ttl > 0 && tokenSupplier instanceof RefreshableSphereAccessTokenSupplier) { final RefreshableSphereAccessTokenSupplier supplier = (RefreshableSphereAccessTokenSupplier) tokenSupplier; final CompletionStage<T> nextAttemptCompletionStage = supplier.getNewToken().thenComposeAsync(token -> execute(sphereRequest, token, ttl - 1)); CompletableFutureUtils.transferResult(nextAttemptCompletionStage, result); } else { result.completeExceptionally(throwable); } } else { result.complete(value); } }); return result; }
private <T> CompletableFuture<T> executeWithRecover(final SphereRequest<T> sphereRequest, final HttpRequest httpRequest, final int ttl) { final CompletionStage<T> intermediateResult = httpClient.execute(httpRequest).thenApplyAsync(httpResponse -> { try { return processHttpResponse(sphereRequest, objectMapper, config, httpResponse, httpRequest); } catch (final SphereException e) { fillExceptionWithData(sphereRequest, httpResponse, e, config, httpRequest); throw e; } }); final CompletableFuture<T> result = new CompletableFuture<T>(); intermediateResult.whenCompleteAsync((value, throwable) -> { if (throwable != null) { if (throwable.getCause() instanceof InvalidTokenException && ttl > 0 && tokenSupplier instanceof RefreshableSphereAccessTokenSupplier) { final RefreshableSphereAccessTokenSupplier supplier = (RefreshableSphereAccessTokenSupplier) tokenSupplier; final CompletionStage<T> nextAttemptCompletionStage = supplier.getNewToken().thenComposeAsync(token -> execute(sphereRequest, token, ttl - 1)); CompletableFutureUtils.transferResult(nextAttemptCompletionStage, result); } else { result.completeExceptionally(throwable); } } else { result.complete(value); } }); return result; }