Skip to content

Commit d73c013

Browse files
authored
NumberLookup Api V2 implementation (#348)
* NumberLookup Api V2 implementation * New sources generated for number-lookup api v2
1 parent 17389fb commit d73c013

69 files changed

Lines changed: 4193 additions & 4 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

client/resources/config-default.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ voice-server-south-east-asia2=https://calling-apse2.api.sinch.com
2121
conversation-region=
2222
conversation-server=https://%s.conversation.api.sinch.com
2323
template-management-conversation-server=https://%s.template.api.sinch.com
24+
25+
number-lookup-server=https://lookup.api.sinch.com

client/src/main/com/sinch/sdk/SinchClient.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.sinch.sdk.core.utils.StringUtil;
44
import com.sinch.sdk.domains.conversation.ConversationService;
5+
import com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService;
56
import com.sinch.sdk.domains.numbers.NumbersService;
67
import com.sinch.sdk.domains.sms.SMSService;
78
import com.sinch.sdk.domains.verification.VerificationService;
@@ -10,6 +11,7 @@
1011
import com.sinch.sdk.models.Configuration;
1112
import com.sinch.sdk.models.ConversationContext;
1213
import com.sinch.sdk.models.ConversationRegion;
14+
import com.sinch.sdk.models.NumberLookupContext;
1315
import com.sinch.sdk.models.NumbersContext;
1416
import com.sinch.sdk.models.SMSRegion;
1517
import com.sinch.sdk.models.SmsContext;
@@ -50,6 +52,8 @@ public class SinchClient {
5052
private static final String CONVERSATION_TEMPLATE_SERVER_KEY =
5153
"template-management-conversation-server";
5254

55+
private static final String NUMBER_LOOKUP_SERVER_KEY = "number-lookup-server";
56+
5357
// sinch-sdk/{sdk_version} ({language}/{language_version}; {implementation_type};
5458
// {auxiliary_flag})
5559
private static final String SDK_USER_AGENT_HEADER = "User-Agent";
@@ -63,6 +67,7 @@ public class SinchClient {
6367
private volatile VerificationService verification;
6468
private volatile VoiceService voice;
6569
private volatile ConversationService conversation;
70+
private volatile NumberLookupService lookup;
6671
private volatile HttpClientApache httpClient;
6772

6873
/**
@@ -88,6 +93,7 @@ public SinchClient(Configuration configuration) {
8893
handleDefaultVerificationSettings(configurationGuard, props, builder);
8994
handleDefaultVoiceSettings(configurationGuard, props, builder);
9095
handleDefaultConversationSettings(configurationGuard, props, builder);
96+
handleDefaultNumberLookupSettings(configurationGuard, props, builder);
9197

9298
Configuration newConfiguration = builder.build();
9399
checkConfiguration(newConfiguration);
@@ -228,6 +234,23 @@ private void handleDefaultConversationSettings(
228234
builder.setConversationContext(contextBuilder.build());
229235
}
230236

237+
private void handleDefaultNumberLookupSettings(
238+
Configuration configuration, Properties props, Configuration.Builder builder) {
239+
240+
String url =
241+
configuration
242+
.getNumberLookupContext()
243+
.map(NumberLookupContext::getNumberLookupUrl)
244+
.orElse(null);
245+
246+
if (null == url && props.containsKey(NUMBER_LOOKUP_SERVER_KEY)) {
247+
builder.setNumberLookupContext(
248+
NumberLookupContext.builder()
249+
.setNumberLookupUrl(props.getProperty(NUMBER_LOOKUP_SERVER_KEY))
250+
.build());
251+
}
252+
}
253+
231254
/**
232255
* Get current configuration
233256
*
@@ -333,6 +356,23 @@ public ConversationService conversation() {
333356
return conversation;
334357
}
335358

359+
/**
360+
* Get Number Lookup domain service
361+
*
362+
* @return Return instance onto Number Lookup API service
363+
* @since 2.1
364+
*/
365+
public NumberLookupService lookup() {
366+
if (null == lookup) {
367+
synchronized (this) {
368+
if (null == lookup) {
369+
lookup = lookupInit();
370+
}
371+
}
372+
}
373+
return lookup;
374+
}
375+
336376
private void checkConfiguration(Configuration configuration) throws NullPointerException {
337377
Objects.requireNonNull(configuration.getOAuthUrl(), "'oauthUrl' cannot be null");
338378
}
@@ -384,6 +424,14 @@ private ConversationService conversationInit() {
384424
this::getHttpClient);
385425
}
386426

427+
private NumberLookupService lookupInit() {
428+
return new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService(
429+
getConfiguration().getUnifiedCredentials().orElse(null),
430+
getConfiguration().getNumberLookupContext().orElse(null),
431+
getConfiguration().getOAuthServer(),
432+
this::getHttpClient);
433+
}
434+
387435
private Properties handlePropertiesFile(String fileName) {
388436

389437
Properties prop = new Properties();
@@ -466,6 +514,7 @@ public void close() {
466514
verification = null;
467515
voice = null;
468516
conversation = null;
517+
lookup = null;
469518
if (local != null) {
470519
try {
471520
local.close();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sinch.sdk.domains.numberlookup;
2+
3+
/**
4+
* Number Lookup Service
5+
*
6+
* @see <a
7+
* href="https://developers.sinch.com/docs/number-lookup-api-v2">https://developers.sinch.com/docs/number-lookup-api-v2</a>
8+
* @since 2.1
9+
*/
10+
public interface NumberLookupService {
11+
12+
/**
13+
* Number Lookup Service V2
14+
*
15+
* @return V2 service instance for project
16+
* @since 2.1
17+
*/
18+
com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2();
19+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.sinch.sdk.domains.numberlookup.adapters;
2+
3+
import com.sinch.sdk.core.http.HttpClient;
4+
import com.sinch.sdk.core.models.ServerConfiguration;
5+
import com.sinch.sdk.models.NumberLookupContext;
6+
import com.sinch.sdk.models.UnifiedCredentials;
7+
import java.util.function.Supplier;
8+
9+
public class NumberLookupService implements com.sinch.sdk.domains.numberlookup.NumberLookupService {
10+
11+
private final UnifiedCredentials credentials;
12+
private final NumberLookupContext context;
13+
private final ServerConfiguration oAuthServer;
14+
private final Supplier<HttpClient> httpClientSupplier;
15+
16+
private volatile com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2;
17+
18+
public NumberLookupService(
19+
UnifiedCredentials credentials,
20+
NumberLookupContext context,
21+
ServerConfiguration oAuthServer,
22+
Supplier<HttpClient> httpClientSupplier) {
23+
this.credentials = credentials;
24+
this.context = context;
25+
this.oAuthServer = oAuthServer;
26+
this.httpClientSupplier = httpClientSupplier;
27+
}
28+
29+
@Override
30+
public com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService v2() {
31+
if (null == this.v2) {
32+
synchronized (this) {
33+
if (null == this.v2) {
34+
this.v2 =
35+
new com.sinch.sdk.domains.numberlookup.api.v2.adapters.NumberLookupService(
36+
credentials, context, oAuthServer, httpClientSupplier);
37+
}
38+
}
39+
}
40+
return this.v2;
41+
}
42+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sinch.sdk.domains.numberlookup.api.v2;
2+
3+
/**
4+
* Number Lookup Service V2
5+
*
6+
* @see <a
7+
* href="https://developers.sinch.com/docs/number-lookup-api-v2">https://developers.sinch.com/docs/number-lookup-api-v2</a>
8+
* @since 2.1
9+
*/
10+
public interface NumberLookupService {
11+
12+
/**
13+
* Number Lookup Service instance
14+
*
15+
* @return service instance for project
16+
* @since 2.1
17+
*/
18+
NumberLookupV2Service lookup();
19+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.sinch.sdk.domains.numberlookup.api.v2.adapters;
2+
3+
import com.sinch.sdk.auth.adapters.OAuthManager;
4+
import com.sinch.sdk.core.http.AuthManager;
5+
import com.sinch.sdk.core.http.HttpClient;
6+
import com.sinch.sdk.core.http.HttpMapper;
7+
import com.sinch.sdk.core.models.ServerConfiguration;
8+
import com.sinch.sdk.core.utils.StringUtil;
9+
import com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupV2Service;
10+
import com.sinch.sdk.models.NumberLookupContext;
11+
import com.sinch.sdk.models.UnifiedCredentials;
12+
import java.util.AbstractMap;
13+
import java.util.Map;
14+
import java.util.Objects;
15+
import java.util.function.Supplier;
16+
import java.util.logging.Logger;
17+
import java.util.stream.Collectors;
18+
import java.util.stream.Stream;
19+
20+
public class NumberLookupService
21+
implements com.sinch.sdk.domains.numberlookup.api.v2.NumberLookupService {
22+
23+
private static final Logger LOGGER = Logger.getLogger(NumberLookupService.class.getName());
24+
private static final String SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP = "OAuth2";
25+
26+
private final UnifiedCredentials credentials;
27+
private final NumberLookupContext context;
28+
private final ServerConfiguration oAuthServer;
29+
private final Supplier<HttpClient> httpClientSupplier;
30+
31+
private volatile String uriUUID;
32+
private volatile Map<String, AuthManager> authManagers;
33+
34+
private volatile NumberLookupV2Service lookup;
35+
36+
public NumberLookupService(
37+
UnifiedCredentials credentials,
38+
NumberLookupContext context,
39+
ServerConfiguration oAuthServer,
40+
Supplier<HttpClient> httpClientSupplier) {
41+
this.credentials = credentials;
42+
this.context = context;
43+
this.oAuthServer = oAuthServer;
44+
this.httpClientSupplier = httpClientSupplier;
45+
}
46+
47+
@Override
48+
public NumberLookupV2Service lookup() {
49+
if (null == this.lookup) {
50+
synchronized (this) {
51+
if (null == this.lookup) {
52+
instanceLazyInit();
53+
this.lookup =
54+
new NumberLookupV2ServiceImpl(
55+
httpClientSupplier.get(),
56+
context.getNumberLookupServer(),
57+
authManagers,
58+
HttpMapper.getInstance(),
59+
uriUUID);
60+
}
61+
}
62+
}
63+
return this.lookup;
64+
}
65+
66+
private void instanceLazyInit() {
67+
if (null != this.authManagers) {
68+
return;
69+
}
70+
synchronized (this) {
71+
if (null == this.authManagers) {
72+
Objects.requireNonNull(
73+
credentials, "Number Lookup service requires unified credentials to be defined");
74+
Objects.requireNonNull(context, "Number Lookup service requires context to be defined");
75+
StringUtil.requireNonEmpty(
76+
credentials.getKeyId(), "Number Lookup service requires 'keyId' to be defined");
77+
StringUtil.requireNonEmpty(
78+
credentials.getKeySecret(), "Number Lookup service requires 'keySecret' to be defined");
79+
StringUtil.requireNonEmpty(
80+
credentials.getProjectId(), "Number Lookup service requires 'projectId' to be defined");
81+
StringUtil.requireNonEmpty(
82+
context.getNumberLookupUrl(),
83+
"Number Lookup service requires 'numberLookupUrl' to be defined");
84+
85+
LOGGER.fine(
86+
"Activate Number Lookup API with server='"
87+
+ context.getNumberLookupServer().getUrl()
88+
+ "'");
89+
90+
AuthManager authManager =
91+
new OAuthManager(
92+
credentials, oAuthServer, HttpMapper.getInstance(), httpClientSupplier);
93+
94+
uriUUID = credentials.getProjectId();
95+
authManagers =
96+
Stream.of(
97+
new AbstractMap.SimpleEntry<>(
98+
SECURITY_SCHEME_KEYWORD_NUMBER_LOOKUP, authManager))
99+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
100+
}
101+
}
102+
}
103+
}

0 commit comments

Comments
 (0)