1 /*
2 * Copyright (C) 2020-2023 Dipl.-Inform. Kai Hofmann. All rights reserved!
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 * Top level domain.
16 *
17 * Not DSGVO relevant.
18 */
19 public final class TopLevelDomain implements Comparable<TopLevelDomain>, IValueObject
20 {
21 /* *
22 * Cache for singletons.
23 */
24 // private static final Map<String, TopLevelDomain> CACHE = new WeakHashMap<>();
25
26 /**
27 * Top level domain regexp.
28 */
29 private static final Pattern TOPLEVELDOMAIN_REGEXP = Pattern.compile("^[0-9a-zA-Z-]+$"); //$NON-NLS-1$
30
31 /**
32 * Top level domain.
33 */
34 private final String topLevelDomain;
35
36
37 /**
38 * Constructor.
39 *
40 * @param topLevelDomain Top level domain name (without dot)
41 * @throws NullPointerException if top level domain is null
42 * @throws IllegalArgumentException if top level domain is not a known top level domain
43 */
44 private TopLevelDomain(final String topLevelDomain)
45 {
46 super();
47 Objects.requireNonNull(topLevelDomain, "topLevelDomain"); //$NON-NLS-1$
48 if ((topLevelDomain.length() < 2) || (topLevelDomain.length() > 63)) // actual (2020) longest in use is 24
49 {
50 throw new IllegalArgumentException("To short or long for a top level domain"); //$NON-NLS-1$
51 }
52 if ((topLevelDomain.charAt(0) == '-') || (topLevelDomain.charAt(topLevelDomain.length() - 1) == '-'))
53 {
54 throw new IllegalArgumentException("Illegal character '-' at name start or end"); //$NON-NLS-1$
55 }
56 if (!TopLevelDomain.TOPLEVELDOMAIN_REGEXP.matcher(topLevelDomain).matches())
57 {
58 throw new IllegalArgumentException("Top level domain contains illegal character"); //$NON-NLS-1$
59 }
60 if (!GeneratedTlds.contains(topLevelDomain))
61 {
62 throw new IllegalArgumentException("Unknown top level domain"); //$NON-NLS-1$
63 }
64 this.topLevelDomain = topLevelDomain;
65 }
66
67
68 /**
69 * TopLevelDomain factory.
70 *
71 * @param topLevelDomain TopLevelDomain
72 * @return TopLevelDomain object
73 */
74 public static TopLevelDomain of(final String topLevelDomain)
75 {
76 /*
77 synchronized (TopLevelDomain.class)
78 {
79 TopLevelDomain obj = TopLevelDomain.CACHE.get(topLevelDomain);
80 if (obj != null)
81 {
82 return obj;
83 }
84 obj = new TopLevelDomain(topLevelDomain);
85 TopLevelDomain.CACHE.put(topLevelDomain, obj);
86 return obj;
87 }
88 */
89 return new TopLevelDomain(topLevelDomain);
90 }
91
92
93 /**
94 * Returns the value of this TopLevelDomain as a string.
95 *
96 * @return The text value represented by this object after conversion to type string.
97 */
98 @Override
99 public String stringValue()
100 {
101 return this.topLevelDomain;
102 }
103
104
105 /**
106 * Calculate hash code.
107 *
108 * @return Hash
109 * @see java.lang.Object#hashCode()
110 */
111 @Override
112 public int hashCode()
113 {
114 return this.topLevelDomain.hashCode();
115 }
116
117
118 /**
119 * Is equal with another object.
120 *
121 * @param obj Object
122 * @return true when equal, false otherwise
123 * @see java.lang.Object#equals(java.lang.Object)
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 * Returns the string representation of this TopLevelDomain.
143 *
144 * The exact details of this representation are unspecified and subject to change, but the following may be regarded as typical:
145 *
146 * "TopLevelDomain[topLevelDomain=de]"
147 *
148 * @return String representation of this TopLevelDomain
149 * @see java.lang.Object#toString()
150 */
151 @Override
152 public String toString()
153 {
154 final var builder = new StringBuilder(31);
155 builder.append("TopLevelDomain[topLevelDomain=").append(this.topLevelDomain).append(']'); //$NON-NLS-1$
156 return builder.toString();
157 }
158
159
160 /**
161 * Compare with another object.
162 *
163 * @param obj Object to compare with
164 * @return 0: equal; 1: greater; -1: smaller
165 * @see java.lang.Comparable#compareTo(java.lang.Object)
166 */
167 @Override
168 public int compareTo(final TopLevelDomain obj)
169 {
170 Objects.requireNonNull(obj, "obj"); //$NON-NLS-1$
171 return this.topLevelDomain.compareTo(obj.topLevelDomain);
172 }
173
174 }