Skip to content

Commit d7036d4

Browse files
committed
Extensible DnsNameResolverBuilder
1 parent 1194a31 commit d7036d4

File tree

4 files changed

+104
-68
lines changed

4 files changed

+104
-68
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2015 The Netty Project
3+
*
4+
* The Netty Project licenses this file to you under the Apache License,
5+
* version 2.0 (the "License"); you may not use this file except in compliance
6+
* with the License. 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, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations
14+
* under the License.
15+
*/
16+
package io.netty.resolver.dns;
17+
18+
import io.netty.channel.EventLoop;
19+
20+
public class DefaultDnsNameResolverBuilder extends DnsNameResolverBuilder<DefaultDnsNameResolverBuilder> {
21+
22+
public DefaultDnsNameResolverBuilder(EventLoop eventLoop) {
23+
super(eventLoop);
24+
}
25+
26+
@Override
27+
protected DnsNameResolver build0(DnsCache cache) {
28+
return new DnsNameResolver(
29+
eventLoop,
30+
channelFactory,
31+
localAddress,
32+
nameServerAddresses,
33+
cache,
34+
queryTimeoutMillis,
35+
resolvedAddressTypes,
36+
recursionDesired,
37+
maxQueriesPerResolve,
38+
traceEnabled,
39+
maxPayloadSize,
40+
optResourceEnabled,
41+
hostsFileEntriesResolver);
42+
}
43+
}

