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.interfaces.IValueObject;
11
12
13 /**
14 * Address Sub building.
15 *
16 * Possibly DSGVO relevant.
17 */
18 public final class SubBuilding implements Comparable<SubBuilding>, IValueObject
19 {
20 /* *
21 * Cache for singletons.
22 */
23 // private static final Map<String, SubBuilding> CACHE = new WeakHashMap<>();
24
25 /**
26 * Subbuilding regexp.
27 */
28 private static final Pattern SUBBUILDING_REGEXP = Pattern.compile("^[\\p{L}][\\p{L}\\p{Digit}., -]*$"); //$NON-NLS-1$
29
30 /**
31 * Sub building.
32 */
33 private final String subBuilding;
34
35
36 /**
37 * Constructor.
38 *
39 * @param subBuilding Sub building description
40 * @throws NullPointerException if subBuilding is null
41 * @throws IllegalArgumentException if subBuilding is not correct
42 */
43 private SubBuilding(final String subBuilding)
44 {
45 super();
46 Objects.requireNonNull(subBuilding, "subBuilding"); //$NON-NLS-1$
47 if ((subBuilding.length() < 1) || (subBuilding.length() > 32))
48 {
49 throw new IllegalArgumentException("SubBuilding with wrong length"); //$NON-NLS-1$
50 }
51 if (!SubBuilding.SUBBUILDING_REGEXP.matcher(subBuilding).matches())
52 {
53 throw new IllegalArgumentException("SubBuilding with wrong format"); //$NON-NLS-1$
54 }
55 this.subBuilding = subBuilding;
56 }
57
58
59 /**
60 * SubBuilding factory.
61 *
62 * @param subBuilding Sub building
63 * @return SubBuilding object
64 */
65 public static SubBuilding of(final String subBuilding)
66 {
67 /*
68 synchronized (SubBuilding.class)
69 {
70 SubBuilding obj = SubBuilding.CACHE.get(subBuilding);
71 if (obj != null)
72 {
73 return obj;
74 }
75 obj = new SubBuilding(subBuilding);
76 SubBuilding.CACHE.put(subBuilding, obj);
77 return obj;
78 }
79 */
80 return new SubBuilding(subBuilding);
81 }
82
83
84 /**
85 * Returns the value of this SubBuilding as a string.
86 *
87 * @return The text value represented by this object after conversion to type string.
88 */
89 @Override
90 public String stringValue()
91 {
92 return this.subBuilding;
93 }
94
95
96 /**
97 * Calculate hash code.
98 *
99 * @return Hash
100 * @see java.lang.Object#hashCode()
101 */
102 @Override
103 public int hashCode()
104 {
105 return this.subBuilding.hashCode();
106 }
107
108
109 /**
110 * Is equal with another object.
111 *
112 * @param obj Object
113 * @return true when equal, false otherwise
114 * @see java.lang.Object#equals(java.lang.Object)
115 */
116 @Override
117 public boolean equals(final Object obj)
118 {
119 if (this == obj)
120 {
121 return true;
122 }
123 if (!(obj instanceof SubBuilding))
124 {
125 return false;
126 }
127 final SubBuilding other = (SubBuilding)obj;
128 return this.subBuilding.equals(other.subBuilding);
129 }
130
131
132 /**
133 * Returns the string representation of this SubBuilding.
134 *
135 * The exact details of this representation are unspecified and subject to change, but the following may be regarded as typical:
136 *
137 * "SubBuilding[subBuilding=Floor 13, Apart. 0815]"
138 *
139 * @return String representation of this SubBuilding
140 * @see java.lang.Object#toString()
141 */
142 @Override
143 public String toString()
144 {
145 final var builder = new StringBuilder(25);
146 builder.append("SubBuilding[subBuilding=").append(this.subBuilding).append(']'); //$NON-NLS-1$
147 return builder.toString();
148 }
149
150
151 /**
152 * Compare with another object.
153 *
154 * @param obj Object to compare with
155 * @return 0: equal; 1: greater; -1: smaller
156 * @see java.lang.Comparable#compareTo(java.lang.Object)
157 */
158 @Override
159 public int compareTo(final SubBuilding obj)
160 {
161 Objects.requireNonNull(obj, "obj"); //$NON-NLS-1$
162 return this.subBuilding.compareTo(obj.subBuilding);
163 }
164
165 }