package io.searchbox.client.config;
import com.google.gson.Gson;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author Dogukan Sonmez
* @author cihat keser
* @author Min Cha
*/
public class ClientConfig {
private Set<String> serverList;
private boolean isMultiThreaded;
private boolean isDiscoveryEnabled;
private String discoveryFilter;
private boolean isRequestCompressionEnabled;
private int connTimeout;
private int readTimeout;
private long discoveryFrequency;
private long maxConnectionIdleTime;
private TimeUnit discoveryFrequencyTimeUnit;
private TimeUnit maxConnectionIdleTimeDurationTimeUnit;
private Gson gson;
private String defaultSchemeForDiscoveredNodes;
private ClientConfig() {
}
public ClientConfig(AbstractBuilder builder) {
this.serverList = builder.serverList;
this.isMultiThreaded = builder.isMultiThreaded;
this.isDiscoveryEnabled = builder.isDiscoveryEnabled;
this.discoveryFilter = builder.discoveryFilter;
this.isRequestCompressionEnabled = builder.isRequestCompressionEnabled;
this.discoveryFrequency = builder.discoveryFrequency;
this.discoveryFrequencyTimeUnit = builder.discoveryFrequencyTimeUnit;
this.connTimeout = builder.connTimeout;
this.readTimeout = builder.readTimeout;
this.maxConnectionIdleTime = builder.maxConnectionIdleTime;
this.maxConnectionIdleTimeDurationTimeUnit = builder.maxConnectionIdleTimeDurationTimeUnit;
this.gson = builder.gson;
this.defaultSchemeForDiscoveredNodes = builder.defaultSchemeForDiscoveredNodes;
}
public Set<String> getServerList() {
return serverList;
}
public boolean isMultiThreaded() {
return isMultiThreaded;
}
public boolean isDiscoveryEnabled() {
return isDiscoveryEnabled;
}
public String getDiscoveryFilter() {
return discoveryFilter;
}
public Long getDiscoveryFrequency() {
return discoveryFrequency;
}
public TimeUnit getDiscoveryFrequencyTimeUnit() {
return discoveryFrequencyTimeUnit;
}
public int getReadTimeout() {
return readTimeout;
}
public int getConnTimeout() {
return connTimeout;
}
public long getMaxConnectionIdleTime() {
return maxConnectionIdleTime;
}
public TimeUnit getMaxConnectionIdleTimeDurationTimeUnit() {
return maxConnectionIdleTimeDurationTimeUnit;
}
public Gson getGson() {
return gson;
}
public String getDefaultSchemeForDiscoveredNodes() {
return defaultSchemeForDiscoveredNodes;
}
public boolean isRequestCompressionEnabled() {
return isRequestCompressionEnabled;
}
public static class Builder extends AbstractBuilder<ClientConfig, Builder> {
public Builder(ClientConfig clientConfig) {
super(clientConfig);
}
public Builder(Collection<String> serverUris) {
super(serverUris);
}
public Builder(String serverUri) {
super(serverUri);
}
public ClientConfig build() {
return new ClientConfig(this);
}
}
@Override
public int hashCode() {
return Objects.hash(
serverList,
isMultiThreaded,
isDiscoveryEnabled,
isRequestCompressionEnabled,
discoveryFrequency,
discoveryFilter,
connTimeout,
readTimeout,
discoveryFrequencyTimeUnit,
maxConnectionIdleTime,
maxConnectionIdleTimeDurationTimeUnit,
gson,
defaultSchemeForDiscoveredNodes);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
ClientConfig rhs = (ClientConfig) obj;
return Objects.equals(serverList, rhs.serverList)
&& Objects.equals(isMultiThreaded, rhs.isMultiThreaded)
&& Objects.equals(isDiscoveryEnabled, rhs.isDiscoveryEnabled)
&& Objects.equals(isRequestCompressionEnabled, rhs.isRequestCompressionEnabled)
&& Objects.equals(discoveryFrequency, rhs.discoveryFrequency)
&& Objects.equals(discoveryFilter, rhs.discoveryFilter)
&& Objects.equals(connTimeout, rhs.connTimeout)
&& Objects.equals(readTimeout, rhs.readTimeout)
&& Objects.equals(discoveryFrequencyTimeUnit, rhs.discoveryFrequencyTimeUnit)
&& Objects.equals(maxConnectionIdleTime, rhs.maxConnectionIdleTime)
&& Objects.equals(maxConnectionIdleTimeDurationTimeUnit, rhs.maxConnectionIdleTimeDurationTimeUnit)
&& Objects.equals(gson, rhs.gson)
&& Objects.equals(defaultSchemeForDiscoveredNodes, rhs.defaultSchemeForDiscoveredNodes);
}
protected static abstract class AbstractBuilder<T extends ClientConfig, K extends AbstractBuilder<T, K>> {
protected Set<String> serverList = new LinkedHashSet<String>();
protected boolean isMultiThreaded;
protected boolean isDiscoveryEnabled;
protected String discoveryFilter;
protected boolean isRequestCompressionEnabled;
protected long discoveryFrequency = 10L;
protected long maxConnectionIdleTime = -1L;
protected Integer maxTotalConnection;
protected Integer defaultMaxTotalConnectionPerRoute;
protected Integer connTimeout = 3000;
protected Integer readTimeout = 3000;
protected TimeUnit discoveryFrequencyTimeUnit = TimeUnit.SECONDS;
protected TimeUnit maxConnectionIdleTimeDurationTimeUnit = TimeUnit.SECONDS;
protected Gson gson;
protected String defaultSchemeForDiscoveredNodes = "http://";
public AbstractBuilder(Collection<String> serverUris) {
this.serverList.addAll(serverUris);
}
public AbstractBuilder(String serverUri) {
this.serverList.add(serverUri);
}
public AbstractBuilder(ClientConfig clientConfig) {
this.serverList = clientConfig.serverList;
this.isMultiThreaded = clientConfig.isMultiThreaded;
this.isDiscoveryEnabled = clientConfig.isDiscoveryEnabled;
this.discoveryFrequency = clientConfig.discoveryFrequency;
this.discoveryFilter = clientConfig.discoveryFilter;
this.discoveryFrequencyTimeUnit = clientConfig.discoveryFrequencyTimeUnit;
this.connTimeout = clientConfig.connTimeout;
this.readTimeout = clientConfig.readTimeout;
this.gson = clientConfig.gson;
}
public K addServer(String serverUri) {
this.serverList.add(serverUri);
return (K) this;
}
public K addServer(Collection<String> serverUris) {
this.serverList.addAll(serverUris);
return (K) this;
}
public K gson(Gson gson) {
this.gson = gson;
return (K) this;
}
public K discoveryFrequency(long discoveryFrequency, TimeUnit discoveryFrequencyTimeUnit) {
this.discoveryFrequency = discoveryFrequency;
this.discoveryFrequencyTimeUnit = discoveryFrequencyTimeUnit;
return (K) this;
}
public K discoveryEnabled(boolean isDiscoveryEnabled) {
this.isDiscoveryEnabled = isDiscoveryEnabled;
return (K) this;
}
public K discoveryFilter(String discoveryFilter) {
this.discoveryFilter = discoveryFilter;
return (K) this;
}
public K multiThreaded(boolean isMultiThreaded) {
this.isMultiThreaded = isMultiThreaded;
return (K) this;
}
/**
* Whether to GZIP compress request bodies.
* You also need to enable <code>http.compression</code> setting on your Elasticsearch nodes for this to work.
*/
public K requestCompressionEnabled(boolean isRequestCompressionEnabled) {
this.isRequestCompressionEnabled = isRequestCompressionEnabled;
return (K) this;
}
public K connTimeout(int connTimeout) {
this.connTimeout = connTimeout;
return (K) this;
}
public K readTimeout(int readTimeout) {
this.readTimeout = readTimeout;
return (K) this;
}
public K maxTotalConnection(int maxTotalConnection) {
this.maxTotalConnection = maxTotalConnection;
return (K) this;
}
public K defaultMaxTotalConnectionPerRoute(int defaultMaxTotalConnectionPerRoute) {
this.defaultMaxTotalConnectionPerRoute = defaultMaxTotalConnectionPerRoute;
return (K) this;
}
public K maxConnectionIdleTime(long duration, TimeUnit maxConnectionIdleTimeDurationTimeUnit) {
this.maxConnectionIdleTime = duration;
this.maxConnectionIdleTimeDurationTimeUnit = maxConnectionIdleTimeDurationTimeUnit;
return (K) this;
}
/**
* The default URI scheme to use for discovered nodes.
* @param defaultSchemeForDiscoveredNodes a valid URI scheme like <code>http</code> or <code>https</code>
*/
public K defaultSchemeForDiscoveredNodes(String defaultSchemeForDiscoveredNodes) {
this.defaultSchemeForDiscoveredNodes = defaultSchemeForDiscoveredNodes + "://";
return (K) this;
}
abstract public T build();
}
}