Skip to content

Commit 9123def

Browse files
authored
Merge pull request #61 from SentryMan/type-use2
Type Use Support
2 parents 7164a59 + 5e9a23f commit 9123def

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+828
-178
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package example.avaje.typeuse;
2+
3+
import java.util.List;
4+
5+
import io.avaje.validation.constraints.NotEmpty;
6+
7+
public record CrewMate(@NotEmpty(message = "Must have valid task") String assignedTasks) {}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package example.avaje.typeuse;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import io.avaje.validation.ValidPojo;
7+
import io.avaje.validation.constraints.NotBlank;
8+
import io.avaje.validation.constraints.NotNull;
9+
10+
@ValidPojo
11+
public record Ship(
12+
Map<
13+
@NotNull(message = "Names cannot be null") @NotBlank(message = "Names cannot be blank")
14+
String,
15+
@NotNull(message = "Values cannot be null") @ValidPojo CrewMate>
16+
crew,
17+
List<
18+
@NotNull(message = "Tasks cannot be null") @NotBlank(message = "Tasks cannot be blank")
19+
String>
20+
tasks) {}

blackbox-test/src/test/java/example/avaje/nested/AContact.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.avaje.validation.ValidPojo;
44
import io.avaje.validation.constraints.NotNull;
5+
import jakarta.validation.Valid;
56
import jakarta.validation.constraints.NotBlank;
67
import jakarta.validation.constraints.Size;
78

