1
2
3
4 package de.powerstat.validation.values;
5
6
7 import java.util.Objects;
8 import java.util.regex.Pattern;
9
10 import de.powerstat.validation.interfaces.IValueObject;
11
12
13
14
15
16
17
18
19
20
21
22 public final class IPV4Address implements Comparable<IPV4Address>, IValueObject
23 {
24
25
26
27
28
29
30
31
32 private static final String CLASS_C_192 = "192";
33
34
35
36
37 private static final String C100 = "100";
38
39
40
41
42 private static final String C198 = "198";
43
44
45
46
47 private static final String ZERO = "0";
48
49
50
51
52 private static final Pattern IPV4_REGEXP = Pattern.compile("^((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)$");
53
54
55
56
57 private final String address;
58
59
60
61
62 private final String[] parts;
63
64
65
66
67
68
69
70
71
72 private IPV4Address(final String address)
73 {
74 super();
75 Objects.requireNonNull(address, "address");
76 if ((address.length() < 7) || (address.length() > 15))
77 {
78 throw new IllegalArgumentException("To short or long for an IP V4 address");
79 }
80 if (!IPV4Address.IPV4_REGEXP.matcher(address).matches())
81 {
82 throw new IllegalArgumentException("Not an IP V4 address");
83 }
84 this.address = address;
85 this.parts = address.split("\\.");
86 }
87
88
89
90
91
92
93
94
95 public static IPV4Address of(final String address)
96 {
97
98
99
100
101
102
103
104
105
106
107
108
109
110 return new IPV4Address(address);
111 }
112
113
114
115
116
117
118
119
120
121
122
123
124 public boolean isPrivate()
125 {
126 if ("10".equals(this.parts[0]) || (IPV4Address.CLASS_C_192.equals(this.parts[0]) && "168".equals(this.parts[1])) || ("169".equals(this.parts[0]) && "254".equals(this.parts[1])))
127 {
128 return true;
129 }
130 if ("172".equals(this.parts[0]))
131 {
132 final int block2 = Integer.parseInt(this.parts[1]);
133 if ((block2 >= 16) && (block2 <= 31))
134 {
135 return true;
136 }
137 }
138 return false;
139 }
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 public boolean isSpecial()
161 {
162 if (IPV4Address.ZERO.equals(this.parts[0]) ||
163 "127".equals(this.parts[0]) ||
164 (IPV4Address.CLASS_C_192.equals(this.parts[0]) && IPV4Address.ZERO.equals(this.parts[1]) && IPV4Address.ZERO.equals(this.parts[2])) ||
165 (IPV4Address.CLASS_C_192.equals(this.parts[0]) && IPV4Address.ZERO.equals(this.parts[1]) && "2".equals(this.parts[2])) ||
166 (IPV4Address.CLASS_C_192.equals(this.parts[0]) && "88".equals(this.parts[1]) && "99".equals(this.parts[2])) ||
167 (IPV4Address.C198.equals(this.parts[0]) && "51".equals(this.parts[1]) && IPV4Address.C100.equals(this.parts[2])) ||
168 ("203".equals(this.parts[0]) && IPV4Address.ZERO.equals(this.parts[1]) && "113".equals(this.parts[2]))
169 )
170 {
171 return true;
172 }
173 if (IPV4Address.C100.equals(this.parts[0]))
174 {
175 final int block2 = Integer.parseInt(this.parts[1]);
176 if ((block2 >= 64) && (block2 <= 127))
177 {
178 return true;
179 }
180 }
181 if (IPV4Address.C198.equals(this.parts[0]))
182 {
183 final int block2 = Integer.parseInt(this.parts[1]);
184 if ((block2 >= 18) && (block2 <= 19))
185 {
186 return true;
187 }
188 }
189 final int block1 = Integer.parseInt(this.parts[0]);
190 return (block1 >= 224);
191 }
192
193
194
195
196
197
198
199 public boolean isPublic()
200 {
201 return !isPrivate() && !isSpecial();
202 }
203
204
205
206
207
208
209
210 @Override
211 public String stringValue()
212 {
213 return this.address;
214 }
215
216
217
218
219
220
221
222
223 @Override
224 public int hashCode()
225 {
226 return this.address.hashCode();
227 }
228
229
230
231
232
233
234
235
236
237 @Override
238 public boolean equals(final Object obj)
239 {
240 if (this == obj)
241 {
242 return true;
243 }
244 if (!(obj instanceof IPV4Address))
245 {
246 return false;
247 }
248 final IPV4Address other = (IPV4Address)obj;
249 return this.address.equals(other.address);
250 }
251
252
253
254
255
256
257
258
259
260
261
262
263 @Override
264 public String toString()
265 {
266 final var builder = new StringBuilder(21);
267 builder.append("IPV4Address[address=").append(this.address).append(']');
268 return builder.toString();
269 }
270
271
272
273
274
275
276
277
278
279 @Override
280 public int compareTo(final IPV4Address obj)
281 {
282 Objects.requireNonNull(obj, "obj");
283 return this.address.compareTo(obj.address);
284 }
285
286 }