From 037f351efd26ea924684440f9b8ea19954d8815b Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 14 Jan 2016 16:47:55 -0500 Subject: [PATCH] Replace anonymous impls with ListenableFutureAdapater Before this change AsyncRestTemplate had two anonymous implementations of ListenableFuture that were adapting the result. Those have been replaces with ListenableFutureAdapter. This commit is preparation for SPR-13785. --- .../web/client/AsyncRestTemplate.java | 141 ++++-------------- 1 file changed, 31 insertions(+), 110 deletions(-) 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