Skip to content

Commit 1fcc01c

Browse files
committed
Use the same defaults for Lookup and LookupSession
1 parent c6b636d commit 1fcc01c

File tree

4 files changed

+56
-27
lines changed

4 files changed

+56
-27
lines changed

EXAMPLES.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ InetAddress addr = Address.getByName("www.dnsjava.org");
1515

1616
## Get the MX target and preference of a name (modern)
1717
```java
18-
Resolver r = new SimpleResolver("8.8.8.8");
19-
LookupSession s = LookupSession.builder().resolver(r).build();
18+
LookupSession s = LookupSession.defaultBuilder().build();
2019
Name mxLookup = Name.fromString("gmail.com.");
2120
s.lookupAsync(mxLookup, Type.MX)
2221
.whenComplete(

src/main/java/org/xbill/DNS/ResolverConfig.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@
2424
*
2525
* <p>The following are attempted, in order, until one succeeds.
2626
*
27-
* <UL>
28-
* <LI>dnsjava properties, see {@link org.xbill.DNS.config.PropertyResolverConfigProvider}
29-
* <LI>On Unix, /etc/resolv.conf is parsed, see {@link
27+
* <ul>
28+
* <li>dnsjava properties, see {@link org.xbill.DNS.config.PropertyResolverConfigProvider}
29+
* <li>On Unix, /etc/resolv.conf is parsed, see {@link
3030
* org.xbill.DNS.config.ResolvConfResolverConfigProvider}
31-
* <LI>On Windows, GetAdaptersAddresses is called, see {@link
31+
* <li>On Windows, GetAdaptersAddresses is called, see {@link
3232
* org.xbill.DNS.config.WindowsResolverConfigProvider}
3333
* <li>On Android, system properties or the ConnectivityManager are read, see {@link
3434
* org.xbill.DNS.config.AndroidResolverConfigProvider}
3535
* <li>The JNDI DNS Service Provider is queried, see {@link
3636
* org.xbill.DNS.config.JndiContextResolverConfigProvider}
37-
* <LI>The sun.net.dns.ResolverConfiguration class is queried, see {@link
37+
* <li>The sun.net.dns.ResolverConfiguration class is queried, see {@link
3838
* org.xbill.DNS.config.SunJvmResolverConfigProvider}
39-
* <LI>"localhost" is used as the nameserver, and the search path is empty.
40-
* </UL>
39+
* <li>{@code localhost} is used as the nameserver, and the search path is empty.
40+
* </ul>
4141
*
4242
* These routines will be called internally when creating Resolvers/Lookups without explicitly
4343
* specifying server names, and can also be called directly if desired.

src/main/java/org/xbill/DNS/lookup/LookupSession.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.xbill.DNS.Credibility;
2929
import org.xbill.DNS.DClass;
3030
import org.xbill.DNS.DNAMERecord;
31+
import org.xbill.DNS.ExtendedResolver;
3132
import org.xbill.DNS.Lookup;
3233
import org.xbill.DNS.Message;
3334
import org.xbill.DNS.Name;
@@ -36,8 +37,10 @@
3637
import org.xbill.DNS.Rcode;
3738
import org.xbill.DNS.Record;
3839
import org.xbill.DNS.Resolver;
40+
import org.xbill.DNS.ResolverConfig;
3941
import org.xbill.DNS.Section;
4042
import org.xbill.DNS.SetResponse;
43+
import org.xbill.DNS.SimpleResolver;
4144
import org.xbill.DNS.Type;
4245
import org.xbill.DNS.hosts.HostsFileParser;
4346

@@ -93,7 +96,10 @@ private LookupSession(
9396
this.ndots = ndots;
9497
this.searchPath = searchPath;
9598
this.cycleResults = cycleResults;
96-
this.caches = caches.stream().collect(Collectors.toMap(Cache::getDClass, e -> e));
99+
this.caches =
100+
caches == null
101+
? Collections.emptyMap()
102+
: caches.stream().collect(Collectors.toMap(Cache::getDClass, e -> e));
97103
this.hostsFileParser = hostsFileParser;
98104
this.executor = executor == null ? ForkJoinPool.commonPool() : executor;
99105
}
@@ -148,7 +154,9 @@ public LookupSessionBuilder caches(@NonNull Collection<Cache> caches) {
148154

149155
/** Disables using a cache for lookups. */
150156
public LookupSessionBuilder clearCaches() {
151-
caches.clear();
157+
if (caches != null) {
158+
caches.clear();
159+
}
152160
return this;
153161
}
154162

@@ -197,7 +205,10 @@ void preBuild() {
197205
}
198206
}
199207

200-
/** Returns a new {@link LookupSessionBuilder} instance. */
208+
/**
209+
* Returns an empty {@link LookupSessionBuilder} instance. See {@link #defaultBuilder()} for a
210+
* builder initialized with defaults.
211+
*/
201212
public static LookupSessionBuilder builder() {
202213
LookupSessionBuilder builder =
203214
new LookupSessionBuilder() {
@@ -209,10 +220,32 @@ public LookupSession build() {
209220
};
210221
builder.maxRedirects = DEFAULT_MAX_ITERATIONS;
211222
builder.ndots = DEFAULT_NDOTS;
212-
builder.cache(new Cache(DClass.IN));
213223
return builder;
214224
}
215225

226+
/**
227+
* Returns a {@link LookupSessionBuilder} instance initialized with defaults.
228+
*
229+
* <ul>
230+
* <li>Resolver: an {@link org.xbill.DNS.ExtendedResolver} initialized with the system's default
231+
* DNS servers as determined by {@link org.xbill.DNS.ResolverConfig}.
232+
* <li>ndots: as determined by {@link org.xbill.DNS.ResolverConfig}.
233+
* <li>Cache: A cache for the {@code IN} class is installed.
234+
* <li>Hosts: The local host database file is used.
235+
* </ul>
236+
*/
237+
public static LookupSessionBuilder defaultBuilder() {
238+
return builder()
239+
.resolver(
240+
new ExtendedResolver(
241+
ResolverConfig.getCurrentConfig().servers().stream()
242+
.map(SimpleResolver::new)
243+
.collect(Collectors.toList())))
244+
.ndots(ResolverConfig.getCurrentConfig().ndots())
245+
.cache(new Cache(DClass.IN))
246+
.defaultHostsFileParser();
247+
}
248+
216249
/**
217250
* Make an asynchronous lookup of the provided name using the default {@link DClass#IN}.
218251
*

src/test/java/org/xbill/DNS/lookup/LookupSessionTest.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -277,18 +277,15 @@ void lookupAsync_absoluteQueryWithCacheMiss() throws InterruptedException, Execu
277277
@Test
278278
void lookupAsync_absoluteQueryWithoutCache() throws InterruptedException, ExecutionException {
279279
wireUpMockResolver(mockResolver, query -> answer(query, name -> LOOPBACK_A));
280-
Cache mockCache = mock(Cache.class);
281-
when(mockCache.getDClass()).thenReturn(IN);
282280

283281
LookupSession lookupSession =
284-
LookupSession.builder().resolver(mockResolver).cache(mockCache).clearCaches().build();
282+
LookupSession.builder().resolver(mockResolver).clearCaches().build();
285283
CompletionStage<LookupResult> resultFuture = lookupSession.lookupAsync(name("a.b."), A, IN);
286284

287285
LookupResult result = resultFuture.toCompletableFuture().get();
288286
assertEquals(singletonList(LOOPBACK_A.withName(name("a.b."))), result.getRecords());
289287

290288
verify(mockResolver).sendAsync(any(), any(Executor.class));
291-
verifyNoMoreInteractions(mockCache);
292289
}
293290

294291
@Test
@@ -436,8 +433,8 @@ void lookupAsync_twoCnameRedirectMultipleQueries(boolean useCache) throws Except
436433

437434
LookupSession lookupSession =
438435
useCache
439-
? LookupSession.builder().resolver(mockResolver).build()
440-
: LookupSession.builder().clearCaches().resolver(mockResolver).build();
436+
? LookupSession.builder().cache(new Cache()).resolver(mockResolver).build()
437+
: LookupSession.builder().resolver(mockResolver).build();
441438

442439
CompletionStage<LookupResult> resultFuture = lookupSession.lookupAsync(name("cname.a."), A, IN);
443440

@@ -478,8 +475,8 @@ void lookupAsync_twoDnameRedirectOneQuery(boolean useCache, boolean includeSynth
478475

479476
LookupSession lookupSession =
480477
useCache
481-
? LookupSession.builder().resolver(mockResolver).build()
482-
: LookupSession.builder().clearCaches().resolver(mockResolver).build();
478+
? LookupSession.builder().cache(new Cache()).resolver(mockResolver).build()
479+
: LookupSession.builder().resolver(mockResolver).build();
483480

484481
CompletionStage<LookupResult> resultFuture =
485482
lookupSession.lookupAsync(name("www.example.org."), A, IN);
@@ -509,8 +506,8 @@ void lookupAsync_twoCnameRedirectOneQuery(boolean useCache) throws Exception {
509506

510507
LookupSession lookupSession =
511508
useCache
512-
? LookupSession.builder().resolver(mockResolver).build()
513-
: LookupSession.builder().clearCaches().resolver(mockResolver).build();
509+
? LookupSession.builder().cache(new Cache()).resolver(mockResolver).build()
510+
: LookupSession.builder().resolver(mockResolver).build();
514511

515512
CompletionStage<LookupResult> resultFuture = lookupSession.lookupAsync(name("cname.a."), A, IN);
516513

@@ -549,8 +546,8 @@ void lookupAsync_twoCnameRedirectIncompleteResponse(boolean useCache, int firstR
549546

550547
LookupSession lookupSession =
551548
useCache
552-
? LookupSession.builder().resolver(mockResolver).build()
553-
: LookupSession.builder().clearCaches().resolver(mockResolver).build();
549+
? LookupSession.builder().cache(new Cache()).resolver(mockResolver).build()
550+
: LookupSession.builder().resolver(mockResolver).build();
554551

555552
CompletionStage<LookupResult> resultFuture = lookupSession.lookupAsync(name("cname.a."), A, IN);
556553

@@ -605,8 +602,8 @@ void lookupAsync_simpleCnameRedirect(boolean useCache, String rcode, String type
605602

606603
LookupSession lookupSession =
607604
useCache
608-
? LookupSession.builder().resolver(mockResolver).build()
609-
: LookupSession.builder().clearCaches().resolver(mockResolver).build();
605+
? LookupSession.builder().cache(new Cache()).resolver(mockResolver).build()
606+
: LookupSession.builder().resolver(mockResolver).build();
610607

611608
CompletionStage<LookupResult> resultFuture =
612609
lookupSession.lookupAsync(name("cname.r."), Type.value(type), IN);

0 commit comments

Comments
 (0)