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: 2 additions & 0 deletions client/resources/config-default.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ voice-server-south-east-asia2=https://calling-apse2.api.sinch.com
conversation-region=
conversation-server=https://%s.conversation.api.sinch.com
template-management-conversation-server=https://%s.template.api.sinch.com

number-lookup-server=https://lookup.api.sinch.com
49 changes: 49 additions & 0 deletions client/src/main/com/sinch/sdk/SinchClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.sinch.sdk.core.utils.StringUtil;
import com.sinch.sdk.domains.conversation.ConversationService;
import com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService;
import com.sinch.sdk.domains.numbers.NumbersService;
import com.sinch.sdk.domains.sms.SMSService;
import com.sinch.sdk.domains.verification.VerificationService;
Expand All @@ -10,6 +11,7 @@
import com.sinch.sdk.models.Configuration;
import com.sinch.sdk.models.ConversationContext;
import com.sinch.sdk.models.ConversationRegion;
import com.sinch.sdk.models.NumberLookupContext;
import com.sinch.sdk.models.NumbersContext;
import com.sinch.sdk.models.SMSRegion;
import com.sinch.sdk.models.SmsContext;
Expand Down Expand Up @@ -50,6 +52,8 @@ public class SinchClient {
private static final String CONVERSATION_TEMPLATE_SERVER_KEY =
"template-management-conversation-server";

private static final String NUMBER_LOOKUP_SERVER_KEY = "number-lookup-server";

// sinch-sdk/{sdk_version} ({language}/{language_version}; {implementation_type};
// {auxiliary_flag})
private static final String SDK_USER_AGENT_HEADER = "User-Agent";
Expand All @@ -63,6 +67,7 @@ public class SinchClient {
private volatile VerificationService verification;
private volatile VoiceService voice;
private volatile ConversationService conversation;
private volatile NumberLookupService lookup;
private volatile HttpClientApache httpClient;

/**
Expand All @@ -88,6 +93,7 @@ public SinchClient(Configuration configuration) {
handleDefaultVerificationSettings(configurationGuard, props, builder);
handleDefaultVoiceSettings(configurationGuard, props, builder);
handleDefaultConversationSettings(configurationGuard, props, builder);
handleDefaultNumberLookupSettings(configurationGuard, props, builder);

Configuration newConfiguration = builder.build();
checkConfiguration(newConfiguration);
Expand Down Expand Up @@ -228,6 +234,23 @@ private void handleDefaultConversationSettings(
builder.setConversationContext(contextBuilder.build());
}

private void handleDefaultNumberLookupSettings(
Configuration configuration, Properties props, Configuration.Builder builder) {

String url =
configuration
.getNumberLookupContext()
.map(NumberLookupContext::getNumberLookupUrl)
.orElse(null);

if (null == url && props.containsKey(NUMBER_LOOKUP_SERVER_KEY)) {
builder.setNumberLookupContext(
NumberLookupContext.builder()
.setNumberLookupUrl(props.getProperty(NUMBER_LOOKUP_SERVER_KEY))
.build());
}
}

/**
* Get current configuration
*
Expand Down Expand Up @@ -333,6 +356,23 @@ public ConversationService conversation() {
return conversation;
}

/**
* Get Number Lookup domain service
*
* @return Return instance onto Number Lookup API service
* @since 2.1
*/
public NumberLookupService lookup() {
if (null == lookup) {
synchronized (this) {
if (null == lookup) {
lookup = lookupInit();
}
}
}
return lookup;
}

private void checkConfiguration(Configuration configuration) throws NullPointerException {
Objects.requireNonNull(configuration.getOAuthUrl(), "'oauthUrl' cannot be null");
}
Expand Down Expand Up @@ -384,6 +424,14 @@ private ConversationService conversationInit() {
this::getHttpClient);
}

private NumberLookupService lookupInit() {
return new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService(
getConfiguration().getUnifiedCredentials().orElse(null),
getConfiguration().getNumberLookupContext().orElse(null),
getConfiguration().getOAuthServer(),
this::getHttpClient);
}

private Properties handlePropertiesFile(String fileName) {

Properties prop = new Properties();
Expand Down Expand Up @@ -466,6 +514,7 @@ public void close() {
verification = null;
voice = null;
conversation = null;
lookup = null;
if (local != null) {
try {
local.close();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.sinch.sdk.domains.numberlookup;

/**
* Number Lookup Service
*
* @see <a
* href="https://developers.sinch.com/docs/number-lookup-api-v2">https://developers.sinch.com/docs/number-lookup-api-v2</a>
* @since 2.1
*/
public interface NumberLookupService {

/**
* Number Lookup Service V2
*
* @return V2 service instance for project
* @since 2.1
*/
com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.sinch.sdk.domains.numberlookup.adapters;

import com.sinch.sdk.core.http.HttpClient;
import com.sinch.sdk.core.models.ServerConfiguration;
import com.sinch.sdk.models.NumberLookupContext;
import com.sinch.sdk.models.UnifiedCredentials;
import java.util.function.Supplier;

public class NumberLookupService implements com.sinch.sdk.domains.numberlookup.NumberLookupService {

private final UnifiedCredentials credentials;
private final NumberLookupContext context;
private final ServerConfiguration oAuthServer;
private final Supplier<HttpClient> httpClientSupplier;

private volatile com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2;

public NumberLookupService(
UnifiedCredentials credentials,
NumberLookupContext context,
ServerConfiguration oAuthServer,
Supplier<HttpClient> httpClientSupplier) {
this.credentials = credentials;
this.context = context;
this.oAuthServer = oAuthServer;
this.httpClientSupplier = httpClientSupplier;
}

@Override
public com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2() {
if (null == this.v2) {
synchronized (this) {
if (null == this.v2) {
this.v2 =
new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService(
credentials, context, oAuthServer, httpClientSupplier);
}
}
}
return this.v2;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.sinch.sdk.domains.numberlookup.api.v2;

/**
* Number Lookup Service V2
*
* @see <a
* href="https://developers.sinch.com/docs/number-lookup-api-v2">https://developers.sinch.com/docs/number-lookup-api-v2</a>
* @since 2.1
*/
public interface NumberLookupService {

/**
* Number Lookup Service instance
*
* @return service instance for project
* @since 2.1
*/
NumberLookupV2Service lookup();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.sinch.sdk.domains.numberlookup.api.v2.adapters;

import com.sinch.sdk.auth.adapters.OAuthManager;
import com.sinch.sdk.core.http.AuthManager;
import com.sinch.sdk.core.http.HttpClient;
import com.sinch.sdk.core.http.HttpMapper;
import com.sinch.sdk.core.models.ServerConfiguration;
import com.sinch.sdk.core.utils.StringUtil;
import com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service;
import com.sinch.sdk.models.NumberLookupContext;
import com.sinch.sdk.models.UnifiedCredentials;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class NumberLookupService
implements com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService {

private static final Logger LOGGER = Logger.getLogger(NumberLookupService.class.getName());
private static final String SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP = "OAuth2";

private final UnifiedCredentials credentials;
private final NumberLookupContext context;
private final ServerConfiguration oAuthServer;
private final Supplier<HttpClient> httpClientSupplier;

private volatile String uriUUID;
private volatile Map<String, AuthManager> authManagers;

private volatile NumberLookupV2Service lookup;

public NumberLookupService(
UnifiedCredentials credentials,
NumberLookupContext context,
ServerConfiguration oAuthServer,
Supplier<HttpClient> httpClientSupplier) {
this.credentials = credentials;
this.context = context;
this.oAuthServer = oAuthServer;
this.httpClientSupplier = httpClientSupplier;
}

@Override
public NumberLookupV2Service lookup() {
if (null == this.lookup) {
synchronized (this) {
if (null == this.lookup) {
instanceLazyInit();
this.lookup =
new NumberLookupV2ServiceImpl(
httpClientSupplier.get(),
context.getNumberLookupServer(),
authManagers,
HttpMapper.getInstance(),
uriUUID);
}
}
}
return this.lookup;
}

private void instanceLazyInit() {
if (null != this.authManagers) {
return;
}
synchronized (this) {
if (null == this.authManagers) {
Objects.requireNonNull(
credentials, "Number Lookup service requires unified credentials to be defined");
Objects.requireNonNull(context, "Number Lookup service requires context to be defined");
StringUtil.requireNonEmpty(
credentials.getKeyId(), "Number Lookup service requires 'keyId' to be defined");
StringUtil.requireNonEmpty(
credentials.getKeySecret(), "Number Lookup service requires 'keySecret' to be defined");
StringUtil.requireNonEmpty(
credentials.getProjectId(), "Number Lookup service requires 'projectId' to be defined");
StringUtil.requireNonEmpty(
context.getNumberLookupUrl(),
"Number Lookup service requires 'numberLookupUrl' to be defined");

LOGGER.fine(
"Activate Number Lookup API with server='"
+ context.getNumberLookupServer().getUrl()
+ "'");

AuthManager authManager =
new OAuthManager(
credentials, oAuthServer, HttpMapper.getInstance(), httpClientSupplier);

uriUUID = credentials.getProjectId();
authManagers =
Stream.of(
new AbstractMap.SimpleEntry<>(
SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP, authManager))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
}
}
}
Loading
Loading