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.generated.GeneratedTlds;
11 import de.powerstat.validation.interfaces.IValueObject;
12
13
14
15
16
17
18
19 public final class TopLevelDomain implements Comparable<TopLevelDomain>, IValueObject
20 {
21
22
23
24
25
26
27
28
29 private static final Pattern TOPLEVELDOMAIN_REGEXP = Pattern.compile("^[0-9a-zA-Z-]+$");
30
31
32
33
34 private final String topLevelDomain;
35
36
37
38
39
40
41
42
43
44 private TopLevelDomain(final String topLevelDomain)
45 {
46 super();
47 Objects.requireNonNull(topLevelDomain, "topLevelDomain");
48 if ((topLevelDomain.length() < 2) || (topLevelDomain.length() > 63))
49 {
50 throw new IllegalArgumentException("To short or long for a top level domain");
51 }
52 if ((topLevelDomain.charAt(0) == '-') || (topLevelDomain.charAt(topLevelDomain.length() - 1) == '-'))
53 {
54 throw new IllegalArgumentException("Illegal character '-' at name start or end");
55 }
56 if (!TopLevelDomain.TOPLEVELDOMAIN_REGEXP.matcher(topLevelDomain).matches())
57 {
58 throw new IllegalArgumentException("Top level domain contains illegal character");
59 }
60 if (!GeneratedTlds.contains(topLevelDomain))
61 {
62 throw new IllegalArgumentException("Unknown top level domain");
63 }
64 this.topLevelDomain = topLevelDomain;
65 }
66
67
68
69
70
71
72
73
74 public static TopLevelDomain of(final String topLevelDomain)
75 {
76
77
78
79
80
81
82
83
84
85
86
87
88
89 return new TopLevelDomain(topLevelDomain);
90 }
91
92
93
94
95
96
97
98 @Override
99 public String stringValue()
100 {
101 return this.topLevelDomain;
102 }
103
104
105
106
107
108
109
110
111 @Override
112 public int hashCode()
113 {
114 return this.topLevelDomain.hashCode();
115 }
116
117
118
119
120
121
122
123
124
125 @Override
126 public boolean equals(final Object obj)
127 {
128 if (this == obj)
129 {
130 return true;
131 }
132 if (!(obj instanceof TopLevelDomain))
133 {
134 return false;
135 }
136 final TopLevelDomain other = (TopLevelDomain)obj;
137 return this.topLevelDomain.equals(other.topLevelDomain);
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151 @Override
152 public String toString()
153 {
154 final var builder = new StringBuilder(31);
155 builder.append("TopLevelDomain[topLevelDomain=").append(this.topLevelDomain).append(']');
156 return builder.toString();
157 }
158
159
160
161
162
163
164
165
166
167 @Override
168 public int compareTo(final TopLevelDomain obj)
169 {
170 Objects.requireNonNull(obj, "obj");
171 return this.topLevelDomain.compareTo(obj.topLevelDomain);
172 }
173
174 }