From 4cc2dfb612e2916afbb601447ef0e1d33ffe195a Mon Sep 17 00:00:00 2001 From: Ihor Cherkashyn Date: Tue, 13 Jan 2026 12:52:06 +0100 Subject: [PATCH] Allow to build Api Client without config file required. --- README.md | 2 +- pom.xml | 12 +++- .../signnow/core/config/ConfigDefaults.java | 58 ++++++++++++++++ .../com/signnow/core/config/ConfigLoader.java | 34 +++++++--- .../signnow/core/config/ConfigRepository.java | 13 ++-- .../core/provider/ApiServiceProvider.java | 39 +++++++---- .../core/config/ConfigRepositoryTest.java | 6 +- .../core/provider/ApiServiceProviderTest.java | 68 +++++++++++++++++++ src/test/java/com/signnow/mock/Constants.java | 14 ++++ 9 files changed, 214 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/signnow/core/config/ConfigDefaults.java create mode 100644 src/test/java/com/signnow/core/provider/ApiServiceProviderTest.java create mode 100644 src/test/java/com/signnow/mock/Constants.java diff --git a/README.md b/README.md index 09836b3..3857b64 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # signNow API Java SDK -## v3.4.1 +## v3.5.1 [![Java Version](https://img.shields.io/badge/codebase-java--11-yellowgreen)](https://www.java.com/) diff --git a/pom.xml b/pom.xml index f9bace2..78b5b87 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.signnow signnow-java-sdk - 3.2.1 + 3.5.1 jar signnow-java-sdk SignNow official Java SDK @@ -26,6 +26,16 @@ Ihor Cherkashyn cherkashyn.ihor@pdffiller.team + + Vasyl-Kravets + Vasyl Kravets + kravets.vasyl@pdffiller.team + + + Mykhailo-Lebediev + Mykhailo Lebediev + lebedev.mikhail@pdffiller.team + diff --git a/src/main/java/com/signnow/core/config/ConfigDefaults.java b/src/main/java/com/signnow/core/config/ConfigDefaults.java new file mode 100644 index 0000000..4aa0fea --- /dev/null +++ b/src/main/java/com/signnow/core/config/ConfigDefaults.java @@ -0,0 +1,58 @@ +/* + * This file is a part of signNow SDK API client. + * + * (с) Copyright © 2011-present airSlate Inc. (https://www.signnow.com) + * + * For more details on copyright, see LICENSE.md file + * that was distributed with this source code. + */ + +package com.signnow.core.config; + +import java.util.HashMap; +import java.util.Map; + +/** This class provides default values for signNow SDK configuration file. */ +public class ConfigDefaults { + /** Default values for configuration */ + private static final String SIGNNOW_API_HOST = "https://api.signnow.com"; + + private static final String BASIC_TOKEN = ""; + private static final String USERNAME = ""; + private static final String PASSWORD = ""; + public static final String DOWNLOADS_DIR = "./src/main/resources/downloads"; + + /** Environment variables to keep API secrets */ + public static final String ENV_VAR_HOST = "SIGNNOW_API_HOST"; + + public static final String ENV_VAR_BASIC_TOKEN = "SIGNNOW_API_BASIC_TOKEN"; + public static final String ENV_VAR_USERNAME = "SIGNNOW_API_USERNAME"; + public static final String ENV_VAR_PASSWORD = "SIGNNOW_API_PASSWORD"; + public static final String ENV_DOWNLOADS_DIR = "SIGNNOW_DOWNLOADS_DIR"; + + /** + * Returns defaults values for SDK configuration. + * + * @return A map containing the key-value pairs for case when configuration file not found + */ + public Map getDefaults() { + Map config = new HashMap<>(); + config.put(ENV_VAR_HOST, SIGNNOW_API_HOST); + config.put(ENV_VAR_BASIC_TOKEN, BASIC_TOKEN); + config.put(ENV_VAR_USERNAME, USERNAME); + config.put(ENV_VAR_PASSWORD, PASSWORD); + config.put(ENV_DOWNLOADS_DIR, DOWNLOADS_DIR); + return config; + } + + /** + * Returns list of environment variables that keep API secrets. + * + * @return A list of environment variable names + */ + public static String[] getEnvironmentVariableNames() { + return new String[] { + ENV_VAR_HOST, ENV_VAR_BASIC_TOKEN, ENV_VAR_USERNAME, ENV_VAR_PASSWORD, ENV_DOWNLOADS_DIR + }; + } +} diff --git a/src/main/java/com/signnow/core/config/ConfigLoader.java b/src/main/java/com/signnow/core/config/ConfigLoader.java index 68864cc..cc71a2f 100644 --- a/src/main/java/com/signnow/core/config/ConfigLoader.java +++ b/src/main/java/com/signnow/core/config/ConfigLoader.java @@ -16,16 +16,14 @@ import java.util.HashMap; import java.util.Map; -/** - * This class reads and parses signNow SDK configuration file. - */ +/** This class reads and parses signNow SDK configuration file. */ public class ConfigLoader { - /** + /** * This method loads the configuration file from the provided file path and parses it into a map. - * Each line in the file should represent a key-value pair, separated by an equals sign. - * Lines starting with a hash sign are considered comments and are ignored. - * Empty lines are also ignored. + * Each line in the file should represent a key-value pair, separated by an equals sign. Lines + * starting with a hash sign are considered comments and are ignored. Empty lines are also + * ignored. * * @param filePath The path to the configuration file. * @return A map containing the key-value pairs from the configuration file. @@ -56,4 +54,24 @@ public Map load(String filePath) throws SignNowApiException { } return configMap; } -} \ No newline at end of file + + /** + * Load API credentials from environment variables if they exist. + * + * @return A map of SDK configuration parsed from environment variables + */ + public Map loadConfigFromEnvironmentVariables() { + String[] envVars = ConfigDefaults.getEnvironmentVariableNames(); + + Map config = new HashMap<>(); + Map env = System.getenv(); + + for (String envVar : envVars) { + String value = env.get(envVar); + if (value != null) { + config.put(envVar, value); + } + } + return config; + } +} diff --git a/src/main/java/com/signnow/core/config/ConfigRepository.java b/src/main/java/com/signnow/core/config/ConfigRepository.java index 618a24b..1d6ba97 100644 --- a/src/main/java/com/signnow/core/config/ConfigRepository.java +++ b/src/main/java/com/signnow/core/config/ConfigRepository.java @@ -16,8 +16,7 @@ public class ConfigRepository { private static final int READ_TIMEOUT = 15; - private static final String CLIENT_NAME = "SignNowApiClient/v3.4.1 (Java)"; - private static final String DEFAULT_DOWNLOADS_DIR = "./src/main/resources/downloads"; + private static final String CLIENT_NAME = "SignNowApiClient/v3.5.1 (Java)"; private final Map configMap; @@ -36,7 +35,7 @@ public ConfigRepository(Map configMap) { * @return the host as a string */ public String host() { - return this.configMap.get("SIGNNOW_API_HOST"); + return this.configMap.get(ConfigDefaults.ENV_VAR_HOST); } /** @@ -45,7 +44,7 @@ public String host() { * @return the basic token as a BasicToken object */ public BasicToken basicToken() { - return new BasicToken(this.configMap.get("SIGNNOW_API_BASIC_TOKEN")); + return new BasicToken(this.configMap.get(ConfigDefaults.ENV_VAR_BASIC_TOKEN)); } /** @@ -54,7 +53,7 @@ public BasicToken basicToken() { * @return the user as a string */ public String user() { - return this.configMap.get("SIGNNOW_API_USERNAME"); + return this.configMap.get(ConfigDefaults.ENV_VAR_USERNAME); } /** @@ -63,7 +62,7 @@ public String user() { * @return the password as a string */ public String password() { - return this.configMap.get("SIGNNOW_API_PASSWORD"); + return this.configMap.get(ConfigDefaults.ENV_VAR_PASSWORD); } public String projectDirectory() { @@ -77,7 +76,7 @@ public String projectDirectory() { */ public String downloadsDirectory() { String downloadsDir = - this.configMap.getOrDefault("SIGNNOW_DOWNLOADS_DIR", DEFAULT_DOWNLOADS_DIR); + this.configMap.getOrDefault(ConfigDefaults.ENV_DOWNLOADS_DIR, ConfigDefaults.DOWNLOADS_DIR); if (downloadsDir.startsWith(".")) { downloadsDir = downloadsDir.replaceFirst("^\\.", projectDirectory()); diff --git a/src/main/java/com/signnow/core/provider/ApiServiceProvider.java b/src/main/java/com/signnow/core/provider/ApiServiceProvider.java index 1e47522..f6e4e02 100644 --- a/src/main/java/com/signnow/core/provider/ApiServiceProvider.java +++ b/src/main/java/com/signnow/core/provider/ApiServiceProvider.java @@ -10,27 +10,25 @@ package com.signnow.core.provider; import com.signnow.core.ApiClient; +import com.signnow.core.config.ConfigDefaults; import com.signnow.core.config.ConfigLoader; import com.signnow.core.config.ConfigRepository; import com.signnow.core.exception.SignNowApiException; import com.signnow.core.request.ApiEndpointResolver; +import java.io.File; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import org.jetbrains.annotations.NotNull; -/** - * This class provides services for the signNow API SDK. - */ +/** This class provides services for the signNow API SDK. */ public class ApiServiceProvider { - /** - * Path to signNow API SDK configuration file. - */ + /** Path to signNow API SDK configuration file. */ private final String configPath; - /** - * Map of SDK general services - */ + /** Map of SDK general services */ private final ServiceRepository serviceRepository; /** @@ -70,10 +68,9 @@ public ServiceRepository services() { * Create an API client. * * @return the created API client - * @throws SignNowApiException if there is an error during the creation process */ @NotNull - private ApiClient createApiClient() throws SignNowApiException { + private ApiClient createApiClient() { ConfigRepository config = (ConfigRepository) this.serviceRepository.get("config"); OkHttpClient httpClient = new OkHttpClient.Builder() @@ -92,6 +89,24 @@ private ApiClient createApiClient() throws SignNowApiException { @NotNull private ConfigRepository createSdkConfig() throws SignNowApiException { ConfigLoader configLoader = new ConfigLoader(); - return new ConfigRepository(configLoader.load(this.configPath)); + ConfigDefaults defaults = new ConfigDefaults(); + Map defaultConfig = defaults.getDefaults(); + Map config; + File file = new File(this.configPath); + if (file.exists() && file.isFile()) { + Map fileConfig = configLoader.load(this.configPath); + config = new HashMap<>(fileConfig); + } else { + Map envConfig = configLoader.loadConfigFromEnvironmentVariables(); + config = new HashMap<>(envConfig); + } + defaultConfig.forEach( + (key, defaultVal) -> { + String currentVal = config.get(key); + if (currentVal == null || currentVal.isBlank()) { + config.put(key, defaultVal); + } + }); + return new ConfigRepository(config); } } diff --git a/src/test/java/com/signnow/core/config/ConfigRepositoryTest.java b/src/test/java/com/signnow/core/config/ConfigRepositoryTest.java index fec68b0..e394b34 100644 --- a/src/test/java/com/signnow/core/config/ConfigRepositoryTest.java +++ b/src/test/java/com/signnow/core/config/ConfigRepositoryTest.java @@ -13,20 +13,20 @@ import com.signnow.core.exception.SignNowApiException; import com.signnow.core.token.BasicToken; +import com.signnow.mock.Constants; import java.util.Map; import java.util.Objects; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class ConfigRepositoryTest { - private static final String TEST_CONFIG_FILE = "mock_config.env"; - private ConfigRepository configRepository; @BeforeEach public void setUp() { String configPath = - Objects.requireNonNull(getClass().getClassLoader().getResource(TEST_CONFIG_FILE)).getPath(); + Objects.requireNonNull(getClass().getClassLoader().getResource(Constants.TEST_CONFIG_FILE)) + .getPath(); try { Map configMap = (new ConfigLoader()).load(configPath); configRepository = new ConfigRepository(configMap); diff --git a/src/test/java/com/signnow/core/provider/ApiServiceProviderTest.java b/src/test/java/com/signnow/core/provider/ApiServiceProviderTest.java new file mode 100644 index 0000000..8d47999 --- /dev/null +++ b/src/test/java/com/signnow/core/provider/ApiServiceProviderTest.java @@ -0,0 +1,68 @@ +/* + * This file is a part of signNow SDK API client. + * + * (с) Copyright © 2011-present airSlate Inc. (https://www.signnow.com) + * + * For more details on copyright, see LICENSE.md file + * that was distributed with this source code. + */ + +package com.signnow.core.provider; + +import static org.junit.jupiter.api.Assertions.*; + +import com.signnow.core.config.ConfigRepository; +import com.signnow.core.exception.SignNowApiException; +import com.signnow.core.token.BasicToken; +import com.signnow.mock.Constants; +import java.util.Objects; +import org.junit.jupiter.api.Test; + +public class ApiServiceProviderTest { + @Test + public void testBuildConfigWithDefaultsLoading() { + try { + ApiServiceProvider provider = new ApiServiceProvider(".not_existing_config"); + provider.register(); + ConfigRepository configRepository = (ConfigRepository) provider.services().get("config"); + + assertNotNull(configRepository); + assertEquals("https://api.signnow.com", configRepository.host()); + assertEquals("", configRepository.user()); + assertEquals("", configRepository.password()); + assertEquals("", configRepository.basicToken().token()); + assertEquals(System.getProperty("user.dir"), configRepository.projectDirectory()); + assertEquals( + configRepository.projectDirectory() + "/src/main/resources/downloads", + configRepository.downloadsDirectory()); + } catch (SignNowApiException e) { + fail(e.getMessage()); + } + } + + @Test + public void testBuildConfigWithActualConfigFile() { + try { + String configPath = + Objects.requireNonNull( + getClass().getClassLoader().getResource(Constants.TEST_CONFIG_FILE)) + .getPath(); + ApiServiceProvider provider = new ApiServiceProvider(configPath); + provider.register(); + ConfigRepository configRepository = (ConfigRepository) provider.services().get("config"); + + assertNotNull(configRepository); + assertEquals("https://api.test.not.exist.signnow.com", configRepository.host()); + assertEquals("user-test@signnow.com", configRepository.user()); + assertEquals("test!PAZZW", configRepository.password()); + assertInstanceOf(BasicToken.class, configRepository.basicToken()); + assertEquals("test_basic_token", configRepository.basicToken().token()); + assertEquals(System.getProperty("user.dir"), configRepository.projectDirectory()); + assertEquals( + configRepository.projectDirectory() + "/src/main/resources/downloads", + configRepository.downloadsDirectory()); + } catch (SignNowApiException e) { + fail(e.getMessage()); + } + } +} diff --git a/src/test/java/com/signnow/mock/Constants.java b/src/test/java/com/signnow/mock/Constants.java new file mode 100644 index 0000000..57c1616 --- /dev/null +++ b/src/test/java/com/signnow/mock/Constants.java @@ -0,0 +1,14 @@ +/* + * This file is a part of signNow SDK API client. + * + * (с) Copyright © 2011-present airSlate Inc. (https://www.signnow.com) + * + * For more details on copyright, see LICENSE.md file + * that was distributed with this source code. + */ + +package com.signnow.mock; + +public class Constants { + public static final String TEST_CONFIG_FILE = "mock_config.env"; +}