netty-bp/resolver-dns/src/main/java/io/netty/resolver/dns/DnsAddressResolverGroup.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ protected AddressResolver<InetSocketAddress> newResolver(
8181
EventLoop eventLoop, ChannelFactory<? extends DatagramChannel> channelFactory,
8282
InetSocketAddress localAddress, DnsServerAddresses nameServerAddresses) throws Exception {
8383

84-
return new DnsNameResolverBuilder(eventLoop)
84+
return new DefaultDnsNameResolverBuilder(eventLoop)
8585
.channelFactory(channelFactory)
8686
.localAddress(localAddress)
8787
.nameServerAddresses(nameServerAddresses)

netty-bp/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolverBuilder.java

Lines changed: 57 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package io.netty.resolver.dns;
1717

1818
import static io.netty.util.internal.ObjectUtil2.*;
19-
2019
import io.netty.bootstrap.ChannelFactory;
2120
import io.netty.channel.EventLoop;
2221
import io.netty.channel.ReflectiveChannelFactory;
@@ -33,24 +32,24 @@
3332
/**
3433
* A {@link DnsNameResolver} builder.
3534
*/
36-
public final class DnsNameResolverBuilder {
37-
38-
private final EventLoop eventLoop;
39-
private ChannelFactory<? extends DatagramChannel> channelFactory;
40-
private InetSocketAddress localAddress = DnsNameResolver.ANY_LOCAL_ADDR;
41-
private DnsServerAddresses nameServerAddresses;
42-
private DnsCache resolveCache;
43-
private Integer minTtl;
44-
private Integer maxTtl;
45-
private Integer negativeTtl;
46-
private long queryTimeoutMillis = 5000;
47-
private InternetProtocolFamily[] resolvedAddressTypes = DnsNameResolver.DEFAULT_RESOLVE_ADDRESS_TYPES;
48-
private boolean recursionDesired = true;
49-
private int maxQueriesPerResolve = 3;
50-
private boolean traceEnabled;
51-
private int maxPayloadSize = 4096;
52-
private boolean optResourceEnabled = true;
53-
private HostsFileEntriesResolver hostsFileEntriesResolver = HostsFileEntriesResolver.DEFAULT;
35+
public abstract class DnsNameResolverBuilder<T extends DnsNameResolverBuilder<T>> {
36+
37+
protected final EventLoop eventLoop;
38+
protected ChannelFactory<? extends DatagramChannel> channelFactory;
39+
protected InetSocketAddress localAddress = DnsNameResolver.ANY_LOCAL_ADDR;
40+
protected DnsServerAddresses nameServerAddresses = DnsServerAddresses.defaultAddresses();
41+
protected DnsCache resolveCache;
42+
protected Integer minTtl;
43+
protected Integer maxTtl;
44+
protected Integer negativeTtl;
45+
protected long queryTimeoutMillis = 5000;
46+
protected InternetProtocolFamily[] resolvedAddressTypes = DnsNameResolver.DEFAULT_RESOLVE_ADDRESS_TYPES;
47+
protected boolean recursionDesired = true;
48+
protected int maxQueriesPerResolve = 3;
49+
protected boolean traceEnabled;
50+
protected int maxPayloadSize = 4096;
51+
protected boolean optResourceEnabled = true;
52+
protected HostsFileEntriesResolver hostsFileEntriesResolver = HostsFileEntriesResolver.DEFAULT;
5453

5554
/**
5655
* Creates a new builder.
@@ -62,15 +61,20 @@ public DnsNameResolverBuilder(EventLoop eventLoop) {
6261
this.eventLoop = eventLoop;
6362
}
6463

64+
@SuppressWarnings("unchecked")
65+
private T cast() {
66+
return (T) this;
67+
}
68+
6569
/**
6670
* Sets the {@link ChannelFactory} that will create a {@link DatagramChannel}.
6771
*
6872
* @param channelFactory the {@link ChannelFactory}
6973
* @return {@code this}
7074
*/
71-
public DnsNameResolverBuilder channelFactory(ChannelFactory<? extends DatagramChannel> channelFactory) {
75+
public T channelFactory(ChannelFactory<? extends DatagramChannel> channelFactory) {
7276
this.channelFactory = channelFactory;
73-
return this;
77+
return cast();
7478
}
7579

7680
/**
@@ -80,7 +84,7 @@ public DnsNameResolverBuilder channelFactory(ChannelFactory<? extends DatagramCh
8084
* @param channelType
8185
* @return {@code this}
8286
*/
83-
public DnsNameResolverBuilder channelType(Class<? extends DatagramChannel> channelType) {
87+
public T channelType(Class<? extends DatagramChannel> channelType) {
8488
return channelFactory(new ReflectiveChannelFactory<DatagramChannel>(channelType));
8589
}
8690

@@ -90,9 +94,9 @@ public DnsNameResolverBuilder channelType(Class<? extends DatagramChannel> chann
9094
* @param localAddress the local address
9195
* @return {@code this}
9296
*/
93-
public DnsNameResolverBuilder localAddress(InetSocketAddress localAddress) {
97+
public T localAddress(InetSocketAddress localAddress) {
9498
this.localAddress = localAddress;
95-
return this;
99+
return cast();
96100
}
97101

98102
/**
@@ -101,9 +105,9 @@ public DnsNameResolverBuilder localAddress(InetSocketAddress localAddress) {
101105
* @param nameServerAddresses the DNS server addresses
102106
* @return {@code this}
103107
*/
104-
public DnsNameResolverBuilder nameServerAddresses(DnsServerAddresses nameServerAddresses) {
108+
public T nameServerAddresses(DnsServerAddresses nameServerAddresses) {
105109
this.nameServerAddresses = nameServerAddresses;
106-
return this;
110+
return cast();
107111
}
108112

109113
/**
@@ -112,9 +116,9 @@ public DnsNameResolverBuilder nameServerAddresses(DnsServerAddresses nameServerA
112116
* @param resolveCache the DNS resolution results cache
113117
* @return {@code this}
114118
*/
115-
public DnsNameResolverBuilder resolveCache(DnsCache resolveCache) {
119+
public T resolveCache(DnsCache resolveCache) {
116120
this.resolveCache = resolveCache;
117-
return this;
121+
return cast();
118122
}
119123

120124
/**
@@ -129,10 +133,10 @@ public DnsNameResolverBuilder resolveCache(DnsCache resolveCache) {
129133
* @param maxTtl the maximum TTL
130134
* @return {@code this}
131135
*/
132-
public DnsNameResolverBuilder ttl(int minTtl, int maxTtl) {
136+
public T ttl(int minTtl, int maxTtl) {
133137
this.maxTtl = maxTtl;
134138
this.minTtl = minTtl;
135-
return this;
139+
return cast();
136140
}
137141

138142
/**
@@ -141,9 +145,9 @@ public DnsNameResolverBuilder ttl(int minTtl, int maxTtl) {
141145
* @param negativeTtl the TTL for failed cached queries
142146
* @return {@code this}
143147
*/
144-
public DnsNameResolverBuilder negativeTtl(int negativeTtl) {
148+
public T negativeTtl(int negativeTtl) {
145149
this.negativeTtl = negativeTtl;
146-
return this;
150+
return cast();
147151
}
148152

149153
/**
@@ -152,9 +156,9 @@ public DnsNameResolverBuilder negativeTtl(int negativeTtl) {
152156
* @param queryTimeoutMillis the query timeout
153157
* @return {@code this}
154158
*/
155-
public DnsNameResolverBuilder queryTimeoutMillis(long queryTimeoutMillis) {
159+
public T queryTimeoutMillis(long queryTimeoutMillis) {
156160
this.queryTimeoutMillis = queryTimeoutMillis;
157-
return this;
161+
return cast();
158162
}
159163

160164
/**
@@ -166,7 +170,7 @@ public DnsNameResolverBuilder queryTimeoutMillis(long queryTimeoutMillis) {
166170
* @param resolvedAddressTypes the address types
167171
* @return {@code this}
168172
*/
169-
public DnsNameResolverBuilder resolvedAddressTypes(InternetProtocolFamily... resolvedAddressTypes) {
173+
public T resolvedAddressTypes(InternetProtocolFamily... resolvedAddressTypes) {
170174
checkNotNull(resolvedAddressTypes, "resolvedAddressTypes");
171175

172176
final List<InternetProtocolFamily> list =
@@ -191,7 +195,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(InternetProtocolFamily... res
191195

192196
this.resolvedAddressTypes = list.toArray(new InternetProtocolFamily[list.size()]);
193197

194-
return this;
198+
return cast();
195199
}
196200

197201
/**
@@ -203,7 +207,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(InternetProtocolFamily... res
203207
* @param resolvedAddressTypes the address types
204208
* @return {@code this}
205209
*/
206-
public DnsNameResolverBuilder resolvedAddressTypes(Iterable<InternetProtocolFamily> resolvedAddressTypes) {
210+
public T resolvedAddressTypes(Iterable<InternetProtocolFamily> resolvedAddressTypes) {
207211
checkNotNull(resolvedAddressTypes, "resolveAddressTypes");
208212

209213
final List<InternetProtocolFamily> list =
@@ -228,7 +232,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(Iterable<InternetProtocolFami
228232

229233
this.resolvedAddressTypes = list.toArray(new InternetProtocolFamily[list.size()]);
230234

231-
return this;
235+
return cast();
232236
}
233237

234238
/**
@@ -237,9 +241,9 @@ public DnsNameResolverBuilder resolvedAddressTypes(Iterable<InternetProtocolFami
237241
* @param recursionDesired true if recursion is desired
238242
* @return {@code this}
239243
*/
240-
public DnsNameResolverBuilder recursionDesired(boolean recursionDesired) {
244+
public T recursionDesired(boolean recursionDesired) {
241245
this.recursionDesired = recursionDesired;
242-
return this;
246+
return cast();
243247
}
244248

245249
/**
@@ -248,9 +252,9 @@ public DnsNameResolverBuilder recursionDesired(boolean recursionDesired) {
248252
* @param maxQueriesPerResolve the max number of queries
249253
* @return {@code this}
250254
*/
251-
public DnsNameResolverBuilder maxQueriesPerResolve(int maxQueriesPerResolve) {
255+
public T maxQueriesPerResolve(int maxQueriesPerResolve) {
252256
this.maxQueriesPerResolve = maxQueriesPerResolve;
253-
return this;
257+
return cast();
254258
}
255259

256260
/**
@@ -260,9 +264,9 @@ public DnsNameResolverBuilder maxQueriesPerResolve(int maxQueriesPerResolve) {
260264
* @param traceEnabled true if trace is enabled
261265
* @return {@code this}
262266
*/
263-
public DnsNameResolverBuilder traceEnabled(boolean traceEnabled) {
267+
public T traceEnabled(boolean traceEnabled) {
264268
this.traceEnabled = traceEnabled;
265-
return this;
269+
return cast();
266270
}
267271

268272
/**
@@ -271,9 +275,9 @@ public DnsNameResolverBuilder traceEnabled(boolean traceEnabled) {
271275
* @param maxPayloadSize the capacity of the datagram packet buffer
272276
* @return {@code this}
273277
*/
274-
public DnsNameResolverBuilder maxPayloadSize(int maxPayloadSize) {
278+
public T maxPayloadSize(int maxPayloadSize) {
275279
this.maxPayloadSize = maxPayloadSize;
276-
return this;
280+
return cast();
277281
}
278282

279283
/**
@@ -284,19 +288,19 @@ public DnsNameResolverBuilder maxPayloadSize(int maxPayloadSize) {
284288
* @param optResourceEnabled if optional records inclusion is enabled
285289
* @return {@code this}
286290
*/
287-
public DnsNameResolverBuilder optResourceEnabled(boolean optResourceEnabled) {
291+
public T optResourceEnabled(boolean optResourceEnabled) {
288292
this.optResourceEnabled = optResourceEnabled;
289-
return this;
293+
return cast();
290294
}
291295

292296
/**
293297
* @param hostsFileEntriesResolver the {@link HostsFileEntriesResolver} used to first check
294298
* if the hostname is locally aliased.
295299
* @return {@code this}
296300
*/
297-
public DnsNameResolverBuilder hostsFileEntriesResolver(HostsFileEntriesResolver hostsFileEntriesResolver) {
301+
public T hostsFileEntriesResolver(HostsFileEntriesResolver hostsFileEntriesResolver) {
298302
this.hostsFileEntriesResolver = hostsFileEntriesResolver;
299-
return this;
303+
return cast();
300304
}
301305

302306
/**
@@ -313,19 +317,8 @@ public DnsNameResolver build() {
313317
DnsCache cache = resolveCache != null ? resolveCache :
314318
new DefaultDnsCache(intValue(minTtl, 0), intValue(maxTtl, Integer.MAX_VALUE), intValue(negativeTtl, 0));
315319

316-
return new DnsNameResolver(
317-
eventLoop,
318-
channelFactory,
319-
localAddress,
320-
nameServerAddresses,
321-
cache,
322-
queryTimeoutMillis,
323-
resolvedAddressTypes,
324-
recursionDesired,
325-
maxQueriesPerResolve,
326-
traceEnabled,
327-
maxPayloadSize,
328-
optResourceEnabled,
329-
hostsFileEntriesResolver);
320+
return build0(cache);
330321
}
322+
323+
protected abstract DnsNameResolver build0(DnsCache cache);
331324
}

netty-bp/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,15 @@ public class DnsNameResolverTest {
265265
private static final TestDnsServer dnsServer = new TestDnsServer();
266266
private static final EventLoopGroup group = new NioEventLoopGroup(1);
267267

268-
private DnsNameResolverBuilder newResolver() {
269-
return new DnsNameResolverBuilder(group.next())
268+
private DnsNameResolverBuilder<?> newResolver() {
269+
return new DefaultDnsNameResolverBuilder(group.next())
270270
.channelType(NioDatagramChannel.class)
271271
.nameServerAddresses(DnsServerAddresses.singleton(dnsServer.localAddress()))
272272
.maxQueriesPerResolve(1)
273273
.optResourceEnabled(false);
274274
}
275275

276-
private DnsNameResolverBuilder newResolver(InternetProtocolFamily... resolvedAddressTypes) {
276+
private DnsNameResolverBuilder<?> newResolver(InternetProtocolFamily... resolvedAddressTypes) {
277277
return newResolver()
278278
.resolvedAddressTypes(resolvedAddressTypes);
279279
}

0 commit comments

Comments
 (0)