|
4 | 4 | import org.json.JSONException;
|
5 | 5 |
|
6 | 6 | import java.math.BigDecimal;
|
| 7 | +import java.util.ArrayList; |
| 8 | +import java.util.List; |
7 | 9 | import java.util.Objects;
|
8 | 10 |
|
9 | 11 | import static java.lang.String.format;
|
10 | 12 |
|
11 | 13 | /**
|
12 | 14 | * Number schema validator.
|
| 15 | + * @ThreadSafe |
13 | 16 | */
|
14 | 17 | public class NumberSchema extends Schema {
|
15 | 18 |
|
@@ -131,42 +134,43 @@ public NumberSchema(final Builder builder) {
|
131 | 134 | this.exclusiveMaximumLimit = builder.exclusiveMaximumLimit;
|
132 | 135 | }
|
133 | 136 |
|
134 |
| - private void checkMaximum(final double subject) { |
| 137 | + private void checkMaximum(final double subject, final List<ValidationException> validationExceptions) { |
135 | 138 | if (maximum != null) {
|
136 | 139 | if (exclusiveMaximum && maximum.doubleValue() <= subject) {
|
137 |
| - throw failure(subject + " is not less than " + maximum, "exclusiveMaximum"); |
| 140 | + validationExceptions.add(failure(subject + " is not less than " + maximum, "exclusiveMaximum")); |
138 | 141 | } else if (maximum.doubleValue() < subject) {
|
139 |
| - throw failure(subject + " is not less or equal to " + maximum, "maximum"); |
| 142 | + validationExceptions.add(failure(subject + " is not less or equal to " + maximum, "maximum")); |
140 | 143 | }
|
141 | 144 | }
|
142 | 145 | if (exclusiveMaximumLimit != null) {
|
143 | 146 | if (subject >= exclusiveMaximumLimit.doubleValue()) {
|
144 |
| - throw failure(format("is not less than " + exclusiveMaximumLimit), "exclusiveMaximum"); |
| 147 | + validationExceptions.add( |
| 148 | + failure(format("is not less than " + exclusiveMaximumLimit),"exclusiveMaximum")); |
145 | 149 | }
|
146 | 150 | }
|
147 | 151 | }
|
148 | 152 |
|
149 |
| - private void checkMinimum(final double subject) { |
| 153 | + private void checkMinimum(final double subject, final List<ValidationException> validationExceptions) { |
150 | 154 | if (minimum != null) {
|
151 | 155 | if (exclusiveMinimum && subject <= minimum.doubleValue()) {
|
152 |
| - throw failure(subject + " is not greater than " + minimum, "exclusiveMinimum"); |
| 156 | + validationExceptions.add(failure(subject + " is not greater than " + minimum, "exclusiveMinimum")); |
153 | 157 | } else if (subject < minimum.doubleValue()) {
|
154 |
| - throw failure(subject + " is not greater or equal to " + minimum, "minimum"); |
| 158 | + validationExceptions.add(failure(subject + " is not greater or equal to " + minimum, "minimum")); |
155 | 159 | }
|
156 | 160 | }
|
157 | 161 | if (exclusiveMinimumLimit != null) {
|
158 | 162 | if (subject <= exclusiveMinimumLimit.doubleValue()) {
|
159 |
| - throw failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum"); |
| 163 | + validationExceptions.add(failure(subject + " is not greater than " + exclusiveMinimumLimit, "exclusiveMinimum")); |
160 | 164 | }
|
161 | 165 | }
|
162 | 166 | }
|
163 | 167 |
|
164 |
| - private void checkMultipleOf(final double subject) { |
| 168 | + private void checkMultipleOf(final double subject, final List<ValidationException> validationExceptions) { |
165 | 169 | if (multipleOf != null) {
|
166 | 170 | BigDecimal remainder = BigDecimal.valueOf(subject).remainder(
|
167 | 171 | BigDecimal.valueOf(multipleOf.doubleValue()));
|
168 | 172 | if (remainder.compareTo(BigDecimal.ZERO) != 0) {
|
169 |
| - throw failure(subject + " is not a multiple of " + multipleOf, "multipleOf"); |
| 173 | + validationExceptions.add(failure(subject + " is not a multiple of " + multipleOf, "multipleOf")); |
170 | 174 | }
|
171 | 175 | }
|
172 | 176 | }
|
@@ -206,9 +210,11 @@ public void validate(final Object subject) {
|
206 | 210 | throw failure(Integer.class, subject);
|
207 | 211 | }
|
208 | 212 | double intSubject = ((Number) subject).doubleValue();
|
209 |
| - checkMinimum(intSubject); |
210 |
| - checkMaximum(intSubject); |
211 |
| - checkMultipleOf(intSubject); |
| 213 | + final List<ValidationException> validationExceptions = new ArrayList<>(); |
| 214 | + checkMinimum(intSubject, validationExceptions); |
| 215 | + checkMaximum(intSubject, validationExceptions); |
| 216 | + checkMultipleOf(intSubject, validationExceptions); |
| 217 | + ValidationException.throwFor(this, validationExceptions); |
212 | 218 | }
|
213 | 219 | }
|
214 | 220 |
|
|
0 commit comments