Skip to content

Commit 556d277

Browse files
marko-bekhtagsmet
authored andcommitted
HV-1623 Clean ups around cascadable properties in PropertyMetaData
1 parent af67fd7 commit 556d277

File tree

4 files changed

+121
-31
lines changed

4 files changed

+121
-31
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.metadata.aggregated;
8+
9+
import java.lang.annotation.ElementType;
10+
11+
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
12+
import org.hibernate.validator.internal.metadata.facets.Cascadable;
13+
import org.hibernate.validator.internal.properties.Property;
14+
15+
/**
16+
* A {@link Cascadable} backed by a field of a Java bean.
17+
*
18+
* @author Gunnar Morling
19+
* @author Marko Bekhta
20+
*/
21+
public class FieldCascadable extends PropertyCascadable {
22+
23+
FieldCascadable(Property property, CascadingMetaData cascadingMetaData) {
24+
super( property, cascadingMetaData );
25+
}
26+
27+
@Override
28+
public ElementType getElementType() {
29+
return ElementType.FIELD;
30+
}
31+
32+
public static class Builder extends PropertyCascadable.Builder {
33+
34+
protected Builder(ValueExtractorManager valueExtractorManager, Property property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
35+
super( valueExtractorManager, property, cascadingMetaDataBuilder );
36+
}
37+
38+
@Override
39+
protected Cascadable create(Property property, CascadingMetaData cascadingMetaData) {
40+
return new FieldCascadable( property, cascadingMetaData );
41+
}
42+
}
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.metadata.aggregated;
8+
9+
import java.lang.annotation.ElementType;
10+
11+
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
12+
import org.hibernate.validator.internal.metadata.facets.Cascadable;
13+
import org.hibernate.validator.internal.properties.Property;
14+
15+
/**
16+
* A {@link Cascadable} backed by a getter of a Java bean.
17+
*
18+
* @author Gunnar Morling
19+
* @author Marko Bekhta
20+
*/
21+
public class GetterCascadable extends PropertyCascadable {
22+
23+
GetterCascadable(Property property, CascadingMetaData cascadingMetaData) {
24+
super( property, cascadingMetaData );
25+
}
26+
27+
@Override
28+
public ElementType getElementType() {
29+
return ElementType.METHOD;
30+
}
31+
32+
public static class Builder extends PropertyCascadable.Builder {
33+
34+
protected Builder(ValueExtractorManager valueExtractorManager, Property property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
35+
super( valueExtractorManager, property, cascadingMetaDataBuilder );
36+
}
37+
38+
@Override
39+
protected Cascadable create(Property property, CascadingMetaData cascadingMetaData) {
40+
return new GetterCascadable( property, cascadingMetaData );
41+
}
42+
}
43+
}

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/PropertyCascadable.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,30 @@
66
*/
77
package org.hibernate.validator.internal.metadata.aggregated;
88

9-
import java.lang.annotation.ElementType;
109
import java.lang.reflect.Type;
1110

1211
import org.hibernate.validator.internal.engine.path.PathImpl;
1312
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
1413
import org.hibernate.validator.internal.metadata.facets.Cascadable;
14+
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
1515
import org.hibernate.validator.internal.properties.Property;
16-
import org.hibernate.validator.internal.properties.javabean.JavaBeanField;
1716

1817
/**
1918
* A {@link Cascadable} backed by a field of a Java bean.
2019
*
2120
* @author Gunnar Morling
2221
* @author Marko Bekhta
2322
*/
24-
public class PropertyCascadable implements Cascadable {
23+
public abstract class PropertyCascadable implements Cascadable {
2524

2625
private final Property property;
2726
private final Type cascadableType;
2827
private final CascadingMetaData cascadingMetaData;
29-
private final ElementType elementType;
3028

3129
PropertyCascadable(Property property, CascadingMetaData cascadingMetaData) {
3230
this.property = property;
3331
this.cascadableType = property.getType();
3432
this.cascadingMetaData = cascadingMetaData;
35-
this.elementType = property instanceof JavaBeanField ? ElementType.FIELD : ElementType.METHOD;
36-
}
37-
38-
@Override
39-
public ElementType getElementType() {
40-
return elementType;
4133
}
4234

4335
@Override
@@ -60,13 +52,13 @@ public CascadingMetaData getCascadingMetaData() {
6052
return cascadingMetaData;
6153
}
6254

63-
public static class Builder implements Cascadable.Builder {
55+
public abstract static class Builder implements Cascadable.Builder {
6456

6557
private final ValueExtractorManager valueExtractorManager;
6658
private final Property property;
6759
private CascadingMetaDataBuilder cascadingMetaDataBuilder;
6860

69-
public Builder(ValueExtractorManager valueExtractorManager, Property property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
61+
protected Builder(ValueExtractorManager valueExtractorManager, Property property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
7062
this.valueExtractorManager = valueExtractorManager;
7163
this.property = property;
7264
this.cascadingMetaDataBuilder = cascadingMetaDataBuilder;
@@ -78,8 +70,20 @@ public void mergeCascadingMetaData(CascadingMetaDataBuilder cascadingMetaData) {
7870
}
7971

8072
@Override
81-
public PropertyCascadable build() {
82-
return new PropertyCascadable( property, cascadingMetaDataBuilder.build( valueExtractorManager, property ) );
73+
public Cascadable build() {
74+
return create( property, cascadingMetaDataBuilder.build( valueExtractorManager, property ) );
75+
}
76+
77+
protected abstract Cascadable create(Property property, CascadingMetaData build);
78+
79+
public static Cascadable.Builder builder(ConstrainedElementKind constrainedElementKind, ValueExtractorManager valueExtractorManager, Property property, CascadingMetaDataBuilder cascadingMetaDataBuilder) {
80+
if ( ConstrainedElementKind.FIELD == constrainedElementKind ) {
81+
return new FieldCascadable.Builder( valueExtractorManager, property, cascadingMetaDataBuilder );
82+
}
83+
else if ( ConstrainedElementKind.METHOD == constrainedElementKind ) {
84+
return new GetterCascadable.Builder( valueExtractorManager, property, cascadingMetaDataBuilder );
85+
}
86+
throw new IllegalStateException( "It should either be field or method." );
8387
}
8488
}
8589
}

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/PropertyMetaData.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919
import java.util.Map;
2020
import java.util.Objects;
21+
import java.util.Optional;
2122
import java.util.Set;
2223
import java.util.stream.Collectors;
2324

@@ -38,7 +39,6 @@
3839
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
3940
import org.hibernate.validator.internal.metadata.raw.ConstrainedField;
4041
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
41-
import org.hibernate.validator.internal.properties.Callable;
4242
import org.hibernate.validator.internal.properties.Constrainable;
4343
import org.hibernate.validator.internal.properties.Property;
4444
import org.hibernate.validator.internal.properties.javabean.JavaBeanGetter;
@@ -211,31 +211,31 @@ public final void add(ConstrainedElement constrainedElement) {
211211

212212
if ( constrainedElement.getCascadingMetaDataBuilder().isMarkedForCascadingOnAnnotatedObjectOrContainerElements() ||
213213
constrainedElement.getCascadingMetaDataBuilder().hasGroupConversionsOnAnnotatedObjectOrContainerElements() ) {
214-
if ( constrainedElement.getKind() == ConstrainedElementKind.FIELD ) {
215-
Property property = ( (ConstrainedField) constrainedElement ).getProperty();
216-
Cascadable.Builder builder = cascadableBuilders.get( property );
217214

215+
Optional<Constrainable> constrainable = getConstrainableFromConstrainedElement( constrainedElement );
216+
217+
if ( constrainable.isPresent() ) {
218+
Property property = constrainable.get().as( Property.class );
219+
Cascadable.Builder builder = cascadableBuilders.get( property );
218220
if ( builder == null ) {
219-
builder = new PropertyCascadable.Builder( valueExtractorManager, property, constrainedElement.getCascadingMetaDataBuilder() );
221+
builder = PropertyCascadable.Builder.builder( constrainedElement.getKind(), valueExtractorManager, property, constrainedElement.getCascadingMetaDataBuilder() );
220222
cascadableBuilders.put( property, builder );
221223
}
222224
else {
223225
builder.mergeCascadingMetaData( constrainedElement.getCascadingMetaDataBuilder() );
224226
}
225227
}
226-
else if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD ) {
227-
Callable method = ( (ConstrainedExecutable) constrainedElement ).getCallable();
228-
Cascadable.Builder builder = cascadableBuilders.get( method );
228+
}
229+
}
229230

230-
if ( builder == null ) {
231-
builder = new PropertyCascadable.Builder( valueExtractorManager, method.as( Property.class ), constrainedElement.getCascadingMetaDataBuilder() );
232-
cascadableBuilders.put( method, builder );
233-
}
234-
else {
235-
builder.mergeCascadingMetaData( constrainedElement.getCascadingMetaDataBuilder() );
236-
}
237-
}
231+
private Optional<Constrainable> getConstrainableFromConstrainedElement(ConstrainedElement constrainedElement) {
232+
if ( constrainedElement.getKind() == ConstrainedElementKind.FIELD ) {
233+
return Optional.of( ( (ConstrainedField) constrainedElement ).getProperty() );
234+
}
235+
else if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD ) {
236+
return Optional.of( ( (ConstrainedExecutable) constrainedElement ).getCallable() );
238237
}
238+
return Optional.empty();
239239
}
240240

241241
@Override
@@ -256,7 +256,7 @@ private MetaConstraint<?> withGetterLocation(ConstraintLocation getterConstraint
256256
ConstraintLocation converted = null;
257257

258258
// fast track if it's a regular constraint
259-
if ( !(constraint.getLocation() instanceof TypeArgumentConstraintLocation) ) {
259+
if ( !( constraint.getLocation() instanceof TypeArgumentConstraintLocation ) ) {
260260
// Change the constraint location to a GetterConstraintLocation if it is not already one
261261
if ( constraint.getLocation() instanceof GetterPropertyConstraintLocation ) {
262262
converted = constraint.getLocation();

0 commit comments

Comments
 (0)