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
+ */
+@Documented
+@Target({METHOD, FIELD})
+@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";
Show replies by date