All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arm.mbed.cloud.sdk.common.ConnectionOptions Maven / Gradle / Ivy

package com.arm.mbed.cloud.sdk.common;

import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;

import io.github.cdimascio.dotenv.Dotenv;

import com.arm.mbed.cloud.sdk.annotations.DefaultValue;
import com.arm.mbed.cloud.sdk.annotations.Preamble;

@Preamble(description = "APIs connection options/configuration")
public class ConnectionOptions implements Cloneable, Serializable {
    /**
     * Environment variable for setting Mbed Cloud host.
     */
    public static final String ENVIRONMENT_VARIABLE_HOST = "MBED_CLOUD_SDK_HOST";
    /**
     * Environment variable for setting the level of HTTP logs when communicating to Mbed Cloud.
     *
     * @see CallLogLevel for more details about the possible values.
     */
    public static final String ENVIRONMENT_VARIABLE_HTTP_LOG_LEVEL = "MBED_CLOUD_SDK_LOG_LEVEL";
    /**
     * Environment variable for setting the API Key to use for Mbed Cloud.
     */
    public static final String ENVIRONMENT_VARIABLE_API_KEY = "MBED_CLOUD_SDK_API_KEY";
    /**
     * Serialisation Id.
     */
    private static final long serialVersionUID = -7143679922351151624L;
    private static final String ARM_MBED_CLOUD_DEFAULT_HOST = "https://api.us-east-1.mbedcloud.com";
    private String apiKey;
    private String host;
    private CallLogLevel clientLogLevel;
    private TimePeriod requestTimeout;
    @DefaultValue(value = "TRUE")
    private boolean autostartDaemon;
    private final transient Dotenv dotenv;