@@ -12,6 +13,8 @@ public class AContact {
1213
public String firstName;
1314
@Size(max = 5)
1415
public String lastName;
16+
17+
@Valid
1518
@NotNull
1619
public AAddress address;
1720

blackbox-test/src/test/java/example/avaje/nested/AContactWithNullable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.avaje.lang.Nullable;
44
import io.avaje.validation.ValidPojo;
55
import io.avaje.validation.constraints.NotNull;
6+
import jakarta.validation.Valid;
67
import jakarta.validation.constraints.NotBlank;
78
import jakarta.validation.constraints.Size;
89

@@ -14,6 +15,7 @@ public class AContactWithNullable {
1415
@Size(max = 5)
1516
public String lastName;
1617

18+
@Valid
1719
@Nullable
1820
public AAddress address;
1921

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package example.avaje.typeuse;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.Assertions.fail;
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Locale;
10+
import java.util.Map;
11+
12+
import org.junit.jupiter.api.BeforeAll;
13+
import org.junit.jupiter.api.Test;
14+
15+
import example.avaje.ACustomer;
16+
import io.avaje.validation.ConstraintViolation;
17+
import io.avaje.validation.ConstraintViolationException;
18+
import io.avaje.validation.Validator;
19+
20+
class ShipTypeUseTest {
21+
22+
final Validator validator = Validator.builder().failFast(true).build();
23+
24+
@Test
25+
void valid() {
26+
final var cust = new Ship(Map.of("juice", new CrewMate("medbay")), List.of("medbay"));
27+
validator.validate(cust);
28+
}
29+
30+
@Test
31+
void blank() {
32+
var violation = one(new Ship(Map.of("", new CrewMate("")), null));
33+
assertThat(violation.message()).isEqualTo("Names cannot be blank");
34+
violation = one(new Ship(Map.of("tank", new CrewMate("")), null));
35+
assertThat(violation.message()).isEqualTo("Must have valid task");
36+
violation = one(new Ship(Map.of("tank", new CrewMate("gh")), List.of("")));
37+
assertThat(violation.message()).isEqualTo("Tasks cannot be blank");
38+
}
39+
40+
ConstraintViolation one(Object any) {
41+
try {
42+
validator.validate(any);
43+
fail("not expected");
44+
return null;
45+
} catch (final ConstraintViolationException e) {
46+
final var violations = new ArrayList<>(e.violations());
47+
assertThat(violations).hasSize(1);
48+
return violations.get(0);
49+
}
50+
}
51+
}

validator-constraints/src/main/java/io/avaje/validation/constraints/AssertFalse.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.avaje.validation.constraints;
22

3-
import java.lang.annotation.*;
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
46

5-
@Target({ElementType.METHOD, ElementType.FIELD})
7+
import java.lang.annotation.Documented;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Repeatable;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({METHOD, FIELD, TYPE_USE})
615
@Retention(RetentionPolicy.RUNTIME)
716
@Repeatable(AssertFalse.List.class)
817
public @interface AssertFalse {

validator-constraints/src/main/java/io/avaje/validation/constraints/AssertTrue.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.avaje.validation.constraints;
22

3-
import java.lang.annotation.*;
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
46

5-
@Target({ElementType.METHOD, ElementType.FIELD})
7+
import java.lang.annotation.Documented;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Repeatable;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({METHOD, FIELD, TYPE_USE})
615
@Retention(RetentionPolicy.RUNTIME)
716
@Repeatable(AssertTrue.List.class)
817
public @interface AssertTrue {

validator-constraints/src/main/java/io/avaje/validation/constraints/DecimalMax.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Repeatable;
@@ -10,7 +11,7 @@
1011

1112
import io.avaje.validation.constraints.DecimalMax.List;
1213

13-
@Target({METHOD, FIELD})
14+
@Target({METHOD, FIELD, TYPE_USE})
1415
@Retention(RUNTIME)
1516
@Repeatable(List.class)
1617
public @interface DecimalMax {

validator-constraints/src/main/java/io/avaje/validation/constraints/Digits.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.avaje.validation.constraints;
22

3-
import java.lang.annotation.*;
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
46

5-
@Target({ElementType.METHOD, ElementType.FIELD})
7+
import java.lang.annotation.Documented;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Repeatable;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({METHOD, FIELD, TYPE_USE})
615
@Retention(RetentionPolicy.RUNTIME)
716
@Repeatable(Digits.List.class)
817
public @interface Digits {

validator-constraints/src/main/java/io/avaje/validation/constraints/Email.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -17,7 +18,7 @@
1718
*
1819
* <p>Accepts {@code CharSequence}. {@code null} elements are considered valid.
1920
*/
20-
@Target({METHOD, FIELD})
21+
@Target({METHOD, FIELD, TYPE_USE})
2122
@Retention(RUNTIME)
2223
@Repeatable(List.class)
2324
@Documented
@@ -28,15 +29,12 @@
2829
Class<?>[] groups() default {};
2930

3031
/**
31-
* @return an additional regular expression the annotated element must match. The default is any
32-
* string ('.*')
32+
* An additional regular expression the annotated element must match. The default is any string
33+
* ('.*')
3334
*/
3435
String regexp() default ".*";
3536

36-
/**
37-
* @return used in combination with {@link #regexp()} in order to specify a regular expression
38-
* option
39-
*/
37+
/** Used in combination with {@link #regexp()} in order to specify a regular expression option */
4038
RegexFlag[] flags() default {};
4139

4240
/**

validator-constraints/src/main/java/io/avaje/validation/constraints/Future.java

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

3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
6+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
7+
38
import java.lang.annotation.Documented;
49
import java.lang.annotation.Repeatable;
510
import java.lang.annotation.Retention;
611
import java.lang.annotation.Target;
712

8-
import static java.lang.annotation.ElementType.FIELD;
9-
import static java.lang.annotation.ElementType.METHOD;
10-
import static java.lang.annotation.RetentionPolicy.RUNTIME;
11-
1213
@Documented
13-
@Target({METHOD, FIELD})
14+
@Target({METHOD, FIELD, TYPE_USE})
1415
@Retention(RUNTIME)
1516
@Repeatable(Future.List.class)
1617
public @interface Future {

validator-constraints/src/main/java/io/avaje/validation/constraints/FutureOrPresent.java

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

3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
6+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
7+
38
import java.lang.annotation.Documented;
49
import java.lang.annotation.Repeatable;
510
import java.lang.annotation.Retention;
611
import java.lang.annotation.Target;
712

8-
import static java.lang.annotation.ElementType.FIELD;
9-
import static java.lang.annotation.ElementType.METHOD;
10-
import static java.lang.annotation.RetentionPolicy.RUNTIME;
11-
1213
@Documented
13-
@Target({METHOD, FIELD})
14+
@Target({METHOD, FIELD, TYPE_USE})
1415
@Retention(RUNTIME)
1516
@Repeatable(FutureOrPresent.List.class)
1617
public @interface FutureOrPresent {

validator-constraints/src/main/java/io/avaje/validation/constraints/Max.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.avaje.validation.constraints;
22

3-
import java.lang.annotation.*;
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
46

5-
@Target({ElementType.METHOD, ElementType.FIELD})
7+
import java.lang.annotation.Documented;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Repeatable;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({METHOD, FIELD, TYPE_USE})
615
@Retention(RetentionPolicy.RUNTIME)
716
@Repeatable(Max.List.class)
817
public @interface Max {

validator-constraints/src/main/java/io/avaje/validation/constraints/Min.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.avaje.validation.constraints;
22

3-
import java.lang.annotation.*;
3+
import static java.lang.annotation.ElementType.FIELD;
4+
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
46

5-
@Target({ElementType.METHOD, ElementType.FIELD})
7+
import java.lang.annotation.Documented;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Repeatable;
10+
import java.lang.annotation.Retention;
11+
import java.lang.annotation.RetentionPolicy;
12+
import java.lang.annotation.Target;
13+
14+
@Target({METHOD, FIELD, TYPE_USE})
615
@Retention(RetentionPolicy.RUNTIME)
716
@Repeatable(Min.List.class)
817
public @interface Min {

validator-constraints/src/main/java/io/avaje/validation/constraints/Negative.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -11,7 +12,7 @@
1112

1213
import io.avaje.validation.constraints.Negative.List;
1314

14-
@Target({METHOD, FIELD})
15+
@Target({METHOD, FIELD, TYPE_USE})
1516
@Retention(RUNTIME)
1617
@Repeatable(List.class)
1718
@Documented

validator-constraints/src/main/java/io/avaje/validation/constraints/NegativeOrZero.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -11,7 +12,7 @@
1112

1213
import io.avaje.validation.constraints.NegativeOrZero.List;
1314

14-
@Target({METHOD, FIELD})
15+
@Target({METHOD, FIELD, TYPE_USE})
1516
@Retention(RUNTIME)
1617
@Repeatable(List.class)
1718
@Documented

validator-constraints/src/main/java/io/avaje/validation/constraints/NotBlank.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -12,7 +13,7 @@
1213
import io.avaje.validation.constraints.NotBlank.List;
1314

1415
@Documented
15-
@Target({METHOD, FIELD})
16+
@Target({METHOD, FIELD, TYPE_USE})
1617
@Retention(RUNTIME)
1718
@Repeatable(List.class)
1819
public @interface NotBlank {

validator-constraints/src/main/java/io/avaje/validation/constraints/NotEmpty.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -12,7 +13,7 @@
1213
import io.avaje.validation.constraints.NotEmpty.List;
1314

1415
@Documented
15-
@Target({METHOD, FIELD})
16+
@Target({METHOD, FIELD, TYPE_USE})
1617
@Retention(RUNTIME)
1718
@Repeatable(List.class)
1819
public @interface NotEmpty {

validator-constraints/src/main/java/io/avaje/validation/constraints/NotNull.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static java.lang.annotation.ElementType.FIELD;
44
import static java.lang.annotation.ElementType.METHOD;
5+
import static java.lang.annotation.ElementType.TYPE_USE;
56
import static java.lang.annotation.RetentionPolicy.RUNTIME;
67

78
import java.lang.annotation.Documented;
@@ -12,7 +13,7 @@
1213
import io.avaje.validation.constraints.NotNull.List;
1314

1415
@Documented
15-
@Target({METHOD, FIELD})
16+
@Target({METHOD, FIELD, TYPE_USE})
1617
@Retention(RUNTIME)
1718
@Repeatable(List.class)
1819
public @interface NotNull {

0 commit comments

Comments
 (0)