1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.newsclub.net.unix;
19
20 import java.io.File;
21 import java.io.FileNotFoundException;
22 import java.io.IOException;
23 import java.net.InetAddress;
24 import java.net.SocketAddress;
25 import java.net.SocketException;
26 import java.net.URI;
27 import java.nio.ByteBuffer;
28 import java.util.Arrays;
29 import java.util.Collections;
30 import java.util.Objects;
31 import java.util.Set;
32
33
34
35
36
37
38 public final class AFGenericSocketAddress extends AFSocketAddress {
39 private static final long serialVersionUID = 1L;
40
41 private static AFAddressFamily<AFGenericSocketAddress> family;
42 private static final String SELECTOR_PROVIDER_CLASS =
43 "org.newsclub.net.unix.generic.AFGenericSelectorProvider";
44
45 private AFGenericSocketAddress(int port, final byte[] socketAddress, ByteBuffer nativeAddress)
46 throws SocketException {
47 super(port, socketAddress, nativeAddress, addressFamily());
48 }
49
50 private static AFGenericSocketAddress newAFSocketAddress(int port, final byte[] socketAddress,
51 ByteBuffer nativeAddress) throws SocketException {
52 return newDeserializedAFSocketAddress(port, socketAddress, nativeAddress, addressFamily(),
53 AFGenericSocketAddress::new);
54 }
55
56
57
58
59
60
61
62
63
64
65
66 public static AFGenericSocketAddress unwrap(InetAddress address, int port)
67 throws SocketException {
68 return AFSocketAddress.unwrap(address, port, addressFamily());
69 }
70
71
72
73
74
75
76
77
78
79
80
81
82 public static AFGenericSocketAddress unwrap(String hostname, int port) throws SocketException {
83 return AFSocketAddress.unwrap(hostname, port, addressFamily());
84 }
85
86
87
88
89
90
91
92
93
94 public static AFGenericSocketAddress unwrap(SocketAddress address) throws SocketException {
95 Objects.requireNonNull(address);
96 if (!isSupportedAddress(address)) {
97 throw new SocketException("Unsupported address");
98 }
99 return (AFGenericSocketAddress) address;
100 }
101
102 @Override
103 public String toString() {
104 int port = getPort();
105
106 return getClass().getName() + "[" + (port == 0 ? "" : "port=" + port + ";") + "bytes=" + Arrays
107 .toString(getBytes()) + "]";
108 }
109
110
111
112
113
114
115
116
117
118 public byte[] toBytes() {
119 byte[] bytes = getBytes();
120 return Arrays.copyOf(bytes, bytes.length);
121 }
122
123 @Override
124 public boolean hasFilename() {
125 return false;
126 }
127
128 @Override
129 public File getFile() throws FileNotFoundException {
130 throw new FileNotFoundException("no file");
131 }
132
133
134
135
136
137
138
139
140
141 public static boolean isSupportedAddress(InetAddress addr) {
142 return AFSocketAddress.isSupportedAddress(addr, addressFamily());
143 }
144
145
146
147
148
149
150
151
152 public static boolean isSupportedAddress(SocketAddress addr) {
153 return (addr instanceof AFGenericSocketAddress);
154 }
155
156
157
158
159
160
161 @SuppressWarnings("null")
162 public static synchronized AFAddressFamily<AFGenericSocketAddress> addressFamily() {
163 if (family == null) {
164 family = AFAddressFamily.registerAddressFamily("generic",
165 AFGenericSocketAddress.class, new AFSocketAddressConfig<AFGenericSocketAddress>() {
166
167 private final AFSocketAddressConstructor<AFGenericSocketAddress> addrConstr =
168 isUseDeserializationForInit() ? AFGenericSocketAddress::newAFSocketAddress
169 : AFGenericSocketAddress::new;
170
171 @Override
172 protected AFGenericSocketAddress parseURI(URI u, int port) throws SocketException {
173 return AFGenericSocketAddress.of(u, port);
174 }
175
176 @Override
177 protected AFSocketAddressConstructor<AFGenericSocketAddress> addressConstructor() {
178 return addrConstr;
179 }
180
181 @Override
182 protected String selectorProviderClassname() {
183 return SELECTOR_PROVIDER_CLASS;
184 }
185
186 @Override
187 protected Set<String> uriSchemes() {
188 return Collections.emptySet();
189 }
190 });
191 try {
192 Class.forName(SELECTOR_PROVIDER_CLASS);
193 } catch (ClassNotFoundException e) {
194
195 }
196 }
197 return family;
198 }
199
200
201
202
203
204
205
206
207 @SuppressWarnings("PMD.ShortMethodName")
208 public static AFGenericSocketAddress of(URI uri) throws SocketException {
209 return of(uri, -1);
210 }
211
212
213
214
215
216
217
218
219
220 @SuppressWarnings({
221 "PMD.CognitiveComplexity", "PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength",
222 "PMD.NcssCount", "PMD.NPathComplexity", "PMD.ShortMethodName"})
223 public static AFGenericSocketAddress of(URI uri, int overridePort) throws SocketException {
224 throw new SocketException("Unsupported");
225 }
226
227 @Override
228 @SuppressWarnings({"PMD.CognitiveComplexity", "PMD.CompareObjectsWithEquals"})
229 public URI toURI(String scheme, URI template) throws IOException {
230 return super.toURI(scheme, template);
231 }
232 }