16
16
package io .netty .resolver .dns ;
17
17
18
18
import static io .netty .util .internal .ObjectUtil2 .*;
19
-
20
19
import io .netty .bootstrap .ChannelFactory ;
21
20
import io .netty .channel .EventLoop ;
22
21
import io .netty .channel .ReflectiveChannelFactory ;
33
32
/**
34
33
* A {@link DnsNameResolver} builder.
35
34
*/
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 ;
54
53
55
54
/**
56
55
* Creates a new builder.
@@ -62,15 +61,20 @@ public DnsNameResolverBuilder(EventLoop eventLoop) {
62
61
this .eventLoop = eventLoop ;
63
62
}
64
63
64
+ @ SuppressWarnings ("unchecked" )
65
+ private T cast () {
66
+ return (T ) this ;
67
+ }
68
+
65
69
/**
66
70
* Sets the {@link ChannelFactory} that will create a {@link DatagramChannel}.
67
71
*
68
72
* @param channelFactory the {@link ChannelFactory}
69
73
* @return {@code this}
70
74
*/
71
- public DnsNameResolverBuilder channelFactory (ChannelFactory <? extends DatagramChannel > channelFactory ) {
75
+ public T channelFactory (ChannelFactory <? extends DatagramChannel > channelFactory ) {
72
76
this .channelFactory = channelFactory ;
73
- return this ;
77
+ return cast () ;
74
78
}
75
79
76
80
/**
@@ -80,7 +84,7 @@ public DnsNameResolverBuilder channelFactory(ChannelFactory<? extends DatagramCh
80
84
* @param channelType
81
85
* @return {@code this}
82
86
*/
83
- public DnsNameResolverBuilder channelType (Class <? extends DatagramChannel > channelType ) {
87
+ public T channelType (Class <? extends DatagramChannel > channelType ) {
84
88
return channelFactory (new ReflectiveChannelFactory <DatagramChannel >(channelType ));
85
89
}
86
90
@@ -90,9 +94,9 @@ public DnsNameResolverBuilder channelType(Class<? extends DatagramChannel> chann
90
94
* @param localAddress the local address
91
95
* @return {@code this}
92
96
*/
93
- public DnsNameResolverBuilder localAddress (InetSocketAddress localAddress ) {
97
+ public T localAddress (InetSocketAddress localAddress ) {
94
98
this .localAddress = localAddress ;
95
- return this ;
99
+ return cast () ;
96
100
}
97
101
98
102
/**
@@ -101,9 +105,9 @@ public DnsNameResolverBuilder localAddress(InetSocketAddress localAddress) {
101
105
* @param nameServerAddresses the DNS server addresses
102
106
* @return {@code this}
103
107
*/
104
- public DnsNameResolverBuilder nameServerAddresses (DnsServerAddresses nameServerAddresses ) {
108
+ public T nameServerAddresses (DnsServerAddresses nameServerAddresses ) {
105
109
this .nameServerAddresses = nameServerAddresses ;
106
- return this ;
110
+ return cast () ;
107
111
}
108
112
109
113
/**
@@ -112,9 +116,9 @@ public DnsNameResolverBuilder nameServerAddresses(DnsServerAddresses nameServerA
112
116
* @param resolveCache the DNS resolution results cache
113
117
* @return {@code this}
114
118
*/
115
- public DnsNameResolverBuilder resolveCache (DnsCache resolveCache ) {
119
+ public T resolveCache (DnsCache resolveCache ) {
116
120
this .resolveCache = resolveCache ;
117
- return this ;
121
+ return cast () ;
118
122
}
119
123
120
124
/**
@@ -129,10 +133,10 @@ public DnsNameResolverBuilder resolveCache(DnsCache resolveCache) {
129
133
* @param maxTtl the maximum TTL
130
134
* @return {@code this}
131
135
*/
132
- public DnsNameResolverBuilder ttl (int minTtl , int maxTtl ) {
136
+ public T ttl (int minTtl , int maxTtl ) {
133
137
this .maxTtl = maxTtl ;
134
138
this .minTtl = minTtl ;
135
- return this ;
139
+ return cast () ;
136
140
}
137
141
138
142
/**
@@ -141,9 +145,9 @@ public DnsNameResolverBuilder ttl(int minTtl, int maxTtl) {
141
145
* @param negativeTtl the TTL for failed cached queries
142
146
* @return {@code this}
143
147
*/
144
- public DnsNameResolverBuilder negativeTtl (int negativeTtl ) {
148
+ public T negativeTtl (int negativeTtl ) {
145
149
this .negativeTtl = negativeTtl ;
146
- return this ;
150
+ return cast () ;
147
151
}
148
152
149
153
/**
@@ -152,9 +156,9 @@ public DnsNameResolverBuilder negativeTtl(int negativeTtl) {
152
156
* @param queryTimeoutMillis the query timeout
153
157
* @return {@code this}
154
158
*/
155
- public DnsNameResolverBuilder queryTimeoutMillis (long queryTimeoutMillis ) {
159
+ public T queryTimeoutMillis (long queryTimeoutMillis ) {
156
160
this .queryTimeoutMillis = queryTimeoutMillis ;
157
- return this ;
161
+ return cast () ;
158
162
}
159
163
160
164
/**
@@ -166,7 +170,7 @@ public DnsNameResolverBuilder queryTimeoutMillis(long queryTimeoutMillis) {
166
170
* @param resolvedAddressTypes the address types
167
171
* @return {@code this}
168
172
*/
169
- public DnsNameResolverBuilder resolvedAddressTypes (InternetProtocolFamily ... resolvedAddressTypes ) {
173
+ public T resolvedAddressTypes (InternetProtocolFamily ... resolvedAddressTypes ) {
170
174
checkNotNull (resolvedAddressTypes , "resolvedAddressTypes" );
171
175
172
176
final List <InternetProtocolFamily > list =
@@ -191,7 +195,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(InternetProtocolFamily... res
191
195
192
196
this .resolvedAddressTypes = list .toArray (new InternetProtocolFamily [list .size ()]);
193
197
194
- return this ;
198
+ return cast () ;
195
199
}
196
200
197
201
/**
@@ -203,7 +207,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(InternetProtocolFamily... res
203
207
* @param resolvedAddressTypes the address types
204
208
* @return {@code this}
205
209
*/
206
- public DnsNameResolverBuilder resolvedAddressTypes (Iterable <InternetProtocolFamily > resolvedAddressTypes ) {
210
+ public T resolvedAddressTypes (Iterable <InternetProtocolFamily > resolvedAddressTypes ) {
207
211
checkNotNull (resolvedAddressTypes , "resolveAddressTypes" );
208
212
209
213
final List <InternetProtocolFamily > list =
@@ -228,7 +232,7 @@ public DnsNameResolverBuilder resolvedAddressTypes(Iterable<InternetProtocolFami
228
232
229
233
this .resolvedAddressTypes = list .toArray (new InternetProtocolFamily [list .size ()]);
230
234
231
- return this ;
235
+ return cast () ;
232
236
}
233
237
234
238
/**
@@ -237,9 +241,9 @@ public DnsNameResolverBuilder resolvedAddressTypes(Iterable<InternetProtocolFami
237
241
* @param recursionDesired true if recursion is desired
238
242
* @return {@code this}
239
243
*/
240
- public DnsNameResolverBuilder recursionDesired (boolean recursionDesired ) {
244
+ public T recursionDesired (boolean recursionDesired ) {
241
245
this .recursionDesired = recursionDesired ;
242
- return this ;
246
+ return cast () ;
243
247
}
244
248
245
249
/**
@@ -248,9 +252,9 @@ public DnsNameResolverBuilder recursionDesired(boolean recursionDesired) {
248
252
* @param maxQueriesPerResolve the max number of queries
249
253
* @return {@code this}
250
254
*/
251
- public DnsNameResolverBuilder maxQueriesPerResolve (int maxQueriesPerResolve ) {
255
+ public T maxQueriesPerResolve (int maxQueriesPerResolve ) {
252
256
this .maxQueriesPerResolve = maxQueriesPerResolve ;
253
- return this ;
257
+ return cast () ;
254
258
}
255
259
256
260
/**
@@ -260,9 +264,9 @@ public DnsNameResolverBuilder maxQueriesPerResolve(int maxQueriesPerResolve) {
260
264
* @param traceEnabled true if trace is enabled
261
265
* @return {@code this}
262
266
*/
263
- public DnsNameResolverBuilder traceEnabled (boolean traceEnabled ) {
267
+ public T traceEnabled (boolean traceEnabled ) {
264
268
this .traceEnabled = traceEnabled ;
265
- return this ;
269
+ return cast () ;
266
270
}
267
271
268
272
/**
@@ -271,9 +275,9 @@ public DnsNameResolverBuilder traceEnabled(boolean traceEnabled) {
271
275
* @param maxPayloadSize the capacity of the datagram packet buffer
272
276
* @return {@code this}
273
277
*/
274
- public DnsNameResolverBuilder maxPayloadSize (int maxPayloadSize ) {
278
+ public T maxPayloadSize (int maxPayloadSize ) {
275
279
this .maxPayloadSize = maxPayloadSize ;
276
- return this ;
280
+ return cast () ;
277
281
}
278
282
279
283
/**
@@ -284,19 +288,19 @@ public DnsNameResolverBuilder maxPayloadSize(int maxPayloadSize) {
284
288
* @param optResourceEnabled if optional records inclusion is enabled
285
289
* @return {@code this}
286
290
*/
287
- public DnsNameResolverBuilder optResourceEnabled (boolean optResourceEnabled ) {
291
+ public T optResourceEnabled (boolean optResourceEnabled ) {
288
292
this .optResourceEnabled = optResourceEnabled ;
289
- return this ;
293
+ return cast () ;
290
294
}
291
295
292
296
/**
293
297
* @param hostsFileEntriesResolver the {@link HostsFileEntriesResolver} used to first check
294
298
* if the hostname is locally aliased.
295
299
* @return {@code this}
296
300
*/
297
- public DnsNameResolverBuilder hostsFileEntriesResolver (HostsFileEntriesResolver hostsFileEntriesResolver ) {
301
+ public T hostsFileEntriesResolver (HostsFileEntriesResolver hostsFileEntriesResolver ) {
298
302
this .hostsFileEntriesResolver = hostsFileEntriesResolver ;
299
- return this ;
303
+ return cast () ;
300
304
}
301
305
302
306
/**
@@ -313,19 +317,8 @@ public DnsNameResolver build() {
313
317
DnsCache cache = resolveCache != null ? resolveCache :
314
318
new DefaultDnsCache (intValue (minTtl , 0 ), intValue (maxTtl , Integer .MAX_VALUE ), intValue (negativeTtl , 0 ));
315
319
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 );
330
321
}
322
+
323
+ protected abstract DnsNameResolver build0 (DnsCache cache );
331
324
}
0 commit comments