View Javadoc
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  }