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
9 import de.powerstat.validation.interfaces.IValueObject;
10 import de.powerstat.validation.values.strategies.IUsernameStrategy;
11 import de.powerstat.validation.values.strategies.UsernameDefaultStrategy;
12
13
14 /**
15 * Username.
16 *
17 * DSGVO relevant.
18 *
19 * TODO Already existing user?
20 * TODO case sensitive or insensitive?
21 * TODO Comparable<EMail>
22 */
23 public final class Username implements Comparable<Username>, IValueObject
24 {
25 /* *
26 * Cache for singletons.
27 */
28 // private static final Map<String, Username> CACHE = new WeakHashMap<>();
29
30 /**
31 * Username.
32 */
33 private final String username;
34
35 /**
36 * Does the username conforms to an email address format.
37 */
38 private final boolean conformsToEMailAddressFormat;
39
40
41 /**
42 * Constructor.
43 *
44 * @param validationStrategy Validation strategy
45 * @param username Username
46 *
47 * @throws NullPointerException if username or validationStrategy is null
48 * @throws IllegalArgumentException if username contains unsupported characters or is to long or short
49 */
50 private Username(final IUsernameStrategy validationStrategy, final String username)
51 {
52 super();
53 Objects.requireNonNull(validationStrategy, "validationStrategy"); //$NON-NLS-1$
54 Objects.requireNonNull(username, "username"); //$NON-NLS-1$
55 this.conformsToEMailAddressFormat = validationStrategy.validationStrategy(username);
56 this.username = username;
57 }
58
59
60 /**
61 * Username factory.
62 *
63 * @param validationStrategy Validation strategy
64 * @param username Username
65 * @return Username object
66 */
67 public static Username of(final IUsernameStrategy validationStrategy, final String username)
68 {
69 /*
70 synchronized (Username.class)
71 {
72 Username obj = Username.CACHE.get(username);
73 if (obj != null)
74 {
75 validationStrategy.validationStrategy(username);
76 return obj;
77 }
78 obj = new Username(validationStrategy, username);
79 Username.CACHE.put(username, obj);
80 return obj;
81 }
82 */
83 return new Username(validationStrategy, username);
84 }
85
86
87 /**
88 * Username factory with UsernameMin2Max254CanBeEMailStrategy.
89 *
90 * @param username Username
91 * @return Username object
92 */
93 public static Username of(final String username)
94 {
95 return new Username(UsernameDefaultStrategy.of(), username);
96 }
97
98
99 /**
100 * Returns the value of this Username as a string.
101 *
102 * @return The text value represented by this object after conversion to type string.
103 */
104 @Override
105 public String stringValue()
106 {
107 return this.username;
108 }
109
110
111 /**
112 * Is username an email address.
113 *
114 * @return true when username is an email address, false otherwise
115 */
116 public boolean isEMail()
117 {
118 return this.conformsToEMailAddressFormat;
119 }
120
121
122 /**
123 * Calculate hash code.
124 *
125 * @return Hash
126 * @see java.lang.Object#hashCode()
127 */
128 @Override
129 public int hashCode()
130 {
131 return this.username.hashCode();
132 }
133
134
135 /**
136 * Is equal with another object.
137 *
138 * @param obj Object
139 * @return true when equal, false otherwise
140 * @see java.lang.Object#equals(java.lang.Object)
141 */
142 @Override
143 public boolean equals(final Object obj)
144 {
145 if (this == obj)
146 {
147 return true;
148 }
149 if (!(obj instanceof Username))
150 {
151 return false;
152 }
153 final Username other = (Username)obj;
154 return this.username.equals(other.username);
155 }
156
157
158 /**
159 * Returns the string representation of this Username.
160 *
161 * The exact details of this representation are unspecified and subject to change, but the following may be regarded as typical:
162 *
163 * "Username[username=user@example.com]"
164 *
165 * @return String representation of this Username
166 * @see java.lang.Object#toString()
167 */
168 @Override
169 public String toString()
170 {
171 final var builder = new StringBuilder(19);
172 builder.append("Username[username=").append(this.username).append(']'); //$NON-NLS-1$
173 return builder.toString();
174 }
175
176
177 /**
178 * Compare with another object.
179 *
180 * @param obj Object to compare with
181 * @return 0: equal; 1: greater; -1: smaller
182 * @see java.lang.Comparable#compareTo(java.lang.Object)
183 */
184 @Override
185 public int compareTo(final Username obj)
186 {
187 Objects.requireNonNull(obj, "obj"); //$NON-NLS-1$
188 return this.username.compareTo(obj.username);
189 }
190
191 }