CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-cdap-cdap--cdap-client

CDAP Java Client library providing programmatic APIs for interacting with the CDAP platform

Pending
Overview
Eval results
Files

configuration.mddocs/

Configuration and Connection Management

Configuration classes provide the foundation for connecting to CDAP instances. They handle connection settings, SSL configuration, authentication, timeouts, and custom HTTP headers.

ConnectionConfig

Manages connection information to a CDAP instance including hostname, port, SSL settings, and API path configuration.

public class ConnectionConfig {
    // Constructors
    public ConnectionConfig(ConnectionConfig config);
    public ConnectionConfig(String hostname, Integer port, boolean sslEnabled);
    public ConnectionConfig(String hostname, Integer port, boolean sslEnabled, String apiPath);
    
    // URI resolution methods
    public URI getURI();
    public String getFullHost();
    public URI resolveURI(String path);
    public URI resolveURI(String apiVersion, String path);
    public URI resolveNamespacedURI(NamespaceId namespace, String apiVersion, String path);
    
    // Property accessors
    public String getHostname();
    public Integer getPort();
    public boolean isSSLEnabled();
    public String getApiPath();
    
    // Static factory methods
    public static Builder builder();
    public static Builder builder(ConnectionConfig connectionConfig);
    
    // Constants
    public static final ConnectionConfig DEFAULT;
}

ConnectionConfig.Builder

public static class Builder {
    public Builder setHostname(String hostname);
    public Builder setPort(Integer port);
    public Builder setSSLEnabled(boolean sslEnabled);
    public Builder setApiPath(String apiPath);
    public ConnectionConfig build();
}

Usage Examples

// Basic connection to local CDAP instance
ConnectionConfig local = ConnectionConfig.builder()
    .setHostname("localhost")
    .setPort(11015)
    .setSSLEnabled(false)
    .build();

// Secure connection to remote CDAP instance
ConnectionConfig remote = ConnectionConfig.builder()
    .setHostname("cdap.company.com")
    .setPort(443)
    .setSSLEnabled(true)
    .setApiPath("/api")
    .build();

// Copy constructor for modifications
ConnectionConfig modified = ConnectionConfig.builder(remote)
    .setPort(8443)
    .build();

ClientConfig

Comprehensive configuration for the Java client API including HTTP settings, authentication, retry policies, and request customization.

public class ClientConfig {
    // URL resolution methods
    public URL resolveURL(String path);
    public URL resolveURL(String format, Object... args);
    public URL resolveURLV3(String path);
    public URL resolveURLNoVersion(String path);
    public URL resolveNamespacedURLV3(NamespaceId namespace, String path);
    
    // HTTP configuration accessors
    public HttpRequestConfig getDefaultRequestConfig();
    public HttpRequestConfig getUploadRequestConfig();
    public int getDefaultReadTimeout();
    public int getDefaultConnectTimeout();
    public int getUploadReadTimeout();
    public int getUploadConnectTimeout();
    public int getAppListPageSize();
    public Map<String, String> getAdditionalHeaders();
    
    // Core configuration accessors
    public ConnectionConfig getConnectionConfig();
    public boolean isVerifySSLCert();
    public String getApiVersion();
    public int getUnavailableRetryLimit();
    
    // Authentication accessors
    public AccessToken getAccessToken();
    public Supplier<AccessToken> getAccessTokenSupplier();
    
    // Static factory methods
    public static ClientConfig getDefault();
    public static Builder builder();
}

ClientConfig.Builder

public static class Builder {
    // Connection configuration
    public Builder setConnectionConfig(ConnectionConfig connectionConfig);
    
    // SSL configuration
    public Builder setVerifySSLCert(boolean verifySSLCert);
    
    // Timeout configuration
    public Builder setUploadReadTimeout(int uploadReadTimeout);
    public Builder setUploadConnectTimeout(int uploadConnectTimeout);
    public Builder setDefaultReadTimeout(int defaultReadTimeout);
    public Builder setDefaultConnectTimeout(int defaultConnectTimeout);
    
    // Request configuration
    public Builder setAppListPageSize(int appListPageSize);
    public Builder addAdditionalHeader(String header, String value);
    public Builder setUnavailableRetryLimit(int retry);
    
    // Authentication configuration
    public Builder setAccessToken(AccessToken accessToken);
    public Builder setAccessToken(Supplier<AccessToken> accessToken);
    
    // API configuration
    public Builder setApiVersion(String apiVersion);
    
    // Build method
    public ClientConfig build();
}

Configuration Constants

// Default timeout values
public static final int DEFAULT_READ_TIMEOUT = 15000; // milliseconds
public static final int DEFAULT_CONNECT_TIMEOUT = 15000; // milliseconds
public static final int DEFAULT_UPLOAD_READ_TIMEOUT = 0; // no timeout
public static final int DEFAULT_UPLOAD_CONNECT_TIMEOUT = 0; // no timeout

