diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java index 12ac4045723..3f835db5407 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java @@ -24,8 +24,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.task.AsyncListenableTaskExecutor; @@ -44,11 +42,8 @@ import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.client.support.InterceptingAsyncHttpAccessor; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.util.Assert; -import org.springframework.util.concurrent.FailureCallback; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFutureCallback; -import org.springframework.util.concurrent.SuccessCallback; import org.springframework.web.util.DefaultUriTemplateHandler; import org.springframework.web.util.UriTemplateHandler; @@ -245,75 +240,37 @@ public class AsyncRestTemplate extends InterceptingAsyncHttpAccessor implements // POST @Override - public ListenableFuture postForLocation(String url, HttpEntity request, Object... uriVariables) + public ListenableFuture postForLocation(String url, HttpEntity request, Object... uriVars) throws RestClientException { - AsyncRequestCallback requestCallback = httpEntityCallback(request); - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = - execute(url, HttpMethod.POST, requestCallback, headersExtractor, uriVariables); - return extractLocationHeader(headersFuture); + AsyncRequestCallback callback = httpEntityCallback(request); + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.POST, callback, extractor, uriVars); + return adaptToLocationHeader(future); } @Override - public ListenableFuture postForLocation(String url, HttpEntity request, Map uriVariables) + public ListenableFuture postForLocation(String url, HttpEntity request, Map uriVars) throws RestClientException { - AsyncRequestCallback requestCallback = httpEntityCallback(request); - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = - execute(url, HttpMethod.POST, requestCallback, headersExtractor, uriVariables); - return extractLocationHeader(headersFuture); + AsyncRequestCallback callback = httpEntityCallback(request); + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.POST, callback, extractor, uriVars); + return adaptToLocationHeader(future); } @Override public ListenableFuture postForLocation(URI url, HttpEntity request) throws RestClientException { - AsyncRequestCallback requestCallback = httpEntityCallback(request); - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = - execute(url, HttpMethod.POST, requestCallback, headersExtractor); - return extractLocationHeader(headersFuture); + AsyncRequestCallback callback = httpEntityCallback(request); + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.POST, callback, extractor); + return adaptToLocationHeader(future); } - private static ListenableFuture extractLocationHeader(final ListenableFuture headersFuture) { - return new ListenableFuture() { + private static ListenableFuture adaptToLocationHeader(ListenableFuture future) { + return new ListenableFutureAdapter(future) { @Override - public void addCallback(final ListenableFutureCallback callback) { - addCallback(callback, callback); - } - @Override - public void addCallback(final SuccessCallback successCallback, final FailureCallback failureCallback) { - headersFuture.addCallback(new ListenableFutureCallback() { - @Override - public void onSuccess(HttpHeaders result) { - successCallback.onSuccess(result.getLocation()); - } - @Override - public void onFailure(Throwable ex) { - failureCallback.onFailure(ex); - } - }); - } - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return headersFuture.cancel(mayInterruptIfRunning); - } - @Override - public boolean isCancelled() { - return headersFuture.isCancelled(); - } - @Override - public boolean isDone() { - return headersFuture.isDone(); - } - @Override - public URI get() throws InterruptedException, ExecutionException { - HttpHeaders headers = headersFuture.get(); - return headers.getLocation(); - } - @Override - public URI get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - HttpHeaders headers = headersFuture.get(timeout, unit); + protected URI adapt(HttpHeaders headers) throws ExecutionException { return headers.getLocation(); } }; @@ -389,71 +346,35 @@ public class AsyncRestTemplate extends InterceptingAsyncHttpAccessor implements // OPTIONS @Override - public ListenableFuture> optionsForAllow(String url, Object... uriVariables) throws RestClientException { - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = execute(url, HttpMethod.OPTIONS, null, headersExtractor, uriVariables); - return extractAllowHeader(headersFuture); + public ListenableFuture> optionsForAllow(String url, Object... uriVars) throws RestClientException { + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.OPTIONS, null, extractor, uriVars); + return adaptToAllowHeader(future); } @Override - public ListenableFuture> optionsForAllow(String url, Map uriVariables) throws RestClientException { - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = execute(url, HttpMethod.OPTIONS, null, headersExtractor, uriVariables); - return extractAllowHeader(headersFuture); + public ListenableFuture> optionsForAllow(String url, Map uriVars) throws RestClientException { + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.OPTIONS, null, extractor, uriVars); + return adaptToAllowHeader(future); } @Override public ListenableFuture> optionsForAllow(URI url) throws RestClientException { - ResponseExtractor headersExtractor = headersExtractor(); - ListenableFuture headersFuture = execute(url, HttpMethod.OPTIONS, null, headersExtractor); - return extractAllowHeader(headersFuture); + ResponseExtractor extractor = headersExtractor(); + ListenableFuture future = execute(url, HttpMethod.OPTIONS, null, extractor); + return adaptToAllowHeader(future); } - private static ListenableFuture> extractAllowHeader(final ListenableFuture headersFuture) { - return new ListenableFuture>() { + private static ListenableFuture> adaptToAllowHeader(ListenableFuture future) { + return new ListenableFutureAdapter, HttpHeaders>(future) { @Override - public void addCallback(final ListenableFutureCallback> callback) { - addCallback(callback, callback); - } - @Override - public void addCallback(final SuccessCallback> successCallback, final FailureCallback failureCallback) { - headersFuture.addCallback(new ListenableFutureCallback() { - @Override - public void onSuccess(HttpHeaders result) { - successCallback.onSuccess(result.getAllow()); - } - @Override - public void onFailure(Throwable ex) { - failureCallback.onFailure(ex); - } - }); - } - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return headersFuture.cancel(mayInterruptIfRunning); - } - @Override - public boolean isCancelled() { - return headersFuture.isCancelled(); - } - @Override - public boolean isDone() { - return headersFuture.isDone(); - } - @Override - public Set get() throws InterruptedException, ExecutionException { - HttpHeaders headers = headersFuture.get(); - return headers.getAllow(); - } - @Override - public Set get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - HttpHeaders headers = headersFuture.get(timeout, unit); + protected Set adapt(HttpHeaders headers) throws ExecutionException { return headers.getAllow(); } }; } - // exchange @Override