Skip to content

Commit ed377f6

Browse files
committed
pattern adapter
1 parent 4ae1127 commit ed377f6

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

validator/src/main/java/io/avaje/validation/core/DefaultBootstrap.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
/** Default bootstrap of Validator. */
66
public final class DefaultBootstrap {
7+
private DefaultBootstrap() {}
78

89
/** Create the Validator.Builder. */
910
public static Validator.Builder builder() {

validator/src/main/java/io/avaje/validation/core/JakartaTypeAdapters.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@
2020
import java.time.LocalTime;
2121
import java.time.temporal.TemporalAccessor;
2222
import java.util.Collection;
23+
import java.util.List;
2324
import java.util.Map;
25+
import java.util.function.Predicate;
2426

2527
import io.avaje.validation.AnnotationValidationAdapter;
2628
import io.avaje.validation.adapter.ValidationRequest;
2729
import jakarta.validation.constraints.AssertTrue;
2830
import jakarta.validation.constraints.NotBlank;
2931
import jakarta.validation.constraints.Past;
32+
import jakarta.validation.constraints.Pattern;
33+
import jakarta.validation.constraints.Pattern.Flag;
3034
import jakarta.validation.constraints.Size;
3135

3236
final class JakartaTypeAdapters {
@@ -38,10 +42,52 @@ private JakartaTypeAdapters() {}
3842
if (annotationType == AssertTrue.class) return new AssertTrueAdapter(interpolator);
3943
if (annotationType == NotBlank.class) return new NotBlankAdapter(interpolator);
4044
if (annotationType == Past.class) return new PastAdapter(interpolator);
45+
if (annotationType == Pattern.class) return new PatternAdapter(interpolator);
4146
if (annotationType == Size.class) return new SizeAdapter(interpolator);
4247
return null;
4348
};
4449

50+
private static final class PatternAdapter implements AnnotationValidationAdapter<CharSequence> {
51+
52+
private String message;
53+
private final MessageInterpolator interpolator;
54+
private Predicate<String> pattern;
55+
56+
public PatternAdapter(MessageInterpolator interpolator) {
57+
this.interpolator = interpolator;
58+
}
59+
60+
@Override
61+
public AnnotationValidationAdapter<CharSequence> init(Map<String, Object> annotationValueMap) {
62+
message = interpolator.interpolate((String) annotationValueMap.get("message"));
63+
64+
int flags = 0;
65+
66+
for (final var flag : (List<Flag>) annotationValueMap.get("flags")) {
67+
flags |= flag.getValue();
68+
}
69+
70+
pattern =
71+
java.util.regex.Pattern.compile((String) annotationValueMap.get("regexp"), flags)
72+
.asMatchPredicate()
73+
.negate();
74+
75+
return this;
76+
}
77+
78+
@Override
79+
public boolean validate(CharSequence value, ValidationRequest req, String propertyName) {
80+
81+
if (value == null || pattern.test(propertyName)) {
82+
83+
req.addViolation(message, propertyName);
84+
return false;
85+
}
86+
87+
return true;
88+
}
89+
}
90+
4591
private static final class SizeAdapter implements AnnotationValidationAdapter<Object> {
4692

4793
private String message;

0 commit comments

Comments
 (0)