package combo; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.GsonHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.net.URI; import java.util.Collections; import static java.net.URI.create; import static java.util.Collections.singletonList; public final class ComboFactory { public static Combo httpCombo(final URI baseUrl) { return new HttpCombo(restTemplate(baseUrl)); } private ComboFactory() { } private static RestTemplate restTemplate(final URI baseUrl) { final RestTemplate restTemplate = new RestTemplate(Collections.<HttpMessageConverter<?>>singletonList(new GsonHttpMessageConverter())); restTemplate.getInterceptors().add(new BaseUrlInterceptor(baseUrl)); return restTemplate; } private static final class BaseUrlInterceptor implements ClientHttpRequestInterceptor { private final URI baseUri; private BaseUrlInterceptor(final URI baseUri) { this.baseUri = baseUri; } @Override public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { return execution.execute(new BaseUriRequestDecorator(request, baseUri), body); } private static final class BaseUriRequestDecorator implements HttpRequest { private final HttpRequest request; private final URI baseUri; private BaseUriRequestDecorator(final HttpRequest request, final URI baseUri) { this.request = request; this.baseUri = baseUri; } @Override public HttpMethod getMethod() { return request.getMethod(); } @Override public URI getURI() { return create(baseUri + request.getURI().toString()); } @Override public HttpHeaders getHeaders() { return request.getHeaders(); } } } }