-
Notifications
You must be signed in to change notification settings - Fork 571
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Explore FreeForm validation v2 #989
base: main
Are you sure you want to change the base?
Changes from 1 commit
f61a93d
80a4bb8
9418a35
415abf7
4a523a8
37d4545
00a7af7
f75e407
ac7835f
92b0696
4e021be
9f1b1da
1807098
8076e67
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,6 +25,9 @@ | |
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor; | ||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorHelper; | ||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager; | ||
import org.hibernate.validator.internal.metadata.aggregated.cascading.ContainerCascadingMetaData; | ||
import org.hibernate.validator.internal.metadata.aggregated.cascading.NonContainerCascadingMetaData; | ||
import org.hibernate.validator.internal.metadata.aggregated.cascading.PotentiallyContainerCascadingMetaData; | ||
import org.hibernate.validator.internal.util.CollectionHelper; | ||
import org.hibernate.validator.internal.util.ReflectionHelper; | ||
import org.hibernate.validator.internal.util.StringHelper; | ||
|
@@ -47,6 +50,8 @@ public class CascadingMetaDataBuilder { | |
private static final CascadingMetaDataBuilder NON_CASCADING = | ||
new CascadingMetaDataBuilder( null, null, null, null, false, Collections.emptyMap(), Collections.emptyMap() ); | ||
|
||
private final String mapping; | ||
|
||
/** | ||
* The enclosing type that defines this type parameter. | ||
*/ | ||
|
@@ -122,6 +127,8 @@ private CascadingMetaDataBuilder(Type enclosingType, TypeVariable<?> typeParamet | |
} | ||
hasContainerElementsMarkedForCascading = tmpHasContainerElementsMarkedForCascading; | ||
hasGroupConversionsOnAnnotatedObjectOrContainerElements = tmpHasGroupConversionsOnAnnotatedObjectOrContainerElements; | ||
|
||
mapping = null; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe you fix it in a later commit but if not, let's add a |
||
} | ||
|
||
public static CascadingMetaDataBuilder nonCascading() { | ||
|
@@ -140,6 +147,10 @@ public Type getEnclosingType() { | |
return enclosingType; | ||
} | ||
|
||
public String getMappingName() { | ||
return mapping; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's be consistent between the method name and the property and call the property |
||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thinking about it a bit more, I wonder if a string is such a good idea. I wonder if we shouldn't have a proper wrapper here which would contain the necessary information for beans or property holders. Not sure only the mapping makes sense in this case, maybe the class should be part of it too so that we have something for the beans too. Thinking out loud here, not sure if it totally makes sense. |
||
|
||
public Class<?> getDeclaredContainerClass() { | ||
return declaredContainerClass; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
* License: Apache License, Version 2.0 | ||
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. | ||
*/ | ||
package org.hibernate.validator.internal.metadata.aggregated; | ||
package org.hibernate.validator.internal.metadata.aggregated.cascading; | ||
|
||
import java.lang.invoke.MethodHandles; | ||
import java.lang.reflect.Type; | ||
|
@@ -19,6 +19,8 @@ | |
import org.hibernate.validator.internal.engine.valueextraction.AnnotatedObject; | ||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor; | ||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager; | ||
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaData; | ||
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaDataBuilder; | ||
import org.hibernate.validator.internal.util.CollectionHelper; | ||
import org.hibernate.validator.internal.util.StringHelper; | ||
import org.hibernate.validator.internal.util.TypeVariables; | ||
|
@@ -66,7 +68,7 @@ public class ContainerCascadingMetaData implements CascadingMetaData { | |
* Possibly the cascading type parameters corresponding to this type parameter if it is a parameterized type. | ||
*/ | ||
@Immutable | ||
private final List<ContainerCascadingMetaData> containerElementTypesCascadingMetaData; | ||
private final List<? extends ContainerCascadingMetaData> containerElementTypesCascadingMetaData; | ||
|
||
/** | ||
* If this type parameter is marked for cascading. | ||
|
@@ -92,10 +94,13 @@ public class ContainerCascadingMetaData implements CascadingMetaData { | |
|
||
public static ContainerCascadingMetaData of(ValueExtractorManager valueExtractorManager, CascadingMetaDataBuilder cascadingMetaDataBuilder, | ||
Object context) { | ||
if ( cascadingMetaDataBuilder.getMappingName() != null ) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, in the end, we really need this to be part of the builder once they are split. |
||
return ContainerPropertyHolderCascadingMetaData.of( valueExtractorManager, cascadingMetaDataBuilder, context ); | ||
} | ||
return new ContainerCascadingMetaData( valueExtractorManager, cascadingMetaDataBuilder ); | ||
} | ||
|
||
private ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager, CascadingMetaDataBuilder cascadingMetaDataBuilder) { | ||
protected ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager, CascadingMetaDataBuilder cascadingMetaDataBuilder) { | ||
this( | ||
valueExtractorManager, | ||
cascadingMetaDataBuilder.getEnclosingType(), | ||
|
@@ -138,7 +143,7 @@ private ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager, | |
} | ||
} | ||
|
||
ContainerCascadingMetaData(Type enclosingType, List<ContainerCascadingMetaData> containerElementTypesCascadingMetaData, | ||
ContainerCascadingMetaData(Type enclosingType, List<? extends ContainerCascadingMetaData> containerElementTypesCascadingMetaData, | ||
GroupConversionHelper groupConversionHelper, Set<ValueExtractorDescriptor> valueExtractorCandidates) { | ||
this.enclosingType = enclosingType; | ||
this.typeParameter = AnnotatedObject.INSTANCE; | ||
|
@@ -206,7 +211,7 @@ public boolean isMarkedForCascadingOnAnnotatedObjectOrContainerElements() { | |
return cascading || hasContainerElementsMarkedForCascading; | ||
} | ||
|
||
public List<ContainerCascadingMetaData> getContainerElementTypesCascadingMetaData() { | ||
public List<? extends ContainerCascadingMetaData> getContainerElementTypesCascadingMetaData() { | ||
return containerElementTypesCascadingMetaData; | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
* Hibernate Validator, declare and validate application constraints | ||
* | ||
* License: Apache License, Version 2.0 | ||
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. | ||
*/ | ||
package org.hibernate.validator.internal.metadata.aggregated.cascading; | ||
|
||
import java.lang.reflect.Type; | ||
import java.lang.reflect.TypeVariable; | ||
import java.util.List; | ||
import java.util.Set; | ||
|
||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor; | ||
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager; | ||
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData; | ||
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaDataBuilder; | ||
import org.hibernate.validator.internal.metadata.manager.ConstraintMetaDataManager; | ||
import org.hibernate.validator.internal.util.Contracts; | ||
import org.hibernate.validator.internal.util.StringHelper; | ||
|
||
/** | ||
* Extended view of container cascading metadta for property holders that in addition stores mapping name. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/metadta/metadata/ |
||
* | ||
* @author Marko Bekhta | ||
*/ | ||
public class ContainerPropertyHolderCascadingMetaData extends ContainerCascadingMetaData { | ||
|
||
/** | ||
* Name of the constraint mappings to be applied. | ||
*/ | ||
private final String mapping; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same remark here about the name. |
||
|
||
public static ContainerPropertyHolderCascadingMetaData of(ValueExtractorManager valueExtractorManager, CascadingMetaDataBuilder cascadingMetaDataBuilder, | ||
Object context) { | ||
Contracts.assertNotEmpty( cascadingMetaDataBuilder.getMappingName(), "Property holder mapping cannot be an empty string." ); | ||
|
||
return new ContainerPropertyHolderCascadingMetaData( valueExtractorManager, cascadingMetaDataBuilder ); | ||
} | ||
|
||
private ContainerPropertyHolderCascadingMetaData(ValueExtractorManager valueExtractorManager, CascadingMetaDataBuilder cascadingMetaDataBuilder) { | ||
super( valueExtractorManager, cascadingMetaDataBuilder ); | ||
this.mapping = cascadingMetaDataBuilder.getMappingName(); | ||
} | ||
|
||
ContainerPropertyHolderCascadingMetaData(String mapping, Type enclosingType, List<ContainerPropertyHolderCascadingMetaData> containerElementTypesCascadingMetaData, | ||
GroupConversionHelper groupConversionHelper, Set<ValueExtractorDescriptor> valueExtractorCandidates) { | ||
super( enclosingType, containerElementTypesCascadingMetaData, groupConversionHelper, valueExtractorCandidates ); | ||
this.mapping = mapping; | ||
} | ||
|
||
ContainerPropertyHolderCascadingMetaData(String mapping, Type enclosingType, TypeVariable<?> typeParameter, Class<?> declaredContainerClass, TypeVariable<?> declaredTypeParameter, | ||
GroupConversionHelper groupConversionHelper) { | ||
super( enclosingType, typeParameter, declaredContainerClass, declaredTypeParameter, groupConversionHelper ); | ||
this.mapping = mapping; | ||
} | ||
|
||
@Override | ||
public BeanMetaData<?> getBeanMetaDataForCascadable(ConstraintMetaDataManager constraintMetaDataManager, Object value) { | ||
return constraintMetaDataManager.getPropertyHolderBeanMetaData( value.getClass(), mapping ); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append( getClass().getSimpleName() ); | ||
sb.append( " [" ); | ||
sb.append( "mapping=" ).append( mapping ).append( ", " ); | ||
sb.append( "enclosingType=" ).append( StringHelper.toShortString( getEnclosingType() ) ).append( ", " ); | ||
sb.append( "typeParameter=" ).append( getTypeParameter() ).append( ", " ); | ||
sb.append( "cascading=" ).append( isCascading() ).append( ", " ); | ||
sb.append( "containerElementTypesCascadingMetaData=" ).append( getContainerElementTypesCascadingMetaData() ); | ||
sb.append( "]" ); | ||
return sb.toString(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/* | ||
* Hibernate Validator, declare and validate application constraints | ||
* | ||
* License: Apache License, Version 2.0 | ||
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. | ||
*/ | ||
package org.hibernate.validator.internal.metadata.aggregated.cascading; | ||
|
||
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData; | ||
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaDataBuilder; | ||
import org.hibernate.validator.internal.metadata.manager.ConstraintMetaDataManager; | ||
import org.hibernate.validator.internal.util.Contracts; | ||
|
||
/** | ||
* Extended view of non container cascading metadta for property holders that in addition stores mapping name. | ||
* | ||
* @author Marko Bekhta | ||
*/ | ||
public class NonContainerPropertyHolderCascadingMetaData extends NonContainerCascadingMetaData { | ||
|
||
/** | ||
* Name of the constraint mappings to be applied. | ||
*/ | ||
private final String mapping; | ||
|
||
public static NonContainerPropertyHolderCascadingMetaData of(CascadingMetaDataBuilder cascadingMetaDataBuilder, Object context) { | ||
Contracts.assertTrue( cascadingMetaDataBuilder.isCascading(), "Property holder cascading metadata should always be cascading." ); | ||
Contracts.assertNotEmpty( cascadingMetaDataBuilder.getMappingName(), "Property holder mapping cannot be an empty string." ); | ||
|
||
return new NonContainerPropertyHolderCascadingMetaData( cascadingMetaDataBuilder ); | ||
} | ||
|
||
private NonContainerPropertyHolderCascadingMetaData(CascadingMetaDataBuilder cascadingMetaDataBuilder) { | ||
super( cascadingMetaDataBuilder ); | ||
this.mapping = cascadingMetaDataBuilder.getMappingName(); | ||
} | ||
|
||
@Override | ||
public BeanMetaData<?> getBeanMetaDataForCascadable(ConstraintMetaDataManager constraintMetaDataManager, Object value) { | ||
return constraintMetaDataManager.getPropertyHolderBeanMetaData( value.getClass(), mapping ); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
StringBuilder sb = new StringBuilder(); | ||
sb.append( getClass().getSimpleName() ); | ||
sb.append( " [" ); | ||
sb.append( "mapping=" ).append( mapping ).append( ", " ); | ||
sb.append( "cascading=" ).append( isCascading() ).append( ", " ); | ||
sb.append( "]" ); | ||
return sb.toString(); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For now property holders and regular beans are using the same cascading metadata builder. When I've tried to break it into smaller reusable pieces, I've broke it so badly 😄 that I decided to revert the changes for now and just use the same builder. But this still is needed to be done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, let's try to have a todo list somewhere so that we don't forget about it.