1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
package javax.jmdns.impl; |
5 |
|
|
6 |
|
import java.util.EventListener; |
7 |
|
import java.util.concurrent.ConcurrentHashMap; |
8 |
|
import java.util.concurrent.ConcurrentMap; |
9 |
|
import java.util.logging.Logger; |
10 |
|
|
11 |
|
import javax.jmdns.JmDNS; |
12 |
|
import javax.jmdns.ServiceEvent; |
13 |
|
import javax.jmdns.ServiceInfo; |
14 |
|
import javax.jmdns.ServiceListener; |
15 |
|
import javax.jmdns.ServiceTypeListener; |
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
@param |
22 |
|
|
23 |
|
|
|
|
| 71.4% |
Uncovered Elements: 4 (14) |
Complexity: 6 |
Complexity Density: 0.75 |
|
24 |
|
public class ListenerStatus<T extends EventListener> { |
25 |
|
|
|
|
| 62.8% |
Uncovered Elements: 32 (86) |
Complexity: 23 |
Complexity Density: 0.46 |
|
26 |
|
public static class ServiceListenerStatus extends ListenerStatus<ServiceListener> { |
27 |
|
private static Logger logger = Logger.getLogger(ServiceListenerStatus.class.getName()); |
28 |
|
|
29 |
|
private final ConcurrentMap<String, ServiceInfo> _addedServices; |
30 |
|
|
31 |
|
|
32 |
|
@param |
33 |
|
|
34 |
|
@param |
35 |
|
|
36 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
37 |
42
|
public ServiceListenerStatus(ServiceListener listener, boolean synch) {... |
38 |
42
|
super(listener, synch); |
39 |
42
|
_addedServices = new ConcurrentHashMap<String, ServiceInfo>(32); |
40 |
|
} |
41 |
|
|
42 |
|
|
43 |
|
|
44 |
|
|
45 |
|
@link@link |
46 |
|
|
47 |
|
|
48 |
|
|
49 |
|
|
50 |
|
|
51 |
|
|
52 |
|
|
53 |
|
|
54 |
|
@param |
55 |
|
|
56 |
|
|
|
|
| 81.8% |
Uncovered Elements: 2 (11) |
Complexity: 4 |
Complexity Density: 0.57 |
|
57 |
26
|
void serviceAdded(ServiceEvent event) {... |
58 |
26
|
String qualifiedName = event.getName() + "." + event.getType(); |
59 |
26
|
if (null == _addedServices.putIfAbsent(qualifiedName, event.getInfo().clone())) { |
60 |
26
|
this.getListener().serviceAdded(event); |
61 |
26
|
ServiceInfo info = event.getInfo(); |
62 |
26
|
if ((info != null) && (info.hasData())) { |
63 |
1
|
this.getListener().serviceResolved(event); |
64 |
|
} |
65 |
|
} else { |
66 |
0
|
logger.finer("Service Added called for a service already added: " + event); |
67 |
|
} |
68 |
|
} |
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
|
73 |
|
@param |
74 |
|
|
75 |
|
|
|
|
| 66.7% |
Uncovered Elements: 2 (6) |
Complexity: 2 |
Complexity Density: 0.5 |
|
76 |
5
|
void serviceRemoved(ServiceEvent event) {... |
77 |
5
|
String qualifiedName = event.getName() + "." + event.getType(); |
78 |
5
|
if (_addedServices.remove(qualifiedName, _addedServices.get(qualifiedName))) { |
79 |
5
|
this.getListener().serviceRemoved(event); |
80 |
|
} else { |
81 |
0
|
logger.finer("Service Removed called for a service already removed: " + event); |
82 |
|
} |
83 |
|
} |
84 |
|
|
85 |
|
|
86 |
|
|
87 |
|
|
88 |
|
|
89 |
|
@param |
90 |
|
|
91 |
|
|
|
|
| 63.6% |
Uncovered Elements: 8 (22) |
Complexity: 7 |
Complexity Density: 0.58 |
|
92 |
40
|
synchronized void serviceResolved(ServiceEvent event) {... |
93 |
40
|
ServiceInfo info = event.getInfo(); |
94 |
40
|
if ((info != null) && (info.hasData())) { |
95 |
40
|
String qualifiedName = event.getName() + "." + event.getType(); |
96 |
40
|
ServiceInfo previousServiceInfo = _addedServices.get(qualifiedName); |
97 |
40
|
if (!_sameInfo(info, previousServiceInfo)) { |
98 |
33
|
if (null == previousServiceInfo) { |
99 |
0
|
if (null == _addedServices.putIfAbsent(qualifiedName, info.clone())) { |
100 |
0
|
this.getListener().serviceResolved(event); |
101 |
|
} |
102 |
|
} else { |
103 |
33
|
if (_addedServices.replace(qualifiedName, previousServiceInfo, info.clone())) { |
104 |
33
|
this.getListener().serviceResolved(event); |
105 |
|
} |
106 |
|
} |
107 |
|
} else { |
108 |
7
|
logger.finer("Service Resolved called for a service already resolved: " + event); |
109 |
|
} |
110 |
|
} else { |
111 |
0
|
logger.warning("Service Resolved called for an unresolved event: " + event); |
112 |
|
|
113 |
|
} |
114 |
|
} |
115 |
|
|
|
|
| 76.9% |
Uncovered Elements: 6 (26) |
Complexity: 7 |
Complexity Density: 0.5 |
|
116 |
40
|
private static final boolean _sameInfo(ServiceInfo info, ServiceInfo lastInfo) {... |
117 |
40
|
if (info == null) return false; |
118 |
40
|
if (lastInfo == null) return false; |
119 |
40
|
if (!info.equals(lastInfo)) return false; |
120 |
40
|
byte[] text = info.getTextBytes(); |
121 |
40
|
byte[] lastText = lastInfo.getTextBytes(); |
122 |
18
|
if (text.length != lastText.length) return false; |
123 |
281
|
for (int i = 0; i < text.length; i++) { |
124 |
15
|
if (text[i] != lastText[i]) return false; |
125 |
|
} |
126 |
7
|
return true; |
127 |
|
} |
128 |
|
|
129 |
|
|
130 |
|
|
131 |
|
@see |
132 |
|
|
|
|
| 0% |
Uncovered Elements: 13 (13) |
Complexity: 2 |
Complexity Density: 0.18 |
|
133 |
0
|
@Override... |
134 |
|
public String toString() { |
135 |
0
|
StringBuilder aLog = new StringBuilder(2048); |
136 |
0
|
aLog.append("[Status for "); |
137 |
0
|
aLog.append(this.getListener().toString()); |
138 |
0
|
if (_addedServices.isEmpty()) { |
139 |
0
|
aLog.append(" no type event "); |
140 |
|
} else { |
141 |
0
|
aLog.append(" ("); |
142 |
0
|
for (String service : _addedServices.keySet()) { |
143 |
0
|
aLog.append(service + ", "); |
144 |
|
} |
145 |
0
|
aLog.append(") "); |
146 |
|
} |
147 |
0
|
aLog.append("]"); |
148 |
0
|
return aLog.toString(); |
149 |
|
} |
150 |
|
|
151 |
|
} |
152 |
|
|
|
|
| 0% |
Uncovered Elements: 29 (29) |
Complexity: 7 |
Complexity Density: 0.37 |
|
153 |
|
public static class ServiceTypeListenerStatus extends ListenerStatus<ServiceTypeListener> { |
154 |
|
private static Logger logger = Logger.getLogger(ServiceTypeListenerStatus.class.getName()); |
155 |
|
|
156 |
|
private final ConcurrentMap<String, String> _addedTypes; |
157 |
|
|
158 |
|
|
159 |
|
@param |
160 |
|
|
161 |
|
@param |
162 |
|
|
163 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
164 |
0
|
public ServiceTypeListenerStatus(ServiceTypeListener listener, boolean synch) {... |
165 |
0
|
super(listener, synch); |
166 |
0
|
_addedTypes = new ConcurrentHashMap<String, String>(32); |
167 |
|
} |
168 |
|
|
169 |
|
|
170 |
|
|
171 |
|
|
172 |
|
@param |
173 |
|
|
174 |
|
|
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
175 |
0
|
void serviceTypeAdded(ServiceEvent event) {... |
176 |
0
|
if (null == _addedTypes.putIfAbsent(event.getType(), event.getType())) { |
177 |
0
|
this.getListener().serviceTypeAdded(event); |
178 |
|
} else { |
179 |
0
|
logger.finest("Service Type Added called for a service type already added: " + event); |
180 |
|
} |
181 |
|
} |
182 |
|
|
183 |
|
|
184 |
|
|
185 |
|
|
186 |
|
|
187 |
|
|
188 |
|
|
189 |
|
|
190 |
|
@param |
191 |
|
|
192 |
|
|
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
193 |
0
|
void subTypeForServiceTypeAdded(ServiceEvent event) {... |
194 |
0
|
if (null == _addedTypes.putIfAbsent(event.getType(), event.getType())) { |
195 |
0
|
this.getListener().subTypeForServiceTypeAdded(event); |
196 |
|
} else { |
197 |
0
|
logger.finest("Service Sub Type Added called for a service sub type already added: " + event); |
198 |
|
} |
199 |
|
} |
200 |
|
|
201 |
|
|
202 |
|
|
203 |
|
@see |
204 |
|
|
|
|
| 0% |
Uncovered Elements: 13 (13) |
Complexity: 2 |
Complexity Density: 0.18 |
|
205 |
0
|
@Override... |
206 |
|
public String toString() { |
207 |
0
|
StringBuilder aLog = new StringBuilder(2048); |
208 |
0
|
aLog.append("[Status for "); |
209 |
0
|
aLog.append(this.getListener().toString()); |
210 |
0
|
if (_addedTypes.isEmpty()) { |
211 |
0
|
aLog.append(" no type event "); |
212 |
|
} else { |
213 |
0
|
aLog.append(" ("); |
214 |
0
|
for (String type : _addedTypes.keySet()) { |
215 |
0
|
aLog.append(type + ", "); |
216 |
|
} |
217 |
0
|
aLog.append(") "); |
218 |
|
} |
219 |
0
|
aLog.append("]"); |
220 |
0
|
return aLog.toString(); |
221 |
|
} |
222 |
|
|
223 |
|
} |
224 |
|
|
225 |
|
public final static boolean SYNCHONEOUS = true; |
226 |
|
public final static boolean ASYNCHONEOUS = false; |
227 |
|
|
228 |
|
private final T _listener; |
229 |
|
|
230 |
|
private final boolean _synch; |
231 |
|
|
232 |
|
|
233 |
|
@param |
234 |
|
|
235 |
|
@param |
236 |
|
|
237 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 1 |
Complexity Density: 0.33 |
|
238 |
42
|
public ListenerStatus(T listener, boolean synch) {... |
239 |
42
|
super(); |
240 |
42
|
_listener = listener; |
241 |
42
|
_synch = synch; |
242 |
|
} |
243 |
|
|
244 |
|
|
245 |
|
@return |
246 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
247 |
99
|
public T getListener() {... |
248 |
99
|
return _listener; |
249 |
|
} |
250 |
|
|
251 |
|
|
252 |
|
|
253 |
|
|
254 |
|
@return |
255 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
256 |
23
|
public boolean isSynchronous() {... |
257 |
23
|
return _synch; |
258 |
|
} |
259 |
|
|
260 |
|
|
261 |
|
|
262 |
|
@see |
263 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
264 |
0
|
@Override... |
265 |
|
public int hashCode() { |
266 |
0
|
return this.getListener().hashCode(); |
267 |
|
} |
268 |
|
|
269 |
|
|
270 |
|
|
271 |
|
@see |
272 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
273 |
17
|
@Override... |
274 |
|
public boolean equals(Object obj) { |
275 |
17
|
return (obj instanceof ListenerStatus) && this.getListener().equals(((ListenerStatus<?>) obj).getListener()); |
276 |
|
} |
277 |
|
|
278 |
|
|
279 |
|
|
280 |
|
@see |
281 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
282 |
0
|
@Override... |
283 |
|
public String toString() { |
284 |
0
|
return "[Status for " + this.getListener().toString() + "]"; |
285 |
|
} |
286 |
|
} |