Skip to content

Commit 1b8bce4

Browse files
authored
Use InetAddressResolverProvider and add tests (#1354)
This is a backport of 9a02f81 from `master` to `5.0.x` JAVA-5390
1 parent 4198e27 commit 1b8bce4

File tree

4 files changed

+74
-3
lines changed

4 files changed

+74
-3
lines changed

driver-core/src/main/com/mongodb/internal/connection/ServerAddressHelper.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,27 @@
2121
import com.mongodb.MongoSocketException;
2222
import com.mongodb.ServerAddress;
2323
import com.mongodb.UnixServerAddress;
24+
import com.mongodb.lang.Nullable;
2425
import com.mongodb.spi.dns.InetAddressResolver;
26+
import com.mongodb.spi.dns.InetAddressResolverProvider;
2527

2628
import java.net.InetSocketAddress;
2729
import java.net.UnknownHostException;
2830
import java.util.List;
31+
import java.util.ServiceLoader;
2932
import java.util.stream.Collectors;
33+
import java.util.stream.StreamSupport;
3034

3135
/**
3236
* <p>This class is not part of the public API and may be removed or changed at any time</p>
3337
*/
3438
public final class ServerAddressHelper {
39+
@Nullable
40+
private static final InetAddressResolver LOCATED_INET_ADDRESS_RESOLVER = StreamSupport.stream(
41+
ServiceLoader.load(InetAddressResolverProvider.class).spliterator(), false)
42+
.findFirst()
43+
.map(InetAddressResolverProvider::create)
44+
.orElse(null);
3545

3646
public static ServerAddress createServerAddress(final String host) {
3747
return createServerAddress(host, ServerAddress.defaultPort());
@@ -46,8 +56,14 @@ public static ServerAddress createServerAddress(final String host, final int por
4656
}
4757

4858
public static InetAddressResolver getInetAddressResolver(final MongoClientSettings settings) {
49-
InetAddressResolver inetAddressResolver = settings.getInetAddressResolver();
50-
return inetAddressResolver == null ? new DefaultInetAddressResolver() : inetAddressResolver;
59+
InetAddressResolver explicitInetAddressResolver = settings.getInetAddressResolver();
60+
if (explicitInetAddressResolver != null) {
61+
return explicitInetAddressResolver;
62+
} else if (LOCATED_INET_ADDRESS_RESOLVER != null) {
63+
return LOCATED_INET_ADDRESS_RESOLVER;
64+
} else {
65+
return new DefaultInetAddressResolver();
66+
}
5167
}
5268

5369
public static List<InetSocketAddress> getSocketAddresses(final ServerAddress serverAddress, final InetAddressResolver resolver) {

driver-core/src/main/resources/META-INF/native-image/org.mongodb/bson/native-image.properties

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
Args = --initialize-at-run-time=com.mongodb.UnixServerAddress,com.mongodb.internal.connection.SnappyCompressor,org.bson.types.ObjectId,com.mongodb.internal.connection.ClientMetadataHelper
16+
Args =\
17+
--initialize-at-run-time=\
18+
com.mongodb.UnixServerAddress,\
19+
com.mongodb.internal.connection.SnappyCompressor,\
20+
com.mongodb.internal.connection.ClientMetadataHelper,\
21+
com.mongodb.internal.connection.ServerAddressHelper
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"resources":{
3+
"includes":[{
4+
"pattern":"\\QMETA-INF/services/com.mongodb.spi.dns.InetAddressResolverProvider\\E"
5+
}]},
6+
"bundles":[]
7+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2008-present MongoDB, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.mongodb.connection;
17+
18+
import com.mongodb.MongoClientSettings;
19+
import com.mongodb.internal.connection.DefaultInetAddressResolver;
20+
import com.mongodb.internal.connection.ServerAddressHelper;
21+
import com.mongodb.spi.dns.InetAddressResolver;
22+
import org.junit.jupiter.api.Test;
23+
24+
import static org.junit.jupiter.api.Assertions.assertAll;
25+
import static org.junit.jupiter.api.Assertions.assertEquals;
26+
import static org.junit.jupiter.api.Assertions.assertSame;
27+
28+
final class ServerAddressHelperTest {
29+
@Test
30+
void getInetAddressResolver() {
31+
assertAll(
32+
() -> assertEquals(
33+
DefaultInetAddressResolver.class,
34+
ServerAddressHelper.getInetAddressResolver(MongoClientSettings.builder().build()).getClass()),
35+
() -> {
36+
InetAddressResolver resolver = new DefaultInetAddressResolver();
37+
assertSame(
38+
resolver,
39+
ServerAddressHelper.getInetAddressResolver(MongoClientSettings.builder().inetAddressResolver(resolver).build()));
40+
}
41+
);
42+
}
43+
}

0 commit comments

Comments
 (0)