[hibernate-commits] Hibernate SVN: r17618 - beanvalidation/api/trunk/src/main/java/javax/validation/metadata and 10 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Sun Oct 4 07:12:10 EDT 2009


Author: hardy.ferentschik
Date: 2009-10-04 07:12:10 -0400 (Sun, 04 Oct 2009)
New Revision: 17618

Added:
   beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/
   beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/ConstraintVisibilityTest.java
   beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SubClass.java
   beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SuperClass.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintOrigin.java
Modified:
   beanvalidation/api/trunk/pom.xml
   beanvalidation/api/trunk/src/main/java/javax/validation/metadata/ElementDescriptor.java
   beanvalidation/tck/trunk/pom.xml
   beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/GroupInheritanceTest.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ConstraintTree.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidatorFactoryImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/BeanMetaDataImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintDescriptorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ElementDescriptorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/MetaConstraint.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/xml/XmlMappingParser.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/engine/messageinterpolation/ResourceBundleMessageInterpolatorTest.java
   validator/trunk/hibernate-validator/src/test/suite/unit-tests.xml
   validator/trunk/pom.xml
Log:
HV-247

Modified: beanvalidation/api/trunk/pom.xml
===================================================================
--- beanvalidation/api/trunk/pom.xml	2009-10-03 17:53:41 UTC (rev 17617)
+++ beanvalidation/api/trunk/pom.xml	2009-10-04 11:12:10 UTC (rev 17618)
@@ -4,7 +4,7 @@
 
     <groupId>javax.validation</groupId>
     <artifactId>validation-api</artifactId>
-    <version>1.1.0-SNAPSHOT</version>
+    <version>1.0.0.GA-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>Bean Validation API</name>
 


Property changes on: beanvalidation/api/trunk/pom.xml
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: beanvalidation/api/trunk/src/main/java/javax/validation/metadata/ElementDescriptor.java
===================================================================
--- beanvalidation/api/trunk/src/main/java/javax/validation/metadata/ElementDescriptor.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ beanvalidation/api/trunk/src/main/java/javax/validation/metadata/ElementDescriptor.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -49,20 +49,6 @@
 	Set<ConstraintDescriptor<?>> getConstraintDescriptors();
 
 	/**
-	 * Return the list of matching constraints for a given set of groups for this element.
-	 *
-	 * This method respects group sequences and group inheritance (including
-	 * class-level <code>Default</code> group overriding) but does not return
-	 * <code>ConstraintDescriptor</code>s in any particular order.
-	 * Specifically, ordering of the group sequence is not respected.
-	 *
-	 * @param groups groups targeted
-	 * @return list of matching ConstraintDescriptors
-	 * @deprecated {@link #findConstraints()}
-	 */
-	Set<ConstraintDescriptor<?>> getUnorderedConstraintDescriptorsMatchingGroups(Class<?>... groups);
-
-	/**
 	 * Find constraints and potentially restricting to certain criteria.
 	 *
 	 * @return ConstraintFinder object.

Modified: beanvalidation/tck/trunk/pom.xml
===================================================================
--- beanvalidation/tck/trunk/pom.xml	2009-10-03 17:53:41 UTC (rev 17617)
+++ beanvalidation/tck/trunk/pom.xml	2009-10-04 11:12:10 UTC (rev 17618)
@@ -44,7 +44,7 @@
         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
-            <version>1.0.0.GA</version>
+            <version>1.0.0.GA-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.jboss.test-audit</groupId>

Modified: beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/GroupInheritanceTest.java
===================================================================
--- beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/GroupInheritanceTest.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/constraints/groups/inheritance/GroupInheritanceTest.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -71,20 +71,24 @@
 
 		//  PreManufacturing belongs implicitly to All
 		PropertyDescriptor propertyDescriptor = descriptor.getConstraintsForProperty( "partNumber" );
-		Set<ConstraintDescriptor<?>> descriptorsForGroup = propertyDescriptor.getUnorderedConstraintDescriptorsMatchingGroups(
-				All.class
-		);
+		Set<ConstraintDescriptor<?>> descriptorsForGroup = propertyDescriptor.findConstraints()
+				.unorderedAndMatchingGroups( All.class )
+				.getConstraintDescriptors();
 		assertEquals( descriptorsForGroup.size(), 1, "Wrong number of descriptors" );
 		assertEquals( descriptorsForGroup.iterator().next().getAnnotation().annotationType(), Digits.class );
 
 		//  PostManufacturing belongs implicitly to All
 		propertyDescriptor = descriptor.getConstraintsForProperty( "qaChecked" );
-		descriptorsForGroup = propertyDescriptor.getUnorderedConstraintDescriptorsMatchingGroups( All.class );
+		descriptorsForGroup = propertyDescriptor.findConstraints()
+				.unorderedAndMatchingGroups( All.class )
+				.getConstraintDescriptors();
 		assertEquals( descriptorsForGroup.size(), 1, "Wrong number of descriptors" );
 		assertEquals( descriptorsForGroup.iterator().next().getAnnotation().annotationType(), AssertTrue.class );
 
 		propertyDescriptor = descriptor.getConstraintsForProperty( "size" );
-		descriptorsForGroup = propertyDescriptor.getUnorderedConstraintDescriptorsMatchingGroups( All.class );
+		descriptorsForGroup = propertyDescriptor.findConstraints()
+				.unorderedAndMatchingGroups( All.class )
+				.getConstraintDescriptors();
 		assertEquals( descriptorsForGroup.size(), 1, "Wrong number of descriptors" );
 		assertEquals( descriptorsForGroup.iterator().next().getAnnotation().annotationType(), Max.class );
 	}

Added: beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/ConstraintVisibilityTest.java
===================================================================
--- beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/ConstraintVisibilityTest.java	                        (rev 0)
+++ beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/ConstraintVisibilityTest.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -0,0 +1,76 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jsr303.tck.tests.metadata.visibility;
+
+import java.lang.annotation.ElementType;
+import java.util.Set;
+import javax.validation.Validator;
+import javax.validation.metadata.BeanDescriptor;
+import javax.validation.metadata.ConstraintDescriptor;
+import javax.validation.metadata.Scope;
+
+import static junit.framework.Assert.assertTrue;
+import org.jboss.testharness.AbstractTest;
+import org.jboss.testharness.impl.packaging.Artifact;
+import org.jboss.testharness.impl.packaging.ArtifactType;
+import org.jboss.testharness.impl.packaging.Classes;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+import org.hibernate.jsr303.tck.util.TestUtil;
+
+/**
+ * @author Hardy Ferentschik
+ */
+ at Artifact(artifactType = ArtifactType.JSR303)
+ at Classes({ TestUtil.class, TestUtil.PathImpl.class, TestUtil.NodeImpl.class })
+public class ConstraintVisibilityTest extends AbstractTest {
+
+	@Test
+	public void testVisibility() {
+		Validator validator = TestUtil.getValidatorUnderTest();
+		BeanDescriptor beanDescriptor = validator.getConstraintsForClass( SubClass.class );
+		assertNotNull( beanDescriptor );
+
+		Set<ConstraintDescriptor<?>> descriptors = beanDescriptor.getConstraintsForProperty( "myField" )
+				.findConstraints()
+				.lookingAt( Scope.HIERARCHY )
+				.getConstraintDescriptors();
+		assertTrue( descriptors.size() == 2 );
+
+		descriptors = beanDescriptor.getConstraintsForProperty( "myField" )
+				.findConstraints()
+				.lookingAt( Scope.LOCAL_ELEMENT )
+				.getConstraintDescriptors();
+		assertTrue( descriptors.size() == 1 );
+
+		descriptors = beanDescriptor.getConstraintsForProperty( "myField" )
+				.findConstraints()
+				.lookingAt( Scope.HIERARCHY )
+				.declaredOn( ElementType.TYPE )
+				.getConstraintDescriptors();
+		assertTrue( descriptors.size() == 0 );
+
+		descriptors = beanDescriptor.getConstraintsForProperty( "myField" )
+				.findConstraints()
+				.lookingAt( Scope.HIERARCHY )
+				.declaredOn( ElementType.FIELD )
+				.getConstraintDescriptors();
+		assertTrue( descriptors.size() == 2 );
+	}
+}
\ No newline at end of file

