Skip to content

Commit 03b470a

Browse files
committed
Refactor validation error handling to use StringBuilder for prefix management
1 parent 496c074 commit 03b470a

File tree

5 files changed

+23
-29
lines changed

5 files changed

+23
-29
lines changed

javalidation/src/main/java/io/github/raniagus/javalidation/IndexCollectorWrapper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@ public Supplier<C> supplier() {
2929

3030
@Override
3131
public BiConsumer<C, Result<T>> accumulator() {
32-
return (c, result) -> c.add(result.withPrefix(prefix, "[", index++, "]"));
32+
return (c, result) -> c.add(
33+
result,
34+
new StringBuilder(prefix)
35+
.append('[')
36+
.append(index++)
37+
.append(']')
38+
);
3339
}
3440

3541
@Override

javalidation/src/main/java/io/github/raniagus/javalidation/ResultCollector.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ void add(Result<T> result) {
2424
}
2525
}
2626

27+
void add(Result<T> result, StringBuilder prefix) {
28+
switch (result) {
29+
case Result.Ok<T>(T value) -> values.add(value);
30+
case Result.Err<T>(ValidationErrors validationErrors) ->
31+
validation.addAll(validationErrors, prefix);
32+
}
33+
}
34+
2735
R finish() {
2836
return finish(values, validation);
2937
}

javalidation/src/main/java/io/github/raniagus/javalidation/Validation.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,24 +187,21 @@ public Validation addAll(ValidationErrors errors) {
187187
* // }
188188
* }</pre>
189189
*
190-
* @param prefix the prefix to add to all field paths (must not be null)
191190
* @param errors the validation errors to merge (must not be null)
191+
* @param prefix the prefix to add to all field paths (must not be null)
192192
* @return this validation for method chaining
193193
* @throws NullPointerException if prefix or errors is null
194194
* @see ValidationErrors#withPrefix(String)
195195
*/
196-
public Validation addAll(String prefix, ValidationErrors errors) {
196+
public Validation addAll(ValidationErrors errors, StringBuilder prefix) {
197197
Objects.requireNonNull(prefix);
198198
Objects.requireNonNull(errors);
199199
if (!errors.rootErrors().isEmpty()) {
200-
addFieldErrors(prefix, errors.rootErrors());
200+
addFieldErrors(prefix.toString(), errors.rootErrors());
201201
}
202-
StringBuilder prefixBuilder = new StringBuilder(prefix).append(".");
203-
int prefixLength = prefixBuilder.length();
202+
StringBuilder prefixResult = prefix.append('.');
204203
for (Map.Entry<String, List<TemplateString>> entry : errors.fieldErrors().entrySet()) {
205-
prefixBuilder.append(entry.getKey());
206-
addFieldErrors(prefixBuilder.toString(), entry.getValue());
207-
prefixBuilder.setLength(prefixLength);
204+
addFieldErrors(prefixResult + entry.getKey(), entry.getValue());
208205
}
209206
return this;
210207
}

javalidation/src/main/java/io/github/raniagus/javalidation/ValidationErrors.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public ValidationErrors withPrefix(String prefix) {
178178
if (!rootErrors.isEmpty()) {
179179
prefixedFieldErrors.put(prefix, rootErrors);
180180
}
181-
String dotPrefix = prefix + ".";
181+
String dotPrefix = prefix + '.';
182182
for (Map.Entry<String, List<TemplateString>> entry : fieldErrors.entrySet()) {
183183
prefixedFieldErrors.put(dotPrefix + entry.getKey(), entry.getValue());
184184
}

javalidation/src/test/java/io/github/raniagus/javalidation/ValidationTest.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void givenNull_whenAddAll_thenThrowsNullPointerException() {
118118
void givenFieldErrors_whenAddAllWithPrefix_thenPrefixesFieldNames() {
119119
var validationErrors = ValidationErrors.ofField("field", "error");
120120
var validation = Validation.create()
121-
.addAll("root", validationErrors);
121+
.addAll(validationErrors, new StringBuilder("root"));
122122

123123
var errors = validation.finish();
124124
assertThat(errors.fieldErrors()).containsKey("root.field");
@@ -128,29 +128,12 @@ void givenFieldErrors_whenAddAllWithPrefix_thenPrefixesFieldNames() {
128128
void givenRootErrors_whenAddAllWithPrefix_thenConvertsToFieldErrors() {
129129
var validationErrors = ValidationErrors.ofRoot("root error");
130130
var validation = Validation.create()
131-
.addAll("prefix", validationErrors);
131+
.addAll(validationErrors, new StringBuilder("prefix"));
132132

133133
var errors = validation.finish();
134134
assertThat(errors.fieldErrors()).containsKey("prefix");
135135
}
136136

137-
@Test
138-
void givenNullPrefix_whenAddAllWithPrefix_thenThrowsNullPointerException() {
139-
var validation = Validation.create();
140-
var validationErrors = ValidationErrors.ofRoot("error");
141-
142-
assertThatThrownBy(() -> validation.addAll(null, validationErrors))
143-
.isInstanceOf(NullPointerException.class);
144-
}
145-
146-
@Test
147-
void givenNullValidationErrors_whenAddAllWithPrefix_thenThrowsNullPointerException() {
148-
var validation = Validation.create();
149-
150-
assertThatThrownBy(() -> validation.addAll("prefix", null))
151-
.isInstanceOf(NullPointerException.class);
152-
}
153-
154137
// -- finish --
155138

156139
@Test

0 commit comments

Comments
 (0)