/*
* Copyright © 2015 Cask Data, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package co.cask.cdap.client.config;
import co.cask.cdap.client.exception.DisconnectedException;
import co.cask.cdap.common.conf.Constants;
import co.cask.cdap.proto.Id;
import co.cask.cdap.security.authentication.client.AccessToken;
import co.cask.common.http.HttpRequestConfig;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import java.net.MalformedURLException;
import java.net.URL;
import javax.annotation.Nullable;
/**
* Configuration for the Java client API
*/
public class ClientConfig {
private static final boolean DEFAULT_VERIFY_SSL_CERTIFICATE = true;
private static final int DEFAULT_UPLOAD_READ_TIMEOUT = 0;
private static final int DEFAULT_UPLOAD_CONNECT_TIMEOUT = 0;
private static final int DEFAULT_SERVICE_UNAVAILABLE_RETRY_LIMIT = 50;
private static final int DEFAULT_READ_TIMEOUT = 15000;
private static final int DEFAULT_CONNECT_TIMEOUT = 15000;
private static final String DEFAULT_VERSION = Constants.Gateway.API_VERSION_3_TOKEN;
@Nullable
private ConnectionConfig connectionConfig;
private boolean verifySSLCert;
private int defaultReadTimeout;
private int defaultConnectTimeout;
private int uploadReadTimeout;
private int uploadConnectTimeout;
private int unavailableRetryLimit;
private String apiVersion;
private Supplier<AccessToken> accessToken;
private ClientConfig(@Nullable ConnectionConfig connectionConfig,
boolean verifySSLCert, int unavailableRetryLimit,
String apiVersion, Supplier<AccessToken> accessToken,
int defaultReadTimeout, int defaultConnectTimeout,
int uploadReadTimeout, int uploadConnectTimeout) {
this.connectionConfig = connectionConfig;
this.verifySSLCert = verifySSLCert;
this.apiVersion = apiVersion;
this.unavailableRetryLimit = unavailableRetryLimit;
this.accessToken = accessToken;
this.defaultReadTimeout = defaultReadTimeout;
this.defaultConnectTimeout = defaultConnectTimeout;
this.uploadReadTimeout = uploadReadTimeout;
this.uploadConnectTimeout = uploadConnectTimeout;
}
public static ClientConfig getDefault() {
return ClientConfig.builder().build();
}
private URL resolveURL(String apiVersion, String path) throws DisconnectedException, MalformedURLException {
return getConnectionConfig().resolveURI(apiVersion, path).toURL();
}
/**
* Resolves a path against the target CDAP server
*
* @param path Path to the HTTP endpoint. For example, "apps" would result
* in a URL like "http://example.com:10000/v2/apps".
* @return URL of the resolved path
*/
public URL resolveURL(String path) throws DisconnectedException, MalformedURLException {
return resolveURL(apiVersion, path);
}
public URL resolveURL(String format, Object... args) throws MalformedURLException {
return resolveURL(apiVersion, String.format(format, args));
}
/**
* Resolves a path against the target CDAP server
*
* @param path Path to the HTTP endpoint. For example, "apps" would result
* in a URL like "http://example.com:10000/v2/apps".
* @return URL of the resolved path
*/
public URL resolveURLV3(String path) throws MalformedURLException {
return resolveURL(Constants.Gateway.API_VERSION_3_TOKEN, path);
}
/**
* Resolves a path aginst the CDAP server, without applying an API version. For example, /ping
*/
public URL resolveURLNoVersion(String path) throws MalformedURLException {
return getConnectionConfig().resolveURI(path).toURL();
}
/**
* Resolves a path against the target CDAP server with the provided namespace, using V3 APIs
*
* @param path Path to the HTTP endpoint. For example, "apps" would result
* in a URL like "http://example.com:10000/v3/<namespace>/apps".
* @return URL of the resolved path
* @throws MalformedURLException
*/
public URL resolveNamespacedURLV3(Id.Namespace namespace, String path) throws MalformedURLException {
return getConnectionConfig().resolveNamespacedURI(namespace, Constants.Gateway.API_VERSION_3_TOKEN, path).toURL();
}
public HttpRequestConfig getDefaultRequestConfig() {
if (connectionConfig == null) {
throw new DisconnectedException();
}
return new HttpRequestConfig(defaultConnectTimeout, defaultReadTimeout, verifySSLCert);
}
/**
* @return a {@link HttpRequestConfig} used for operations whose duration varies based on the operation, such as
* application deployment and query execution.
*/
public HttpRequestConfig getUploadRequestConfig() {
if (connectionConfig == null) {
throw new DisconnectedException();
}
return new HttpRequestConfig(uploadConnectTimeout, uploadReadTimeout, verifySSLCert);
}
public int getDefaultReadTimeout() {
return defaultReadTimeout;
}
public int getDefaultConnectTimeout() {
return defaultConnectTimeout;
}
public int getUploadReadTimeout() {
return uploadReadTimeout;
}
public int getUploadConnectTimeout() {
return uploadConnectTimeout;
}
public void setConnectionConfig(@Nullable ConnectionConfig connectionConfig) {
this.connectionConfig = connectionConfig;
}
public ConnectionConfig getConnectionConfig() {
if (connectionConfig == null) {
throw new DisconnectedException();
}
return connectionConfig;
}
public boolean isVerifySSLCert() {
return verifySSLCert;
}
public void setVerifySSLCert(boolean verifySSLCert) {
this.verifySSLCert = verifySSLCert;
}
public void setDefaultReadTimeout(int defaultReadTimeout) {
this.defaultReadTimeout = defaultReadTimeout;
}
public void setDefaultConnectTimeout(int defaultConnectTimeout) {
this.defaultConnectTimeout = defaultConnectTimeout;
}
public void setUploadReadTimeout(int uploadReadTimeout) {
this.uploadReadTimeout = uploadReadTimeout;
}
public void setUploadConnectTimeout(int uploadConnectTimeout) {
this.uploadConnectTimeout = uploadConnectTimeout;
}
public void setUnavailableRetryLimit(int unavailableRetryLimit) {
this.unavailableRetryLimit = unavailableRetryLimit;
}
public String getApiVersion() {
return apiVersion;
}
public int getUnavailableRetryLimit() {
return unavailableRetryLimit;
}
public void setApiVersion(String apiVersion) {
this.apiVersion = apiVersion;
}
public void setAllTimeouts(int timeout) {
this.defaultConnectTimeout = timeout;
this.defaultReadTimeout = timeout;
this.uploadConnectTimeout = timeout;
this.uploadReadTimeout = timeout;
}
@Nullable
public AccessToken getAccessToken() {
return accessToken.get();
}
public Supplier<AccessToken> getAccessTokenSupplier() {
return accessToken;
}
public void setAccessToken(Supplier<AccessToken> accessToken) {
this.accessToken = accessToken;
}
public void setAccessToken(AccessToken accessToken) {
this.accessToken = Suppliers.ofInstance(accessToken);
}
public static Builder builder() {
return new Builder();
}
/**
* Builder for {@link ClientConfig}.
*/
public static final class Builder {
private ConnectionConfig connectionConfig = ConnectionConfig.DEFAULT;
private String apiVersion = DEFAULT_VERSION;
private Supplier<AccessToken> accessToken = Suppliers.ofInstance(null);
private boolean verifySSLCert = DEFAULT_VERIFY_SSL_CERTIFICATE;
private int uploadReadTimeout = DEFAULT_UPLOAD_READ_TIMEOUT;
private int uploadConnectTimeout = DEFAULT_UPLOAD_CONNECT_TIMEOUT;
private int defaultReadTimeout = DEFAULT_READ_TIMEOUT;
private int defaultConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
private int unavailableRetryLimit = DEFAULT_SERVICE_UNAVAILABLE_RETRY_LIMIT;
public Builder() { }
public Builder(ClientConfig clientConfig) {
this.connectionConfig = clientConfig.connectionConfig;
this.verifySSLCert = clientConfig.verifySSLCert;
this.apiVersion = clientConfig.apiVersion;
this.accessToken = clientConfig.accessToken;
this.uploadReadTimeout = clientConfig.uploadReadTimeout;
this.uploadConnectTimeout = clientConfig.uploadConnectTimeout;
this.defaultReadTimeout = clientConfig.defaultReadTimeout;
this.defaultConnectTimeout = clientConfig.defaultConnectTimeout;
this.unavailableRetryLimit = clientConfig.unavailableRetryLimit;
}
public Builder setConnectionConfig(ConnectionConfig connectionConfig) {
this.connectionConfig = connectionConfig;
return this;
}
public Builder setVerifySSLCert(boolean verifySSLCert) {
this.verifySSLCert = verifySSLCert;
return this;
}
public Builder setUploadReadTimeout(int uploadReadTimeout) {
this.uploadReadTimeout = uploadReadTimeout;
return this;
}
public Builder setUploadConnectTimeout(int uploadConnectTimeout) {
this.uploadConnectTimeout = uploadConnectTimeout;
return this;
}
public Builder setDefaultReadTimeout(int defaultReadTimeout) {
this.defaultReadTimeout = defaultReadTimeout;
return this;
}
public Builder setDefaultConnectTimeout(int defaultConnectTimeout) {
this.defaultConnectTimeout = defaultConnectTimeout;
return this;
}
public Builder setAccessToken(Supplier<AccessToken> accessToken) {
this.accessToken = accessToken;
return this;
}
public Builder setAccessToken(AccessToken accessToken) {
this.accessToken = Suppliers.ofInstance(accessToken);
return this;
}
public Builder setApiVersion(String apiVersion) {
this.apiVersion = apiVersion;
return this;
}
public Builder setUnavailableRetryLimit(int retry) {
this.unavailableRetryLimit = retry;
return this;
}
public ClientConfig build() {
return new ClientConfig(connectionConfig, verifySSLCert,
unavailableRetryLimit, apiVersion, accessToken,
defaultReadTimeout, defaultConnectTimeout,
uploadReadTimeout, uploadConnectTimeout);
}
}
}