[hibernate-issues] [Hibernate-JIRA] Resolved: (HV-443) Scope of ConstraintDescriptors sometimes wrong in type hierarchies
Gunnar Morling (JIRA)
noreply at atlassian.com
Mon Oct 24 15:01:23 EDT 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HV-443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gunnar Morling resolved HV-443.
-------------------------------
Resolution: Fixed
> Scope of ConstraintDescriptors sometimes wrong in type hierarchies
> ------------------------------------------------------------------
>
> Key: HV-443
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HV-443
> Project: Hibernate Validator
> Issue Type: Bug
> Components: engine
> Affects Versions: 4.1.0.Final
> Reporter: Gunnar Morling
> Fix For: 4.3.0.next
>
>
> Using the BV meta data API it is possible to retrieve meta information on the constraints of given Java types. Using the {{ConstraintFinder}} API the scope of the constraints to retrieve meta data for can be restricted.
> Due to the caching of meta data in {{BeanMetaDataCache}} it can happen under certain circumstances that constraints are declared in scope {{LOCAL_ELEMENT}}, although it should be {{HIERARCHY}} instead.
> The following test demonstrates the bug:
> {code:java}
> public class CacheTest {
> @Test
> public void constraintsFromSuperTypeAreInLocalScopeWhenSuperTypeIsLoadedFromCache() {
> Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
> // loads BeanMetaData for A and puts it into the BeanMetaDataCache
> PropertyDescriptor propertyDescriptorForSuperType = validator
> .getConstraintsForClass(A.class).getConstraintsForProperty("foo");
> Set<ConstraintDescriptor<?>> constraintDescriptorsFromSuperType = propertyDescriptorForSuperType
> .findConstraints().lookingAt(Scope.LOCAL_ELEMENT)
> .getConstraintDescriptors();
> assertEquals(constraintDescriptorsFromSuperType.size(), 1);
> // re-uses BeanMetaData for A from cache, keeps A's constraints in
> // LOCAL_ELEMENT scope
> PropertyDescriptor propertyDescriptorForSubType = validator
> .getConstraintsForClass(B.class).getConstraintsForProperty("foo");
> Set<ConstraintDescriptor<?>> constraintDescriptorsFromSubType = propertyDescriptorForSubType
> .findConstraints().lookingAt(Scope.LOCAL_ELEMENT)
> .getConstraintDescriptors();
> // fails
> assertEquals(constraintDescriptorsFromSubType.size(), 0, "No descriptor in LOCAL scope expected for B.foo");
> }
> @Test
> public void constraintsFromSuperTypeAreInHierarchyScopeWhenSuperTypeIsNotLoadedFromCache() {
> Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
> // loads BeanMetaData for A when traversing B's hierarchy, A's constraints
> // are correctly in HIERARCHY scope
> PropertyDescriptor propertyDescriptorForSubType = validator
> .getConstraintsForClass(B.class).getConstraintsForProperty("foo");
> Set<ConstraintDescriptor<?>> constraintDescriptorsFromSubType = propertyDescriptorForSubType
> .findConstraints().lookingAt(Scope.LOCAL_ELEMENT)
> .getConstraintDescriptors();
> assertEquals(constraintDescriptorsFromSubType.size(), 0, "No descriptor in LOCAL scope expected for B.foo");
> constraintDescriptorsFromSubType = propertyDescriptorForSubType
> .findConstraints().lookingAt(Scope.HIERARCHY)
> .getConstraintDescriptors();
> assertEquals(constraintDescriptorsFromSubType.size(), 1, "One descriptor in HIERARCHY scope expected for B.foo");
> }
> public static class A {
> @NotNull
> public String getFoo() {
> return null;
> }
> }
> public static class B extends A {
> }
> }
> {code}
> The bug is caused by retrieving the meta data for {{A}} from the cache when building the meta data for its sub-type {{B}} (see {{constraintsFromSuperTypeAreInLocalScopeWhenSuperTypeIsLoadedFromCache}}). In this case the constraint from {{A}} are added to {{B}} but remain in scope {{LOCAL_ELEMENT}}.
> The bug does not occur when the meta data for {{A}} is retrieved when traversing the type hierarchy while building up the meta data for {{B}} (see {{constraintsFromSuperTypeAreInHierarchyScopeWhenSuperTypeIsNotLoadedFromCache}}), though I guess the constraints would be wrongly in scope {{HIERARCHY}} if afterwards the descriptors for {{A}} itself would be retrieved.
> To fix this bug the constraint scope needs to be re-determined always if the meta data is retrieved from the cache.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list