From 9a2a96f0a6ca0eeeaeeec25dae1b4a398703d5f5 Mon Sep 17 00:00:00 2001 From: Christopher Lynch Date: Tue, 16 Feb 2021 15:12:15 +0000 Subject: [PATCH] HV-1831: Optimize cascading validation for large lists --- .../validator/bugs/FirstChildBean.java | 35 ++++++++++++++ .../validator/bugs/ParentAnnotatedBean.java | 36 ++++++++++++++ .../validator/bugs/SecondChildBean.java | 48 +++++++++++++++++++ .../validator/bugs/YourAnnotatedBean.java | 32 ------------- .../validator/bugs/YourTestCase.java | 35 +++++++++++--- 5 files changed, 147 insertions(+), 39 deletions(-) create mode 100644 validator/src/test/java/org/hibernate/validator/bugs/FirstChildBean.java create mode 100644 validator/src/test/java/org/hibernate/validator/bugs/ParentAnnotatedBean.java create mode 100644 validator/src/test/java/org/hibernate/validator/bugs/SecondChildBean.java delete mode 100644 validator/src/test/java/org/hibernate/validator/bugs/YourAnnotatedBean.java diff --git a/validator/src/test/java/org/hibernate/validator/bugs/FirstChildBean.java b/validator/src/test/java/org/hibernate/validator/bugs/FirstChildBean.java new file mode 100644 index 00000000..686541c3 --- /dev/null +++ b/validator/src/test/java/org/hibernate/validator/bugs/FirstChildBean.java @@ -0,0 +1,35 @@ +package org.hibernate.validator.bugs; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.Objects; + +public class FirstChildBean { + @NotBlank + private String name; + + // 3 to 4 further fields with simple validators + + @Valid + private List secondChildren; + + public FirstChildBean(String name, List secondChildren) { + this.name = name; + this.secondChildren = secondChildren; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FirstChildBean that = (FirstChildBean) o; + return Objects.equals(name, that.name) && + Objects.equals(secondChildren, that.secondChildren); + } + + @Override + public int hashCode() { + return Objects.hash(name, secondChildren); + } +} diff --git a/validator/src/test/java/org/hibernate/validator/bugs/ParentAnnotatedBean.java b/validator/src/test/java/org/hibernate/validator/bugs/ParentAnnotatedBean.java new file mode 100644 index 00000000..e88390bb --- /dev/null +++ b/validator/src/test/java/org/hibernate/validator/bugs/ParentAnnotatedBean.java @@ -0,0 +1,36 @@ +package org.hibernate.validator.bugs; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.List; + +public class ParentAnnotatedBean { + + @NotBlank + @Size + private String name; + + @Valid + private List firstChildren; + + protected ParentAnnotatedBean() {} + + public ParentAnnotatedBean(String name, List firstChildren) { + this.name = name; + this.firstChildren = firstChildren; + } + + public List getFirstChildren() { return firstChildren; } + + public void setFirstChildren(List firstChildren) { this.firstChildren = firstChildren; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/validator/src/test/java/org/hibernate/validator/bugs/SecondChildBean.java b/validator/src/test/java/org/hibernate/validator/bugs/SecondChildBean.java new file mode 100644 index 00000000..3f97e0fd --- /dev/null +++ b/validator/src/test/java/org/hibernate/validator/bugs/SecondChildBean.java @@ -0,0 +1,48 @@ +package org.hibernate.validator.bugs; + +import javax.validation.constraints.NotBlank; +import java.util.Objects; + +public class SecondChildBean { + + @NotBlank + private String foo; + + @NotBlank + private String bar; + + public SecondChildBean(String foo, String bar) { + this.foo = foo; + this.bar = bar; + } + + public String getFoo() { + return foo; + } + + public void setFoo(String foo) { + this.foo = foo; + } + + public String getBar() { + return bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SecondChildBean that = (SecondChildBean) o; + return Objects.equals(foo, that.foo) && + Objects.equals(bar, that.bar); + } + + @Override + public int hashCode() { + return Objects.hash(foo, bar); + } +} diff --git a/validator/src/test/java/org/hibernate/validator/bugs/YourAnnotatedBean.java b/validator/src/test/java/org/hibernate/validator/bugs/YourAnnotatedBean.java deleted file mode 100644 index a077fa20..00000000 --- a/validator/src/test/java/org/hibernate/validator/bugs/YourAnnotatedBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.hibernate.validator.bugs; - -import javax.validation.constraints.NotNull; - -public class YourAnnotatedBean { - - @NotNull - private Long id; - - private String name; - - protected YourAnnotatedBean() { - } - - public YourAnnotatedBean(Long id, String name) { - this.id = id; - this.name = name; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/validator/src/test/java/org/hibernate/validator/bugs/YourTestCase.java b/validator/src/test/java/org/hibernate/validator/bugs/YourTestCase.java index 3e480bd8..e5a2b5eb 100644 --- a/validator/src/test/java/org/hibernate/validator/bugs/YourTestCase.java +++ b/validator/src/test/java/org/hibernate/validator/bugs/YourTestCase.java @@ -2,6 +2,8 @@ import static org.junit.Assert.assertEquals; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; @@ -24,15 +26,34 @@ public static void setUp() { } @Test - @TestForIssue(jiraKey = "HV-NNNNN") // Please fill in the JIRA key of your issue + @TestForIssue(jiraKey = "HV-1831") // Please fill in the JIRA key of your issue public void testYourBug() { - YourAnnotatedBean yourEntity1 = new YourAnnotatedBean( null, "example" ); + List firstChildren = createFirstChildren(); - Set> constraintViolations = validator.validate( yourEntity1 ); - assertEquals( 1, constraintViolations.size() ); - assertEquals( - "must not be null", - constraintViolations.iterator().next().getMessage() ); + ParentAnnotatedBean yourEntity1 = new ParentAnnotatedBean( "parent-bean", firstChildren ); + + Set> constraintViolations = validator.validate( yourEntity1 ); + assertEquals( 0, constraintViolations.size() ); + } + + private List createFirstChildren() { + List firstChildren = new ArrayList<>(); + + for(int i = 0; i < 50; i++) { + firstChildren.add(new FirstChildBean("foo" + i, createSecondChildren())); + } + + return firstChildren; + } + + private List createSecondChildren() { + List secondChildren = new ArrayList<>(); + + for(int i = 0; i < 10; i++) { + secondChildren.add(new SecondChildBean("foo" + i, "bar" + i)); + } + + return secondChildren; } }