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; }
private <T> CompletionStage<T> execute(final SphereRequest<T> sphereRequest, final String token) { final HttpRequest httpRequest = createHttpRequest(sphereRequest, token); final SphereInternalLogger logger = getLogger(httpRequest); logger.debug(() -> sphereRequest); logger.trace(() -> { final String output; if (httpRequest.getBody() != null && httpRequest.getBody() instanceof StringHttpRequestBody) { final StringHttpRequestBody body = (StringHttpRequestBody) httpRequest.getBody(); final String unformattedJson = body.getSecuredBody(); output = "send: " + unformattedJson + "\nformatted: " + SphereJsonUtils.prettyPrint(unformattedJson); } else { output = "no request body present"; } return output; }); return httpClient.execute(httpRequest).thenApply(httpResponse -> { try { return processHttpResponse(sphereRequest, objectMapper, config, httpResponse); } catch (final SphereException e) { fillExceptionWithData(sphereRequest, httpResponse, e, config); throw e; } }); }