package com.searchly.jestdroid;
import io.searchbox.client.config.ClientConfig;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthenticationStrategy;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.BasicCredentialsProviderHC4;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.impl.conn.SystemDefaultRoutePlanner;
import java.net.ProxySelector;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* @author cihat.keser
*/
public class DroidClientConfig extends ClientConfig {
private final Integer maxTotalConnection;
private final Integer defaultMaxTotalConnectionPerRoute;
private final Map<HttpRoute, Integer> maxTotalConnectionPerRoute;
private final CredentialsProvider credentialsProvider;
private final LayeredConnectionSocketFactory sslSocketFactory;
private final ConnectionSocketFactory plainSocketFactory;
private final HttpRoutePlanner httpRoutePlanner;
private final AuthenticationStrategy proxyAuthenticationStrategy;
public DroidClientConfig(Builder builder) {
super(builder);
this.maxTotalConnection = builder.maxTotalConnection;
this.defaultMaxTotalConnectionPerRoute = builder.defaultMaxTotalConnectionPerRoute;
this.maxTotalConnectionPerRoute = builder.maxTotalConnectionPerRoute;
this.credentialsProvider = builder.credentialsProvider;
this.plainSocketFactory = builder.plainSocketFactory;
this.sslSocketFactory = builder.sslSocketFactory;
this.httpRoutePlanner = builder.httpRoutePlanner;
this.proxyAuthenticationStrategy = builder.proxyAuthenticationStrategy;
}
public Map<HttpRoute, Integer> getMaxTotalConnectionPerRoute() {
return maxTotalConnectionPerRoute;
}
public Integer getMaxTotalConnection() {
return maxTotalConnection;
}
public Integer getDefaultMaxTotalConnectionPerRoute() {
return defaultMaxTotalConnectionPerRoute;
}
public CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
}
public LayeredConnectionSocketFactory getSslSocketFactory() {
return sslSocketFactory;
}
public ConnectionSocketFactory getPlainSocketFactory() {
return plainSocketFactory;
}
public HttpRoutePlanner getHttpRoutePlanner() {
return httpRoutePlanner;
}
public AuthenticationStrategy getProxyAuthenticationStrategy() {
return proxyAuthenticationStrategy;
}
public static class Builder extends ClientConfig.AbstractBuilder<DroidClientConfig, Builder> {
private Integer maxTotalConnection;
private Integer defaultMaxTotalConnectionPerRoute;
private Map<HttpRoute, Integer> maxTotalConnectionPerRoute = new HashMap<HttpRoute, Integer>();
private CredentialsProvider credentialsProvider;
private LayeredConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
private ConnectionSocketFactory plainSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
private HttpRoutePlanner httpRoutePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());
private AuthenticationStrategy proxyAuthenticationStrategy;
public Builder(DroidClientConfig httpClientConfig) {
super(httpClientConfig);
this.maxTotalConnection = httpClientConfig.maxTotalConnection;
this.defaultMaxTotalConnectionPerRoute = httpClientConfig.defaultMaxTotalConnectionPerRoute;
this.maxTotalConnectionPerRoute = httpClientConfig.maxTotalConnectionPerRoute;
}
public Builder(Collection<String> serverUris) {
super(serverUris);
}
public Builder(String serverUri) {
super(serverUri);
}
public Builder maxTotalConnection(int maxTotalConnection) {
this.maxTotalConnection = maxTotalConnection;
return this;
}
public Builder defaultMaxTotalConnectionPerRoute(int defaultMaxTotalConnectionPerRoute) {
this.defaultMaxTotalConnectionPerRoute = defaultMaxTotalConnectionPerRoute;
return this;
}
public Builder maxTotalConnectionPerRoute(Map<HttpRoute, Integer> maxTotalConnectionPerRoute) {
this.maxTotalConnectionPerRoute.putAll(maxTotalConnectionPerRoute);
return this;
}
public Builder maxTotalConnectionPerRoute(HttpRoute httpRoute, int maxTotalConnection) {
this.maxTotalConnectionPerRoute.put(httpRoute, maxTotalConnection);
return this;
}
/**
* Set a custom instance of an implementation of <code>CredentialsProvider</code>.
* This method will override any previous credential setting (including <code>defaultCredentials</code>) on this builder instance.
*/
public Builder credentialsProvider(CredentialsProvider credentialsProvider) {
this.credentialsProvider = credentialsProvider;
return this;
}
public Builder defaultCredentials(String username, String password) {
this.credentialsProvider = new BasicCredentialsProviderHC4();
this.credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(username, password)
);
return this;
}
/**
*
* @param socketFactory The socket factory instance that will be registered for <code>https</code> scheme.
*/
public Builder sslSocketFactory(LayeredConnectionSocketFactory socketFactory) {
this.sslSocketFactory = socketFactory;
return this;
}
/**
*
* @param socketFactory The socket factory instance that will be registered for <code>http</code> scheme.
*/
public Builder plainSocketFactory(ConnectionSocketFactory socketFactory) {
this.plainSocketFactory = socketFactory;
return this;
}
public Builder proxy(HttpHost proxy) {
return proxy(proxy, null);
}
public Builder proxy(HttpHost proxy, AuthenticationStrategy proxyAuthenticationStrategy) {
this.httpRoutePlanner = new DefaultProxyRoutePlanner(proxy);
this.proxyAuthenticationStrategy = proxyAuthenticationStrategy;
return this;
}
public DroidClientConfig build() {
return new DroidClientConfig(this);
}
}
}