package com.searchly.jestdroid;
import com.google.gson.Gson;
import io.searchbox.client.JestClient;
import io.searchbox.client.config.discovery.NodeChecker;
import io.searchbox.client.config.idle.IdleConnectionReaper;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedHashSet;
import java.util.Map;
/**
* @author cihat.keser
*/
public class JestClientFactory {
final static Logger log = LoggerFactory.getLogger(JestClientFactory.class);
private DroidClientConfig droidClientConfig;
public JestClient getObject() {
JestDroidClient client = new JestDroidClient();
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", droidClientConfig.getPlainSocketFactory())
.register("https", droidClientConfig.getSslSocketFactory())
.build();
if (droidClientConfig != null) {
log.debug("Creating HTTP client based on configuration");
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
client.setRequestCompressionEnabled(droidClientConfig.isRequestCompressionEnabled());
client.setServers(droidClientConfig.getServerList());
boolean isMultiThreaded = droidClientConfig.isMultiThreaded();
if (isMultiThreaded) {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
Integer maxTotal = droidClientConfig.getMaxTotalConnection();
if (maxTotal != null) {
cm.setMaxTotal(maxTotal);
}
Integer defaultMaxPerRoute = droidClientConfig.getDefaultMaxTotalConnectionPerRoute();
if (defaultMaxPerRoute != null) {
cm.setDefaultMaxPerRoute(defaultMaxPerRoute);
}
Map<HttpRoute, Integer> maxPerRoute = droidClientConfig.getMaxTotalConnectionPerRoute();
for (Map.Entry<HttpRoute, Integer> entry : maxPerRoute.entrySet()) {
cm.setMaxPerRoute(entry.getKey(), entry.getValue());
}
httpClientBuilder.setConnectionManager(cm);
log.debug("Multi Threaded http client created");
// schedule idle connection reaping if configured
if (droidClientConfig.getMaxConnectionIdleTime() > 0) {
log.info("Idle connection reaping enabled...");
IdleConnectionReaper reaper = new IdleConnectionReaper(droidClientConfig, new DroidReapableConnectionManager(cm));
client.setIdleConnectionReaper(reaper);
reaper.startAsync();
reaper.awaitRunning();
}
} else {
log.debug("Default http client is created without multi threaded option");
httpClientBuilder.setConnectionManager(new BasicHttpClientConnectionManager(registry));
}
httpClientBuilder
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectTimeout(droidClientConfig.getConnTimeout())
.setSocketTimeout(droidClientConfig.getReadTimeout())
.build())
.setDefaultCredentialsProvider(droidClientConfig.getCredentialsProvider())
.setProxyAuthenticationStrategy(droidClientConfig.getProxyAuthenticationStrategy())
.setRoutePlanner(droidClientConfig.getHttpRoutePlanner());
// set custom gson instance
Gson gson = droidClientConfig.getGson();
if (gson != null) {
client.setGson(gson);
}
client.setHttpClient(httpClientBuilder.build());
//set discovery (should be set after setting the httpClient on jestClient)
if (droidClientConfig.isDiscoveryEnabled()) {
log.info("Node Discovery Enabled...");
NodeChecker nodeChecker = new NodeChecker(client, droidClientConfig);
client.setNodeChecker(nodeChecker);
nodeChecker.startAsync();
nodeChecker.awaitRunning();
} else {
log.info("Node Discovery Disabled...");
}
} else {
log.debug("There is no configuration to create http client. Going to create simple client with default values");
client.setHttpClient(new DefaultHttpClient());
LinkedHashSet<String> servers = new LinkedHashSet<String>();
servers.add("http://localhost:9200");
client.setServers(servers);
}
return client;
}
public void setDroidClientConfig(DroidClientConfig droidClientConfig) {
this.droidClientConfig = droidClientConfig;
}
}