Added: beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SubClass.java
===================================================================
--- beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SubClass.java	                        (rev 0)
+++ beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SubClass.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -0,0 +1,29 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jsr303.tck.tests.metadata.visibility;
+
+import javax.validation.constraints.Max;
+
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class SubClass extends SuperClass {
+	@Max(value = 10)
+	private String myField = "1234567890";
+}
\ No newline at end of file

Added: beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SuperClass.java
===================================================================
--- beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SuperClass.java	                        (rev 0)
+++ beanvalidation/tck/trunk/src/main/java/org/hibernate/jsr303/tck/tests/metadata/visibility/SuperClass.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -0,0 +1,33 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jsr303.tck.tests.metadata.visibility;
+
+import javax.validation.constraints.NotNull;
+
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class SuperClass {
+	@NotNull
+	private String myField = "12345678901234567890";
+
+	public String getMyField() {
+		return myField;
+	}
+}
\ No newline at end of file

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ConstraintTree.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ConstraintTree.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ConstraintTree.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -20,6 +20,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -34,6 +35,7 @@
 import com.googlecode.jtype.TypeUtils;
 import org.slf4j.Logger;
 
+import org.hibernate.validator.metadata.ConstraintDescriptorImpl;
 import org.hibernate.validator.util.LoggerFactory;
 import org.hibernate.validator.util.ValidatorTypeHelper;
 
@@ -49,29 +51,33 @@
 
 	private final ConstraintTree<?> parent;
 	private final List<ConstraintTree<?>> children;
-	private final ConstraintDescriptor<A> descriptor;
+	private final ConstraintDescriptorImpl<A> descriptor;
 
 	private final Map<ValidatorCacheKey, ConstraintValidator<A, ?>> constraintValidatorCache;
 
