private CompletionStage<AuthenticationResponse> mapSubject(AuthenticationResponse prevResponse) { ProviderRequest providerRequest = new ProviderRequest(context, request.resources(), request.requestEntity(), request.responseEntity()); if (prevResponse.status() == SecurityResponse.SecurityStatus.SUCCESS) { return security.subjectMapper() .map(mapper -> mapper.map(providerRequest, prevResponse)) .orElseGet(() -> CompletableFuture.completedFuture(prevResponse)) .thenApply(newResponse -> { // intentionally checking for instance equality, as that means we are guaranteed no changes if (newResponse == prevResponse) { // no changes were done, response as is return prevResponse; } else { newResponse.user().ifPresent(context::setUser); newResponse.service().ifPresent(context::setService); return newResponse; } }); } else { return CompletableFuture.completedFuture(prevResponse); } }