Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

import jakarta.enterprise.inject.Any;
import jakarta.enterprise.inject.Default;
Expand All @@ -27,6 +26,7 @@
import org.hibernate.validator.internal.engine.ValidatorImpl;
import org.hibernate.validator.internal.util.CollectionHelper;
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
import org.hibernate.validator.internal.util.classhierarchy.Filter;

/**
* Provides functionality for dealing with validation provider types.
Expand Down Expand Up @@ -146,27 +146,45 @@ private static Set<Annotation> determineRequiredQualifiers(
public Set<Type> determineValidatorFactoryCdiTypes() {
return Collections.unmodifiableSet(
CollectionHelper.<Type>newHashSet(
ClassHierarchyHelper.getHierarchy( getValidatorFactoryBeanClass() )
.stream()
// We do not include Hibernate Validator internal types:
.filter( klass -> !( isHibernateValidator && isHibernateValidatorInternalType( klass ) ) )
.collect( Collectors.toSet() )
ClassHierarchyHelper.getHierarchy(
getValidatorFactoryBeanClass(),
isHibernateValidator ? HibernateValidatorInternalTypeFilter.INSTANCE : AcceptAllFilter.INSTANCE
)
)
);
}

public Set<Type> determineValidatorCdiTypes() {
return Collections.unmodifiableSet(
CollectionHelper.<Type>newHashSet(
ClassHierarchyHelper.getHierarchy( getValidatorBeanClass() )
.stream()
// We do not include Hibernate Validator internal types:
.filter( klass -> !( isHibernateValidator && isHibernateValidatorInternalType( klass ) ) )
.collect( Collectors.toSet() )
ClassHierarchyHelper.getHierarchy(
getValidatorBeanClass(),
isHibernateValidator ? HibernateValidatorInternalTypeFilter.INSTANCE : AcceptAllFilter.INSTANCE
)
)
);
}

private static class HibernateValidatorInternalTypeFilter implements Filter {

public static final HibernateValidatorInternalTypeFilter INSTANCE = new HibernateValidatorInternalTypeFilter();

@Override
public boolean accepts(Class<?> clazz) {
return !isHibernateValidatorInternalType( clazz );
}
}

private static class AcceptAllFilter implements Filter {

public static final AcceptAllFilter INSTANCE = new AcceptAllFilter();

@Override
public boolean accepts(Class<?> clazz) {
return true;
}
}

@Override
public String toString() {
return "ValidationProviderHelper [isDefaultProvider="
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
Class<?> normalizedValidatedClass = beanMetaDataClassNormalizer.normalize( validatedClass );

@SuppressWarnings("unchecked")
List<Class<?>> classHierarchy = (List<Class<?>>) (Object) ClassHierarchyHelper.getHierarchy( normalizedValidatedClass, Filters.excludeInterfaces() );
List<Class<?>> classHierarchy = (List<Class<?>>) (Object) ClassHierarchyHelper.getHierarchy( normalizedValidatedClass,
Filters.excludeInterfaces( normalizedValidatedClass ) );

// note that the hierarchy also contains the initial class
for ( Class<?> hierarchyElement : classHierarchy ) {
Expand Down Expand Up @@ -200,7 +201,7 @@ private static class UninitializedBeanMetaData<T> implements BeanMetaData<T> {
@SuppressWarnings("unchecked")
private UninitializedBeanMetaData(Class<T> beanClass) {
this.beanClass = beanClass;
this.classHierarchy = (List<Class<? super T>>) (Object) ClassHierarchyHelper.getHierarchy( beanClass, Filters.excludeInterfaces() );
this.classHierarchy = (List<Class<? super T>>) (Object) ClassHierarchyHelper.getHierarchy( beanClass, Filters.excludeInterfaces( beanClass ) );
this.beanDescriptor = new UninitializedBeanDescriptor( beanClass );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {

this.classHierarchyWithoutInterfaces = CollectionHelper.toImmutableList( ClassHierarchyHelper.getHierarchy(
beanClass,
Filters.excludeInterfaces()
Filters.excludeInterfaces( beanClass )
) );

DefaultGroupSequenceContext<? super T> defaultGroupContext = getDefaultGroupSequenceData( beanClass, defaultGroupSequence, defaultGroupSequenceProvider, validationOrderGenerator );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
public class Filters {

private static final Filter PROXY_FILTER = new WeldProxyFilter();
private static final Filter INTERFACES_FILTER = new InterfacesFilter();

private Filters() {
// Not allowed
Expand All @@ -26,8 +25,8 @@ private Filters() {
*
* @return a filter which excludes interfaces
*/
public static Filter excludeInterfaces() {
return INTERFACES_FILTER;
public static Filter excludeInterfaces(Class<?> self) {
return new InterfacesFilter( self );
}

/**
Expand All @@ -41,9 +40,15 @@ public static Filter excludeProxies() {

private static class InterfacesFilter implements Filter {

private final Class<?> self;

public InterfacesFilter(Class<?> self) {
this.self = self;
}

@Override
public boolean accepts(Class<?> clazz) {
return !clazz.isInterface();
return !clazz.isInterface() || self.equals( clazz );
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,20 @@ public void testValidatePropertyInPresenceOfClassLevelConstraint() {
);
}

@Test
public void testValidateValueConstraintOnInterface() {
Validator validator = getValidator();

Set<ConstraintViolation<MyConstraints>> violations = validator.validateValue( MyConstraints.class, "property", null );
assertThat( violations ).containsOnlyViolations(
violationOf( NotNull.class ).withProperty( "property" ) );
}

interface MyConstraints {
@NotNull
String getProperty();
}

class A {
@NotNull
String b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,25 @@ public void testGetHierarchy() {

List<Class<? super Fubar>> superClasses = ClassHierarchyHelper.getHierarchy(
Fubar.class,
Filters.excludeInterfaces()
Filters.excludeInterfaces( Fubar.class )
);
assertThat( superClasses ).containsOnly( Fubar.class, Object.class );
}

@Test
public void testHierarchyWithoutInterfaces() {
List<Class<? super Snafu>> superClasses = ClassHierarchyHelper.getHierarchy(
Snafu.class
);
assertThat( superClasses ).containsOnly( Snafu.class );

superClasses = ClassHierarchyHelper.getHierarchy(
Snafu.class,
Filters.excludeInterfaces( Snafu.class )
);
assertThat( superClasses ).containsOnly( Snafu.class );
}

private interface Snafu {
void snafu();
}
Expand Down