-	public ConstraintTree(ConstraintDescriptor<A> descriptor) {
+	public ConstraintTree(ConstraintDescriptorImpl<A> descriptor) {
 		this( descriptor, null );
 	}
 
-	private ConstraintTree(ConstraintDescriptor<A> descriptor, ConstraintTree<?> parent) {
+	private ConstraintTree(ConstraintDescriptorImpl<A> descriptor, ConstraintTree<?> parent) {
 		this.parent = parent;
 		this.descriptor = descriptor;
 		this.constraintValidatorCache = new ConcurrentHashMap<ValidatorCacheKey, ConstraintValidator<A, ?>>();
 
-		final Set<ConstraintDescriptor<?>> composingConstraints = descriptor.getComposingConstraints();
+		final Set<ConstraintDescriptorImpl<?>> composingConstraints = new HashSet<ConstraintDescriptorImpl<?>>();
+		for ( ConstraintDescriptor<?> composingConstraint : descriptor.getComposingConstraints() ) {
+			composingConstraints.add( ( ConstraintDescriptorImpl<?> ) composingConstraint );
+		}
+		
 		children = new ArrayList<ConstraintTree<?>>( composingConstraints.size() );
 
-		for ( ConstraintDescriptor<?> composingDescriptor : composingConstraints ) {
+		for ( ConstraintDescriptorImpl<?> composingDescriptor : composingConstraints ) {
 			ConstraintTree<?> treeNode = createConstraintTree( composingDescriptor );
 			children.add( treeNode );
 		}
 	}
 
-	private <U extends Annotation> ConstraintTree<U> createConstraintTree(ConstraintDescriptor<U> composingDescriptor) {
+	private <U extends Annotation> ConstraintTree<U> createConstraintTree(ConstraintDescriptorImpl<U> composingDescriptor) {
 		return new ConstraintTree<U>( composingDescriptor, this );
 	}
 
@@ -79,7 +85,7 @@
 		return children;
 	}
 
-	public ConstraintDescriptor<A> getDescriptor() {
+	public ConstraintDescriptorImpl<A> getDescriptor() {
 		return descriptor;
 	}
 

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidatorFactoryImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidatorFactoryImpl.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidatorFactoryImpl.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -30,13 +30,14 @@
 import javax.validation.Validator;
 import javax.validation.ValidatorContext;
 import javax.validation.ValidatorFactory;
-import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.spi.ConfigurationState;
 
 import org.hibernate.validator.metadata.AnnotationIgnores;
 import org.hibernate.validator.metadata.BeanMetaDataCache;
 import org.hibernate.validator.metadata.BeanMetaDataImpl;
+import org.hibernate.validator.metadata.ConstraintDescriptorImpl;
 import org.hibernate.validator.metadata.ConstraintHelper;
+import org.hibernate.validator.metadata.ConstraintOrigin;
 import org.hibernate.validator.metadata.MetaConstraint;
 import org.hibernate.validator.util.ReflectionHelper;
 import org.hibernate.validator.xml.XmlMappingParser;
@@ -125,29 +126,33 @@
 		}
 	}
 
+	@SuppressWarnings("unchecked")
 	private <T, A extends Annotation> void addXmlConfiguredConstraintToMetaData(XmlMappingParser mappingParser, Class<T> rootClass, Class<?> hierarchyClass, BeanMetaDataImpl<T> metaData) {
 		for ( MetaConstraint<?, ? extends Annotation> constraint : mappingParser.getConstraintsForClass( hierarchyClass ) ) {
-			if ( hierarchyClass.equals( rootClass ) ) {
-				@SuppressWarnings("unchecked") // safe cast due to the class check
-						MetaConstraint<T, ? extends Annotation> castedConstrain = ( MetaConstraint<T, ? extends Annotation> ) constraint;
-				metaData.addMetaConstraint( hierarchyClass, castedConstrain );
-			}
-			else {
-				MetaConstraint<T, A> newMetaConstraint;
-				@SuppressWarnings("unchecked")
-				ConstraintDescriptor<A> descriptor = ( ConstraintDescriptor<A> ) constraint.getDescriptor();
-				if ( constraint.getMember() == null ) {
-					newMetaConstraint = new MetaConstraint<T, A>( rootClass, descriptor );
-				}
-				else {
-					newMetaConstraint = new MetaConstraint<T, A>( constraint.getMember(), rootClass, descriptor );
-				}
-				metaData.addMetaConstraint( hierarchyClass, newMetaConstraint );
-			}
+			ConstraintOrigin definedIn = definedIn( rootClass, hierarchyClass );
+			ConstraintDescriptorImpl<A> descriptor = new ConstraintDescriptorImpl<A>(
+					( A ) constraint.getDescriptor().getAnnotation(),
+					constraintHelper,
+					constraint.getElementType(),
+					definedIn
+			);
+			MetaConstraint<T, A> newMetaConstraint = new MetaConstraint<T, A>(
+					rootClass, constraint.getMember(), descriptor
+			);
+			metaData.addMetaConstraint( hierarchyClass, newMetaConstraint );
 		}
 
 		for ( Member m : mappingParser.getCascadedMembersForClass( hierarchyClass ) ) {
 			metaData.addCascadedMember( m );
 		}
 	}
+
+	private ConstraintOrigin definedIn(Class<?> rootClass, Class<?> hierarchyClass) {
+		if ( hierarchyClass.equals( rootClass ) ) {
+			return ConstraintOrigin.DEFINED_LOCALLY;
+		}
+		else {
+			return ConstraintOrigin.DEFINED_IN_HIERARCHY;
+		}
+	}
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/BeanMetaDataImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/BeanMetaDataImpl.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/BeanMetaDataImpl.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -61,7 +61,7 @@
 	private static final Logger log = LoggerFactory.make();
 
 	/**
-	 * The root bean class for this validator.
+	 * The root bean class for this meta data.
 	 */
 	private final Class<T> beanClass;
 
@@ -97,7 +97,6 @@
 	private final ConstraintHelper constraintHelper;
 
 	//updated on the fly, needs to be thread safe
-	//property name
 	private final Set<String> propertyNames = new HashSet<String>( 30 );
 
 	public BeanMetaDataImpl(Class<T> beanClass, ConstraintHelper constraintHelper) {
@@ -280,8 +279,8 @@
 				propertyNames.add( name );
 			}
 
-			List<ConstraintDescriptorImpl<?>> fieldMetadata = findConstraints( field );
-			for ( ConstraintDescriptorImpl<?> constraintDescription : fieldMetadata ) {
+			List<ConstraintDescriptorImpl<?>> fieldMetaData = findConstraints( field, ElementType.FIELD );
+			for ( ConstraintDescriptorImpl<?> constraintDescription : fieldMetaData ) {
 				setAccessibility( field );
 				MetaConstraint<T, ?> metaConstraint = createMetaConstraint( field, constraintDescription );
 				addMetaConstraint( clazz, metaConstraint );
@@ -329,8 +328,8 @@
 				propertyNames.add( name );
 			}
 
-			List<ConstraintDescriptorImpl<?>> methodMetadata = findConstraints( method );
-			for ( ConstraintDescriptorImpl<?> constraintDescription : methodMetadata ) {
+			List<ConstraintDescriptorImpl<?>> methodMetaData = findConstraints( method, ElementType.METHOD );
+			for ( ConstraintDescriptorImpl<?> constraintDescription : methodMetaData ) {
 				setAccessibility( method );
 				MetaConstraint<T, ?> metaConstraint = createMetaConstraint( method, constraintDescription );
 				addMetaConstraint( clazz, metaConstraint );
@@ -368,29 +367,26 @@
 		}
 		List<ConstraintDescriptorImpl<?>> classMetadata = findClassLevelConstraints( clazz );
 		for ( ConstraintDescriptorImpl<?> constraintDescription : classMetadata ) {
-			MetaConstraint<T, ?> metaConstraint = createMetaConstraint( constraintDescription );
+			MetaConstraint<T, ?> metaConstraint = createMetaConstraint( null, constraintDescription );
 			addMetaConstraint( clazz, metaConstraint );
 		}
 	}
 
-	private <A extends Annotation> MetaConstraint<T, ?> createMetaConstraint(ConstraintDescriptorImpl<A> descriptor) {
-		return new MetaConstraint<T, A>( beanClass, descriptor );
-	}
-
 	private <A extends Annotation> MetaConstraint<T, ?> createMetaConstraint(Member m, ConstraintDescriptorImpl<A> descriptor) {
-		return new MetaConstraint<T, A>( m, beanClass, descriptor );
+		return new MetaConstraint<T, A>( beanClass, m, descriptor );
 	}
 
 	/**
 	 * Examines the given annotation to see whether it is a single- or multi-valued constraint annotation.
 	 *
-	 * @param clazz the class we are currently processing.
-	 * @param annotation The annotation to examine.
+	 * @param clazz the class we are currently processing
+	 * @param annotation The annotation to examine
+	 * @param type the element type on which the annotation/constraint is placed on
 	 *
 	 * @return A list of constraint descriptors or the empty list in case <code>annotation</code> is neither a
-	 *         single nor multi value annotation.
+	 *         single nor multi-valued annotation.
 	 */
-	private <A extends Annotation> List<ConstraintDescriptorImpl<?>> findConstraintAnnotations(Class<?> clazz, A annotation) {
+	private <A extends Annotation> List<ConstraintDescriptorImpl<?>> findConstraintAnnotations(Class<?> clazz, A annotation, ElementType type) {
 		List<ConstraintDescriptorImpl<?>> constraintDescriptors = new ArrayList<ConstraintDescriptorImpl<?>>();
 
 		List<Annotation> constraints = new ArrayList<Annotation>();
@@ -399,24 +395,27 @@
 			constraints.add( annotation );
 		}
 
-		// check if we have a multi value constraint
+		// check if we have a multi-valued constraint
 		constraints.addAll( constraintHelper.getMultiValueConstraints( annotation ) );
 
 		for ( Annotation constraint : constraints ) {
-			final ConstraintDescriptorImpl constraintDescriptor = buildConstraintDescriptor( clazz, constraint );
+			final ConstraintDescriptorImpl constraintDescriptor = buildConstraintDescriptor( clazz, constraint, type );
 			constraintDescriptors.add( constraintDescriptor );
 		}
 		return constraintDescriptors;
 	}
 
 	@SuppressWarnings("unchecked")
-	private <A extends Annotation> ConstraintDescriptorImpl buildConstraintDescriptor(Class<?> clazz, A annotation) {
+	private <A extends Annotation> ConstraintDescriptorImpl buildConstraintDescriptor(Class<?> clazz, A annotation, ElementType type) {
 		ConstraintDescriptorImpl constraintDescriptor;
+		ConstraintOrigin definedIn = determineOrigin( clazz );
 		if ( clazz.isInterface() && !clazz.equals( beanClass ) ) {
-			constraintDescriptor = new ConstraintDescriptorImpl( annotation, constraintHelper, clazz );
+			constraintDescriptor = new ConstraintDescriptorImpl(
+					annotation, constraintHelper, clazz, type, definedIn
+			);
 		}
 		else {
-			constraintDescriptor = new ConstraintDescriptorImpl( annotation, constraintHelper );
+			constraintDescriptor = new ConstraintDescriptorImpl( annotation, constraintHelper, type, definedIn );
 		}
 		return constraintDescriptor;
 	}
@@ -430,11 +429,11 @@
 	 * @return A list of constraint descriptors for all constraint specified on the given class.
 	 */
 	private List<ConstraintDescriptorImpl<?>> findClassLevelConstraints(Class<?> beanClass) {
-		List<ConstraintDescriptorImpl<?>> metadata = new ArrayList<ConstraintDescriptorImpl<?>>();
+		List<ConstraintDescriptorImpl<?>> metaData = new ArrayList<ConstraintDescriptorImpl<?>>();
 		for ( Annotation annotation : beanClass.getAnnotations() ) {
-			metadata.addAll( findConstraintAnnotations( beanClass, annotation ) );
+			metaData.addAll( findConstraintAnnotations( beanClass, annotation, ElementType.TYPE ) );
 		}
-		return metadata;
+		return metaData;
 	}
 
 
@@ -443,20 +442,30 @@
 	 * constraint descriptors.
 	 *
 	 * @param member The fields or method to check for constraints annotations.
+	 * @param type The element type the constraint/annotation is placed on.
 	 *
 	 * @return A list of constraint descriptors for all constraint specified for the given field or method.
 	 */
-	private List<ConstraintDescriptorImpl<?>> findConstraints(Member member) {
+	private List<ConstraintDescriptorImpl<?>> findConstraints(Member member, ElementType type) {
 		assert member instanceof Field || member instanceof Method;
 
-		List<ConstraintDescriptorImpl<?>> metadata = new ArrayList<ConstraintDescriptorImpl<?>>();
+		List<ConstraintDescriptorImpl<?>> metaData = new ArrayList<ConstraintDescriptorImpl<?>>();
 		for ( Annotation annotation : ( ( AnnotatedElement ) member ).getAnnotations() ) {
-			metadata.addAll( findConstraintAnnotations( member.getDeclaringClass(), annotation ) );
+			metaData.addAll( findConstraintAnnotations( member.getDeclaringClass(), annotation, type ) );
 		}
 
-		return metadata;
+		return metaData;
 	}
 
+	private ConstraintOrigin determineOrigin(Class<?> clazz) {
+		if ( clazz.equals( beanClass ) ) {
+			return ConstraintOrigin.DEFINED_LOCALLY;
+		}
+		else {
+			return ConstraintOrigin.DEFINED_IN_HIERARCHY;
+		}
+	}
+
 	@Override
 	public String toString() {
 		final StringBuilder sb = new StringBuilder();

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintDescriptorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintDescriptorImpl.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintDescriptorImpl.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -19,6 +19,7 @@
 
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
@@ -102,14 +103,28 @@
 	private final boolean isReportAsSingleInvalidConstraint;
 
 	/**
+	 * Describes on which level (<code>TYPE</code>, <code>METHOD</code>, <code>FIELD</code>) the constraint was
+	 * defined on.
+	 */
+	private final ElementType elementType;
+
+	/**
+	 * The oririgin of the constraint. Defined on the actual root class or somehwere in the class hierarchy
+	 */
+	private final ConstraintOrigin definedOn;
+
+
+	/**
 	 * Handle to the built-in constraint implementations.
 	 */
 	//TODO Can be made transient since it is only used during object construction. It would be better if we would not have to pass it at all
 	private transient final ConstraintHelper constraintHelper;
 
-	public ConstraintDescriptorImpl(T annotation, ConstraintHelper constraintHelper, Class<?> implicitGroup) {
+	public ConstraintDescriptorImpl(T annotation, ConstraintHelper constraintHelper, Class<?> implicitGroup, ElementType type, ConstraintOrigin definedOn) {
 		this.annotation = annotation;
 		this.constraintHelper = constraintHelper;
+		this.elementType = type;
+		this.definedOn = definedOn;
 		this.isReportAsSingleInvalidConstraint = annotation.annotationType().isAnnotationPresent(
 				ReportAsSingleViolation.class
 		);
@@ -123,8 +138,8 @@
 		this.composingConstraints = parseComposingConstraints();
 	}
 
-	public ConstraintDescriptorImpl(T annotation, ConstraintHelper constraintHelper) {
-		this( annotation, constraintHelper, null );
+	public ConstraintDescriptorImpl(T annotation, ConstraintHelper constraintHelper, ElementType type, ConstraintOrigin definedOn) {
+		this( annotation, constraintHelper, null, type, definedOn );
 	}
 
 	private Set<Class<? extends Payload>> buildPayloadSet(T annotation) {
@@ -243,16 +258,28 @@
 		return isReportAsSingleInvalidConstraint;
 	}
 
+	public ElementType getElementType() {
+		return elementType;
+	}
+
+	public ConstraintOrigin getDefinedOn() {
+		return definedOn;
+	}
+
 	@Override
 	public String toString() {
-		return "ConstraintDescriptorImpl{" +
-				"annotation=" + annotation +
-				", constraintValidatorDefinitionClasses=" + constraintValidatorDefinitionClasses.toString() +
-				", groups=" + groups +
-				", attributes=" + attributes +
-				", composingConstraints=" + composingConstraints +
-				", isReportAsSingleInvalidConstraint=" + isReportAsSingleInvalidConstraint +
-				'}';
+		final StringBuilder sb = new StringBuilder();
+		sb.append( "ConstraintDescriptorImpl" );
+		sb.append( "{annotation=" ).append( annotation.annotationType().getName() );
+		sb.append( ", payloads=" ).append( payloads );
+		sb.append( ", hasComposingConstraints=" ).append( composingConstraints.isEmpty() );
+		sb.append( ", isReportAsSingleInvalidConstraint=" ).append( isReportAsSingleInvalidConstraint );
+		sb.append( ", elementType=" ).append( elementType );
+		sb.append( ", definedOn=" ).append( definedOn );
+		sb.append( ", groups=" ).append( groups );
+		sb.append( ", attributes=" ).append( attributes );		
+		sb.append( '}' );
+		return sb.toString();
 	}
 
 	private Map<String, Object> buildAnnotationParameterMap(Annotation annotation) {
@@ -430,7 +457,7 @@
 
 		U annotationProxy = AnnotationFactory.create( annotationDescriptor );
 		return new ConstraintDescriptorImpl<U>(
-				annotationProxy, constraintHelper
+				annotationProxy, constraintHelper, elementType, definedOn
 		);
 	}
 

Added: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintOrigin.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintOrigin.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintOrigin.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -0,0 +1,35 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validator.metadata;
+
+/**
+ * Visibility looked at when discovering constraints.
+ *
+ * @author Hardy Ferentschik
+ */
+public enum ConstraintOrigin {
+	/**
+	 * Constraint is defined on the root class
+	 */
+	DEFINED_LOCALLY,
+
+	/**
+	 * Constraint is defined in a super-class or interface of the root class.
+	 */
+	DEFINED_IN_HIERARCHY
+}
\ No newline at end of file


Property changes on: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ConstraintOrigin.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ElementDescriptorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ElementDescriptorImpl.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/ElementDescriptorImpl.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -17,13 +17,16 @@
 */
 package org.hibernate.validator.metadata;
 
+import java.lang.annotation.ElementType;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.ElementDescriptor;
+import javax.validation.metadata.Scope;
 
 import org.hibernate.validator.engine.groups.Group;
 import org.hibernate.validator.engine.groups.GroupChain;
@@ -37,13 +40,13 @@
  */
 public class ElementDescriptorImpl implements ElementDescriptor {
 	private final Class<?> type;
-	private final Set<ConstraintDescriptor<?>> constraintDescriptors = new HashSet<ConstraintDescriptor<?>>();
+	private final Set<ConstraintDescriptorImpl<?>> constraintDescriptors = new HashSet<ConstraintDescriptorImpl<?>>();
 
 	public ElementDescriptorImpl(Class<?> type) {
 		this.type = type;
 	}
 
-	public void addConstraintDescriptor(ConstraintDescriptor constraintDescriptor) {
+	public void addConstraintDescriptor(ConstraintDescriptorImpl constraintDescriptor) {
 		constraintDescriptors.add( constraintDescriptor );
 	}
 
@@ -56,25 +59,83 @@
 	}
 
 	public Set<ConstraintDescriptor<?>> getConstraintDescriptors() {
-		return Collections.unmodifiableSet( constraintDescriptors );
+		return findConstraints().getConstraintDescriptors();
 	}
 
-	public Set<ConstraintDescriptor<?>> getUnorderedConstraintDescriptorsMatchingGroups(Class<?>... groups) {
-		Set<ConstraintDescriptor<?>> matchingDescriptors = new HashSet<ConstraintDescriptor<?>>();
-		GroupChain groupChain = new GroupChainGenerator().getGroupChainFor( Arrays.asList( groups ) );
-		Iterator<Group> groupIterator = groupChain.getGroupIterator();
-		while ( groupIterator.hasNext() ) {
-			Group g = groupIterator.next();
-			addMatchingDescriptorsForGroup( g.getGroup(), matchingDescriptors );
-		}
-		return Collections.unmodifiableSet( matchingDescriptors );
+	public ConstraintFinder findConstraints() {
+		return new ConstraintFinderImpl();
 	}
 
-	private void addMatchingDescriptorsForGroup(Class<?> group, Set<ConstraintDescriptor<?>> matchingDescriptors) {
-		for ( ConstraintDescriptor<?> descriptor : constraintDescriptors ) {
-			if ( descriptor.getGroups().contains( group ) ) {
-				matchingDescriptors.add( descriptor );
+	private class ConstraintFinderImpl implements ConstraintFinder {
+		private List<Class<?>> groups;
+		private Set<ConstraintOrigin> definedInSet;
+		private Set<ElementType> elementTypes;
+
+		ConstraintFinderImpl() {
+			elementTypes = new HashSet<ElementType>();
+			elementTypes.add( ElementType.TYPE );
+			elementTypes.add( ElementType.METHOD );
+			elementTypes.add( ElementType.FIELD );
+			definedInSet = new HashSet<ConstraintOrigin>();
+			definedInSet.add( ConstraintOrigin.DEFINED_LOCALLY );
+			definedInSet.add( ConstraintOrigin.DEFINED_IN_HIERARCHY );
+			groups = Collections.emptyList();
+		}
+
+		public ConstraintFinder unorderedAndMatchingGroups(Class<?>... classes) {
+			this.groups = Arrays.asList( classes );
+			return this;
+		}
+
+		public ConstraintFinder lookingAt(Scope visibility) {
+			if ( visibility.equals( Scope.LOCAL_ELEMENT ) ) {
+				definedInSet.remove( ConstraintOrigin.DEFINED_IN_HIERARCHY );
 			}
+			return this;
 		}
+
+		public ConstraintFinder declaredOn(ElementType... elementTypes) {
+			this.elementTypes.clear();
+			this.elementTypes.addAll( Arrays.asList( elementTypes ) );
+			return this;
+		}
+
+		public Set<ConstraintDescriptor<?>> getConstraintDescriptors() {
+
+			Set<ConstraintDescriptor<?>> matchingDescriptors = new HashSet<ConstraintDescriptor<?>>();
+			findMatchingDescriptors( matchingDescriptors );
+			return Collections.unmodifiableSet( matchingDescriptors );
+		}
+
+		private void findMatchingDescriptors(Set<ConstraintDescriptor<?>> matchingDescriptors) {
+			if ( !groups.isEmpty() ) {
+				GroupChain groupChain = new GroupChainGenerator().getGroupChainFor( groups );
+				Iterator<Group> groupIterator = groupChain.getGroupIterator();
+				while ( groupIterator.hasNext() ) {
+					Group g = groupIterator.next();
+					addMatchingDescriptorsForGroup( g.getGroup(), matchingDescriptors );
+				}
+			}
+			else {
+				for ( ConstraintDescriptorImpl<?> descriptor : constraintDescriptors ) {
+					if ( definedInSet.contains( descriptor.getDefinedOn() ) && elementTypes.contains( descriptor.getElementType() ) ) {
+						matchingDescriptors.add( descriptor );
+					}
+				}
+			}
+		}
+
+		public boolean hasConstraints() {
+			return getConstraintDescriptors().size() != 0;
+		}
+
+		private void addMatchingDescriptorsForGroup(Class<?> group, Set<ConstraintDescriptor<?>> matchingDescriptors) {
+			for ( ConstraintDescriptorImpl<?> descriptor : constraintDescriptors ) {
+				if ( definedInSet.contains( descriptor.getDefinedOn() ) && elementTypes.contains( descriptor.getElementType() )
+						&& descriptor.getGroups().contains( group ) ) {
+					matchingDescriptors.add( descriptor );
+				}
+			}
+		}
 	}
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/MetaConstraint.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/MetaConstraint.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/metadata/MetaConstraint.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -19,7 +19,6 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
-import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
@@ -28,7 +27,6 @@
 import java.util.Set;
 import javax.validation.ConstraintViolation;
 import javax.validation.ValidationException;
-import javax.validation.metadata.ConstraintDescriptor;
 
 import org.hibernate.validator.engine.ConstraintTree;
 import org.hibernate.validator.engine.GlobalExecutionContext;
@@ -55,12 +53,6 @@
 	private final String propertyName;
 
 	/**
-	 * Describes on which level (<code>TYPE</code>, <code>METHOD</code>, <code>FIELD</code>) the constraint was
-	 * defined on.
-	 */
-	private final ElementType elementType;
-
-	/**
 	 * The class of the bean hosting this constraint.
 	 */
 	private final Class<T> beanClass;
@@ -70,36 +62,27 @@
 	 */
 	private final ConstraintTree<A> constraintTree;
 
-	public MetaConstraint(Class<T> beanClass, ConstraintDescriptor<A> constraintDescriptor) {
-		this.elementType = ElementType.TYPE;
-		this.member = null;
-		this.propertyName = null;
-		this.beanClass = beanClass;
-		constraintTree = new ConstraintTree<A>( constraintDescriptor );
-	}
-
-	public MetaConstraint(Member member, Class<T> beanClass, ConstraintDescriptor<A> constraintDescriptor) {
-		if ( member instanceof Method ) {
-			this.elementType = ElementType.METHOD;
-		}
-		else if ( member instanceof Field ) {
-			this.elementType = ElementType.FIELD;
-		}
-		else {
-			throw new IllegalArgumentException( "Non allowed member type: " + member );
-		}
+	/**
+	 * @param beanClass The class in which the constraint is defined on
+	 * @param member The member on which the constraint is defined on, {@code null} if it is a class constraint}
+	 * @param constraintDescriptor The constraint descriptor for this constraint
+	 */
+	public MetaConstraint(Class<T> beanClass, Member member, ConstraintDescriptorImpl<A> constraintDescriptor) {
 		this.member = member;
-		this.propertyName = ReflectionHelper.getPropertyName( member );
-		if ( member instanceof Method && propertyName == null ) { // can happen if member is a Method which does not follow the bean convention
-			throw new ValidationException(
-					"Annotated methods must follow the JavaBeans naming convention. " + member.getName() + "() does not."
-			);
+		if ( this.member != null ) {
+			this.propertyName = ReflectionHelper.getPropertyName( member );
+			if ( member instanceof Method && propertyName == null ) { // can happen if member is a Method which does not follow the bean convention
+				throw new ValidationException(
+						"Annotated methods must follow the JavaBeans naming convention. " + member.getName() + "() does not."
+				);
+			}
+		} else {
+			this.propertyName = null;
 		}
 		this.beanClass = beanClass;
 		constraintTree = new ConstraintTree<A>( constraintDescriptor );
 	}
 
-
 	/**
 	 * @return Returns the list of groups this constraint is part of. This might include the default group even when
 	 *         it is not explicitly specified, but part of the redefined default group list of the hosting bean.
@@ -108,7 +91,7 @@
 		return constraintTree.getDescriptor().getGroups();
 	}
 
-	public ConstraintDescriptor<A> getDescriptor() {
+	public ConstraintDescriptorImpl<A> getDescriptor() {
 		return constraintTree.getDescriptor();
 	}
 
@@ -129,12 +112,12 @@
 	}
 
 	public ElementType getElementType() {
-		return elementType;
+		return constraintTree.getDescriptor().getElementType();
 	}
 
 	public <T, U, V> boolean validateConstraint(GlobalExecutionContext<T> executionContext, LocalExecutionContext<U, V> localExecutionContext) {
 		List<ConstraintViolation<T>> constraintViolations = new ArrayList<ConstraintViolation<T>>();
-		localExecutionContext.setElementType( elementType );
+		localExecutionContext.setElementType( getElementType() );
 		constraintTree.validateConstraints(
 				typeOfAnnotatedElement(), executionContext, localExecutionContext, constraintViolations
 		);
@@ -152,7 +135,7 @@
 	 *         is returned of method or field access is used to access the value.
 	 */
 	public Object getValue(Object o) {
-		switch ( elementType ) {
+		switch ( getElementType() ) {
 			case TYPE: {
 				return o;
 			}
@@ -164,7 +147,7 @@
 
 	private Type typeOfAnnotatedElement() {
 		Type t;
-		switch ( elementType ) {
+		switch ( getElementType() ) {
 			case TYPE: {
 				t = beanClass;
 				break;
@@ -183,9 +166,9 @@
 	public String toString() {
 		final StringBuilder sb = new StringBuilder();
 		sb.append( "MetaConstraint" );
-		sb.append( "{propertyName='" ).append( propertyName ).append( '\'' );
-		sb.append( ", elementType=" ).append( elementType );
-		sb.append( ", beanClass=" ).append( beanClass );
+		sb.append( "{beanClass=" ).append( beanClass );
+		sb.append( ", member=" ).append( member );
+		sb.append( ", propertyName='" ).append( propertyName ).append( '\'' );
 		sb.append( '}' );
 		return sb.toString();
 	}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/xml/XmlMappingParser.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/xml/XmlMappingParser.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/xml/XmlMappingParser.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -52,6 +52,7 @@
 import org.hibernate.validator.metadata.AnnotationIgnores;
 import org.hibernate.validator.metadata.ConstraintDescriptorImpl;
 import org.hibernate.validator.metadata.ConstraintHelper;
+import org.hibernate.validator.metadata.ConstraintOrigin;
 import org.hibernate.validator.metadata.MetaConstraint;
 import org.hibernate.validator.util.ContainsField;
 import org.hibernate.validator.util.ContainsMethod;
@@ -404,18 +405,21 @@
 			);
 		}
 
+		java.lang.annotation.ElementType type = java.lang.annotation.ElementType.TYPE;
+		if ( member instanceof Method ) {
+			type = java.lang.annotation.ElementType.METHOD;
+		}
+		else if ( member instanceof Field ) {
+			type = java.lang.annotation.ElementType.FIELD;
+		}
+
+		// we set initially ConstraintOrigin.DEFINED_LOCALLY for all xml configured constraints
+		// later we will make copies of this constraint descriptor when needed and adjust the ConstraintOrigin
 		ConstraintDescriptorImpl<A> constraintDescriptor = new ConstraintDescriptorImpl<A>(
-				annotation, constraintHelper
+				annotation, constraintHelper, type, ConstraintOrigin.DEFINED_LOCALLY
 		);
 
-		MetaConstraint<T, A> metaConstraint;
-		if ( member == null ) {
-			metaConstraint = new MetaConstraint<T, A>( beanClass, constraintDescriptor );
-		}
-		else {
-			metaConstraint = new MetaConstraint<T, A>( member, beanClass, constraintDescriptor );
-		}
-		return metaConstraint;
+		return new MetaConstraint<T, A>( beanClass, member, constraintDescriptor );
 	}
 
 	private <A extends Annotation> Class<?> getAnnotationParameterType(Class<A> annotationClass, String name) {

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/engine/messageinterpolation/ResourceBundleMessageInterpolatorTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/engine/messageinterpolation/ResourceBundleMessageInterpolatorTest.java	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/engine/messageinterpolation/ResourceBundleMessageInterpolatorTest.java	2009-10-04 11:12:10 UTC (rev 17618)
@@ -37,6 +37,7 @@
 import org.hibernate.validator.engine.ResourceBundleMessageInterpolator;
 import org.hibernate.validator.metadata.ConstraintDescriptorImpl;
 import org.hibernate.validator.metadata.ConstraintHelper;
+import org.hibernate.validator.metadata.ConstraintOrigin;
 import org.hibernate.validator.util.annotationfactory.AnnotationDescriptor;
 import org.hibernate.validator.util.annotationfactory.AnnotationFactory;
 
@@ -59,13 +60,16 @@
 		AnnotationDescriptor<NotNull> descriptor = new AnnotationDescriptor<NotNull>( NotNull.class );
 		notNull = AnnotationFactory.create( descriptor );
 		notNullDescriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new ConstraintHelper()
+				notNull,
+				new ConstraintHelper(),
+				java.lang.annotation.ElementType.FIELD,
+				ConstraintOrigin.DEFINED_LOCALLY
 		);
 
 		AnnotationDescriptor<Size> sizeAnnotationDescriptor = new AnnotationDescriptor<Size>( Size.class );
 		size = AnnotationFactory.create( sizeAnnotationDescriptor );
 		sizeDescriptor = new ConstraintDescriptorImpl<Size>(
-				size, new ConstraintHelper()
+				size, new ConstraintHelper(), java.lang.annotation.ElementType.FIELD, ConstraintOrigin.DEFINED_LOCALLY
 		);
 	}
 
@@ -200,7 +204,7 @@
 
 
 		ConstraintDescriptorImpl<Max> constraintDescriptor = new ConstraintDescriptorImpl<Max>(
-				max, new ConstraintHelper()
+				max, new ConstraintHelper(), java.lang.annotation.ElementType.FIELD, ConstraintOrigin.DEFINED_LOCALLY
 		);
 
 		interpolator = new ResourceBundleMessageInterpolator( new TestResourceBundle() );
@@ -226,7 +230,7 @@
 
 
 		ConstraintDescriptorImpl<Max> constraintDescriptor = new ConstraintDescriptorImpl<Max>(
-				max, new ConstraintHelper()
+				max, new ConstraintHelper(), java.lang.annotation.ElementType.FIELD, ConstraintOrigin.DEFINED_LOCALLY
 		);
 
 		interpolator = new ResourceBundleMessageInterpolator( new TestResourceBundle() );

Modified: validator/trunk/hibernate-validator/src/test/suite/unit-tests.xml
===================================================================
--- validator/trunk/hibernate-validator/src/test/suite/unit-tests.xml	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/hibernate-validator/src/test/suite/unit-tests.xml	2009-10-04 11:12:10 UTC (rev 17618)
@@ -8,8 +8,9 @@
             <package name="org.hibernate.validator.constraints.impl"/>
             <package name="org.hibernate.validator.constraints.composition"/>
             <package name="org.hibernate.validator.engine"/>
+            <package name="org.hibernate.validator.engine.groups"/>
             <package name="org.hibernate.validator.engine.messageinterpolation"/>
-            <package name="org.hibernate.validator.engine.groups"/>
+            <package name="org.hibernate.validator.engine.serialization"/>
             <package name="org.hibernate.validator.engine.traversableresolver"/>
             <package name="org.hibernate.validator.metadata"/>
             <package name="org.hibernate.validator.util"/>

Modified: validator/trunk/pom.xml
===================================================================
--- validator/trunk/pom.xml	2009-10-03 17:53:41 UTC (rev 17617)
+++ validator/trunk/pom.xml	2009-10-04 11:12:10 UTC (rev 17618)
@@ -47,7 +47,7 @@
             <dependency>
                 <groupId>javax.validation</groupId>
                 <artifactId>validation-api</artifactId>
-                <version>1.0.0.GA</version>
+                <version>1.0.0.GA-SNAPSHOT</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>



More information about the hibernate-commits mailing list