package com.netflix.discovery.shared.transport;
import javax.net.ssl.SSLContext;
import com.netflix.appinfo.AbstractEurekaIdentity;
import com.netflix.appinfo.EurekaAccept;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClientConfig;
import com.netflix.discovery.converters.wrappers.CodecWrappers;
import com.netflix.discovery.converters.wrappers.DecoderWrapper;
import com.netflix.discovery.converters.wrappers.EncoderWrapper;
/**
* @author Tomasz Bak
*/
public abstract class EurekaClientFactoryBuilder<F, B extends EurekaClientFactoryBuilder<F, B>> {
private static final int DEFAULT_MAX_CONNECTIONS_PER_HOST = 50;
private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 200;
private static final long DEFAULT_CONNECTION_IDLE_TIMEOUT = 30;
protected InstanceInfo myInstanceInfo;
protected boolean allowRedirect;
protected boolean systemSSL;
protected String clientName;
protected EurekaAccept eurekaAccept;
protected int maxConnectionsPerHost = DEFAULT_MAX_CONNECTIONS_PER_HOST;
protected int maxTotalConnections = DEFAULT_MAX_TOTAL_CONNECTIONS;
protected SSLContext sslContext;
protected String trustStoreFileName;
protected String trustStorePassword;
protected String userAgent;
protected String proxyUserName;
protected String proxyPassword;
protected String proxyHost;
protected int proxyPort;
protected int connectionTimeout;
protected int readTimeout;
protected long connectionIdleTimeout = DEFAULT_CONNECTION_IDLE_TIMEOUT;
protected EncoderWrapper encoderWrapper;
protected DecoderWrapper decoderWrapper;
protected AbstractEurekaIdentity clientIdentity;
public B withClientConfig(EurekaClientConfig clientConfig) {
withClientAccept(EurekaAccept.fromString(clientConfig.getClientDataAccept()));
withAllowRedirect(clientConfig.allowRedirects());
withConnectionTimeout(clientConfig.getEurekaServerConnectTimeoutSeconds() * 1000);
withReadTimeout(clientConfig.getEurekaServerReadTimeoutSeconds() * 1000);
withMaxConnectionsPerHost(clientConfig.getEurekaServerTotalConnectionsPerHost());
withMaxTotalConnections(clientConfig.getEurekaServerTotalConnections());
withConnectionIdleTimeout(clientConfig.getEurekaConnectionIdleTimeoutSeconds() * 1000);
withEncoder(clientConfig.getEncoderName());
return withDecoder(clientConfig.getDecoderName(), clientConfig.getClientDataAccept());
}
public B withMyInstanceInfo(InstanceInfo myInstanceInfo) {
this.myInstanceInfo = myInstanceInfo;
return self();
}
public B withClientName(String clientName) {
this.clientName = clientName;
return self();
}
public B withClientAccept(EurekaAccept eurekaAccept) {
this.eurekaAccept = eurekaAccept;
return self();
}
public B withUserAgent(String userAgent) {
this.userAgent = userAgent;
return self();
}
public B withAllowRedirect(boolean allowRedirect) {
this.allowRedirect = allowRedirect;
return self();
}
public B withConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
return self();
}
public B withReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
return self();
}
public B withConnectionIdleTimeout(long connectionIdleTimeout) {
this.connectionIdleTimeout = connectionIdleTimeout;
return self();
}
public B withMaxConnectionsPerHost(int maxConnectionsPerHost) {
this.maxConnectionsPerHost = maxConnectionsPerHost;
return self();
}
public B withMaxTotalConnections(int maxTotalConnections) {
this.maxTotalConnections = maxTotalConnections;
return self();
}
public B withProxy(String proxyHost, int proxyPort, String user, String password) {
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
this.proxyUserName = user;
this.proxyPassword = password;
return self();
}
public B withSSLContext(SSLContext sslContext) {
this.sslContext = sslContext;
return self();
}
/**
* Use {@link #withSSLContext(SSLContext)}
*/
@Deprecated
public B withSystemSSLConfiguration() {
this.systemSSL = true;
return self();
}
/**
* Use {@link #withSSLContext(SSLContext)}
*/
@Deprecated
public B withTrustStoreFile(String trustStoreFileName, String trustStorePassword) {
this.trustStoreFileName = trustStoreFileName;
this.trustStorePassword = trustStorePassword;
return self();
}
public B withEncoder(String encoderName) {
return this.withEncoderWrapper(CodecWrappers.getEncoder(encoderName));
}
public B withEncoderWrapper(EncoderWrapper encoderWrapper) {
this.encoderWrapper = encoderWrapper;
return self();
}
public B withDecoder(String decoderName, String clientDataAccept) {
return this.withDecoderWrapper(CodecWrappers.resolveDecoder(decoderName, clientDataAccept));
}
public B withDecoderWrapper(DecoderWrapper decoderWrapper) {
this.decoderWrapper = decoderWrapper;
return self();
}
public B withClientIdentity(AbstractEurekaIdentity clientIdentity) {
this.clientIdentity = clientIdentity;
return self();
}
public abstract F build();
@SuppressWarnings("unchecked")
protected B self() {
return (B) this;
}
}