1 package org.example.customer.utility;
2
3 /*
4 * This is free and unencumbered software released into the public domain.
5 * Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software,
6 * either in source code form or as a compiled binary, for any purpose, commercial or
7 * non-commercial, and by any means.
8 *
9 * In jurisdictions that recognize copyright laws, the author or authors of this
10 * software dedicate any and all copyright interest in the software to the public domain.
11 * We make this dedication for the benefit of the public at large and to the detriment of
12 * our heirs and successors. We intend this dedication to be an overt act of relinquishment in
13 * perpetuity of all present and future rights to this software under copyright law.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES
18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * For more information, please refer to: https://unlicense.org/
22 */
23
24
25 import java.io.Serializable;
26
27 import org.apache.commons.lang3.builder.EqualsBuilder;
28 import org.apache.commons.lang3.builder.HashCodeBuilder;
29 import org.apache.logging.log4j.LogManager;
30 import org.apache.logging.log4j.Logger;
31 import org.example.websecurity.XssSanitizer;
32 import org.example.websecurity.XssSanitizerImpl;
33
34 /**
35 * The Customer Phone for the Customer application.
36 <br>
37 <br>
38 * This class represents the common Phone/Fax field in the Customer Database
39 *
40 * @author Jonathan Earl
41 * @version 1.0
42 *
43 */
44 public class Phone implements Serializable
45 {
46 private static final long serialVersionUID = 1L;
47
48 private static final Logger LOG = LogManager.getLogger();
49
50 private String myNumber;
51
52 private XssSanitizer mySanitizer;
53
54 /**
55 * The default constructor for the Phone class.
56 * <p>
57 * The initial values are:
58 * <ul>
59 * <li>number: null</li>
60 * </ul>
61 */
62 public Phone()
63 {
64 this(new XssSanitizerImpl());
65 LOG.debug("Finishing the default Constructor");
66 }
67
68 /**
69 * The overloaded constructor for the Phone class that takes an XssSanitizer
70 * as input.
71 * <p>
72 * The initial values are:
73 * <ul>
74 * <li>number: null</li>
75 * </ul>
76 *
77 * @param sanitizer the XssSanitizer used by this instance
78 */
79 public Phone(final XssSanitizer sanitizer)
80 {
81 LOG.debug("Starting the overloaded Constructor");
82 final String initialPhone = null;
83
84 mySanitizer = sanitizer;
85
86 setNumber(initialPhone);
87 }
88
89 /**
90 * Returns the number value for the Phone.
91 *
92 * @return the number value for the Phone
93 */
94 public String getNumber()
95 {
96 LOG.debug("returning the Number: " + myNumber);
97 return myNumber;
98 }
99
100 /**
101 * Sets the number value for the Phone.
102 * <p>
103 * The business rules are:
104 * <ul>
105 * <li>the number <strong>may</strong> be null</li>
106 * <li>the number must <strong>not</strong> be empty</li>
107 * <li>the number must min length of 2 chars</li>
108 * <li>the number must max length of 20 chars</li>
109 * <li>XSS strings within the number will be removed</li>
110 * </ul>
111 *
112 * @param number the value to set into the number field
113 * @throws IllegalArgumentException if the number is invalid
114 */
115 public void setNumber(final String number)
116 {
117 LOG.debug("setting the Number");
118 final int max = 30;
119 final int min = 2;
120
121 if (number == null)
122 {
123 LOG.debug("Number is set to null");
124 this.myNumber = null;
125 return;
126 }
127
128 String safeNumber = mySanitizer.sanitizeInput(number);
129 if (safeNumber.isEmpty())
130 {
131 LOG.error("Number must not be empty");
132 throw new IllegalArgumentException("Number must not be empty");
133 }
134 if (safeNumber.length() > max || safeNumber.length() < min)
135 {
136 LOG.error("Number must be between 2 and 40 chars in length");
137 throw new IllegalArgumentException("Number must be between 2 and 20 chars in length");
138 }
139 LOG.debug("setting the Phone to: " + safeNumber);
140 this.myNumber = safeNumber;
141 }
142
143 /**
144 * The hashCode() method of the Phone class.
145 * <p>
146 * <strong>This method uses:</strong>
147 * <ul>
148 * <li>number</li>
149 * </ul>
150 *
151 * @see java.lang.Object#hashCode()
152 * @return the hashCode value for this Phone object
153 */
154 @Override
155 public int hashCode()
156 {
157 LOG.debug("building HashCode");
158 return new HashCodeBuilder()
159 .append(getNumber())
160 .toHashCode();
161 }
162
163 /**
164 * The equals() method of the Phone class.
165 * <p>
166 * <strong>This method uses:</strong>
167 * <ul>
168 * <li>number</li>
169 * </ul>
170 *
171 * @see java.lang.Object#equals(Object obj)
172 * @param obj the incoming object to compare against
173 * @return true if the fields being compared are equal
174 */
175 @Override
176 public boolean equals(final Object obj)
177 {
178 LOG.debug("checking equals");
179 if (obj instanceof Phone)
180 {
181 final Phone other = (Phone) obj;
182 return new EqualsBuilder()
183 .append(getNumber(), other.getNumber())
184 .isEquals();
185 }
186 else
187 {
188 return false;
189 }
190 }
191
192 /**
193 * The toString method for the Phone class.
194 *
195 * this method will return:<br>
196 * Phone [Number=XXX]
197 */
198 @Override
199 public String toString()
200 {
201 return "Phone [Number=" + myNumber + "]";
202 }
203
204 }