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
[](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";
+}