[hibernate-commits] Hibernate SVN: r11197 - in branches/Branch_3_2/HibernateExt/validator/src: test/org/hibernate/validator/test and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Feb 13 13:42:45 EST 2007


Author: epbernard
Date: 2007-02-13 13:42:44 -0500 (Tue, 13 Feb 2007)
New Revision: 11197

Added:
   branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java
   branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java
Modified:
   branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java
   branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java
Log:
ANN-513 support for validations like @MyValidators({@MyValidator(...)})

Modified: branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java	2007-02-13 05:33:27 UTC (rev 11196)
+++ branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java	2007-02-13 18:42:44 UTC (rev 11197)
@@ -205,6 +205,7 @@
 				Annotation classAnnotation = classAnnotations[i];
 				Validator beanValidator = createValidator( classAnnotation );
 				if ( beanValidator != null ) beanValidators.add( beanValidator );
+				handleAggregateAnnotations(classAnnotation, null);
 			}
 		}
 
@@ -236,6 +237,47 @@
 		}
 	}
 
+	private boolean handleAggregateAnnotations(Annotation annotation, XMember member) {
+		Object[] values;
+		try {
+			Method valueMethod = annotation.getClass().getMethod( "value" );
+			if ( valueMethod.getReturnType().isArray() ) {
+				values = (Object[]) valueMethod.invoke( annotation );
+			}
+			else {
+				return false;
+			}
+		}
+		catch (NoSuchMethodException e) {
+			return false;
+		}
+		catch (Exception e) {
+			throw new IllegalStateException( e );
+		}
+
+		boolean validatorPresent = false;
+		for ( Object value : values ) {
+			if ( value instanceof Annotation ) {
+				annotation = (Annotation) value;
+				Validator validator = createValidator( annotation );
+				if ( validator != null ) {
+					if ( member != null ) {
+						//member
+						memberValidators.add( validator );
+						setAccessible( member );
+						memberGetters.add( member );
+					}
+					else {
+						//bean
+						beanValidators.add( validator );
+					}
+					validatorPresent = true;
+				}
+			}
+		}
+		return validatorPresent;
+	}
+
 	@SuppressWarnings("unchecked")
 	private void createChildValidator( XMember member) {
 		if ( member.isAnnotationPresent( Valid.class ) ) {
@@ -249,6 +291,7 @@
 				clazz = member.getType();
 			}
 			if ( !childClassValidators.containsKey( clazz ) ) {
+				//ClassValidator added by side effect (added to childClassValidators during CV construction)
 				new ClassValidator( clazz, messageBundle, userInterpolator, childClassValidators, reflectionManager );
 			}
 		}
@@ -257,8 +300,7 @@
 	private void createMemberValidator(XMember member) {
 		boolean validatorPresent = false;
 		Annotation[] memberAnnotations = member.getAnnotations();
-		for ( int j = 0; j < memberAnnotations.length ; j++ ) {
-			Annotation methodAnnotation = memberAnnotations[j];
+		for ( Annotation methodAnnotation : memberAnnotations ) {
 			Validator propertyValidator = createValidator( methodAnnotation );
 			if ( propertyValidator != null ) {
 				memberValidators.add( propertyValidator );
@@ -266,6 +308,8 @@
 				memberGetters.add( member );
 				validatorPresent = true;
 			}
+			boolean agrValidPresent = handleAggregateAnnotations( methodAnnotation, member );
+			validatorPresent = validatorPresent || agrValidPresent;
 		}
 		if ( validatorPresent && !member.isTypeResolved() ) {
 			log.warn( "Original type of property " + member + " is unbound and has been approximated." );

Added: branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java	2007-02-13 18:42:44 UTC (rev 11197)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+/**
+ * The annotated element must follow the list of regexp patterns
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Patterns {
+	Pattern[] value();
+}

Added: branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java	2007-02-13 18:42:44 UTC (rev 11197)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.Patterns;
+import org.hibernate.validator.Pattern;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Engine {
+	@Patterns( {
+			@Pattern(regex = "^[A-Z0-9-]+$", message = "must contain alphabetical characters only"),
+			@Pattern(regex = "^....-....-....$", message="must match ....-....-....")
+			} )
+	private String serialNumber;
+	private long horsePower;
+
+
+	public String getSerialNumber() {
+		return serialNumber;
+	}
+
+	public void setSerialNumber(String serialNumber) {
+		this.serialNumber = serialNumber;
+	}
+
+	public long getHorsePower() {
+		return horsePower;
+	}
+
+	public void setHorsePower(long horsePower) {
+		this.horsePower = horsePower;
+	}
+}

Modified: branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java	2007-02-13 05:33:27 UTC (rev 11196)
+++ branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java	2007-02-13 18:42:44 UTC (rev 11197)
@@ -101,6 +101,19 @@
 		assertEquals( 1, invalidValues.length );
 	}
 
+	public void testAggregationAnnotations() throws Exception {
+		Engine eng = new Engine();
+		eng.setHorsePower( 23 );
+		eng.setSerialNumber( "23-43###4" );
+		ClassValidator<Engine> classValidator = new ClassValidator<Engine>( Engine.class );
+		InvalidValue[] invalidValues = classValidator.getInvalidValues( eng );
+		assertEquals( 2, invalidValues.length );
+
+		eng.setSerialNumber( "1234-5678-9012");
+		invalidValues = classValidator.getInvalidValues( eng );
+		assertEquals( 0, invalidValues.length );
+	}
+
 	public void testDefaultResourceBundle() throws Exception {
 		Tv tv = new Tv();
 		tv.serial = "FS";




More information about the hibernate-commits mailing list