Skip to content

Commit cce30b5

Browse files
committed
Generate a _type attribute with the target class for min, max, range etc
We are especially interested in the target types of numbers and datetime types if we want to simplify or optimise the min, max, range, size etc adapters as they can be created knowning the specific type that is being validated.
1 parent 799ea8e commit cce30b5

File tree

3 files changed

+68
-28
lines changed

3 files changed

+68
-28
lines changed

validator-generator/src/main/java/io/avaje/validation/generator/AnnotationUtil.java

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.avaje.validation.generator;
22

3+
import static io.avaje.validation.generator.Util.trimAnnotations;
34
import static java.util.function.Predicate.not;
45
import static java.util.stream.Collectors.joining;
56
import static java.util.stream.Collectors.toMap;
@@ -19,12 +20,13 @@
1920
import javax.lang.model.element.TypeElement;
2021
import javax.lang.model.element.VariableElement;
2122
import javax.lang.model.type.ArrayType;
23+
import javax.lang.model.type.TypeMirror;
2224
import javax.lang.model.util.ElementFilter;
2325

2426
final class AnnotationUtil {
2527

2628
interface Handler {
27-
String attributes(AnnotationMirror annotationMirror, Element element);
29+
String attributes(AnnotationMirror annotationMirror, Element element, Element target);
2830

2931
String attributes(Map<String, Object> attributeMap);
3032
}
@@ -43,16 +45,12 @@ interface Handler {
4345
handlers.put("jakarta.validation.constraints.DecimalMax", decimalHandler);
4446
handlers.put("jakarta.validation.constraints.DecimalMin", decimalHandler);
4547

46-
final var commonHandler = new CommonHandler();
47-
final String[] keys = {
48-
"AssertFalse",
49-
"AssertTrue",
50-
"Null",
51-
"NotNull",
52-
"NotBlank",
53-
"NotEmpty",
48+
final String[] withTypeKeys = {
49+
"Length",
50+
"Range",
51+
"Max",
52+
"Min",
5453
"Size",
55-
"Email",
5654
"Past",
5755
"PastOrPresent",
5856
"Future",
@@ -62,8 +60,21 @@ interface Handler {
6260
"PositiveOrZero",
6361
"Negative",
6462
"NegativeOrZero",
65-
"Max",
66-
"Min"
63+
};
64+
var c = new CommonWithTypeHandler();
65+
for (final String key : withTypeKeys) {
66+
handlers.put("io.avaje.validation.constraints." + key, c);
67+
handlers.put("jakarta.validation.constraints." + key, c);
68+
}
69+
final var commonHandler = new CommonHandler();
70+
final String[] keys = {
71+
"AssertFalse",
72+
"AssertTrue",
73+
"Null",
74+
"NotNull",
75+
"NotBlank",
76+
"NotEmpty",
77+
"Email",
6778
};
6879
for (final String key : keys) {
6980
handlers.put("io.avaje.validation.constraints." + key, commonHandler);
@@ -73,11 +84,11 @@ interface Handler {
7384

7485
private AnnotationUtil() {}
7586

76-
static String annotationAttributeMap(AnnotationMirror annotationMirror) {
87+
static String annotationAttributeMap(AnnotationMirror annotationMirror, Element target) {
7788
final Element element = annotationMirror.getAnnotationType().asElement();
7889
final Handler handler = handlers.get(element.toString());
7990
return Objects.requireNonNullElse(handler, defaultHandler)
80-
.attributes(annotationMirror, element);
91+
.attributes(annotationMirror, element, target);
8192
}
8293

8394
static String annotationAttributeMap(String annotationStr) {
@@ -221,7 +232,7 @@ private static String avajeKey(String messageKey) {
221232
static class PatternHandler extends BaseHandler {
222233

223234
@Override
224-
public String attributes(AnnotationMirror annotationMirror, Element element) {
235+
public String attributes(AnnotationMirror annotationMirror, Element element, Element target) {
225236
return new PatternHandler().writeAttributes(annotationMirror);
226237
}
227238

@@ -289,21 +300,24 @@ static class StandardHandler extends BaseHandler {
289300

290301
protected final AnnotationMirror annotationMirror;
291302
protected final Element element;
303+
protected final Element target;
292304

293305
/** Prototype factory */
294306
StandardHandler() {
295307
this.annotationMirror = null;
296308
this.element = null;
309+
this.target = null;
297310
}
298311

299-
StandardHandler(AnnotationMirror annotationMirror, Element element) {
312+
StandardHandler(AnnotationMirror annotationMirror, Element element, Element target) {
300313
this.annotationMirror = annotationMirror;
301314
this.element = element;
315+
this.target = target;
302316
}
303317

304318
@Override
305-
public String attributes(AnnotationMirror annotationMirror, Element element) {
306-
return new StandardHandler(annotationMirror, element).writeAttributes();
319+
public String attributes(AnnotationMirror annotationMirror, Element element, Element target) {
320+
return new StandardHandler(annotationMirror, element, target).writeAttributes();
307321
}
308322

309323
String writeAttributes() {
@@ -316,10 +330,15 @@ String writeAttributes() {
316330
}
317331
writeAttribute(member.getSimpleName(), value, defaultValue);
318332
}
333+
writeTypeAttribute(target.asType());
319334
sb.append(")");
320335
return sb.toString();
321336
}
322337

338+
protected void writeTypeAttribute(TypeMirror typeMirror) {
339+
// do nothing by default
340+
}
341+
323342
void writeAttribute(Name simpleName, AnnotationValue value, AnnotationValue defaultValue) {
324343
writeAttributeKey(simpleName.toString());
325344
if (value != null) {
@@ -365,18 +384,39 @@ public String attributes(Map<String, Object> attributeMap) {
365384
}
366385
}
367386

387+
static class CommonWithTypeHandler extends CommonHandler {
388+
389+
CommonWithTypeHandler(AnnotationMirror annotationMirror, Element element, Element target) {
390+
super(annotationMirror, element, target);
391+
}
392+
393+
CommonWithTypeHandler() {
394+
}
395+
396+
@Override
397+
public String attributes(AnnotationMirror annotationMirror, Element element, Element target) {
398+
return new CommonWithTypeHandler(annotationMirror, element, target).writeAttributes();
399+
}
400+
401+
@Override
402+
protected void writeTypeAttribute(TypeMirror typeMirror) {
403+
writeAttributeKey("_type");
404+
sb.append(trimAnnotations(typeMirror.toString()) + ".class");
405+
}
406+
}
407+
368408
static class CommonHandler extends StandardHandler {
369409

370410
/** Prototype factory only */
371411
CommonHandler() {}
372412

373-
CommonHandler(AnnotationMirror annotationMirror, Element element) {
374-
super(annotationMirror, element);
413+
CommonHandler(AnnotationMirror annotationMirror, Element element, Element target) {
414+
super(annotationMirror, element, target);
375415
}
376416

377417
@Override
378-
public String attributes(AnnotationMirror annotationMirror, Element element) {
379-
return new CommonHandler(annotationMirror, element).writeAttributes();
418+
public String attributes(AnnotationMirror annotationMirror, Element element, Element target) {
419+
return new CommonHandler(annotationMirror, element, target).writeAttributes();
380420
}
381421

382422
@Override
@@ -405,12 +445,12 @@ static class DecimalHandler extends CommonHandler {
405445
DecimalHandler() {}
406446

407447
@Override
408-
public String attributes(AnnotationMirror annotationMirror, Element element) {
409-
return new DecimalHandler(annotationMirror, element).writeAttributes();
448+
public String attributes(AnnotationMirror annotationMirror, Element element, Element target) {
449+
return new DecimalHandler(annotationMirror, element, target).writeAttributes();
410450
}
411451

412-
DecimalHandler(AnnotationMirror annotationMirror, Element element) {
413-
super(annotationMirror, element);
452+
DecimalHandler(AnnotationMirror annotationMirror, Element element, Element target) {
453+
super(annotationMirror, element, target);
414454
}
415455

416456
@Override

validator-generator/src/main/java/io/avaje/validation/generator/ContraintReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class ContraintReader implements BeanReader {
3838
.collect(
3939
toMap(
4040
a -> GenericType.parse(a.getAnnotationType().toString()),
41-
AnnotationUtil::annotationAttributeMap));
41+
a -> AnnotationUtil.annotationAttributeMap(a, element)));
4242
}
4343

4444
private List<AnnotationMirror> expand(AnnotationMirror m, List<AnnotationMirror> mirrors) {

validator-generator/src/main/java/io/avaje/validation/generator/ElementAnnotationContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static ElementAnnotationContainer create(Element element) {
5252
.collect(
5353
toMap(
5454
a -> GenericType.parse(a.getAnnotationType().toString()),
55-
AnnotationUtil::annotationAttributeMap));
55+
a -> AnnotationUtil.annotationAttributeMap(a, element)));
5656

5757
return new ElementAnnotationContainer(genericType, hasValid, annotations, typeUse1, typeUse2);
5858
}

0 commit comments

Comments
 (0)