1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
package javax.jmdns.impl; |
6 |
|
|
7 |
|
import java.io.ByteArrayOutputStream; |
8 |
|
import java.io.IOException; |
9 |
|
import java.io.OutputStream; |
10 |
|
import java.net.Inet4Address; |
11 |
|
import java.net.Inet6Address; |
12 |
|
import java.net.InetAddress; |
13 |
|
import java.util.ArrayList; |
14 |
|
import java.util.Collection; |
15 |
|
import java.util.Collections; |
16 |
|
import java.util.Enumeration; |
17 |
|
import java.util.HashMap; |
18 |
|
import java.util.Hashtable; |
19 |
|
import java.util.LinkedHashSet; |
20 |
|
import java.util.List; |
21 |
|
import java.util.Map; |
22 |
|
import java.util.Set; |
23 |
|
import java.util.Vector; |
24 |
|
import java.util.logging.Level; |
25 |
|
import java.util.logging.Logger; |
26 |
|
|
27 |
|
import javax.jmdns.ServiceEvent; |
28 |
|
import javax.jmdns.ServiceInfo; |
29 |
|
import javax.jmdns.impl.DNSRecord.Pointer; |
30 |
|
import javax.jmdns.impl.DNSRecord.Service; |
31 |
|
import javax.jmdns.impl.DNSRecord.Text; |
32 |
|
import javax.jmdns.impl.constants.DNSRecordClass; |
33 |
|
import javax.jmdns.impl.constants.DNSRecordType; |
34 |
|
import javax.jmdns.impl.constants.DNSState; |
35 |
|
import javax.jmdns.impl.tasks.DNSTask; |
36 |
|
|
37 |
|
|
38 |
|
|
39 |
|
|
40 |
|
@author |
41 |
|
|
|
|
| 69.5% |
Uncovered Elements: 228 (747) |
Complexity: 222 |
Complexity Density: 0.47 |
|
42 |
|
public class ServiceInfoImpl extends ServiceInfo implements DNSListener, DNSStatefulObject { |
43 |
|
private static Logger logger = Logger.getLogger(ServiceInfoImpl.class.getName()); |
44 |
|
|
45 |
|
private String _domain; |
46 |
|
private String _protocol; |
47 |
|
private String _application; |
48 |
|
private String _name; |
49 |
|
private String _subtype; |
50 |
|
private String _server; |
51 |
|
private int _port; |
52 |
|
private int _weight; |
53 |
|
private int _priority; |
54 |
|
private byte _text[]; |
55 |
|
private Map<String, byte[]> _props; |
56 |
|
private final Set<Inet4Address> _ipv4Addresses; |
57 |
|
private final Set<Inet6Address> _ipv6Addresses; |
58 |
|
|
59 |
|
private transient String _key; |
60 |
|
|
61 |
|
private boolean _persistent; |
62 |
|
private boolean _needTextAnnouncing; |
63 |
|
|
64 |
|
private final ServiceInfoState _state; |
65 |
|
|
66 |
|
private Delegate _delegate; |
67 |
|
|
|
|
| - |
Uncovered Elements: 0 (0) |
Complexity: 0 |
Complexity Density: - |
|
68 |
|
public static interface Delegate { |
69 |
|
|
70 |
|
public void textValueUpdated(ServiceInfo target, byte[] value); |
71 |
|
|
72 |
|
} |
73 |
|
|
|
|
| 88% |
Uncovered Elements: 3 (25) |
Complexity: 9 |
Complexity Density: 0.64 |
|
74 |
|
private final static class ServiceInfoState extends DNSStatefulObject.DefaultImplementation { |
75 |
|
|
76 |
|
private static final long serialVersionUID = 1104131034952196820L; |
77 |
|
|
78 |
|
private final ServiceInfoImpl _info; |
79 |
|
|
80 |
|
|
81 |
|
@param |
82 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
83 |
440
|
public ServiceInfoState(ServiceInfoImpl info) {... |
84 |
439
|
super(); |
85 |
440
|
_info = info; |
86 |
|
} |
87 |
|
|
|
|
| 84.2% |
Uncovered Elements: 3 (19) |
Complexity: 7 |
Complexity Density: 0.64 |
|
88 |
194
|
@Override... |
89 |
|
protected void setTask(DNSTask task) { |
90 |
194
|
super.setTask(task); |
91 |
194
|
if ((this._task == null) && _info.needTextAnnouncing()) { |
92 |
4
|
this.lock(); |
93 |
4
|
try { |
94 |
4
|
if ((this._task == null) && _info.needTextAnnouncing()) { |
95 |
4
|
if (this._state.isAnnounced()) { |
96 |
4
|
this.setState(DNSState.ANNOUNCING_1); |
97 |
4
|
if (this.getDns() != null) { |
98 |
4
|
this.getDns().startAnnouncer(); |
99 |
|
} |
100 |
|
} |
101 |
4
|
_info.setNeedTextAnnouncing(false); |
102 |
|
} |
103 |
|
} finally { |
104 |
4
|
this.unlock(); |
105 |
|
} |
106 |
|
} |
107 |
|
} |
108 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
109 |
150
|
@Override... |
110 |
|
public void setDns(JmDNSImpl dns) { |
111 |
150
|
super.setDns(dns); |
112 |
|
} |
113 |
|
|
114 |
|
} |
115 |
|
|
116 |
|
|
117 |
|
@param |
118 |
|
@param |
119 |
|
@param |
120 |
|
@param |
121 |
|
@param |
122 |
|
@param |
123 |
|
@param |
124 |
|
@param |
125 |
|
@see |
126 |
|
|
|
|
| 0% |
Uncovered Elements: 7 (7) |
Complexity: 2 |
Complexity Density: 0.29 |
|
127 |
0
|
public ServiceInfoImpl(String type, String name, String subtype, int port, int weight, int priority, boolean persistent, String text) {... |
128 |
0
|
this(ServiceInfoImpl.decodeQualifiedNameMap(type, name, subtype), port, weight, priority, persistent, (byte[]) null); |
129 |
0
|
_server = text; |
130 |
0
|
try { |
131 |
0
|
ByteArrayOutputStream out = new ByteArrayOutputStream(text.length()); |
132 |
0
|
writeUTF(out, text); |
133 |
0
|
this._text = out.toByteArray(); |
134 |
|
} catch (IOException e) { |
135 |
0
|
throw new RuntimeException("unexpected exception: " + e); |
136 |
|
} |
137 |
|
} |
138 |
|
|
139 |
|
|
140 |
|
@param |
141 |
|
@param |
142 |
|
@param |
143 |
|
@param |
144 |
|
@param |
145 |
|
@param |
146 |
|
@param |
147 |
|
@param |
148 |
|
@see |
149 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
150 |
30
|
public ServiceInfoImpl(String type, String name, String subtype, int port, int weight, int priority, boolean persistent, Map<String, ?> props) {... |
151 |
30
|
this(ServiceInfoImpl.decodeQualifiedNameMap(type, name, subtype), port, weight, priority, persistent, textFromProperties(props)); |
152 |
|
} |
153 |
|
|
154 |
|
|
155 |
|
@param |
156 |
|
@param |
157 |
|
@param |
158 |
|
@param |
159 |
|
@param |
160 |
|
@param |
161 |
|
@param |
162 |
|
@param |
163 |
|
@see |
164 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
165 |
62
|
public ServiceInfoImpl(String type, String name, String subtype, int port, int weight, int priority, boolean persistent, byte text[]) {... |
166 |
62
|
this(ServiceInfoImpl.decodeQualifiedNameMap(type, name, subtype), port, weight, priority, persistent, text); |
167 |
|
} |
168 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
169 |
0
|
public ServiceInfoImpl(Map<Fields, String> qualifiedNameMap, int port, int weight, int priority, boolean persistent, Map<String, ?> props) {... |
170 |
0
|
this(qualifiedNameMap, port, weight, priority, persistent, textFromProperties(props)); |
171 |
|
} |
172 |
|
|
|
|
| 85.7% |
Uncovered Elements: 1 (7) |
Complexity: 2 |
Complexity Density: 0.29 |
|
173 |
112
|
ServiceInfoImpl(Map<Fields, String> qualifiedNameMap, int port, int weight, int priority, boolean persistent, String text) {... |
174 |
112
|
this(qualifiedNameMap, port, weight, priority, persistent, (byte[]) null); |
175 |
113
|
_server = text; |
176 |
112
|
try { |
177 |
112
|
ByteArrayOutputStream out = new ByteArrayOutputStream(text.length()); |
178 |
113
|
writeUTF(out, text); |
179 |
113
|
this._text = out.toByteArray(); |
180 |
|
} catch (IOException e) { |
181 |
0
|
throw new RuntimeException("unexpected exception: " + e); |
182 |
|
} |
183 |
|
} |
184 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (15) |
Complexity: 1 |
Complexity Density: 0.07 |
|
185 |
425
|
ServiceInfoImpl(Map<Fields, String> qualifiedNameMap, int port, int weight, int priority, boolean persistent, byte text[]) {... |
186 |
426
|
Map<Fields, String> map = ServiceInfoImpl.checkQualifiedNameMap(qualifiedNameMap); |
187 |
|
|
188 |
426
|
this._domain = map.get(Fields.Domain); |
189 |
426
|
this._protocol = map.get(Fields.Protocol); |
190 |
426
|
this._application = map.get(Fields.Application); |
191 |
426
|
this._name = map.get(Fields.Instance); |
192 |
426
|
this._subtype = map.get(Fields.Subtype); |
193 |
|
|
194 |
426
|
this._port = port; |
195 |
426
|
this._weight = weight; |
196 |
426
|
this._priority = priority; |
197 |
426
|
this._text = text; |
198 |
425
|
this.setNeedTextAnnouncing(false); |
199 |
423
|
this._state = new ServiceInfoState(this); |
200 |
424
|
this._persistent = persistent; |
201 |
425
|
this._ipv4Addresses = Collections.synchronizedSet(new LinkedHashSet<Inet4Address>()); |
202 |
424
|
this._ipv6Addresses = Collections.synchronizedSet(new LinkedHashSet<Inet6Address>()); |
203 |
|
} |
204 |
|
|
205 |
|
|
206 |
|
|
207 |
|
|
208 |
|
@param |
209 |
|
|
|
|
| 95.5% |
Uncovered Elements: 1 (22) |
Complexity: 2 |
Complexity Density: 0.1 |
|
210 |
14
|
ServiceInfoImpl(ServiceInfo info) {... |
211 |
14
|
this._ipv4Addresses = Collections.synchronizedSet(new LinkedHashSet<Inet4Address>()); |
212 |
14
|
this._ipv6Addresses = Collections.synchronizedSet(new LinkedHashSet<Inet6Address>()); |
213 |
14
|
if (info != null) { |
214 |
14
|
this._domain = info.getDomain(); |
215 |
14
|
this._protocol = info.getProtocol(); |
216 |
14
|
this._application = info.getApplication(); |
217 |
14
|
this._name = info.getName(); |
218 |
14
|
this._subtype = info.getSubtype(); |
219 |
14
|
this._port = info.getPort(); |
220 |
14
|
this._weight = info.getWeight(); |
221 |
14
|
this._priority = info.getPriority(); |
222 |
14
|
this._text = info.getTextBytes(); |
223 |
14
|
this._persistent = info.isPersistent(); |
224 |
14
|
Inet6Address[] ipv6Addresses = info.getInet6Addresses(); |
225 |
14
|
for (Inet6Address address : ipv6Addresses) { |
226 |
9
|
this._ipv6Addresses.add(address); |
227 |
|
} |
228 |
14
|
Inet4Address[] ipv4Addresses = info.getInet4Addresses(); |
229 |
14
|
for (Inet4Address address : ipv4Addresses) { |
230 |
9
|
this._ipv4Addresses.add(address); |
231 |
|
} |
232 |
|
} |
233 |
14
|
this._state = new ServiceInfoState(this); |
234 |
|
} |
235 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
236 |
94
|
public static Map<Fields, String> decodeQualifiedNameMap(String type, String name, String subtype) {... |
237 |
94
|
Map<Fields, String> qualifiedNameMap = decodeQualifiedNameMapForType(type); |
238 |
|
|
239 |
94
|
qualifiedNameMap.put(Fields.Instance, name); |
240 |
93
|
qualifiedNameMap.put(Fields.Subtype, subtype); |
241 |
|
|
242 |
94
|
return checkQualifiedNameMap(qualifiedNameMap); |
243 |
|
} |
244 |
|
|
|
|
| 97.1% |
Uncovered Elements: 2 (68) |
Complexity: 14 |
Complexity Density: 0.29 |
|
245 |
3004
|
public static Map<Fields, String> decodeQualifiedNameMapForType(String type) {... |
246 |
3029
|
int index; |
247 |
|
|
248 |
3027
|
String casePreservedType = type; |
249 |
|
|
250 |
3023
|
String aType = type.toLowerCase(); |
251 |
3014
|
String application = aType; |
252 |
3016
|
String protocol = ""; |
253 |
3021
|
String subtype = ""; |
254 |
3028
|
String name = ""; |
255 |
3028
|
String domain = ""; |
256 |
|
|
257 |
3028
|
if (aType.contains("in-addr.arpa") || aType.contains("ip6.arpa")) { |
258 |
65
|
index = (aType.contains("in-addr.arpa") ? aType.indexOf("in-addr.arpa") : aType.indexOf("ip6.arpa")); |
259 |
65
|
name = removeSeparators(casePreservedType.substring(0, index)); |
260 |
63
|
domain = casePreservedType.substring(index); |
261 |
63
|
application = ""; |
262 |
2965
|
} else if ((!aType.contains("_")) && aType.contains(".")) { |
263 |
1206
|
index = aType.indexOf('.'); |
264 |
1208
|
name = removeSeparators(casePreservedType.substring(0, index)); |
265 |
1208
|
domain = removeSeparators(casePreservedType.substring(index)); |
266 |
1212
|
application = ""; |
267 |
|
} else { |
268 |
|
|
269 |
1753
|
if (!aType.startsWith("_") || aType.startsWith("_services")) { |
270 |
930
|
index = aType.indexOf('.'); |
271 |
930
|
if (index > 0) { |
272 |
|
|
273 |
928
|
name = casePreservedType.substring(0, index); |
274 |
926
|
if (index + 1 < aType.length()) { |
275 |
930
|
aType = aType.substring(index + 1); |
276 |
928
|
casePreservedType = casePreservedType.substring(index + 1); |
277 |
|
} |
278 |
|
} |
279 |
|
} |
280 |
|
|
281 |
1751
|
index = aType.lastIndexOf("._"); |
282 |
1754
|
if (index > 0) { |
283 |
1751
|
int start = index + 2; |
284 |
1746
|
int end = aType.indexOf('.', start); |
285 |
1742
|
protocol = casePreservedType.substring(start, end); |
286 |
|
} |
287 |
1751
|
if (protocol.length() > 0) { |
288 |
1752
|
index = aType.indexOf("_" + protocol.toLowerCase() + "."); |
289 |
1750
|
int start = index + protocol.length() + 2; |
290 |
1750
|
int end = aType.length() - (aType.endsWith(".") ? 1 : 0); |
291 |
1753
|
domain = casePreservedType.substring(start, end); |
292 |
1754
|
application = casePreservedType.substring(0, index - 1); |
293 |
|
} |
294 |
1754
|
index = application.toLowerCase().indexOf("._sub"); |
295 |
1755
|
if (index > 0) { |
296 |
21
|
int start = index + 5; |
297 |
21
|
subtype = removeSeparators(application.substring(0, index)); |
298 |
21
|
application = application.substring(start); |
299 |
|
} |
300 |
|
} |
301 |
|
|
302 |
3024
|
final Map<Fields, String> qualifiedNameMap = new HashMap<Fields, String>(5); |
303 |
3024
|
qualifiedNameMap.put(Fields.Domain, removeSeparators(domain)); |
304 |
3022
|
qualifiedNameMap.put(Fields.Protocol, protocol); |
305 |
3033
|
qualifiedNameMap.put(Fields.Application, removeSeparators(application)); |
306 |
3041
|
qualifiedNameMap.put(Fields.Instance, name); |
307 |
3037
|
qualifiedNameMap.put(Fields.Subtype, subtype); |
308 |
|
|
309 |
3036
|
return qualifiedNameMap; |
310 |
|
} |
311 |
|
|
|
|
| 85.1% |
Uncovered Elements: 7 (47) |
Complexity: 16 |
Complexity Density: 0.59 |
|
312 |
518
|
protected static Map<Fields, String> checkQualifiedNameMap(Map<Fields, String> qualifiedNameMap) {... |
313 |
519
|
Map<Fields, String> checkedQualifiedNameMap = new HashMap<Fields, String>(5); |
314 |
|
|
315 |
|
|
316 |
517
|
String domain = (qualifiedNameMap.containsKey(Fields.Domain) ? qualifiedNameMap.get(Fields.Domain) : "local"); |
317 |
516
|
if ((domain == null) || (domain.length() == 0)) { |
318 |
1
|
domain = "local"; |
319 |
|
} |
320 |
516
|
domain = removeSeparators(domain); |
321 |
517
|
checkedQualifiedNameMap.put(Fields.Domain, domain); |
322 |
|
|
323 |
519
|
String protocol = (qualifiedNameMap.containsKey(Fields.Protocol) ? qualifiedNameMap.get(Fields.Protocol) : "tcp"); |
324 |
516
|
if ((protocol == null) || (protocol.length() == 0)) { |
325 |
115
|
protocol = "tcp"; |
326 |
|
} |
327 |
520
|
protocol = removeSeparators(protocol); |
328 |
518
|
checkedQualifiedNameMap.put(Fields.Protocol, protocol); |
329 |
|
|
330 |
520
|
String application = (qualifiedNameMap.containsKey(Fields.Application) ? qualifiedNameMap.get(Fields.Application) : ""); |
331 |
519
|
if ((application == null) || (application.length() == 0)) { |
332 |
124
|
application = ""; |
333 |
|
} |
334 |
518
|
application = removeSeparators(application); |
335 |
519
|
checkedQualifiedNameMap.put(Fields.Application, application); |
336 |
|
|
337 |
520
|
String instance = (qualifiedNameMap.containsKey(Fields.Instance) ? qualifiedNameMap.get(Fields.Instance) : ""); |
338 |
520
|
if ((instance == null) || (instance.length() == 0)) { |
339 |
0
|
instance = ""; |
340 |
|
|
341 |
|
} |
342 |
520
|
instance = removeSeparators(instance); |
343 |
520
|
checkedQualifiedNameMap.put(Fields.Instance, instance); |
344 |
|
|
345 |
519
|
String subtype = (qualifiedNameMap.containsKey(Fields.Subtype) ? qualifiedNameMap.get(Fields.Subtype) : ""); |
346 |
520
|
if ((subtype == null) || (subtype.length() == 0)) { |
347 |
498
|
subtype = ""; |
348 |
|
} |
349 |
519
|
subtype = removeSeparators(subtype); |
350 |
519
|
checkedQualifiedNameMap.put(Fields.Subtype, subtype); |
351 |
|
|
352 |
519
|
return checkedQualifiedNameMap; |
353 |
|
} |
354 |
|
|
|
|
| 88.9% |
Uncovered Elements: 2 (18) |
Complexity: 5 |
Complexity Density: 0.5 |
|
355 |
11139
|
private static String removeSeparators(String name) {... |
356 |
11160
|
if (name == null) { |
357 |
0
|
return ""; |
358 |
|
} |
359 |
11168
|
String newName = name.trim(); |
360 |
11181
|
if (newName.startsWith(".")) { |
361 |
1235
|
newName = newName.substring(1); |
362 |
|
} |
363 |
11195
|
if (newName.startsWith("_")) { |
364 |
1802
|
newName = newName.substring(1); |
365 |
|
} |
366 |
11194
|
if (newName.endsWith(".")) { |
367 |
1350
|
newName = newName.substring(0, newName.length() - 1); |
368 |
|
} |
369 |
11179
|
return newName; |
370 |
|
} |
371 |
|
|
372 |
|
|
373 |
|
@inheritDoc |
374 |
|
|
|
|
| 87.5% |
Uncovered Elements: 1 (8) |
Complexity: 3 |
Complexity Density: 0.75 |
|
375 |
415
|
@Override... |
376 |
|
public String getType() { |
377 |
415
|
String domain = this.getDomain(); |
378 |
416
|
String protocol = this.getProtocol(); |
379 |
415
|
String application = this.getApplication(); |
380 |
412
|
return (application.length() > 0 ? "_" + application + "." : "") + (protocol.length() > 0 ? "_" + protocol + "." : "") + domain + "."; |
381 |
|
} |
382 |
|
|
383 |
|
|
384 |
|
@inheritDoc |
385 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
386 |
32
|
@Override... |
387 |
|
public String getTypeWithSubtype() { |
388 |
32
|
String subtype = this.getSubtype(); |
389 |
32
|
return (subtype.length() > 0 ? "_" + subtype.toLowerCase() + "._sub." : "") + this.getType(); |
390 |
|
} |
391 |
|
|
392 |
|
|
393 |
|
@inheritDoc |
394 |
|
|
|
|
| 66.7% |
Uncovered Elements: 1 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
395 |
1489
|
@Override... |
396 |
|
public String getName() { |
397 |
1491
|
return (_name != null ? _name : ""); |
398 |
|
} |
399 |
|
|
400 |
|
|
401 |
|
@inheritDoc |
402 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
403 |
110
|
@Override... |
404 |
|
public String getKey() { |
405 |
110
|
if (this._key == null) { |
406 |
23
|
this._key = this.getQualifiedName().toLowerCase(); |
407 |
|
} |
408 |
110
|
return this._key; |
409 |
|
} |
410 |
|
|
411 |
|
|
412 |
|
|
413 |
|
|
414 |
|
@param |
415 |
|
|
416 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
417 |
0
|
void setName(String name) {... |
418 |
0
|
this._name = name; |
419 |
0
|
this._key = null; |
420 |
|
} |
421 |
|
|
422 |
|
|
423 |
|
@inheritDoc |
424 |
|
|
|
|
| 81.8% |
Uncovered Elements: 2 (11) |
Complexity: 4 |
Complexity Density: 0.8 |
|
425 |
1261
|
@Override... |
426 |
|
public String getQualifiedName() { |
427 |
1262
|
String domain = this.getDomain(); |
428 |
1262
|
String protocol = this.getProtocol(); |
429 |
1262
|
String application = this.getApplication(); |
430 |
1262
|
String instance = this.getName(); |
431 |
|
|
432 |
|
|
433 |
|
|
434 |
1261
|
return (instance.length() > 0 ? instance + "." : "") + (application.length() > 0 ? "_" + application + "." : "") + (protocol.length() > 0 ? "_" + protocol + "." : "") + domain + "."; |
435 |
|
} |
436 |
|
|
437 |
|
|
438 |
|
@see |
439 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
440 |
491
|
@Override... |
441 |
|
public String getServer() { |
442 |
490
|
return (_server != null ? _server : ""); |
443 |
|
} |
444 |
|
|
445 |
|
|
446 |
|
@param |
447 |
|
|
448 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
449 |
20
|
void setServer(String server) {... |
450 |
20
|
this._server = server; |
451 |
|
} |
452 |
|
|
453 |
|
|
454 |
|
@inheritDoc |
455 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
456 |
0
|
@Deprecated... |
457 |
|
@Override |
458 |
|
public String getHostAddress() { |
459 |
0
|
String[] names = this.getHostAddresses(); |
460 |
0
|
return (names.length > 0 ? names[0] : ""); |
461 |
|
} |
462 |
|
|
463 |
|
|
464 |
|
@inheritDoc |
465 |
|
|
|
|
| 0% |
Uncovered Elements: 12 (12) |
Complexity: 3 |
Complexity Density: 0.38 |
|
466 |
0
|
@Override... |
467 |
|
public String[] getHostAddresses() { |
468 |
0
|
Inet4Address[] ip4Aaddresses = this.getInet4Addresses(); |
469 |
0
|
Inet6Address[] ip6Aaddresses = this.getInet6Addresses(); |
470 |
0
|
String[] names = new String[ip4Aaddresses.length + ip6Aaddresses.length]; |
471 |
0
|
for (int i = 0; i < ip4Aaddresses.length; i++) { |
472 |
0
|
names[i] = ip4Aaddresses[i].getHostAddress(); |
473 |
|
} |
474 |
0
|
for (int i = 0; i < ip6Aaddresses.length; i++) { |
475 |
0
|
names[i + ip4Aaddresses.length] = "[" + ip6Aaddresses[i].getHostAddress() + "]"; |
476 |
|
} |
477 |
0
|
return names; |
478 |
|
} |
479 |
|
|
480 |
|
|
481 |
|
@param |
482 |
|
|
483 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
484 |
71
|
void addAddress(Inet4Address addr) {... |
485 |
71
|
_ipv4Addresses.add(addr); |
486 |
|
} |
487 |
|
|
488 |
|
|
489 |
|
@param |
490 |
|
|
491 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
492 |
84
|
void addAddress(Inet6Address addr) {... |
493 |
84
|
_ipv6Addresses.add(addr); |
494 |
|
} |
495 |
|
|
496 |
|
|
497 |
|
@inheritDoc |
498 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
499 |
0
|
@Deprecated... |
500 |
|
@Override |
501 |
|
public InetAddress getAddress() { |
502 |
0
|
return this.getInetAddress(); |
503 |
|
} |
504 |
|
|
505 |
|
|
506 |
|
@inheritDoc |
507 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
508 |
0
|
@Deprecated... |
509 |
|
@Override |
510 |
|
public InetAddress getInetAddress() { |
511 |
0
|
InetAddress[] addresses = this.getInetAddresses(); |
512 |
0
|
return (addresses.length > 0 ? addresses[0] : null); |
513 |
|
} |
514 |
|
|
515 |
|
|
516 |
|
@inheritDoc |
517 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
518 |
0
|
@Deprecated... |
519 |
|
@Override |
520 |
|
public Inet4Address getInet4Address() { |
521 |
0
|
Inet4Address[] addresses = this.getInet4Addresses(); |
522 |
0
|
return (addresses.length > 0 ? addresses[0] : null); |
523 |
|
} |
524 |
|
|
525 |
|
|
526 |
|
@inheritDoc |
527 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
528 |
0
|
@Deprecated... |
529 |
|
@Override |
530 |
|
public Inet6Address getInet6Address() { |
531 |
0
|
Inet6Address[] addresses = this.getInet6Addresses(); |
532 |
0
|
return (addresses.length > 0 ? addresses[0] : null); |
533 |
|
} |
534 |
|
|
535 |
|
|
536 |
|
|
537 |
|
@see |
538 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
539 |
7
|
@Override... |
540 |
|
public InetAddress[] getInetAddresses() { |
541 |
7
|
List<InetAddress> aList = new ArrayList<InetAddress>(_ipv4Addresses.size() + _ipv6Addresses.size()); |
542 |
7
|
aList.addAll(_ipv4Addresses); |
543 |
7
|
aList.addAll(_ipv6Addresses); |
544 |
7
|
return aList.toArray(new InetAddress[aList.size()]); |
545 |
|
} |
546 |
|
|
547 |
|
|
548 |
|
|
549 |
|
@see |
550 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
551 |
85
|
@Override... |
552 |
|
public Inet4Address[] getInet4Addresses() { |
553 |
85
|
return _ipv4Addresses.toArray(new Inet4Address[_ipv4Addresses.size()]); |
554 |
|
} |
555 |
|
|
556 |
|
|
557 |
|
|
558 |
|
@see |
559 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
560 |
86
|
@Override... |
561 |
|
public Inet6Address[] getInet6Addresses() { |
562 |
86
|
return _ipv6Addresses.toArray(new Inet6Address[_ipv6Addresses.size()]); |
563 |
|
} |
564 |
|
|
565 |
|
|
566 |
|
@see |
567 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
568 |
207
|
@Override... |
569 |
|
public int getPort() { |
570 |
207
|
return _port; |
571 |
|
} |
572 |
|
|
573 |
|
|
574 |
|
@see |
575 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
576 |
87
|
@Override... |
577 |
|
public int getPriority() { |
578 |
87
|
return _priority; |
579 |
|
} |
580 |
|
|
581 |
|
|
582 |
|
@see |
583 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
584 |
87
|
@Override... |
585 |
|
public int getWeight() { |
586 |
87
|
return _weight; |
587 |
|
} |
588 |
|
|
589 |
|
|
590 |
|
@see |
591 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 3 |
Complexity Density: 3 |
|
592 |
1160
|
@Override... |
593 |
|
public byte[] getTextBytes() { |
594 |
1163
|
return (this._text != null && this._text.length > 0 ? this._text : DNSRecord.EMPTY_TXT); |
595 |
|
} |
596 |
|
|
597 |
|
|
598 |
|
@inheritDoc |
599 |
|
|
|
|
| 0% |
Uncovered Elements: 9 (9) |
Complexity: 3 |
Complexity Density: 0.43 |
|
600 |
0
|
@Deprecated... |
601 |
|
@Override |
602 |
|
public String getTextString() { |
603 |
0
|
Map<String, byte[]> properties = this.getProperties(); |
604 |
0
|
for (String key : properties.keySet()) { |
605 |
0
|
byte[] value = properties.get(key); |
606 |
0
|
if ((value != null) && (value.length > 0)) { |
607 |
0
|
return key + "=" + new String(value); |
608 |
|
} |
609 |
0
|
return key; |
610 |
|
} |
611 |
0
|
return ""; |
612 |
|
} |
613 |
|
|
614 |
|
|
615 |
|
|
616 |
|
@see |
617 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
618 |
0
|
@Deprecated... |
619 |
|
@Override |
620 |
|
public String getURL() { |
621 |
0
|
return this.getURL("http"); |
622 |
|
} |
623 |
|
|
624 |
|
|
625 |
|
|
626 |
|
@see |
627 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
628 |
0
|
@Override... |
629 |
|
public String[] getURLs() { |
630 |
0
|
return this.getURLs("http"); |
631 |
|
} |
632 |
|
|
633 |
|
|
634 |
|
|
635 |
|
@see |
636 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 1 |
|
637 |
0
|
@Deprecated... |
638 |
|
@Override |
639 |
|
public String getURL(String protocol) { |
640 |
0
|
String[] urls = this.getURLs(protocol); |
641 |
0
|
return (urls.length > 0 ? urls[0] : protocol + "://null:" + getPort()); |
642 |
|
} |
643 |
|
|
644 |
|
|
645 |
|
|
646 |
|
@see |
647 |
|
|
|
|
| 0% |
Uncovered Elements: 19 (19) |
Complexity: 5 |
Complexity Density: 0.45 |
|
648 |
0
|
@Override... |
649 |
|
public String[] getURLs(String protocol) { |
650 |
0
|
InetAddress[] addresses = this.getInetAddresses(); |
651 |
0
|
String[] urls = new String[addresses.length]; |
652 |
0
|
for (int i = 0; i < addresses.length; i++) { |
653 |
0
|
String url = protocol + "://" + addresses[i].getHostAddress() + ":" + getPort(); |
654 |
0
|
String path = getPropertyString("path"); |
655 |
0
|
if (path != null) { |
656 |
0
|
if (path.indexOf("://") >= 0) { |
657 |
0
|
url = path; |
658 |
|
} else { |
659 |
0
|
url += path.startsWith("/") ? path : "/" + path; |
660 |
|
} |
661 |
|
} |
662 |
0
|
urls[i] = url; |
663 |
|
} |
664 |
0
|
return urls; |
665 |
|
} |
666 |
|
|
667 |
|
|
668 |
|
@inheritDoc |
669 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
670 |
0
|
@Override... |
671 |
|
public synchronized byte[] getPropertyBytes(String name) { |
672 |
0
|
return this.getProperties().get(name); |
673 |
|
} |
674 |
|
|
675 |
|
|
676 |
|
@inheritDoc |
677 |
|
|
|
|
| 80% |
Uncovered Elements: 2 (10) |
Complexity: 3 |
Complexity Density: 0.5 |
|
678 |
16
|
@Override... |
679 |
|
public synchronized String getPropertyString(String name) { |
680 |
16
|
byte data[] = this.getProperties().get(name); |
681 |
16
|
if (data == null) { |
682 |
1
|
return null; |
683 |
|
} |
684 |
15
|
if (data == NO_VALUE) { |
685 |
0
|
return "true"; |
686 |
|
} |
687 |
15
|
return readUTF(data, 0, data.length); |
688 |
|
} |
689 |
|
|
690 |
|
|
691 |
|
@inheritDoc |
692 |
|
|
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
693 |
0
|
@Override... |
694 |
|
public Enumeration<String> getPropertyNames() { |
695 |
0
|
Map<String, byte[]> properties = this.getProperties(); |
696 |
0
|
Collection<String> names = (properties != null ? properties.keySet() : Collections.<String> emptySet()); |
697 |
0
|
return new Vector<String>(names).elements(); |
698 |
|
} |
699 |
|
|
700 |
|
|
701 |
|
@inheritDoc |
702 |
|
|
|
|
| 66.7% |
Uncovered Elements: 1 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
703 |
1799
|
@Override... |
704 |
|
public String getApplication() { |
705 |
1806
|
return (_application != null ? _application : ""); |
706 |
|
} |
707 |
|
|
708 |
|
|
709 |
|
@inheritDoc |
710 |
|
|
|
|
| 66.7% |
Uncovered Elements: 1 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
711 |
1804
|
@Override... |
712 |
|
public String getDomain() { |
713 |
1805
|
return (_domain != null ? _domain : "local"); |
714 |
|
} |
715 |
|
|
716 |
|
|
717 |
|
@inheritDoc |
718 |
|
|
|
|
| 66.7% |
Uncovered Elements: 1 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
719 |
1798
|
@Override... |
720 |
|
public String getProtocol() { |
721 |
1803
|
return (_protocol != null ? _protocol : "tcp"); |
722 |
|
} |
723 |
|
|
724 |
|
|
725 |
|
@inheritDoc |
726 |
|
|
|
|
| 66.7% |
Uncovered Elements: 1 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
727 |
319
|
@Override... |
728 |
|
public String getSubtype() { |
729 |
319
|
return (_subtype != null ? _subtype : ""); |
730 |
|
} |
731 |
|
|
732 |
|
|
733 |
|
@inheritDoc |
734 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (7) |
Complexity: 1 |
Complexity Density: 0.14 |
|
735 |
113
|
@Override... |
736 |
|
public Map<Fields, String> getQualifiedNameMap() { |
737 |
113
|
Map<Fields, String> map = new HashMap<Fields, String>(5); |
738 |
|
|
739 |
113
|
map.put(Fields.Domain, this.getDomain()); |
740 |
113
|
map.put(Fields.Protocol, this.getProtocol()); |
741 |
113
|
map.put(Fields.Application, this.getApplication()); |
742 |
112
|
map.put(Fields.Instance, this.getName()); |
743 |
112
|
map.put(Fields.Subtype, this.getSubtype()); |
744 |
113
|
return map; |
745 |
|
} |
746 |
|
|
747 |
|
|
748 |
|
|
749 |
|
|
|
|
| 43.8% |
Uncovered Elements: 9 (16) |
Complexity: 5 |
Complexity Density: 0.5 |
|
750 |
145
|
static void writeUTF(OutputStream out, String str) throws IOException {... |
751 |
4048
|
for (int i = 0, len = str.length(); i < len; i++) { |
752 |
3905
|
int c = str.charAt(i); |
753 |
3899
|
if ((c >= 0x0001) && (c <= 0x007F)) { |
754 |
3902
|
out.write(c); |
755 |
|
} else { |
756 |
0
|
if (c > 0x07FF) { |
757 |
0
|
out.write(0xE0 | ((c >> 12) & 0x0F)); |
758 |
0
|
out.write(0x80 | ((c >> 6) & 0x3F)); |
759 |
0
|
out.write(0x80 | ((c >> 0) & 0x3F)); |
760 |
|
} else { |
761 |
0
|
out.write(0xC0 | ((c >> 6) & 0x1F)); |
762 |
0
|
out.write(0x80 | ((c >> 0) & 0x3F)); |
763 |
|
} |
764 |
|
} |
765 |
|
} |
766 |
|
} |
767 |
|
|
768 |
|
|
769 |
|
|
770 |
|
|
|
|
| 35% |
Uncovered Elements: 26 (40) |
Complexity: 16 |
Complexity Density: 0.5 |
|
771 |
33
|
String readUTF(byte data[], int off, int len) {... |
772 |
33
|
int offset = off; |
773 |
33
|
StringBuffer buf = new StringBuffer(); |
774 |
592
|
for (int end = offset + len; offset < end;) { |
775 |
559
|
int ch = data[offset++] & 0xFF; |
776 |
559
|
switch (ch >> 4) { |
777 |
0
|
case 0: |
778 |
0
|
case 1: |
779 |
48
|
case 2: |
780 |
0
|
case 3: |
781 |
0
|
case 4: |
782 |
27
|
case 5: |
783 |
276
|
case 6: |
784 |
208
|
case 7: |
785 |
|
|
786 |
559
|
break; |
787 |
0
|
case 12: |
788 |
0
|
case 13: |
789 |
0
|
if (offset >= len) { |
790 |
0
|
return null; |
791 |
|
} |
792 |
|
|
793 |
0
|
ch = ((ch & 0x1F) << 6) | (data[offset++] & 0x3F); |
794 |
0
|
break; |
795 |
0
|
case 14: |
796 |
0
|
if (offset + 2 >= len) { |
797 |
0
|
return null; |
798 |
|
} |
799 |
|
|
800 |
0
|
ch = ((ch & 0x0f) << 12) | ((data[offset++] & 0x3F) << 6) | (data[offset++] & 0x3F); |
801 |
0
|
break; |
802 |
0
|
default: |
803 |
0
|
if (offset + 1 >= len) { |
804 |
0
|
return null; |
805 |
|
} |
806 |
|
|
807 |
0
|
ch = ((ch & 0x3F) << 4) | (data[offset++] & 0x0f); |
808 |
0
|
break; |
809 |
|
} |
810 |
559
|
buf.append((char) ch); |
811 |
|
} |
812 |
33
|
return buf.toString(); |
813 |
|
} |
814 |
|
|
|
|
| 81.6% |
Uncovered Elements: 7 (38) |
Complexity: 12 |
Complexity Density: 0.5 |
|
815 |
23
|
synchronized Map<String, byte[]> getProperties() {... |
816 |
23
|
if ((_props == null) && (this.getTextBytes() != null)) { |
817 |
19
|
Hashtable<String, byte[]> properties = new Hashtable<String, byte[]>(); |
818 |
19
|
try { |
819 |
19
|
int off = 0; |
820 |
37
|
while (off < getTextBytes().length) { |
821 |
|
|
822 |
19
|
int len = getTextBytes()[off++] & 0xFF; |
823 |
19
|
if ((len == 0) || (off + len > getTextBytes().length)) { |
824 |
1
|
properties.clear(); |
825 |
1
|
break; |
826 |
|
} |
827 |
|
|
828 |
18
|
int i = 0; |
829 |
144
|
for (; (i < len) && (getTextBytes()[off + i] != '='); i++) { |
830 |
|
|
831 |
|
} |
832 |
|
|
833 |
|
|
834 |
18
|
String name = readUTF(getTextBytes(), off, i); |
835 |
18
|
if (name == null) { |
836 |
0
|
properties.clear(); |
837 |
0
|
break; |
838 |
|
} |
839 |
18
|
if (i == len) { |
840 |
0
|
properties.put(name, NO_VALUE); |
841 |
|
} else { |
842 |
18
|
byte value[] = new byte[len - ++i]; |
843 |
18
|
System.arraycopy(getTextBytes(), off + i, value, 0, len - i); |
844 |
18
|
properties.put(name, value); |
845 |
18
|
off += len; |
846 |
|
} |
847 |
|
} |
848 |
|
} catch (Exception exception) { |
849 |
|
|
850 |
0
|
logger.log(Level.WARNING, "Malformed TXT Field ", exception); |
851 |
|
} |
852 |
19
|
this._props = properties; |
853 |
|
} |
854 |
23
|
return (_props != null ? _props : Collections.<String, byte[]> emptyMap()); |
855 |
|
} |
856 |
|
|
857 |
|
|
858 |
|
|
859 |
|
|
860 |
|
@param |
861 |
|
@param |
862 |
|
@param |
863 |
|
|
|
|
| 88.4% |
Uncovered Elements: 8 (69) |
Complexity: 18 |
Complexity Density: 0.35 |
|
864 |
107
|
@Override... |
865 |
|
public void updateRecord(DNSCache dnsCache, long now, DNSEntry rec) { |
866 |
107
|
if ((rec instanceof DNSRecord) && !rec.isExpired(now)) { |
867 |
94
|
boolean serviceUpdated = false; |
868 |
94
|
switch (rec.getRecordType()) { |
869 |
21
|
case TYPE_A: |
870 |
21
|
if (rec.getName().equalsIgnoreCase(this.getServer())) { |
871 |
20
|
_ipv4Addresses.add((Inet4Address) ((DNSRecord.Address) rec).getAddress()); |
872 |
20
|
serviceUpdated = true; |
873 |
|
} |
874 |
21
|
break; |
875 |
22
|
case TYPE_AAAA: |
876 |
22
|
if (rec.getName().equalsIgnoreCase(this.getServer())) { |
877 |
21
|
_ipv6Addresses.add((Inet6Address) ((DNSRecord.Address) rec).getAddress()); |
878 |
21
|
serviceUpdated = true; |
879 |
|
} |
880 |
22
|
break; |
881 |
22
|
case TYPE_SRV: |
882 |
22
|
if (rec.getName().equalsIgnoreCase(this.getQualifiedName())) { |
883 |
22
|
DNSRecord.Service srv = (DNSRecord.Service) rec; |
884 |
22
|
boolean serverChanged = (_server == null) || !_server.equalsIgnoreCase(srv.getServer()); |
885 |
22
|
_server = srv.getServer(); |
886 |
22
|
_port = srv.getPort(); |
887 |
22
|
_weight = srv.getWeight(); |
888 |
22
|
_priority = srv.getPriority(); |
889 |
22
|
if (serverChanged) { |
890 |
21
|
_ipv4Addresses.clear(); |
891 |
21
|
_ipv6Addresses.clear(); |
892 |
21
|
for (DNSEntry entry : dnsCache.getDNSEntryList(_server, DNSRecordType.TYPE_A, DNSRecordClass.CLASS_IN)) { |
893 |
20
|
this.updateRecord(dnsCache, now, entry); |
894 |
|
} |
895 |
21
|
for (DNSEntry entry : dnsCache.getDNSEntryList(_server, DNSRecordType.TYPE_AAAA, DNSRecordClass.CLASS_IN)) { |
896 |
21
|
this.updateRecord(dnsCache, now, entry); |
897 |
|
} |
898 |
|
|
899 |
|
} else { |
900 |
1
|
serviceUpdated = true; |
901 |
|
} |
902 |
|
} |
903 |
22
|
break; |
904 |
26
|
case TYPE_TXT: |
905 |
26
|
if (rec.getName().equalsIgnoreCase(this.getQualifiedName())) { |
906 |
26
|
DNSRecord.Text txt = (DNSRecord.Text) rec; |
907 |
26
|
_text = txt.getText(); |
908 |
26
|
serviceUpdated = true; |
909 |
|
} |
910 |
26
|
break; |
911 |
3
|
case TYPE_PTR: |
912 |
3
|
if ((this.getSubtype().length() == 0) && (rec.getSubtype().length() != 0)) { |
913 |
0
|
_subtype = rec.getSubtype(); |
914 |
0
|
serviceUpdated = true; |
915 |
|
} |
916 |
3
|
break; |
917 |
0
|
default: |
918 |
0
|
break; |
919 |
|
} |
920 |
94
|
if (serviceUpdated && this.hasData()) { |
921 |
68
|
JmDNSImpl dns = this.getDns(); |
922 |
68
|
if (dns != null) { |
923 |
68
|
ServiceEvent event = ((DNSRecord) rec).getServiceEvent(dns); |
924 |
68
|
event = new ServiceEventImpl(dns, event.getType(), event.getName(), this); |
925 |
68
|
dns.handleServiceResolved(event); |
926 |
|
} |
927 |
|
} |
928 |
|
|
929 |
94
|
synchronized (this) { |
930 |
94
|
this.notifyAll(); |
931 |
|
} |
932 |
|
} |
933 |
|
} |
934 |
|
|
935 |
|
|
936 |
|
|
937 |
|
|
938 |
|
@return |
939 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
940 |
436
|
@Override... |
941 |
|
public synchronized boolean hasData() { |
942 |
436
|
return this.getServer() != null && this.hasInetAddress() && this.getTextBytes() != null && this.getTextBytes().length > 0; |
943 |
|
|
944 |
|
} |
945 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
946 |
435
|
private final boolean hasInetAddress() {... |
947 |
436
|
return _ipv4Addresses.size() > 0 || _ipv6Addresses.size() > 0; |
948 |
|
} |
949 |
|
|
950 |
|
|
951 |
|
|
952 |
|
|
953 |
|
@inheritDoc |
954 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
955 |
168
|
@Override... |
956 |
|
public boolean advanceState(DNSTask task) { |
957 |
168
|
return _state.advanceState(task); |
958 |
|
} |
959 |
|
|
960 |
|
|
961 |
|
@inheritDoc |
962 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
963 |
0
|
@Override... |
964 |
|
public boolean revertState() { |
965 |
0
|
return _state.revertState(); |
966 |
|
} |
967 |
|
|
968 |
|
|
969 |
|
@inheritDoc |
970 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
971 |
20
|
@Override... |
972 |
|
public boolean cancelState() { |
973 |
20
|
return _state.cancelState(); |
974 |
|
} |
975 |
|
|
976 |
|
|
977 |
|
@inheritDoc |
978 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
979 |
0
|
@Override... |
980 |
|
public boolean closeState() { |
981 |
0
|
return this._state.closeState(); |
982 |
|
} |
983 |
|
|
984 |
|
|
985 |
|
@inheritDoc |
986 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
987 |
20
|
@Override... |
988 |
|
public boolean recoverState() { |
989 |
20
|
return this._state.recoverState(); |
990 |
|
} |
991 |
|
|
992 |
|
|
993 |
|
@inheritDoc |
994 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
995 |
64
|
@Override... |
996 |
|
public void removeAssociationWithTask(DNSTask task) { |
997 |
64
|
_state.removeAssociationWithTask(task); |
998 |
|
} |
999 |
|
|
1000 |
|
|
1001 |
|
@inheritDoc |
1002 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1003 |
89
|
@Override... |
1004 |
|
public void associateWithTask(DNSTask task, DNSState state) { |
1005 |
89
|
_state.associateWithTask(task, state); |
1006 |
|
} |
1007 |
|
|
1008 |
|
|
1009 |
|
@inheritDoc |
1010 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1011 |
168
|
@Override... |
1012 |
|
public boolean isAssociatedWithTask(DNSTask task, DNSState state) { |
1013 |
168
|
return _state.isAssociatedWithTask(task, state); |
1014 |
|
} |
1015 |
|
|
1016 |
|
|
1017 |
|
@inheritDoc |
1018 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1019 |
0
|
@Override... |
1020 |
|
public boolean isProbing() { |
1021 |
0
|
return _state.isProbing(); |
1022 |
|
} |
1023 |
|
|
1024 |
|
|
1025 |
|
@inheritDoc |
1026 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1027 |
60
|
@Override... |
1028 |
|
public boolean isAnnouncing() { |
1029 |
60
|
return _state.isAnnouncing(); |
1030 |
|
} |
1031 |
|
|
1032 |
|
|
1033 |
|
@inheritDoc |
1034 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1035 |
130
|
@Override... |
1036 |
|
public boolean isAnnounced() { |
1037 |
130
|
return _state.isAnnounced(); |
1038 |
|
} |
1039 |
|
|
1040 |
|
|
1041 |
|
@inheritDoc |
1042 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1043 |
0
|
@Override... |
1044 |
|
public boolean isCanceling() { |
1045 |
0
|
return this._state.isCanceling(); |
1046 |
|
} |
1047 |
|
|
1048 |
|
|
1049 |
|
@inheritDoc |
1050 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1051 |
0
|
@Override... |
1052 |
|
public boolean isCanceled() { |
1053 |
0
|
return _state.isCanceled(); |
1054 |
|
} |
1055 |
|
|
1056 |
|
|
1057 |
|
@inheritDoc |
1058 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1059 |
0
|
@Override... |
1060 |
|
public boolean isClosing() { |
1061 |
0
|
return _state.isClosing(); |
1062 |
|
} |
1063 |
|
|
1064 |
|
|
1065 |
|
@inheritDoc |
1066 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1067 |
0
|
@Override... |
1068 |
|
public boolean isClosed() { |
1069 |
0
|
return _state.isClosed(); |
1070 |
|
} |
1071 |
|
|
1072 |
|
|
1073 |
|
@inheritDoc |
1074 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1075 |
20
|
@Override... |
1076 |
|
public boolean waitForAnnounced(long timeout) { |
1077 |
20
|
return _state.waitForAnnounced(timeout); |
1078 |
|
} |
1079 |
|
|
1080 |
|
|
1081 |
|
@inheritDoc |
1082 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1083 |
20
|
@Override... |
1084 |
|
public boolean waitForCanceled(long timeout) { |
1085 |
20
|
return _state.waitForCanceled(timeout); |
1086 |
|
} |
1087 |
|
|
1088 |
|
|
1089 |
|
@inheritDoc |
1090 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1091 |
0
|
@Override... |
1092 |
|
public int hashCode() { |
1093 |
0
|
return getQualifiedName().hashCode(); |
1094 |
|
} |
1095 |
|
|
1096 |
|
|
1097 |
|
@inheritDoc |
1098 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1099 |
121
|
@Override... |
1100 |
|
public boolean equals(Object obj) { |
1101 |
121
|
return (obj instanceof ServiceInfoImpl) && getQualifiedName().equals(((ServiceInfoImpl) obj).getQualifiedName()); |
1102 |
|
} |
1103 |
|
|
1104 |
|
|
1105 |
|
@inheritDoc |
1106 |
|
|
|
|
| 0% |
Uncovered Elements: 17 (17) |
Complexity: 5 |
Complexity Density: 0.45 |
|
1107 |
0
|
@Override... |
1108 |
|
public String getNiceTextString() { |
1109 |
0
|
StringBuffer buf = new StringBuffer(); |
1110 |
0
|
for (int i = 0, len = this.getTextBytes().length; i < len; i++) { |
1111 |
0
|
if (i >= 200) { |
1112 |
0
|
buf.append("..."); |
1113 |
0
|
break; |
1114 |
|
} |
1115 |
0
|
int ch = getTextBytes()[i] & 0xFF; |
1116 |
0
|
if ((ch < ' ') || (ch > 127)) { |
1117 |
0
|
buf.append("\\0"); |
1118 |
0
|
buf.append(Integer.toString(ch, 8)); |
1119 |
|
} else { |
1120 |
0
|
buf.append((char) ch); |
1121 |
|
} |
1122 |
|
} |
1123 |
0
|
return buf.toString(); |
1124 |
|
} |
1125 |
|
|
1126 |
|
|
1127 |
|
|
1128 |
|
@see |
1129 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (8) |
Complexity: 1 |
Complexity Density: 0.12 |
|
1130 |
59
|
@Override... |
1131 |
|
public ServiceInfoImpl clone() { |
1132 |
59
|
ServiceInfoImpl serviceInfo = new ServiceInfoImpl(this.getQualifiedNameMap(), _port, _weight, _priority, _persistent, _text); |
1133 |
59
|
Inet6Address[] ipv6Addresses = this.getInet6Addresses(); |
1134 |
59
|
for (Inet6Address address : ipv6Addresses) { |
1135 |
34
|
serviceInfo._ipv6Addresses.add(address); |
1136 |
|
} |
1137 |
59
|
Inet4Address[] ipv4Addresses = this.getInet4Addresses(); |
1138 |
59
|
for (Inet4Address address : ipv4Addresses) { |
1139 |
33
|
serviceInfo._ipv4Addresses.add(address); |
1140 |
|
} |
1141 |
59
|
return serviceInfo; |
1142 |
|
} |
1143 |
|
|
1144 |
|
|
1145 |
|
@inheritDoc |
1146 |
|
|
|
|
| 80.5% |
Uncovered Elements: 8 (41) |
Complexity: 7 |
Complexity Density: 0.24 |
|
1147 |
7
|
@Override... |
1148 |
|
public String toString() { |
1149 |
7
|
StringBuilder buf = new StringBuilder(); |
1150 |
7
|
buf.append("[" + this.getClass().getSimpleName() + "@" + System.identityHashCode(this) + " "); |
1151 |
7
|
buf.append("name: '"); |
1152 |
7
|
buf.append((this.getName().length() > 0 ? this.getName() + "." : "") + this.getTypeWithSubtype()); |
1153 |
7
|
buf.append("' address: '"); |
1154 |
7
|
InetAddress[] addresses = this.getInetAddresses(); |
1155 |
7
|
if (addresses.length > 0) { |
1156 |
7
|
for (InetAddress address : addresses) { |
1157 |
14
|
buf.append(address); |
1158 |
14
|
buf.append(':'); |
1159 |
14
|
buf.append(this.getPort()); |
1160 |
14
|
buf.append(' '); |
1161 |
|
} |
1162 |
|
} else { |
1163 |
0
|
buf.append("(null):"); |
1164 |
0
|
buf.append(this.getPort()); |
1165 |
|
} |
1166 |
7
|
buf.append("' status: '"); |
1167 |
7
|
buf.append(_state.toString()); |
1168 |
7
|
buf.append(this.isPersistent() ? "' is persistent," : "',"); |
1169 |
7
|
buf.append(" has "); |
1170 |
7
|
buf.append(this.hasData() ? "" : "NO "); |
1171 |
7
|
buf.append("data"); |
1172 |
7
|
if (this.getTextBytes().length > 0) { |
1173 |
|
|
1174 |
|
|
1175 |
7
|
Map<String, byte[]> properties = this.getProperties(); |
1176 |
7
|
if (!properties.isEmpty()) { |
1177 |
7
|
buf.append("\n"); |
1178 |
7
|
for (String key : properties.keySet()) { |
1179 |
7
|
buf.append("\t" + key + ": " + new String(properties.get(key)) + "\n"); |
1180 |
|
} |
1181 |
|
} else { |
1182 |
0
|
buf.append(" empty"); |
1183 |
|
} |
1184 |
|
} |
1185 |
7
|
buf.append(']'); |
1186 |
7
|
return buf.toString(); |
1187 |
|
} |
1188 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (9) |
Complexity: 2 |
Complexity Density: 0.29 |
|
1189 |
138
|
public Collection<DNSRecord> answers(boolean unique, int ttl, HostInfo localHost) {... |
1190 |
138
|
List<DNSRecord> list = new ArrayList<DNSRecord>(); |
1191 |
138
|
if (this.getSubtype().length() > 0) { |
1192 |
5
|
list.add(new Pointer(this.getTypeWithSubtype(), DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE, ttl, this.getQualifiedName())); |
1193 |
|
} |
1194 |
138
|
list.add(new Pointer(this.getType(), DNSRecordClass.CLASS_IN, DNSRecordClass.NOT_UNIQUE, ttl, this.getQualifiedName())); |
1195 |
138
|
list.add(new Service(this.getQualifiedName(), DNSRecordClass.CLASS_IN, unique, ttl, _priority, _weight, _port, localHost.getName())); |
1196 |
138
|
list.add(new Text(this.getQualifiedName(), DNSRecordClass.CLASS_IN, unique, ttl, this.getTextBytes())); |
1197 |
138
|
return list; |
1198 |
|
} |
1199 |
|
|
1200 |
|
|
1201 |
|
@inheritDoc |
1202 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
1203 |
4
|
@Override... |
1204 |
|
public void setText(byte[] text) throws IllegalStateException { |
1205 |
4
|
synchronized (this) { |
1206 |
4
|
this._text = text; |
1207 |
4
|
this._props = null; |
1208 |
4
|
this.setNeedTextAnnouncing(true); |
1209 |
|
} |
1210 |
|
} |
1211 |
|
|
1212 |
|
|
1213 |
|
@inheritDoc |
1214 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1215 |
4
|
@Override... |
1216 |
|
public void setText(Map<String, ?> props) throws IllegalStateException { |
1217 |
4
|
this.setText(textFromProperties(props)); |
1218 |
|
} |
1219 |
|
|
1220 |
|
|
1221 |
|
|
1222 |
|
|
1223 |
|
@param |
1224 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
1225 |
38
|
void _setText(byte[] text) {... |
1226 |
38
|
this._text = text; |
1227 |
38
|
this._props = null; |
1228 |
|
} |
1229 |
|
|
|
|
| 67.4% |
Uncovered Elements: 14 (43) |
Complexity: 11 |
Complexity Density: 0.41 |
|
1230 |
34
|
private static byte[] textFromProperties(Map<String, ?> props) {... |
1231 |
34
|
byte[] text = null; |
1232 |
34
|
if (props != null) { |
1233 |
34
|
try { |
1234 |
34
|
ByteArrayOutputStream out = new ByteArrayOutputStream(256); |
1235 |
34
|
for (String key : props.keySet()) { |
1236 |
33
|
Object val = props.get(key); |
1237 |
33
|
ByteArrayOutputStream out2 = new ByteArrayOutputStream(100); |
1238 |
33
|
writeUTF(out2, key); |
1239 |
33
|
if (val == null) { |
1240 |
|
|
1241 |
33
|
} else if (val instanceof String) { |
1242 |
0
|
out2.write('='); |
1243 |
0
|
writeUTF(out2, (String) val); |
1244 |
33
|
} else if (val instanceof byte[]) { |
1245 |
33
|
byte[] bval = (byte[]) val; |
1246 |
33
|
if (bval.length > 0) { |
1247 |
33
|
out2.write('='); |
1248 |
33
|
out2.write(bval, 0, bval.length); |
1249 |
|
} else { |
1250 |
0
|
val = null; |
1251 |
|
} |
1252 |
|
} else { |
1253 |
0
|
throw new IllegalArgumentException("invalid property value: " + val); |
1254 |
|
} |
1255 |
33
|
byte data[] = out2.toByteArray(); |
1256 |
33
|
if (data.length > 255) { |
1257 |
0
|
throw new IOException("Cannot have individual values larger that 255 chars. Offending value: " + key + (val != null ? "" : "=" + val)); |
1258 |
|
} |
1259 |
33
|
out.write((byte) data.length); |
1260 |
33
|
out.write(data, 0, data.length); |
1261 |
|
} |
1262 |
34
|
text = out.toByteArray(); |
1263 |
|
} catch (IOException e) { |
1264 |
0
|
throw new RuntimeException("unexpected exception: " + e); |
1265 |
|
} |
1266 |
|
} |
1267 |
34
|
return (text != null && text.length > 0 ? text : DNSRecord.EMPTY_TXT); |
1268 |
|
} |
1269 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1270 |
149
|
public void setDns(JmDNSImpl dns) {... |
1271 |
150
|
this._state.setDns(dns); |
1272 |
|
} |
1273 |
|
|
1274 |
|
|
1275 |
|
@inheritDoc |
1276 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1277 |
91
|
@Override... |
1278 |
|
public JmDNSImpl getDns() { |
1279 |
91
|
return this._state.getDns(); |
1280 |
|
} |
1281 |
|
|
1282 |
|
|
1283 |
|
@inheritDoc |
1284 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1285 |
39
|
@Override... |
1286 |
|
public boolean isPersistent() { |
1287 |
39
|
return _persistent; |
1288 |
|
} |
1289 |
|
|
1290 |
|
|
1291 |
|
@param |
1292 |
|
|
1293 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
1294 |
434
|
public void setNeedTextAnnouncing(boolean needTextAnnouncing) {... |
1295 |
434
|
this._needTextAnnouncing = needTextAnnouncing; |
1296 |
433
|
if (this._needTextAnnouncing) { |
1297 |
4
|
_state.setTask(null); |
1298 |
|
} |
1299 |
|
} |
1300 |
|
|
1301 |
|
|
1302 |
|
@return |
1303 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1304 |
111
|
public boolean needTextAnnouncing() {... |
1305 |
111
|
return _needTextAnnouncing; |
1306 |
|
} |
1307 |
|
|
1308 |
|
|
1309 |
|
@return |
1310 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1311 |
0
|
Delegate getDelegate() {... |
1312 |
0
|
return this._delegate; |
1313 |
|
} |
1314 |
|
|
1315 |
|
|
1316 |
|
@param |
1317 |
|
|
1318 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
1319 |
0
|
void setDelegate(Delegate delegate) {... |
1320 |
0
|
this._delegate = delegate; |
1321 |
|
} |
1322 |
|
|
1323 |
|
} |