    /**
     * Constructor for communications to Arm Mbed Cloud.
     * 

* Note: the API key will be read from environment variables or .env file. {@link #ENVIRONMENT_VARIABLE_API_KEY} is * required to be set. * */ public ConnectionOptions() { this(null); } /** * Constructor for communications to Arm Mbed Cloud. * * @param apiKey * API key to use. The host does not need to be specified and will default to Arm Mbed Cloud production * system. * */ public ConnectionOptions(String apiKey) { this(apiKey, null); } /** * Constructor. * * @param apiKey * API key to use. * @param host * Arm Mbed Cloud URL */ public ConnectionOptions(String apiKey, String host) { super(); dotenv = Dotenv.configure().ignoreIfMissing().load(); setApiKey(apiKey); setHost(host); setAutostartDaemon(true); setClientLogLevel((String) null); } /** * Generates a new Mbed Cloud connection configuration. *

* Note: the API key will be read from environment variables or .env file. *

* This is similar to {@link #ConnectionOptions()} * * @return corresponding configuration. */ public static ConnectionOptions newConfiguration() { return new ConnectionOptions(); } /** * Generates a new Mbed Cloud connection configuration. * * @param apiKey * API key to use. * @return corresponding configuration. */ public static ConnectionOptions newConfiguration(String apiKey) { return new ConnectionOptions(apiKey); } /** * * Generates a new Mbed Cloud connection configuration. * * @param apiKey * API key to use. * @param host * Host address of the Cloud to use. The host does not need to be specified and will default to Arm Mbed * Cloud production system. * @return corresponding configuration */ public static ConnectionOptions newConfiguration(String apiKey, String host) { return newConfiguration(apiKey).host(host); } /** * Gets the API key in use. * * @return the apiKey */ public String getApiKey() { return apiKey; } /** * Sets the API key to use to contact the cloud. * * @param apiKey * the apiKey to set */ public void setApiKey(String apiKey) { String key = (apiKey == null) ? null : apiKey.trim(); if (isEntryEmpty(key)) { key = dotenv.get(ENVIRONMENT_VARIABLE_API_KEY); } this.apiKey = key; } /** * States whether the API key has been specified or not. * * @return true if the API key has not been set. false otherwise. */ public boolean isApiKeyEmpty() { return isEntryEmpty(apiKey); } /** * States whether the host to contact has been specified or not. * * @return true if the host has not been set. false otherwise. */ public boolean isHostEmpty() { return isEntryEmpty(host); } /** * States whether the current connection options are valid or not. * * @return true if it is the case. false otherwise. */ public boolean isValid() { try { return !isApiKeyEmpty() && !isHostEmpty() && new URL(getHost()).getHost() != null; } catch (MalformedURLException exception) { return false; } } /** * Gets the Arm Mbed Cloud Host to contact. * * @return the host */ public String getHost() { return host; } /** * Sets the Arm Mbed Cloud Host to contact. * * @param host * the host to set */ public void setHost(String host) { String cloudHost = host; if (isEntryEmpty(cloudHost)) { cloudHost = dotenv.get(ENVIRONMENT_VARIABLE_HOST); if (isEntryEmpty(cloudHost)) { cloudHost = ARM_MBED_CLOUD_DEFAULT_HOST; } } final StringBuilder sb = new StringBuilder(); sb.append(cloudHost.trim()); if (!cloudHost.endsWith("/")) { sb.append('/'); } this.host = sb.toString(); } /** * Sets host. *

* Note: Similar to {@link #setHost(String)} * * @param cloudHost * host to contact * @return these connection options */ public ConnectionOptions host(String cloudHost) { setHost(cloudHost); return this; } /** * Gets the current logging level of the client. * * @see CallLogLevel * @return the clientLogLevel */ public CallLogLevel getClientLogLevel() { return clientLogLevel; } /** * Sets the logging level of the client to use. * * @see CallLogLevel * @param clientLogLevel * the clientLogLevel to set */ public void setClientLogLevel(CallLogLevel clientLogLevel) { this.clientLogLevel = clientLogLevel; } /** * Sets the logging level of the client to use. * * @see CallLogLevel * @param clientLogLevel * the clientLogLevel to set */ public void setClientLogLevel(String clientLogLevel) { String logLevel = clientLogLevel; if (isEntryEmpty(logLevel)) { logLevel = dotenv.get(ENVIRONMENT_VARIABLE_HTTP_LOG_LEVEL); } if (isEntryEmpty(logLevel)) { setClientLogLevel(CallLogLevel.NONE); } else { setClientLogLevel(CallLogLevel.getLevel(logLevel.trim())); } } /** * Sets the log level to apply. *

* Note: Similar to {@link #setClientLogLevel(CallLogLevel)} * * @param logLevelOfTheHttpClient * log level to set * @return these connection options. */ public ConnectionOptions logLevel(CallLogLevel logLevelOfTheHttpClient) { setClientLogLevel(logLevelOfTheHttpClient); return this; } /** * Gets the custom HTTP client request timeout. * * @return the requestTimeout */ public TimePeriod getRequestTimeout() { return requestTimeout; } /** * Sets a HTTP client request timeout different from default setting. * * @param requestTimeout * the requestTimeout to set */ public void setRequestTimeout(TimePeriod requestTimeout) { this.requestTimeout = requestTimeout; } /** * States whether a request timeout has been set. * * @return true if a request timeout different from client default has been set. false otherwise. */ public boolean hasCustomRequestTimeout() { return requestTimeout != null; } /** * States whether daemons should autostart when needed. * * @return true if the daemon will autostart when necessary. */ public boolean isAutostartDaemon() { return autostartDaemon; } /** * Sets whether daemon should autostart when needed. If set to false, an exception will be raised if a daemon is * required but not started. * * @param autostartDaemon * autostart mode for the daemon. */ public void setAutostartDaemon(boolean autostartDaemon) { this.autostartDaemon = autostartDaemon; } /** * Sets autostart daemon mode. *

* Note: Similar to {@link #setAutostartDaemon(boolean)} * * @param autostartDaemonMode * mode to apply. * @return these connection options. */ public ConnectionOptions autostartDaemon(boolean autostartDaemonMode) { setAutostartDaemon(autostartDaemonMode); return this; } /** * Clones the connection options. * * @return a clone. */ @Override public ConnectionOptions clone() { final ConnectionOptions options = new ConnectionOptions(apiKey, host); options.setClientLogLevel(clientLogLevel); options.setAutostartDaemon(autostartDaemon); if (hasCustomRequestTimeout()) { options.setRequestTimeout(requestTimeout.clone()); } return options; } protected static boolean isEntryEmpty(String entry) { if (entry == null || entry.isEmpty()) { return true; } return entry.replace("\'", "").replace("\"", "").trim().isEmpty(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy