Skip to content

Commit

Permalink
HV-1623 Extract class-level metadata from property metadata case
Browse files Browse the repository at this point in the history
  • Loading branch information
marko-bekhta authored and gsmet committed Jun 11, 2018
1 parent 8d96d9b commit c2b9432
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ public BeanMetaDataImpl(Class<T> beanClass,
Set<String> tmpUnconstrainedExecutables = newHashSet();

boolean hasConstraints = false;
Set<MetaConstraint<?>> allMetaConstraints = newHashSet();

for ( ConstraintMetaData constraintMetaData : constraintMetaDataSet ) {
boolean elementHasConstraints = constraintMetaData.isCascading() || constraintMetaData.isConstrained();
Expand All @@ -204,6 +205,9 @@ public BeanMetaDataImpl(Class<T> beanClass,
if ( constraintMetaData.getKind() == ElementKind.PROPERTY ) {
propertyMetaDataSet.add( (PropertyMetaData) constraintMetaData );
}
else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {
allMetaConstraints.addAll( ( (ClassMetaData) constraintMetaData ).getAllConstraints() );
}
else {
ExecutableMetaData executableMetaData = (ExecutableMetaData) constraintMetaData;
if ( elementHasConstraints ) {
Expand All @@ -216,7 +220,6 @@ public BeanMetaDataImpl(Class<T> beanClass,
}

Set<Cascadable> cascadedProperties = newHashSet();
Set<MetaConstraint<?>> allMetaConstraints = newHashSet();

for ( PropertyMetaData propertyMetaData : propertyMetaDataSet ) {
propertyMetaDataMap.put( propertyMetaData.getName(), propertyMetaData );
Expand Down Expand Up @@ -696,7 +699,7 @@ private static class BuilderDelegate {
private final TypeResolutionHelper typeResolutionHelper;
private final ValueExtractorManager valueExtractorManager;
private final ExecutableParameterNameProvider parameterNameProvider;
private MetaDataBuilder propertyBuilder;
private MetaDataBuilder metaDataBuilder;
private ExecutableMetaData.Builder methodBuilder;
private final MethodValidationConfiguration methodValidationConfiguration;
private final int hashCode;
Expand All @@ -723,7 +726,7 @@ public BuilderDelegate(
switch ( constrainedElement.getKind() ) {
case FIELD:
ConstrainedField constrainedField = (ConstrainedField) constrainedElement;
propertyBuilder = new PropertyMetaData.Builder(
metaDataBuilder = new PropertyMetaData.Builder(
beanClass,
constrainedField,
constraintHelper,
Expand Down Expand Up @@ -752,7 +755,7 @@ public BuilderDelegate(
}

if ( constrainedExecutable.isGetterMethod() ) {
propertyBuilder = new PropertyMetaData.Builder(
metaDataBuilder = new PropertyMetaData.Builder(
beanClass,
constrainedExecutable,
constraintHelper,
Expand All @@ -763,7 +766,7 @@ public BuilderDelegate(
break;
case TYPE:
ConstrainedType constrainedType = (ConstrainedType) constrainedElement;
propertyBuilder = new PropertyMetaData.Builder(
metaDataBuilder = new ClassMetaData.Builder(
beanClass,
constrainedType,
constraintHelper,
Expand All @@ -784,8 +787,8 @@ public boolean add(ConstrainedElement constrainedElement) {
added = true;
}

if ( propertyBuilder != null && propertyBuilder.accepts( constrainedElement ) ) {
propertyBuilder.add( constrainedElement );
if ( metaDataBuilder != null && metaDataBuilder.accepts( constrainedElement ) ) {
metaDataBuilder.add( constrainedElement );

if ( !added && constrainedElement.getKind() == ConstrainedElementKind.METHOD && methodBuilder == null ) {
ConstrainedExecutable constrainedMethod = (ConstrainedExecutable) constrainedElement;
Expand All @@ -810,8 +813,8 @@ public boolean add(ConstrainedElement constrainedElement) {
public Set<ConstraintMetaData> build() {
Set<ConstraintMetaData> metaDataSet = newHashSet();

if ( propertyBuilder != null ) {
metaDataSet.add( propertyBuilder.build() );
if ( metaDataBuilder != null ) {
metaDataSet.add( metaDataBuilder.build() );
}

if ( methodBuilder != null ) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*
* 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;

import java.util.List;
import java.util.Set;

import javax.validation.ElementKind;

import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
import org.hibernate.validator.internal.metadata.descriptor.ClassDescriptorImpl;
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement;
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
import org.hibernate.validator.internal.util.TypeResolutionHelper;

/**
* Represents the constraint related meta data for a type i.e. class-level
* constraints.
*
* @author Gunnar Morling
* @author Guillaume Smet
* @author Marko Bekhta
*/
public class ClassMetaData extends AbstractConstraintMetaData {

private ClassMetaData(Class<?> beanClass,
Set<MetaConstraint<?>> constraints,
Set<MetaConstraint<?>> containerElementsConstraints) {
super(
beanClass.getSimpleName(),
beanClass,
constraints,
containerElementsConstraints,
false,
!constraints.isEmpty() || !containerElementsConstraints.isEmpty()
);
}

@Override
public ClassDescriptorImpl asDescriptor(boolean defaultGroupSequenceRedefined, List<Class<?>> defaultGroupSequence) {
return new ClassDescriptorImpl(
getType(),
asDescriptors( getDirectConstraints() ),
defaultGroupSequenceRedefined,
defaultGroupSequence
);
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append( getClass().getSimpleName() ).append( "[ " );
sb.append( "type=" ).append( getType() );
sb.append( "]" );
return sb.toString();
}

@Override
public ElementKind getKind() {
return ElementKind.BEAN;
}

@Override
public int hashCode() {
return super.hashCode();
}

@Override
public boolean equals(Object obj) {
if ( this == obj ) {
return true;
}
if ( !super.equals( obj ) ) {
return false;
}
if ( getClass() != obj.getClass() ) {
return false;
}
return true;
}

public static class Builder extends MetaDataBuilder {
public Builder(Class<?> beanClass, ConstrainedType constrainedType, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
ValueExtractorManager valueExtractorManager) {
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );

add( constrainedType );
}

@Override
public boolean accepts(ConstrainedElement constrainedElement) {
return constrainedElement.getKind() == ConstrainedElement.ConstrainedElementKind.TYPE;
}

@Override
public final void add(ConstrainedElement constrainedElement) {
super.add( constrainedElement );
}

@Override
public ClassMetaData build() {
return new ClassMetaData(
getBeanClass(),
adaptOriginsAndImplicitGroups( getDirectConstraints() ),
adaptOriginsAndImplicitGroups( getContainerElementConstraints() )
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
import org.hibernate.validator.internal.metadata.raw.ConstrainedField;
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
import org.hibernate.validator.internal.properties.Constrainable;
import org.hibernate.validator.internal.properties.Property;
import org.hibernate.validator.internal.properties.javabean.JavaBeanGetter;
Expand Down Expand Up @@ -151,7 +150,6 @@ public boolean equals(Object obj) {
public static class Builder extends MetaDataBuilder {

private static final EnumSet<ConstrainedElementKind> SUPPORTED_ELEMENT_KINDS = EnumSet.of(
ConstrainedElementKind.TYPE,
ConstrainedElementKind.FIELD,
ConstrainedElementKind.METHOD
);
Expand All @@ -169,15 +167,6 @@ public Builder(Class<?> beanClass, ConstrainedField constrainedProperty, Constra
add( constrainedProperty );
}

public Builder(Class<?> beanClass, ConstrainedType constrainedType, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
ValueExtractorManager valueExtractorManager) {
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );

this.propertyName = null;
this.propertyType = null;
add( constrainedType );
}

public Builder(Class<?> beanClass, ConstrainedExecutable constrainedMethod, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
ValueExtractorManager valueExtractorManager) {
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* 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.descriptor;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Set;

import javax.validation.metadata.ElementDescriptor;

/**
* Describes a validated type class-level constraints.
*
* @author Marko Bekhta
*/
public class ClassDescriptorImpl extends ElementDescriptorImpl implements ElementDescriptor {

public ClassDescriptorImpl(Type beanType,
Set<ConstraintDescriptorImpl<?>> constraints,
boolean defaultGroupSequenceRedefined,
List<Class<?>> defaultGroupSequence) {
super( beanType, constraints, defaultGroupSequenceRedefined, defaultGroupSequence );
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( getClass().getSimpleName() );
sb.append( "{beanType=" ).append( getElementClass() );
sb.append( '}' );
return sb.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,6 @@ private <T> BeanConfiguration<T> retrieveBeanConfiguration(Class<T> beanClass) {
constrainedElements.addAll( getMethodMetaData( beanClass ) );
constrainedElements.addAll( getConstructorMetaData( beanClass ) );

//TODO GM: currently class level constraints are represented by a PropertyMetaData. This
//works but seems somewhat unnatural
Set<MetaConstraint<?>> classLevelConstraints = getClassLevelConstraints( beanClass );
if ( !classLevelConstraints.isEmpty() ) {
ConstrainedType classLevelMetaData =
Expand Down

0 comments on commit c2b9432

Please sign in to comment.