// Default retry and pagination settings
public static final int DEFAULT_SERVICE_UNAVAILABLE_RETRY_LIMIT = 50;
public static final int DEFAULT_APP_LIST_PAGE_SIZE = 25;

// SSL configuration
public static final boolean DEFAULT_VERIFY_SSL_CERTIFICATE = true;

// API version
public static final String DEFAULT_VERSION = "v3";

Usage Examples

// Basic client configuration
ClientConfig config = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .build();

// Advanced configuration with custom settings
ClientConfig advancedConfig = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setVerifySSLCert(false) // Disable SSL verification for testing
    .setDefaultReadTimeout(30000) // 30 seconds
    .setDefaultConnectTimeout(10000) // 10 seconds
    .setUploadReadTimeout(300000) // 5 minutes for large uploads
    .setAppListPageSize(50) // Larger page size
    .setUnavailableRetryLimit(10) // Fewer retries
    .addAdditionalHeader("X-Custom-Header", "custom-value")
    .build();

// Configuration with authentication token
AccessToken token = new AccessToken("auth-token-value", 3600L, "Bearer");
ClientConfig authConfig = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setAccessToken(token)
    .build();

// Configuration with dynamic token supplier
Supplier<AccessToken> tokenSupplier = () -> {
    // Your token refresh logic here
    return refreshAuthToken();
};
ClientConfig dynamicAuthConfig = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setAccessToken(tokenSupplier)
    .build();

Authentication Configuration

The client supports various authentication mechanisms through the AccessToken system.

AccessToken

public class AccessToken {
    public AccessToken(String value, Long expiresIn, String tokenType);
    public String getValue();
    public Long getExpiresIn();
    public String getTokenType();
}

Authentication Examples

// Static token authentication
AccessToken staticToken = new AccessToken("your-token-here", 3600L, "Bearer");
ClientConfig config = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setAccessToken(staticToken)
    .build();

// Dynamic token with supplier for automatic refresh
Supplier<AccessToken> tokenSupplier = new Supplier<AccessToken>() {
    @Override
    public AccessToken get() {
        // Implement your token refresh logic
        String newToken = authService.refreshToken();
        return new AccessToken(newToken, 3600L, "Bearer");
    }
};

ClientConfig dynamicConfig = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setAccessToken(tokenSupplier)
    .build();

// Lambda-based token supplier
ClientConfig lambdaConfig = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .setAccessToken(() -> new AccessToken(getTokenFromService(), 3600L, "Bearer"))
    .build();

Error Handling

Configuration-related exceptions that may be thrown:

  • MalformedURLException: Invalid hostname or port in ConnectionConfig
  • DisconnectedException: Connection lost during configuration validation
  • IllegalArgumentException: Invalid configuration parameters
try {
    ConnectionConfig config = ConnectionConfig.builder()
        .setHostname("invalid-hostname")
        .setPort(-1) // Invalid port
        .build();
} catch (IllegalArgumentException e) {
    System.err.println("Invalid configuration: " + e.getMessage());
}

Best Practices

  1. Use Builder Pattern: Always use the builder pattern for creating configurations
  2. Reuse Configurations: Create configuration objects once and reuse them across multiple clients
  3. Handle Timeouts: Set appropriate timeout values based on your network conditions
  4. SSL in Production: Always enable SSL verification in production environments
  5. Token Management: Use token suppliers for long-running applications to handle token refresh
  6. Connection Pooling: The underlying HTTP client handles connection pooling automatically
// Good: Reuse configuration across clients
ClientConfig config = ClientConfig.builder()
    .setConnectionConfig(connectionConfig)
    .build();

ApplicationClient appClient = new ApplicationClient(config);
ProgramClient programClient = new ProgramClient(config);
DatasetClient datasetClient = new DatasetClient(config);

// Good: Environment-specific configuration
ClientConfig prodConfig = ClientConfig.builder()
    .setConnectionConfig(prodConnectionConfig)
    .setVerifySSLCert(true)
    .setDefaultReadTimeout(30000)
    .build();

ClientConfig devConfig = ClientConfig.builder()
    .setConnectionConfig(devConnectionConfig)
    .setVerifySSLCert(false) // OK for development
    .setDefaultReadTimeout(10000)
    .build();

Install with Tessl CLI

npx tessl i tessl/maven-io-cdap-cdap--cdap-client

docs

application-management.md

artifact-management.md

configuration.md

data-operations.md

dataset-operations.md

index.md

metrics-monitoring.md

program-control.md

schedule-management.md

security-administration.md

service-management.md

tile.json