20
20
import java .time .LocalTime ;
21
21
import java .time .temporal .TemporalAccessor ;
22
22
import java .util .Collection ;
23
+ import java .util .List ;
23
24
import java .util .Map ;
25
+ import java .util .function .Predicate ;
24
26
25
27
import io .avaje .validation .AnnotationValidationAdapter ;
26
28
import io .avaje .validation .adapter .ValidationRequest ;
27
29
import jakarta .validation .constraints .AssertTrue ;
28
30
import jakarta .validation .constraints .NotBlank ;
29
31
import jakarta .validation .constraints .Past ;
32
+ import jakarta .validation .constraints .Pattern ;
33
+ import jakarta .validation .constraints .Pattern .Flag ;
30
34
import jakarta .validation .constraints .Size ;
31
35
32
36
final class JakartaTypeAdapters {
@@ -38,10 +42,52 @@ private JakartaTypeAdapters() {}
38
42
if (annotationType == AssertTrue .class ) return new AssertTrueAdapter (interpolator );
39
43
if (annotationType == NotBlank .class ) return new NotBlankAdapter (interpolator );
40
44
if (annotationType == Past .class ) return new PastAdapter (interpolator );
45
+ if (annotationType == Pattern .class ) return new PatternAdapter (interpolator );
41
46
if (annotationType == Size .class ) return new SizeAdapter (interpolator );
42
47
return null ;
43
48
};
44
49
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
+
45
91
private static final class SizeAdapter implements AnnotationValidationAdapter <Object > {
46
92
47
93
private String message ;
0 commit comments