1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty5.resolver.dns;
17
18 import io.netty5.channel.socket.SocketProtocolFamily;
19
20 import java.net.Inet4Address;
21 import java.net.Inet6Address;
22 import java.net.InetAddress;
23 import java.net.ProtocolFamily;
24 import java.util.Comparator;
25
26 final class PreferredAddressTypeComparator implements Comparator<InetAddress> {
27
28 private static final PreferredAddressTypeComparator IPv4 = new PreferredAddressTypeComparator(Inet4Address.class);
29 private static final PreferredAddressTypeComparator IPv6 = new PreferredAddressTypeComparator(Inet6Address.class);
30
31 static PreferredAddressTypeComparator comparator(ProtocolFamily family) {
32 SocketProtocolFamily protocolFamily = SocketProtocolFamily.of(family);
33 switch (protocolFamily) {
34 case INET6:
35 return IPv6;
36 case INET:
37 return IPv4;
38 default:
39 throw new IllegalArgumentException("ProtocolFamily not supported: " + family);
40 }
41 }
42
43 private final Class<? extends InetAddress> preferredAddressType;
44
45 private PreferredAddressTypeComparator(Class<? extends InetAddress> preferredAddressType) {
46 this.preferredAddressType = preferredAddressType;
47 }
48
49 @Override
50 public int compare(InetAddress o1, InetAddress o2) {
51 if (o1.getClass() == o2.getClass()) {
52 return 0;
53 }
54 return preferredAddressType.isAssignableFrom(o1.getClass()) ? -1 : 1;
55 }
56 }