1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
package javax.jmdns.impl.tasks; |
6 |
|
|
7 |
|
import java.util.HashSet; |
8 |
|
import java.util.Set; |
9 |
|
import java.util.Timer; |
10 |
|
import java.util.logging.Level; |
11 |
|
import java.util.logging.Logger; |
12 |
|
|
13 |
|
import javax.jmdns.impl.DNSIncoming; |
14 |
|
import javax.jmdns.impl.DNSOutgoing; |
15 |
|
import javax.jmdns.impl.DNSQuestion; |
16 |
|
import javax.jmdns.impl.DNSRecord; |
17 |
|
import javax.jmdns.impl.JmDNSImpl; |
18 |
|
import javax.jmdns.impl.constants.DNSConstants; |
19 |
|
|
20 |
|
|
21 |
|
|
22 |
|
|
|
|
| 64.4% |
Uncovered Elements: 32 (90) |
Complexity: 25 |
Complexity Density: 0.49 |
|
23 |
|
public class Responder extends DNSTask { |
24 |
|
static Logger logger = Logger.getLogger(Responder.class.getName()); |
25 |
|
|
26 |
|
|
27 |
|
|
28 |
|
|
29 |
|
private final DNSIncoming _in; |
30 |
|
|
31 |
|
|
32 |
|
|
33 |
|
|
34 |
|
private final boolean _unicast; |
35 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 1 |
Complexity Density: 0.33 |
|
36 |
340
|
public Responder(JmDNSImpl jmDNSImpl, DNSIncoming in, int port) {... |
37 |
323
|
super(jmDNSImpl); |
38 |
341
|
this._in = in; |
39 |
324
|
this._unicast = (port != DNSConstants.MDNS_PORT); |
40 |
|
} |
41 |
|
|
42 |
|
|
43 |
|
|
44 |
|
@see |
45 |
|
|
|
|
| 0% |
Uncovered Elements: 3 (3) |
Complexity: 2 |
Complexity Density: 2 |
|
46 |
0
|
@Override... |
47 |
|
public String getName() { |
48 |
0
|
return "Responder(" + (this.getDns() != null ? this.getDns().getName() : "") + ")"; |
49 |
|
} |
50 |
|
|
51 |
|
|
52 |
|
|
53 |
|
@see |
54 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
55 |
0
|
@Override... |
56 |
|
public String toString() { |
57 |
0
|
return super.toString() + " incomming: " + _in; |
58 |
|
} |
59 |
|
|
60 |
|
|
61 |
|
|
62 |
|
@see |
63 |
|
|
|
|
| 73.1% |
Uncovered Elements: 7 (26) |
Complexity: 9 |
Complexity Density: 0.64 |
|
64 |
330
|
@Override... |
65 |
|
public void start(Timer timer) { |
66 |
|
|
67 |
|
|
68 |
|
|
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
|
73 |
339
|
boolean iAmTheOnlyOne = true; |
74 |
333
|
for (DNSQuestion question : _in.getQuestions()) { |
75 |
339
|
if (logger.isLoggable(Level.FINEST)) { |
76 |
0
|
logger.finest(this.getName() + "start() question=" + question); |
77 |
|
} |
78 |
335
|
iAmTheOnlyOne = question.iAmTheOnlyOne(this.getDns()); |
79 |
341
|
if (!iAmTheOnlyOne) { |
80 |
155
|
break; |
81 |
|
} |
82 |
|
} |
83 |
341
|
int delay = (iAmTheOnlyOne && !_in.isTruncated()) ? 0 : DNSConstants.RESPONSE_MIN_WAIT_INTERVAL + JmDNSImpl.getRandom().nextInt(DNSConstants.RESPONSE_MAX_WAIT_INTERVAL - DNSConstants.RESPONSE_MIN_WAIT_INTERVAL + 1) - _in.elapseSinceArrival(); |
84 |
340
|
if (delay < 0) { |
85 |
0
|
delay = 0; |
86 |
|
} |
87 |
346
|
if (logger.isLoggable(Level.FINEST)) { |
88 |
0
|
logger.finest(this.getName() + "start() Responder chosen delay=" + delay); |
89 |
|
} |
90 |
345
|
if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) { |
91 |
344
|
timer.schedule(this, delay); |
92 |
|
} |
93 |
|
} |
94 |
|
|
|
|
| 63.5% |
Uncovered Elements: 19 (52) |
Complexity: 12 |
Complexity Density: 0.38 |
|
95 |
348
|
@Override... |
96 |
|
public void run() { |
97 |
349
|
this.getDns().respondToQuery(_in); |
98 |
|
|
99 |
|
|
100 |
348
|
Set<DNSQuestion> questions = new HashSet<DNSQuestion>(); |
101 |
349
|
Set<DNSRecord> answers = new HashSet<DNSRecord>(); |
102 |
|
|
103 |
350
|
if (this.getDns().isAnnounced()) { |
104 |
139
|
try { |
105 |
|
|
106 |
139
|
for (DNSQuestion question : _in.getQuestions()) { |
107 |
143
|
if (logger.isLoggable(Level.FINER)) { |
108 |
0
|
logger.finer(this.getName() + "run() JmDNS responding to: " + question); |
109 |
|
} |
110 |
|
|
111 |
143
|
if (_unicast) { |
112 |
|
|
113 |
0
|
questions.add(question); |
114 |
|
} |
115 |
|
|
116 |
143
|
question.addAnswers(this.getDns(), answers); |
117 |
|
} |
118 |
|
|
119 |
|
|
120 |
139
|
long now = System.currentTimeMillis(); |
121 |
139
|
for (DNSRecord knownAnswer : _in.getAnswers()) { |
122 |
18
|
if (knownAnswer.isStale(now)) { |
123 |
0
|
answers.remove(knownAnswer); |
124 |
0
|
if (logger.isLoggable(Level.FINER)) { |
125 |
0
|
logger.finer(this.getName() + "JmDNS Responder Known Answer Removed"); |
126 |
|
} |
127 |
|
} |
128 |
|
} |
129 |
|
|
130 |
|
|
131 |
139
|
if (!answers.isEmpty()) { |
132 |
33
|
if (logger.isLoggable(Level.FINER)) { |
133 |
0
|
logger.finer(this.getName() + "run() JmDNS responding"); |
134 |
|
} |
135 |
33
|
DNSOutgoing out = new DNSOutgoing(DNSConstants.FLAGS_QR_RESPONSE | DNSConstants.FLAGS_AA, !_unicast, _in.getSenderUDPPayload()); |
136 |
33
|
out.setId(_in.getId()); |
137 |
33
|
for (DNSQuestion question : questions) { |
138 |
0
|
if (question != null) { |
139 |
0
|
out = this.addQuestion(out, question); |
140 |
|
} |
141 |
|
} |
142 |
33
|
for (DNSRecord answer : answers) { |
143 |
123
|
if (answer != null) { |
144 |
123
|
out = this.addAnswer(out, _in, answer); |
145 |
|
|
146 |
|
} |
147 |
|
} |
148 |
30
|
if (!out.isEmpty()) this.getDns().send(out); |
149 |
|
} |
150 |
|
|
151 |
|
} catch (Throwable e) { |
152 |
0
|
logger.log(Level.WARNING, this.getName() + "run() exception ", e); |
153 |
0
|
this.getDns().close(); |
154 |
|
} |
155 |
|
} |
156 |
|
} |
157 |
|
} |