package org.gbif.occurrence.processor.guice; import org.gbif.occurrence.processor.interpreting.util.ObjectMapperContextResolver; import org.gbif.utils.HttpUtil; import java.net.URI; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import com.beust.jcommander.Parameter; import com.google.common.base.Objects; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.json.JSONConfiguration; import com.sun.jersey.client.apache4.ApacheHttpClient4; import com.sun.jersey.client.apache4.ApacheHttpClient4Handler; import org.apache.http.client.HttpClient; import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ApiClientConfiguration { private static final Logger LOG = LoggerFactory.getLogger(ApiClientConfiguration.class); /** * The base URL to the GBIF API. */ @Parameter(names = "--api-url") @NotNull public URI url; /** * http timeout in milliseconds. */ @Parameter(names = "--api-timeout") @Min(10) public int timeout = 3000; /** * maximum allowed parallel http connections. */ @Parameter(names = "--max-connections") @Min(10) public int maxConnections = 100; /** * @return a new jersey client using a multithreaded http client */ public WebResource newApiClient() { ClientConfig cc = new DefaultClientConfig(); cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); cc.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, timeout); cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, timeout); cc.getClasses().add(JacksonJsonProvider.class); // use custom configured object mapper ignoring unknown properties cc.getClasses().add(ObjectMapperContextResolver.class); HttpClient http = HttpUtil.newMultithreadedClient(timeout, maxConnections, maxConnections); ApacheHttpClient4Handler hch = new ApacheHttpClient4Handler(http, null, false); Client client = new ApacheHttpClient4(hch, cc); LOG.info("Connecting to GBIF API: {}", url); return client.resource(url); } @Override public String toString() { return Objects.toStringHelper(this) .add("url", url) .add("timeout", timeout) .add("maxConnections", maxConnections) .toString(); } }