package dials.dropwizard.client; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.filter.GZIPContentEncodingFilter; import com.sun.jersey.client.apache4.ApacheHttpClient4; import com.sun.jersey.client.apache4.ApacheHttpClient4Handler; import com.sun.jersey.client.apache4.config.ApacheHttpClient4Config; import com.sun.jersey.client.apache4.config.DefaultApacheHttpClient4Config; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class DialsClientBuilder { private final URI baseURI; private ExecutorService executorService; private Client client; private DialsClientBuilder(URI baseURI) { this.baseURI = baseURI; } public static DialsClientBuilder withURI(String uri) throws URISyntaxException { return withURI(new URI(uri)); } public static DialsClientBuilder withURI(URI uri) { return new DialsClientBuilder(uri); } public DialsClientBuilder withClient(Client client) { this.client = client; return this; } public DialsClientBuilder withExecutorService(ExecutorService executorService) { this.executorService = executorService; return this; } public DialsClient build() { return new DialsClientImpl(determineClient(), baseURI); } private Client determineClient() { return this.client == null ? buildDefaultClient() : this.client; } private ExecutorService determineExecutorService() { return this.executorService == null ? Executors.newCachedThreadPool() : this.executorService; } private Client buildDefaultClient() { Client client = new ApacheHttpClient4(buildClientHandler(buildHttpClient()), buildClientConfig()); client.setExecutorService(determineExecutorService()); client.addFilter(new GZIPContentEncodingFilter(true)); return client; } private ApacheHttpClient4Config buildClientConfig() { ApacheHttpClient4Config clientConfig = new DefaultApacheHttpClient4Config(); ObjectMapper objectMapper = buildObjectMapper(); clientConfig.getSingletons().add(new JacksonJaxbJsonProvider(objectMapper, null)); return clientConfig; } private ObjectMapper buildObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return objectMapper; } private ApacheHttpClient4Handler buildClientHandler(HttpClient httpClient) { return new ApacheHttpClient4Handler(httpClient, null, true); } private HttpClient buildHttpClient() { return HttpClientBuilder.create().build(); } }