Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -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/)

Expand Down
12 changes: 11 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.signnow</groupId>
<artifactId>signnow-java-sdk</artifactId>
<version>3.2.1</version>
<version>3.5.1</version>
<packaging>jar</packaging>
<name>signnow-java-sdk</name>
<description>SignNow official Java SDK</description>
Expand All @@ -26,6 +26,16 @@
<name>Ihor Cherkashyn</name>
<email>cherkashyn.ihor@pdffiller.team</email>
</developer>
<developer>
<id>Vasyl-Kravets</id>
<name>Vasyl Kravets</name>
<email>kravets.vasyl@pdffiller.team</email>
</developer>
<developer>
<id>Mykhailo-Lebediev</id>
<name>Mykhailo Lebediev</name>
<email>lebedev.mikhail@pdffiller.team</email>
</developer>
</developers>

<scm>
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/com/signnow/core/config/ConfigDefaults.java
Original file line number Diff line number Diff line change
@@ -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<String, String> getDefaults() {
Map<String, String> 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
};
}
}
34 changes: 26 additions & 8 deletions src/main/java/com/signnow/core/config/ConfigLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -56,4 +54,24 @@ public Map<String, String> load(String filePath) throws SignNowApiException {
}
return configMap;
}
}

/**
* Load API credentials from environment variables if they exist.
*
* @return A map of SDK configuration parsed from environment variables
*/
public Map<String, String> loadConfigFromEnvironmentVariables() {
String[] envVars = ConfigDefaults.getEnvironmentVariableNames();

Map<String, String> config = new HashMap<>();
Map<String, String> env = System.getenv();

for (String envVar : envVars) {
String value = env.get(envVar);
if (value != null) {
config.put(envVar, value);
}
}
return config;
}
}
13 changes: 6 additions & 7 deletions src/main/java/com/signnow/core/config/ConfigRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> configMap;

Expand All @@ -36,7 +35,7 @@ public ConfigRepository(Map<String, String> 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);
}

/**
Expand All @@ -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));
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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() {
Expand All @@ -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());
Expand Down
39 changes: 27 additions & 12 deletions src/main/java/com/signnow/core/provider/ApiServiceProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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()
Expand All @@ -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<String, String> defaultConfig = defaults.getDefaults();
Map<String, String> config;
File file = new File(this.configPath);
if (file.exists() && file.isFile()) {
Map<String, String> fileConfig = configLoader.load(this.configPath);
config = new HashMap<>(fileConfig);
} else {
Map<String, String> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> configMap = (new ConfigLoader()).load(configPath);
configRepository = new ConfigRepository(configMap);
Expand Down
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
14 changes: 14 additions & 0 deletions src/test/java/com/signnow/mock/Constants.java
Original file line number Diff line number Diff line change
@@ -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";
}