Author: hardy.ferentschik
Date: 2009-02-25 08:09:51 -0500 (Wed, 25 Feb 2009)
New Revision: 16031
Added:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java
Removed:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java
Log:
HV-113 Implemented redefining of default group for validate, validateValue and
validateProperty
HV-121 Added support for javax.validation.Pattern and removed obsolete classes
Deleted:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,50 +0,0 @@
-// $Id$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, 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.validation.constraints;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import javax.validation.Constraint;
-
-/**
- * @author Hardy Ferentschik
- */
-@Documented
-@Constraint(validatedBy = PatternValidator.class)
-@Target({ METHOD, FIELD })
-@Retention(RUNTIME)
-public @interface Pattern {
- String message() default "{validator.pattern}";
-
- Class<?>[] groups() default { };
-
- /**
- * @return the regular expression the annotated string must match.
- */
- String regex();
-
- /**
- * @return Additioanl regular expression processing flags. Default is 0.
- */
- int flags() default 0;
-}
-
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -20,6 +20,7 @@
import java.util.regex.Matcher;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.Pattern;
/**
* @author Hardy Ferentschik
@@ -29,10 +30,17 @@
private java.util.regex.Pattern pattern;
public void initialize(Pattern parameters) {
- pattern = java.util.regex.Pattern.compile(
- parameters.regex(),
- parameters.flags()
- );
+ Pattern.Flag flags[] = parameters.flags();
+ if ( flags.length == 0 ) {
+ pattern = java.util.regex.Pattern.compile( parameters.regexp() );
+ }
+ else {
+ int intFlag = 0;
+ for ( Pattern.Flag flag : flags ) {
+ intFlag = intFlag | mapFlagToInt( flag );
+ }
+ pattern = java.util.regex.Pattern.compile( parameters.regexp(), intFlag );
+ }
}
public boolean isValid(String value, ConstraintValidatorContext
constraintValidatorContext) {
@@ -42,4 +50,39 @@
Matcher m = pattern.matcher( value );
return m.matches();
}
+
+ private int mapFlagToInt(Pattern.Flag flag) {
+ int intFlag = 0;
+ switch ( flag ) {
+ case UNIX_LINES: {
+ intFlag = java.util.regex.Pattern.UNIX_LINES;
+ break;
+ }
+ case CASE_INSENSITIVE: {
+ intFlag = java.util.regex.Pattern.CASE_INSENSITIVE;
+ break;
+ }
+ case COMMENTS: {
+ intFlag = java.util.regex.Pattern.COMMENTS;
+ break;
+ }
+ case MULTILINE: {
+ intFlag = java.util.regex.Pattern.MULTILINE;
+ break;
+ }
+ case DOTALL: {
+ intFlag = java.util.regex.Pattern.DOTALL;
+ break;
+ }
+ case UNICODE_CASE: {
+ intFlag = java.util.regex.Pattern.UNICODE_CASE;
+ break;
+ }
+ case CANON_EQ: {
+ intFlag = java.util.regex.Pattern.CANON_EQ;
+ break;
+ }
+ }
+ return intFlag;
+ }
}
Deleted:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,36 +0,0 @@
-// $Id$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, 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.validation.constraints;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * @author Hardy Ferentschik
- */
-@Documented
-@Target({ METHOD, FIELD, TYPE })
-@Retention(RUNTIME)
-public @interface Patterns {
- Pattern[] value();
-}
\ No newline at end of file
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -67,7 +67,7 @@
* @return A list of <code>MetaConstraint</code> instances encapsulating the
information of all the constraints
* defined on the bean.
*/
- List<MetaConstraint> geMetaConstraintList();
+ List<MetaConstraint<T>> geMetaConstraintList();
/**
* @return A map keying the property name of a constraint to its
<code>ElementDescriptor</code>.
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -63,7 +63,7 @@
/**
* List of constraints.
*/
- private List<MetaConstraint> metaConstraintList = new
ArrayList<MetaConstraint>();
+ private List<MetaConstraint<T>> metaConstraintList = new
ArrayList<MetaConstraint<T>>();
/**
* List of cascaded fields.
@@ -85,11 +85,14 @@
*/
private List<Class<?>> defaultGroupSequence = new
ArrayList<Class<?>>();
- private final BuiltinConstraints builtinConstraints;
+ /**
+ * Object keeping track of all builtin constraints.
+ */
+ private final ConstraintHelper constraintHelper;
- public BeanMetaDataImpl(Class<T> beanClass, BuiltinConstraints builtinConstraints)
{
+ public BeanMetaDataImpl(Class<T> beanClass, ConstraintHelper constraintHelper) {
this.beanClass = beanClass;
- this.builtinConstraints = builtinConstraints;
+ this.constraintHelper = constraintHelper;
createMetaData();
}
@@ -173,7 +176,7 @@
List<ConstraintDescriptorImpl> fieldMetadata = findFieldLevelConstraints( field
);
for ( ConstraintDescriptorImpl constraintDescription : fieldMetadata ) {
ReflectionHelper.setAccessibility( field );
- MetaConstraint metaConstraint = new MetaConstraint( field, constraintDescription );
+ MetaConstraint<T> metaConstraint = new MetaConstraint<T>( field,
beanClass, constraintDescription );
metaConstraintList.add( metaConstraint );
}
if ( field.isAnnotationPresent( Valid.class ) ) {
@@ -188,7 +191,7 @@
List<ConstraintDescriptorImpl> methodMetadata = findMethodLevelConstraints(
method );
for ( ConstraintDescriptorImpl constraintDescription : methodMetadata ) {
ReflectionHelper.setAccessibility( method );
- MetaConstraint metaConstraint = new MetaConstraint( method, constraintDescription );
+ MetaConstraint<T> metaConstraint = new MetaConstraint<T>( method,
beanClass, constraintDescription );
metaConstraintList.add( metaConstraint );
}
if ( method.isAnnotationPresent( Valid.class ) ) {
@@ -201,7 +204,7 @@
private void initClassConstraints(Class clazz) {
List<ConstraintDescriptorImpl> classMetadata = findClassLevelConstraints( clazz
);
for ( ConstraintDescriptorImpl constraintDescription : classMetadata ) {
- MetaConstraint metaConstraint = new MetaConstraint( clazz, constraintDescription );
+ MetaConstraint<T> metaConstraint = new MetaConstraint<T>( clazz,
constraintDescription );
metaConstraintList.add( metaConstraint );
}
}
@@ -218,13 +221,13 @@
List<ConstraintDescriptorImpl> constraintDescriptors = new
ArrayList<ConstraintDescriptorImpl>();
List<Annotation> constraints = new ArrayList<Annotation>();
- if ( ReflectionHelper.isConstraintAnnotation( annotation ) ||
- ReflectionHelper.isBuiltInConstraintAnnotation( annotation ) ) {
+ if ( constraintHelper.isConstraintAnnotation( annotation ) ||
+ constraintHelper.isBuiltinConstraint( annotation ) ) {
constraints.add( annotation );
}
// check if we have a multi value constraint
- constraints.addAll( ReflectionHelper.getMultiValueConstraints( annotation ) );
+ constraints.addAll( constraintHelper.getMultiValueConstraints( annotation ) );
for ( Annotation constraint : constraints ) {
final ConstraintDescriptorImpl constraintDescriptor = buildConstraintDescriptor(
constraint );
@@ -236,7 +239,7 @@
@SuppressWarnings("unchecked")
private <A extends Annotation> ConstraintDescriptorImpl
buildConstraintDescriptor(A annotation) {
Class<?>[] groups = ReflectionHelper.getAnnotationParameter( annotation,
"groups", Class[].class );
- return new ConstraintDescriptorImpl( annotation, groups, builtinConstraints );
+ return new ConstraintDescriptorImpl( annotation, groups, constraintHelper );
}
/**
@@ -346,7 +349,7 @@
return cascadedMembers;
}
- public List<MetaConstraint> geMetaConstraintList() {
+ public List<MetaConstraint<T>> geMetaConstraintList() {
return metaConstraintList;
}
Deleted:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,129 +0,0 @@
-// $Id$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, 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.validation.engine;
-
-import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.validation.ConstraintValidator;
-import javax.validation.ValidationException;
-import javax.validation.constraints.AssertFalse;
-import javax.validation.constraints.AssertTrue;
-import javax.validation.constraints.Digits;
-import javax.validation.constraints.Future;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Null;
-import javax.validation.constraints.Size;
-import javax.validation.constraints.Past;
-
-import org.hibernate.validation.constraints.AssertFalseValidator;
-import org.hibernate.validation.constraints.AssertTrueValidator;
-import org.hibernate.validation.constraints.DigitsValidatorForNumber;
-import org.hibernate.validation.constraints.DigitsValidatorForString;
-import org.hibernate.validation.constraints.FutureValidatorForCalendar;
-import org.hibernate.validation.constraints.FutureValidatorForDate;
-import org.hibernate.validation.constraints.MaxValidatorForNumber;
-import org.hibernate.validation.constraints.MaxValidatorForString;
-import org.hibernate.validation.constraints.MinValidatorForNumber;
-import org.hibernate.validation.constraints.MinValidatorForString;
-import org.hibernate.validation.constraints.NotNullValidator;
-import org.hibernate.validation.constraints.NullValidator;
-import org.hibernate.validation.constraints.PastValidatorForCalendar;
-import org.hibernate.validation.constraints.PastValidatorForDate;
-import org.hibernate.validation.constraints.SizeValidatorForString;
-import org.hibernate.validation.constraints.SizeValidatorForCollection;
-import org.hibernate.validation.constraints.SizeValidatorForArray;
-import org.hibernate.validation.constraints.SizeValidatorForMap;
-
-/**
- * @author Hardy Ferentschik
- * @author Alaa Nassef
- */
-public class BuiltinConstraints {
-
- private final Map<Class<? extends Annotation>, List<Class<? extends
ConstraintValidator<?, ?>>>> builtinConstraints =
- new HashMap<Class<? extends Annotation>, List<Class<? extends
ConstraintValidator<?, ?>>>>();
-
- public BuiltinConstraints() {
-
- List<Class<? extends ConstraintValidator<?, ?>>> constraintList = new
ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
- constraintList.add( AssertFalseValidator.class );
- builtinConstraints.put( AssertFalse.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( AssertTrueValidator.class );
- builtinConstraints.put( AssertTrue.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( FutureValidatorForCalendar.class );
- constraintList.add( FutureValidatorForDate.class );
- builtinConstraints.put( Future.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( MaxValidatorForNumber.class );
- constraintList.add( MaxValidatorForString.class );
- builtinConstraints.put( Max.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( MinValidatorForNumber.class );
- constraintList.add( MinValidatorForString.class );
- builtinConstraints.put( Min.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( NotNullValidator.class );
- builtinConstraints.put( NotNull.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( NullValidator.class );
- builtinConstraints.put( Null.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( PastValidatorForCalendar.class );
- constraintList.add( PastValidatorForDate.class );
- builtinConstraints.put( Past.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( DigitsValidatorForString.class );
- constraintList.add( DigitsValidatorForNumber.class );
- builtinConstraints.put( Digits.class, constraintList );
-
- constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
- constraintList.add( SizeValidatorForString.class );
- constraintList.add( SizeValidatorForCollection.class );
- constraintList.add( SizeValidatorForArray.class );
- constraintList.add( SizeValidatorForMap.class );
- builtinConstraints.put( Size.class, constraintList );
-
-
- }
-
- public List<Class<? extends ConstraintValidator<?, ?>>>
getBuiltInConstraints(Annotation annotation) {
- List<Class<? extends ConstraintValidator<?, ?>>> constraints =
builtinConstraints.get( annotation.annotationType() );
-
- if ( constraints == null ) {
- throw new ValidationException( "Unable to find constraints for " +
annotation.annotationType() );
- }
-
- return constraints;
- }
-
-}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -40,7 +40,6 @@
import org.slf4j.Logger;
import org.hibernate.validation.util.LoggerFactory;
-import org.hibernate.validation.util.ReflectionHelper;
import org.hibernate.validation.util.annotationfactory.AnnotationDescriptor;
import org.hibernate.validation.util.annotationfactory.AnnotationFactory;
@@ -95,21 +94,21 @@
/**
* Handle to the builtin constraint implementations.
*/
- private final BuiltinConstraints builtinConstraints;
+ private final ConstraintHelper constraintHelper;
- public ConstraintDescriptorImpl(U annotation, Class<?>[] groups,
BuiltinConstraints builtinConstraints) {
- this( annotation, new HashSet<Class<?>>(), builtinConstraints );
+ public ConstraintDescriptorImpl(U annotation, Class<?>[] groups, ConstraintHelper
constraintHelper) {
+ this( annotation, new HashSet<Class<?>>(), constraintHelper );
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP;
}
this.groups.addAll( Arrays.asList( groups ) );
}
- public ConstraintDescriptorImpl(U annotation, Set<Class<?>> groups,
BuiltinConstraints builtinConstraints) {
+ public ConstraintDescriptorImpl(U annotation, Set<Class<?>> groups,
ConstraintHelper constraintHelper) {
this.annotation = annotation;
this.groups = groups;
this.parameters = getAnnotationParameters( annotation );
- this.builtinConstraints = builtinConstraints;
+ this.constraintHelper = constraintHelper;
this.isReportAsSingleInvalidConstraint =
annotation.annotationType().isAnnotationPresent(
ReportAsSingleViolation.class
@@ -122,8 +121,8 @@
}
private void findConstraintClasses() {
- if ( ReflectionHelper.isBuiltInConstraintAnnotation( annotation ) ) {
- constraintClasses.addAll( builtinConstraints.getBuiltInConstraints( annotation ) );
+ if ( constraintHelper.isBuiltinConstraint( annotation ) ) {
+ constraintClasses.addAll( constraintHelper.getBuiltInConstraints( annotation ) );
}
else {
Constraint constraint = annotation.annotationType().getAnnotation( Constraint.class
);
@@ -248,9 +247,8 @@
private void parseComposingConstraints() {
for ( Annotation declaredAnnotation :
annotation.annotationType().getDeclaredAnnotations() ) {
- if ( ReflectionHelper.isConstraintAnnotation( declaredAnnotation ) ||
ReflectionHelper.isBuiltInConstraintAnnotation(
- declaredAnnotation
- ) ) {
+ if ( constraintHelper.isConstraintAnnotation( declaredAnnotation )
+ || constraintHelper.isBuiltinConstraint( declaredAnnotation ) ) {
ConstraintDescriptorImpl descriptor = createComposingConstraintDescriptor(
OVERRIDES_PARAMETER_DEFAULT_INDEX,
declaredAnnotation
@@ -258,8 +256,8 @@
composingConstraints.add( descriptor );
log.debug( "Adding composing constraint: " + descriptor );
}
- else if ( ReflectionHelper.isMultiValueConstraint( declaredAnnotation ) ) {
- List<Annotation> multiValueConstraints =
ReflectionHelper.getMultiValueConstraints( declaredAnnotation );
+ else if ( constraintHelper.isMultiValueConstraint( declaredAnnotation ) ) {
+ List<Annotation> multiValueConstraints =
constraintHelper.getMultiValueConstraints( declaredAnnotation );
int index = 1;
for ( Annotation constraintAnnotation : multiValueConstraints ) {
ConstraintDescriptorImpl descriptor = createComposingConstraintDescriptor(
@@ -288,7 +286,7 @@
}
}
Annotation annotationProxy = AnnotationFactory.create( annotationDescriptor );
- return new ConstraintDescriptorImpl( annotationProxy, groups, builtinConstraints );
+ return new ConstraintDescriptorImpl( annotationProxy, groups, constraintHelper );
}
private class ClassIndexWrapper {
Copied:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
(from rev 16028,
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java)
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
(rev 0)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -0,0 +1,272 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, 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.validation.engine;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.validation.Constraint;
+import javax.validation.ConstraintValidator;
+import javax.validation.ValidationException;
+import javax.validation.constraints.AssertFalse;
+import javax.validation.constraints.AssertTrue;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.Future;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import javax.validation.constraints.Past;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+import org.slf4j.Logger;
+
+import org.hibernate.validation.constraints.AssertFalseValidator;
+import org.hibernate.validation.constraints.AssertTrueValidator;
+import org.hibernate.validation.constraints.DigitsValidatorForNumber;
+import org.hibernate.validation.constraints.DigitsValidatorForString;
+import org.hibernate.validation.constraints.FutureValidatorForCalendar;
+import org.hibernate.validation.constraints.FutureValidatorForDate;
+import org.hibernate.validation.constraints.MaxValidatorForNumber;
+import org.hibernate.validation.constraints.MaxValidatorForString;
+import org.hibernate.validation.constraints.MinValidatorForNumber;
+import org.hibernate.validation.constraints.MinValidatorForString;
+import org.hibernate.validation.constraints.NotNullValidator;
+import org.hibernate.validation.constraints.NullValidator;
+import org.hibernate.validation.constraints.PastValidatorForCalendar;
+import org.hibernate.validation.constraints.PastValidatorForDate;
+import org.hibernate.validation.constraints.PatternValidator;
+import org.hibernate.validation.constraints.SizeValidatorForArray;
+import org.hibernate.validation.constraints.SizeValidatorForCollection;
+import org.hibernate.validation.constraints.SizeValidatorForMap;
+import org.hibernate.validation.constraints.SizeValidatorForString;
+import org.hibernate.validation.util.LoggerFactory;
+import org.hibernate.validation.util.ReflectionHelper;
+
+/**
+ * Keeps track of builtin constraints and their validator implementations.
+ *
+ * @author Hardy Ferentschik
+ * @author Alaa Nassef
+ */
+public class ConstraintHelper {
+
+ private static final Logger log = LoggerFactory.make();
+
+ private final Map<Class<? extends Annotation>, List<Class<? extends
ConstraintValidator<?, ?>>>> builtinConstraints =
+ new HashMap<Class<? extends Annotation>, List<Class<? extends
ConstraintValidator<?, ?>>>>();
+
+ public ConstraintHelper() {
+
+ List<Class<? extends ConstraintValidator<?, ?>>> constraintList = new
ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+ constraintList.add( AssertFalseValidator.class );
+ builtinConstraints.put( AssertFalse.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( AssertTrueValidator.class );
+ builtinConstraints.put( AssertTrue.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( FutureValidatorForCalendar.class );
+ constraintList.add( FutureValidatorForDate.class );
+ builtinConstraints.put( Future.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( MaxValidatorForNumber.class );
+ constraintList.add( MaxValidatorForString.class );
+ builtinConstraints.put( Max.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( MinValidatorForNumber.class );
+ constraintList.add( MinValidatorForString.class );
+ builtinConstraints.put( Min.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( NotNullValidator.class );
+ builtinConstraints.put( NotNull.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( NullValidator.class );
+ builtinConstraints.put( Null.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( PastValidatorForCalendar.class );
+ constraintList.add( PastValidatorForDate.class );
+ builtinConstraints.put( Past.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( DigitsValidatorForString.class );
+ constraintList.add( DigitsValidatorForNumber.class );
+ builtinConstraints.put( Digits.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( SizeValidatorForString.class );
+ constraintList.add( SizeValidatorForCollection.class );
+ constraintList.add( SizeValidatorForArray.class );
+ constraintList.add( SizeValidatorForMap.class );
+ builtinConstraints.put( Size.class, constraintList );
+
+ constraintList = new ArrayList<Class<? extends ConstraintValidator<?,
?>>>();
+ constraintList.add( PatternValidator.class );
+ builtinConstraints.put( Pattern.class, constraintList );
+ }
+
+ public List<Class<? extends ConstraintValidator<?, ?>>>
getBuiltInConstraints(Annotation annotation) {
+ List<Class<? extends ConstraintValidator<?, ?>>> constraints =
builtinConstraints.get( annotation.annotationType() );
+
+ if ( constraints == null ) {
+ throw new ValidationException( "Unable to find constraints for " +
annotation.annotationType() );
+ }
+
+ return constraints;
+ }
+
+ public boolean isBuiltinConstraint(Annotation annotation) {
+ return builtinConstraints.containsKey( annotation.annotationType() );
+ }
+
+ /**
+ * Checks whether a given annotation is a multi value constraint or not.
+ *
+ * @param annotation the annotation to check.
+ *
+ * @return <code>true</code> if the specified annotation is a multi value
constraints, <code>false</code>
+ * otherwise.
+ */
+ public boolean isMultiValueConstraint(Annotation annotation) {
+ boolean isMultiValueConstraint = false;
+ try {
+ Method m = annotation.getClass().getMethod( "value" );
+ Class returnType = m.getReturnType();
+ if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
+ Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
+ for ( Annotation a : annotations ) {
+ if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+ isMultiValueConstraint = true;
+ }
+ else {
+ isMultiValueConstraint = false;
+ break;
+ }
+ }
+ }
+ }
+ catch ( NoSuchMethodException nsme ) {
+ // ignore
+ }
+ catch ( IllegalAccessException iae ) {
+ // ignore
+ }
+ catch ( InvocationTargetException ite ) {
+ // ignore
+ }
+ return isMultiValueConstraint;
+ }
+
+
+ /**
+ * Checks whether a given annotation is a multi value constraint and returns the
contained constraints if so.
+ *
+ * @param annotation the annotation to check.
+ *
+ * @return A list of constraint annotations or the empty list if
<code>annotation</code> is not a multi constraint
+ * annotation.
+ */
+ public <A extends Annotation> List<Annotation> getMultiValueConstraints(A
annotation) {
+ List<Annotation> annotationList = new ArrayList<Annotation>();
+ try {
+ Method m = annotation.getClass().getMethod( "value" );
+ Class returnType = m.getReturnType();
+ if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
+ Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
+ for ( Annotation a : annotations ) {
+ if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+ annotationList.add( a );
+ }
+ }
+ }
+ }
+ catch ( NoSuchMethodException nsme ) {
+ // ignore
+ }
+ catch ( IllegalAccessException iae ) {
+ // ignore
+ }
+ catch ( InvocationTargetException ite ) {
+ // ignore
+ }
+ return annotationList;
+ }
+
+ /**
+ * Checks whehter the specified annotation is a valid constraint annotation. A
constraint annotations has to
+ * fulfill the following conditions:
+ * <ul>
+ * <li>Has to contain a <code>ConstraintValidator</code>
implementation.</li>
+ * <li>Defines a message parameter.</li>
+ * <li>Defines a group parameter.</li>
+ * </ul>
+ *
+ * @param annotation The annotation to test.
+ *
+ * @return <code>true</code> if the annotation fulfills the above condtions,
<code>false</code> otherwise.
+ */
+ public boolean isConstraintAnnotation(Annotation annotation) {
+
+ Constraint constraint = annotation.annotationType()
+ .getAnnotation( Constraint.class );
+ if ( constraint == null ) {
+ return false;
+ }
+
+ try {
+ ReflectionHelper.getAnnotationParameter( annotation, "message", String.class
);
+ }
+ catch ( Exception e ) {
+ String msg = annotation.annotationType().getName() + " contains Constraint
annotation, but does " +
+ "not contain a message parameter. Annotation is getting ignored.";
+ log.warn( msg );
+ return false;
+ }
+
+ try {
+ ReflectionHelper.getAnnotationParameter( annotation, "groups", Class[].class
);
+ }
+ catch ( Exception e ) {
+ String msg = annotation.annotationType().getName() + " contains Constraint
annotation, but does " +
+ "not contain a groups parameter. Annotation is getting ignored.";
+ log.warn( msg );
+ return false;
+ }
+
+ Method[] methods = annotation.getClass().getMethods();
+ for ( Method m : methods ) {
+ if ( m.getName().startsWith( "valid" ) ) {
+ String msg = "Parameters starting with 'valid' are not allowed in a
constraint.";
+ log.warn( msg );
+ return false;
+ }
+ }
+ return true;
+ }
+}
Property changes on:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -35,7 +35,7 @@
*
* @author Hardy Ferentschik
*/
-public class MetaConstraint {
+public class MetaConstraint<T> {
/**
* The constraint tree created from the constraint annotation.
@@ -71,31 +71,38 @@
*/
private final ElementType elementType;
+ /**
+ * The class of the bean hosting this constraint.
+ */
+ private final Class<T> beanClass;
+
public MetaConstraint(Type t, ConstraintDescriptor constraintDescriptor) {
- this( t, null, null, ElementType.TYPE, constraintDescriptor, "" );
+ this( t, null, null, ElementType.TYPE, (Class<T>) t.getClass(),
constraintDescriptor, "" );
}
- public MetaConstraint(Method m, ConstraintDescriptor constraintDescriptor) {
+ public MetaConstraint(Method m, Class<T> beanClass, ConstraintDescriptor
constraintDescriptor) {
this(
null,
m,
null,
ElementType.METHOD,
+ beanClass,
constraintDescriptor,
ReflectionHelper.getPropertyName( m )
);
}
- public MetaConstraint(Field f, ConstraintDescriptor constraintDescriptor) {
- this( null, null, f, ElementType.FIELD, constraintDescriptor, f.getName());
+ public MetaConstraint(Field f, Class<T> beanClass, ConstraintDescriptor
constraintDescriptor) {
+ this( null, null, f, ElementType.FIELD, beanClass, constraintDescriptor, f.getName());
}
- private MetaConstraint(Type t, Method m, Field f, ElementType elementType,
ConstraintDescriptor constraintDescriptor, String property) {
+ private MetaConstraint(Type t, Method m, Field f, ElementType elementType,
Class<T> beanClass, ConstraintDescriptor constraintDescriptor, String property) {
this.type = t;
this.method = m;
this.field = f;
this.elementType = elementType;
this.propertyName = property;
+ this.beanClass = beanClass;
constraintTree = new ConstraintTree( constraintDescriptor );
}
@@ -167,6 +174,10 @@
return type;
}
+ public Class<T> getBeanClass() {
+ return beanClass;
+ }
+
public String getPropertyName() {
return propertyName;
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -15,16 +15,16 @@
private final MessageInterpolator factoryMessageInterpolator;
private final TraversableResolver factoryTraversableResolver;
private final ConstraintValidatorFactory constraintValidatorFactory;
- private final BuiltinConstraints builtinConstraints;
+ private final ConstraintHelper constraintHelper;
public ValidatorContextImpl(ConstraintValidatorFactory constraintValidatorFactory,
MessageInterpolator factoryMessageInterpolator,
TraversableResolver factoryTraversableResolver,
- BuiltinConstraints builtinConstraints) {
+ ConstraintHelper constraintHelper) {
this.constraintValidatorFactory = constraintValidatorFactory;
this.factoryMessageInterpolator = factoryMessageInterpolator;
this.factoryTraversableResolver = factoryTraversableResolver;
- this.builtinConstraints = builtinConstraints;
+ this.constraintHelper = constraintHelper;
messageInterpolator( factoryMessageInterpolator );
traversableResolver( factoryTraversableResolver );
}
@@ -50,6 +50,6 @@
}
public Validator getValidator() {
- return new ValidatorImpl( constraintValidatorFactory, messageInterpolator,
builtinConstraints );
+ return new ValidatorImpl( constraintValidatorFactory, messageInterpolator,
constraintHelper );
}
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -34,7 +34,7 @@
private final MessageInterpolator messageInterpolator;
private final TraversableResolver traversableResolver;
private final ConstraintValidatorFactory constraintValidatorFactory;
- private final BuiltinConstraints builtinConstraints = new BuiltinConstraints();
+ private final ConstraintHelper constraintHelper = new ConstraintHelper();
public ValidatorFactoryImpl(ConfigurationState configurationState) {
this.messageInterpolator = configurationState.getMessageInterpolator();
@@ -61,6 +61,8 @@
* {@inheritDoc}
*/
public ValidatorContext usingContext() {
- return new ValidatorContextImpl( constraintValidatorFactory, messageInterpolator,
traversableResolver, builtinConstraints );
+ return new ValidatorContextImpl( constraintValidatorFactory, messageInterpolator,
traversableResolver,
+ constraintHelper
+ );
}
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -86,12 +86,12 @@
private final MessageInterpolator messageInterpolator;
- private final BuiltinConstraints builtinConstraints;
+ private final ConstraintHelper constraintHelper;
- public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory,
MessageInterpolator messageInterpolator, BuiltinConstraints builtinConstraints) {
+ public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory,
MessageInterpolator messageInterpolator, ConstraintHelper constraintHelper) {
this.constraintValidatorFactory = constraintValidatorFactory;
this.messageInterpolator = messageInterpolator;
- this.builtinConstraints = builtinConstraints;
+ this.constraintHelper = constraintHelper;
groupChainGenerator = new GroupChainGenerator();
}
@@ -103,15 +103,13 @@
if ( object == null ) {
throw new IllegalArgumentException( "Validation of a null object" );
}
+ GroupChain groupChain = determineGroupExecutionOrder( groups );
ExecutionContext<T> context = new ExecutionContext<T>(
object, messageInterpolator, constraintValidatorFactory
);
-
- groups = validateGroupVararg( groups );
-
- List<ConstraintViolationImpl<T>> list = validateInContext( context,
Arrays.asList( groups ) );
+ List<ConstraintViolationImpl<T>> list = validateInContext( context,
groupChain );
return new HashSet<ConstraintViolation<T>>( list );
}
@@ -119,15 +117,14 @@
* {@inheritDoc}
*/
public <T> Set<ConstraintViolation<T>> validateProperty(T object,
String propertyName, Class<?>... groups) {
-
- sanityCheckPropertyPath( propertyName );
-
if ( object == null ) {
throw new IllegalArgumentException( "Validated object cannot be null." );
}
+ sanityCheckPropertyPath( propertyName );
+ GroupChain groupChain = determineGroupExecutionOrder( groups );
List<ConstraintViolationImpl<T>> failingConstraintViolations = new
ArrayList<ConstraintViolationImpl<T>>();
- validateProperty( object, new PropertyIterator( propertyName ),
failingConstraintViolations, groups );
+ validateProperty( object, new PropertyIterator( propertyName ),
failingConstraintViolations, groupChain );
return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
}
@@ -135,15 +132,14 @@
* {@inheritDoc}
*/
public <T> Set<ConstraintViolation<T>> validateValue(Class<T>
beanType, String propertyName, Object value, Class<?>... groups) {
-
- sanityCheckPropertyPath( propertyName );
-
if ( beanType == null ) {
throw new IllegalArgumentException( "The bean type cannot be null." );
}
+ sanityCheckPropertyPath( propertyName );
+ GroupChain groupChain = determineGroupExecutionOrder( groups );
List<ConstraintViolationImpl<T>> failingConstraintViolations = new
ArrayList<ConstraintViolationImpl<T>>();
- validateValue( beanType, value, new PropertyIterator( propertyName ),
failingConstraintViolations, groups );
+ validateValue( beanType, value, new PropertyIterator( propertyName ),
failingConstraintViolations, groupChain );
return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
}
@@ -160,7 +156,7 @@
}
}
- private Class<?>[] validateGroupVararg(Class<?>[] groups) {
+ private GroupChain determineGroupExecutionOrder(Class<?>[] groups) {
if ( groups == null ) {
throw new IllegalArgumentException( "null passed as group name" );
}
@@ -169,7 +165,8 @@
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP_ARRAY;
}
- return groups;
+
+ return groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
}
/**
@@ -177,16 +174,15 @@
*
* @param context A context object containing the object to validate together with other
state information needed
* for validation.
- * @param groups A list of groups to validate.
+ * @param groupChain A <code>GroupChain</code> instance containing the
resolved group sequence to execute
*
* @return List of invalid constraints.
*/
- private <T> List<ConstraintViolationImpl<T>>
validateInContext(ExecutionContext<T> context, List<Class<?>> groups) {
+ private <T> List<ConstraintViolationImpl<T>>
validateInContext(ExecutionContext<T> context, GroupChain groupChain) {
if ( context.peekValidatedObject() == null ) {
return Collections.emptyList();
}
- GroupChain groupChain = groupChainGenerator.getGroupChainFor( groups );
while ( groupChain.hasNext() ) {
int numberOfViolations = context.getFailingConstraints().size();
Group group = groupChain.next();
@@ -209,9 +205,8 @@
*/
private <T> void validateConstraints(ExecutionContext<T> executionContext)
{
//casting rely on the fact that root object is at the top of the stack
- @SuppressWarnings("unchecked")
- BeanMetaData<T> beanMetaData =
- ( BeanMetaData<T> ) getBeanMetaData( executionContext.peekValidatedObjectType()
);
+ @SuppressWarnings(" unchecked")
+ BeanMetaData<T> beanMetaData = getBeanMetaData( ( Class<T> )
executionContext.peekValidatedObjectType() );
if ( executionContext.getCurrentGroup().getName().equals( Default.class.getName() ) )
{
List<Class<?>> defaultGroupSequence =
beanMetaData.getDefaultGroupSequence();
if ( log.isDebugEnabled() && defaultGroupSequence.size() > 0 ) {
@@ -251,7 +246,7 @@
*/
private <T> boolean validateConstraintsForCurrentGroup(ExecutionContext<T>
executionContext, BeanMetaData<T> beanMetaData) {
boolean validationSuccessful = true;
- for ( MetaConstraint metaConstraint : beanMetaData.geMetaConstraintList() ) {
+ for ( MetaConstraint<T> metaConstraint : beanMetaData.geMetaConstraintList() ) {
executionContext.pushProperty( metaConstraint.getPropertyName() );
if ( executionContext.checkValidationRequired( metaConstraint.getGroupList() ) ) {
boolean tmp = metaConstraint.validateConstraint( beanMetaData.getBeanClass(),
executionContext );
@@ -313,6 +308,7 @@
return iter;
}
+ @SuppressWarnings("RedundantArrayCreation")
private <T> void validateCascadedConstraint(ExecutionContext<T> context,
Iterator<?> iter) {
Object actualValue;
String propertyIndex;
@@ -336,21 +332,24 @@
context.replacePropertyIndex( propertyIndex );
context.pushValidatedObject( actualValue );
- validateInContext( context, Arrays.asList( new Class<?>[] {
context.getCurrentGroup() } ) );
+ validateInContext(
+ context,
+ groupChainGenerator.getGroupChainFor( Arrays.asList( new Class<?>[] {
context.getCurrentGroup() } ) )
+ );
context.popValidatedObject();
i++;
}
}
- private <T> void validateProperty(T object, PropertyIterator propertyIter,
List<ConstraintViolationImpl<T>> failingConstraintViolations,
Class<?>... groups) {
+ private <T> void validateProperty(T object, PropertyIterator propertyIter,
List<ConstraintViolationImpl<T>> failingConstraintViolations, GroupChain
groupChain) {
@SuppressWarnings("unchecked")
final Class<T> beanType = ( Class<T> ) object.getClass();
- Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
- Object hostingBean = collectMetaConstraintsForPath( beanType, object, propertyIter,
metaConstraints );
+ Set<MetaConstraint<T>> metaConstraints = new
HashSet<MetaConstraint<T>>();
+ Object hostingBeanInstance = collectMetaConstraintsForPath( beanType, object,
propertyIter, metaConstraints );
- if ( hostingBean == null ) {
+ if ( hostingBeanInstance == null ) {
throw new IllegalArgumentException( "Invalid property path." );
}
@@ -358,57 +357,82 @@
return;
}
- groups = validateGroupVararg( groups );
-
- GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups )
);
while ( groupChain.hasNext() ) {
Group group = groupChain.next();
- for ( MetaConstraint metaConstraint : metaConstraints ) {
- if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
- continue;
+ int numberOfConstraintViolations = failingConstraintViolations.size();
+ BeanMetaData<T> beanMetaData = getBeanMetaData(
metaConstraints.iterator().next().getBeanClass() );
+
+ List<Class<?>> groupList;
+ if ( group.isDefaultGroup() ) {
+ groupList = beanMetaData.getDefaultGroupSequence();
+ }
+ else {
+ groupList = new ArrayList<Class<?>>();
+ groupList.add( group.getGroup() );
+ }
+
+ for ( Class<?> groupClass : groupList ) {
+ for ( MetaConstraint<T> metaConstraint : metaConstraints ) {
+ if ( metaConstraint.getGroupList().contains( groupClass ) ) {
+ ExecutionContext<T> context = new ExecutionContext<T>(
+ object, hostingBeanInstance, messageInterpolator, constraintValidatorFactory
+ );
+ context.pushProperty( propertyIter.getOriginalProperty() );
+ metaConstraint.validateConstraint( object.getClass(), context );
+ failingConstraintViolations.addAll( context.getFailingConstraints() );
+ }
}
- ExecutionContext<T> context = new ExecutionContext<T>(
- object, hostingBean, messageInterpolator, constraintValidatorFactory
- );
- context.pushProperty( propertyIter.getOriginalProperty() );
- metaConstraint.validateConstraint( object.getClass(), context );
- failingConstraintViolations.addAll( context.getFailingConstraints() );
+ if ( failingConstraintViolations.size() > numberOfConstraintViolations) {
+ break;
+ }
}
- if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+ if ( groupChain.inSequence() && failingConstraintViolations.size() >
numberOfConstraintViolations ) {
groupChain.moveToLastInCurrentSequence();
}
}
}
- private <T> void validateValue(Class<T> beanType, Object value,
PropertyIterator propertyIter, List<ConstraintViolationImpl<T>>
failingConstraintViolations, Class<?>... groups) {
- Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
+ @SuppressWarnings("unchecked")
+ private <T> void validateValue(Class<T> beanType, Object value,
PropertyIterator propertyIter, List<ConstraintViolationImpl<T>>
failingConstraintViolations, GroupChain groupChain) {
+ Set<MetaConstraint<T>> metaConstraints = new
HashSet<MetaConstraint<T>>();
collectMetaConstraintsForPath( beanType, null, propertyIter, metaConstraints );
if ( metaConstraints.size() == 0 ) {
return;
}
- groups = validateGroupVararg( groups );
-
- GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups )
);
while ( groupChain.hasNext() ) {
Group group = groupChain.next();
+ int numberOfConstraintViolations = failingConstraintViolations.size();
+ BeanMetaData<T> beanMetaData = getBeanMetaData(
metaConstraints.iterator().next().getBeanClass() );
- for ( MetaConstraint metaConstraint : metaConstraints ) {
- if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
- continue;
+ List<Class<?>> groupList;
+ if ( group.isDefaultGroup() ) {
+ groupList = beanMetaData.getDefaultGroupSequence();
+ }
+ else {
+ groupList = new ArrayList<Class<?>>();
+ groupList.add( group.getGroup() );
+ }
+
+ for ( Class<?> groupClass : groupList ) {
+ for ( MetaConstraint<T> metaConstraint : metaConstraints ) {
+ if ( metaConstraint.getGroupList().contains( groupClass ) ) {
+ ExecutionContext<T> context = new ExecutionContext<T>(
+ ( T ) value, messageInterpolator, constraintValidatorFactory
+ );
+ context.pushProperty( propertyIter.getOriginalProperty() );
+ metaConstraint.validateConstraint( beanType.getClass(), value, context );
+ failingConstraintViolations.addAll( context.getFailingConstraints() );
+ }
}
-
- ExecutionContext<T> context = new ExecutionContext<T>(
- ( T ) value, messageInterpolator, constraintValidatorFactory
- );
- context.pushProperty( propertyIter.getOriginalProperty() );
- metaConstraint.validateConstraint( beanType, value, context );
- failingConstraintViolations.addAll( context.getFailingConstraints() );
+ if ( failingConstraintViolations.size() > numberOfConstraintViolations) {
+ break;
+ }
}
- if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+ if ( groupChain.inSequence() && failingConstraintViolations.size() >
numberOfConstraintViolations ) {
groupChain.moveToLastInCurrentSequence();
}
}
@@ -427,7 +451,8 @@
*
* @return Returns the bean hosting the constraints which match the specified property
path.
*/
- private Object collectMetaConstraintsForPath(Class<?> clazz, Object value,
PropertyIterator propertyIter, Set<MetaConstraint> metaConstraints) {
+ @SuppressWarnings("unchecked")
+ private <T> Object collectMetaConstraintsForPath(Class<T> clazz, Object
value, PropertyIterator propertyIter, Set<MetaConstraint<T>> metaConstraints)
{
propertyIter.split();
if ( !propertyIter.hasNext() ) {
@@ -435,8 +460,8 @@
throw new IllegalArgumentException( "Invalid property path." );
}
- List<MetaConstraint> metaConstraintList = getBeanMetaData( clazz
).geMetaConstraintList();
- for ( MetaConstraint metaConstraint : metaConstraintList ) {
+ List<MetaConstraint<T>> metaConstraintList = getBeanMetaData( clazz
).geMetaConstraintList();
+ for ( MetaConstraint<T> metaConstraint : metaConstraintList ) {
if ( metaConstraint.getPropertyName().equals( propertyIter.getHead() ) ) {
metaConstraints.add( metaConstraint );
}
@@ -458,7 +483,7 @@
}
}
collectMetaConstraintsForPath(
- ( Class<?> ) type, value, propertyIter, metaConstraints
+ ( Class<T> ) type, value, propertyIter, metaConstraints
);
}
}
@@ -469,14 +494,14 @@
/**
* {@inheritDoc}
*/
- private <T> BeanMetaDataImpl<T> getBeanMetaData(Class<T> beanClass) {
+ private <T> BeanMetaData<T> getBeanMetaData(Class<T> beanClass) {
if ( beanClass == null ) {
throw new IllegalArgumentException( "Class cannot be null" );
}
@SuppressWarnings("unchecked")
BeanMetaDataImpl<T> metadata = ( BeanMetaDataImpl<T> )
metadataProviders.get( beanClass );
if ( metadata == null ) {
- metadata = new BeanMetaDataImpl<T>( beanClass, builtinConstraints );
+ metadata = new BeanMetaDataImpl<T>( beanClass, constraintHelper );
metadataProviders.put( beanClass, metadata );
}
return metadata;
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -17,6 +17,8 @@
*/
package org.hibernate.validation.engine.groups;
+import javax.validation.groups.Default;
+
/**
* Encapsulates a single group.
*
@@ -68,6 +70,10 @@
return true;
}
+ public boolean isDefaultGroup() {
+ return getGroup().getName().equals( Default.class.getName() );
+ }
+
@Override
public int hashCode() {
int result = group != null ? group.hashCode() : 0;
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -29,17 +29,13 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.WildcardType;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import javax.validation.Constraint;
import javax.validation.ValidationException;
-import org.slf4j.Logger;
-
/**
* Some reflection utility methods.
*
@@ -47,8 +43,6 @@
*/
public class ReflectionHelper {
- private static final Logger log = LoggerFactory.make();
-
/**
* Private constructor in order to avoid instantiation.
*/
@@ -73,133 +67,6 @@
return isBuiltInConstraintAnnotation;
}
- /**
- * Checks whehter the specified annotation is a valid constraint annotation. A
constraint annotations has to
- * fulfill the following conditions:
- * <ul>
- * <li>Has to contain a <code>ConstraintValidator</code>
implementation.</li>
- * <li>Defines a message parameter.</li>
- * <li>Defines a group parameter.</li>
- * </ul>
- *
- * @param annotation The annotation to test.
- *
- * @return <code>true</code> if the annotation fulfills the above condtions,
<code>false</code> otherwise.
- */
- public static boolean isConstraintAnnotation(Annotation annotation) {
-
- Constraint constraint = annotation.annotationType()
- .getAnnotation( Constraint.class );
- if ( constraint == null ) {
- return false;
- }
-
- try {
- getAnnotationParameter( annotation, "message", String.class );
- }
- catch ( Exception e ) {
- String msg = annotation.annotationType().getName() + " contains Constraint
annotation, but does " +
- "not contain a message parameter. Annotation is getting ignored.";
- log.warn( msg );
- return false;
- }
-
- try {
- getAnnotationParameter( annotation, "groups", Class[].class );
- }
- catch ( Exception e ) {
- String msg = annotation.annotationType().getName() + " contains Constraint
annotation, but does " +
- "not contain a groups parameter. Annotation is getting ignored.";
- log.warn( msg );
- return false;
- }
-
- Method[] methods = annotation.getClass().getMethods();
- for ( Method m : methods ) {
- if ( m.getName().startsWith( "valid" ) ) {
- String msg = "Parameters starting with 'valid' are not allowed in a
constraint.";
- log.warn( msg );
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Checks whether a given annotation is a multi value constraint or not.
- *
- * @param annotation the annotation to check.
- *
- * @return <code>true</code> if the specified annotation is a multi value
constraints, <code>false</code>
- * otherwise.
- */
- public static boolean isMultiValueConstraint(Annotation annotation) {
- boolean isMultiValueConstraint = false;
- try {
- Method m = annotation.getClass().getMethod( "value" );
- Class returnType = m.getReturnType();
- if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
- Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
- for ( Annotation a : annotations ) {
- if ( isConstraintAnnotation( a ) || isBuiltInConstraintAnnotation( a ) ) {
- isMultiValueConstraint = true;
- }
- else {
- isMultiValueConstraint = false;
- break;
- }
- }
- }
- }
- catch ( NoSuchMethodException nsme ) {
- // ignore
- }
- catch ( IllegalAccessException iae ) {
- // ignore
- }
- catch ( InvocationTargetException ite ) {
- // ignore
- }
- return isMultiValueConstraint;
- }
-
-
- /**
- * Checks whether a given annotation is a multi value constraint and returns the
contained constraints if so.
- *
- * @param annotation the annotation to check.
- *
- * @return A list of constraint annotations or the empty list if
<code>annotation</code> is not a multi constraint
- * annotation.
- */
- public static <A extends Annotation> List<Annotation>
getMultiValueConstraints(A annotation) {
- List<Annotation> annotationList = new ArrayList<Annotation>();
- try {
- Method m = annotation.getClass().getMethod( "value" );
- Class returnType = m.getReturnType();
- if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
- Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
- for ( Annotation a : annotations ) {
- if ( isConstraintAnnotation( a ) || isBuiltInConstraintAnnotation( a ) ) {
- annotationList.add( a );
- }
- }
- }
- }
- catch ( NoSuchMethodException nsme ) {
- // ignore
- }
- catch ( IllegalAccessException iae ) {
- // ignore
- }
- catch ( InvocationTargetException ite ) {
- // ignore
- }
- return annotationList;
- }
-
-
@SuppressWarnings("unchecked")
public static <T> T getAnnotationParameter(Annotation annotation, String
parameterName, Class<T> type) {
try {
@@ -502,7 +369,7 @@
return true;
}
catch ( NoSuchFieldException e ) {
- ; // ignore
+ // ignore
}
try {
@@ -510,7 +377,7 @@
return true;
}
catch ( NoSuchMethodException e ) {
- ; // ignore
+ // ignore
}
return false;
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -79,7 +79,7 @@
}
}
if ( processedValuesFromDescriptor != descriptor.numberOfElements() ) {
- throw new RuntimeException( "Trying to instanciate " + annotationType +
" with unknown elements" );
+ throw new RuntimeException( "Trying to instanciate " + annotationType +
" with unknown paramters." );
}
return result;
}
Modified:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
===================================================================
---
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties 2009-02-25
13:09:51 UTC (rev 16031)
@@ -3,7 +3,7 @@
validator.size=size must be between {min} and {max}
validator.length=length must be between {min} and {max}
validator.notEmpty=may not be empty
-validator.pattern=must match "{regex}"
+validator.pattern=must match "{regexp}"
validator.min=must be greater than {value}
validator.max=must be less than {value}
validator.null=must be null
Modified:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
===================================================================
---
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,9 +1,9 @@
-# $Id: ValidationMessages.properties 15846 2009-02-02 11:56:15Z hardy.ferentschik $
+# $Id$
validator.notNull=kann nicht null sein
validator.size=muss zwischen {min} und {max} liegen
validator.length=muss zwischen {min} und {max} liegen
validator.notEmpty=kann nicht leer sein
-validator.pattern=muss auf Ausdruck "{regex}" passen
+validator.pattern=muss auf Ausdruck "{regexp}" passen
validator.min=muss gr\u00F6\u00DFer sein als {value}
validator.max=muss kleiner sein als {value}
validator.null=muss null sein
Property changes on:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
===================================================================
---
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,9 +1,9 @@
-# $Id: ValidationMessages.properties 15846 2009-02-02 11:56:15Z hardy.ferentschik $
+# $Id$
validator.notNull=ne peut pas \u00EAtre nul
validator.size=la taille doit \u00EAtre entre {min} et {max}
validator.length=length must be between {min} and {max}
validator.notEmpty=ne peut pas \u00EAtre vide
-validator.pattern=doit suivre "{regex}"
+validator.pattern=doit suivre "{regexp}"
validator.min=doit \u00EAtre plus grand que {value}
validator.max=doit \u00EAtre plus petit que {value}
validator.null=doit \u00EAtre nul
Property changes on:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -17,6 +17,8 @@
*/
package org.hibernate.validation.constraints;
+import javax.validation.constraints.Pattern;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.BeforeClass;
@@ -36,7 +38,7 @@
public static void init() {
AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
- descriptor.setValue( "regex", "foobar" );
+ descriptor.setValue( "regexp", "foobar" );
descriptor.setValue( "message", "{validator.pattern}" );
Pattern p = AnnotationFactory.create( descriptor );
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -29,9 +29,8 @@
import javax.validation.OverridesParameters;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import javax.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
/**
* @author Hardy Ferentschik
@@ -39,7 +38,7 @@
@NotNull
@Size
// first pattern just duplicates the length of 5 characters, the second pattern is just
to proof that parameters can be overridden.
-@Patterns({ @Pattern(regex = "....."), @Pattern(regex = "bar") })
+(a)Pattern.List({ @Pattern(regexp = "....."), @Pattern(regexp = "bar")
})
@Constraint(validatedBy = FrenchZipcodeConstraintValidator.class)
@Documented
@Target({ METHOD, FIELD, TYPE })
@@ -58,5 +57,5 @@
parameter = "message") String sizeMessage() default "A french zip code
has a length of 5";
- @OverridesParameter(constraint = Pattern.class, parameter = "regex", index =
2) String regex() default "\\d*";
+ @OverridesParameter(constraint = Pattern.class, parameter = "regexp", index =
2) String regex() default "\\d*";
}
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -17,17 +17,17 @@
*/
package org.hibernate.validation.eg;
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
+import javax.validation.constraints.Pattern;
+
/**
* @author Hardy Ferentschik
*/
public class Engine {
- @Patterns({
- @Pattern(regex = "^[A-Z0-9-]+$",
+ @Pattern.List({
+ @Pattern(regexp = "^[A-Z0-9-]+$",
message = "must contain alphabetical characters only"),
- @Pattern(regex = "^....-....-....$", message = "must match
....-....-....")
+ @Pattern(regexp = "^....-....-....$", message = "must match
....-....-....")
})
private String serialNumber;
Added:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
(rev 0)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -0,0 +1,134 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, 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.validation.engine;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.List;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.hibernate.validation.constraints.incomplete.NoGroups;
+import org.hibernate.validation.constraints.incomplete.NoMessage;
+import org.hibernate.validation.constraints.incomplete.ValidProperty;
+import org.hibernate.validation.eg.Engine;
+import org.hibernate.validation.eg.Order;
+import org.hibernate.validation.util.ReflectionHelper;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class ConstraintHelperTest {
+
+ private static ConstraintHelper constraintHelper;
+
+ @BeforeClass
+ public static void init() {
+ constraintHelper = new ConstraintHelper();
+ }
+
+ @Test
+ public void testConstraintWithNoMessage() {
+ Annotation annotation = new NoGroups() {
+ public String message() {
+ return "";
+ }
+
+ public Class<? extends Annotation> annotationType() {
+ return this.getClass();
+ }
+ };
+ assertFalse(
+ "The constraint annotation should not be valid",
constraintHelper.isConstraintAnnotation( annotation )
+ );
+ }
+
+ @Test
+ public void testConstraintWithNoGroups() {
+ Annotation annotation = new NoMessage() {
+ public Class<?>[] groups() {
+ return null;
+ }
+
+ public Class<? extends Annotation> annotationType() {
+ return this.getClass();
+ }
+ };
+ assertFalse(
+ "The constraint annotation should not be valid",
constraintHelper.isConstraintAnnotation( annotation )
+ );
+ }
+
+ @Test
+ public void testConstraintWithValidInPropertyName() {
+ Annotation annotation = new ValidProperty() {
+ public String message() {
+ return null;
+ }
+
+ public Class<?>[] groups() {
+ return null;
+ }
+
+ public int validLength() {
+ return 0;
+ }
+
+ public Class<? extends Annotation> annotationType() {
+ return this.getClass();
+ }
+ };
+ assertFalse(
+ "The constraint annotation should not be valid",
constraintHelper.isConstraintAnnotation( annotation )
+ );
+ }
+
+ @Test
+ public void testGetMultiValueConstraints() throws Exception {
+ Engine engine = new Engine();
+ Field[] fields = engine.getClass().getDeclaredFields();
+ assertNotNull( fields );
+ assertTrue( fields.length == 1 );
+ ReflectionHelper.setAccessibility( fields[0] );
+
+ Annotation annotation = fields[0].getAnnotation( Pattern.List.class );
+ assertNotNull( annotation );
+ List<Annotation> multiValueConstraintAnnotations =
constraintHelper.getMultiValueConstraints( annotation );
+ assertTrue( "There should be two constraint annotations",
multiValueConstraintAnnotations.size() == 2 );
+ assertTrue( "Wrong constraint annotation",
multiValueConstraintAnnotations.get( 0 ) instanceof Pattern );
+ assertTrue( "Wrong constraint annotation",
multiValueConstraintAnnotations.get( 1 ) instanceof Pattern );
+
+
+ Order order = new Order();
+ fields = order.getClass().getDeclaredFields();
+ assertNotNull( fields );
+ assertTrue( fields.length == 1 );
+ ReflectionHelper.setAccessibility( fields[0] );
+
+ annotation = fields[0].getAnnotation( NotNull.class );
+ assertNotNull( annotation );
+ multiValueConstraintAnnotations = constraintHelper.getMultiValueConstraints( annotation
);
+ assertTrue( "There should be no constraint annotations",
multiValueConstraintAnnotations.size() == 0 );
+ }
+}
Property changes on:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -59,7 +59,7 @@
@Test
public void testSuccessfulInterpolation() {
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "replacement worked";
@@ -82,7 +82,7 @@
@Test
public void testUnSuccessfulInterpolation() {
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "foo"; // missing {}
String actual = interpolator.interpolate( "foo", descriptor, null );
@@ -96,7 +96,7 @@
@Test
public void testUnkownTokenInterpolation() {
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "{bar}"; // unkown token {}
String actual = interpolator.interpolate( "{bar}", descriptor, null );
@@ -106,14 +106,14 @@
@Test
public void testDefaultInterpolation() {
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "may not be null";
String actual = interpolator.interpolate( notNull.message(), descriptor, null );
assertEquals( "Wrong substitution", expected, actual );
ConstraintDescriptorImpl<Size> sizeDescriptor = new
ConstraintDescriptorImpl<Size>(
- size, new Class<?>[] { }, new BuiltinConstraints()
+ size, new Class<?>[] { }, new ConstraintHelper()
);
expected = "size must be between 0 and 2147483647"; // unkown token {}
actual = interpolator.interpolate( size.message(), sizeDescriptor, null );
@@ -125,7 +125,7 @@
interpolator = new ResourceBundleMessageInterpolator();
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "kann nicht null sein";
@@ -138,7 +138,7 @@
interpolator = new ResourceBundleMessageInterpolator();
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "may not be null";
@@ -151,7 +151,7 @@
interpolator = new ResourceBundleMessageInterpolator();
ConstraintDescriptorImpl<NotNull> descriptor = new
ConstraintDescriptorImpl<NotNull>(
- notNull, new Class<?>[] { }, new BuiltinConstraints()
+ notNull, new Class<?>[] { }, new ConstraintHelper()
);
String expected = "no puede ser null";
Copied:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java
(from rev 16024,
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java)
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java
(rev 0)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -0,0 +1,30 @@
+package org.hibernate.validation.engine.groups;
+
+import javax.validation.GroupSequence;
+import javax.validation.constraints.Pattern;
+import javax.validation.groups.Default;
+
+import org.hibernate.validation.constraints.Length;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+@GroupSequence({ Car.class, Car.Test.class })
+public class Car {
+ @Pattern(regexp = ".*", groups = Default.class)
+ @Length(min = 2, max = 20, groups = Car.Test.class)
+ private String type;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public interface Test {
+
+ }
+}
\ No newline at end of file
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -332,6 +332,41 @@
* HV-113
*/
@Test
+ public void testRedefiningDefaultGroup2() {
+ Car car = new Car();
+ car.setType( "A" );
+
+ Validator validator = TestUtil.getValidator();
+
+ Set<ConstraintViolation<Car>> constraintViolations = validator.validate(
car );
+ assertEquals(
+ "There should be one violations due to the re-defintion of the default
group",
+ 1,
+ constraintViolations.size()
+ );
+ assertEquals( "Wrong constraint", "length must be between 2 and
20", constraintViolations.iterator().next().getMessage() );
+
+ constraintViolations = validator.validateProperty( car, "type" );
+ assertEquals(
+ "There should be one violations due to the re-defintion of the default
group",
+ 1,
+ constraintViolations.size()
+ );
+ assertEquals( "Wrong constraint", "length must be between 2 and
20", constraintViolations.iterator().next().getMessage() );
+
+ constraintViolations = validator.validateValue( Car.class, "type",
"A" );
+ assertEquals(
+ "There should be one violations due to the re-defintion of the default
group",
+ 1,
+ constraintViolations.size()
+ );
+ assertEquals( "Wrong constraint", "length must be between 2 and
20", constraintViolations.iterator().next().getMessage() );
+ }
+
+ /**
+ * HV-113
+ */
+ @Test
public void testInvalidRedefinitionOfDefaultGroup() {
Address address = new AddressWithInvalidGroupSequence();
Validator validator = TestUtil.getValidator();
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -1,14 +1,16 @@
package org.hibernate.validation.engine.groups;
+import javax.validation.GroupSequence;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
import javax.validation.groups.Default;
-import org.hibernate.validation.constraints.Pattern;
/**
* @author Emmanuel Bernard
* @author Hardy Ferentschik
*/
+@GroupSequence({ User.class })
public class User {
@NotNull
private String firstname;
@@ -16,7 +18,7 @@
@NotNull(groups = Default.class)
private String lastname;
- @Pattern(regex = "[0-9 -]?", groups = Optional.class)
+ @Pattern(regexp = "[0-9 -]?", groups = Optional.class)
private String phoneNumber;
@NotNull(groups = { Billable.class, BuyInOneClick.class })
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -18,7 +18,6 @@
package org.hibernate.validation.util;
import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -28,21 +27,11 @@
import javax.validation.groups.Default;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
-import org.hibernate.validation.constraints.incomplete.NoGroups;
-import org.hibernate.validation.constraints.incomplete.NoMessage;
-import org.hibernate.validation.constraints.incomplete.ValidProperty;
-import org.hibernate.validation.eg.Engine;
-import org.hibernate.validation.eg.Order;
-
/**
* Tests for the <code>ReflectionHelper</code>.
*
@@ -129,91 +118,4 @@
);
}
}
-
- @Test
- // @SpecAssertion(section = "2.1.1.2", note = "constraint annotation must
specify a groups element")
- public void testConstraintWithNoMessage() {
- Annotation annotation = new NoGroups() {
- public String message() {
- return "";
- }
-
- public Class<? extends Annotation> annotationType() {
- return this.getClass();
- }
- };
- assertFalse(
- "The constraint annotation should not be valid",
ReflectionHelper.isConstraintAnnotation( annotation )
- );
- }
-
- @Test
- // @SpecAssertion(section = "2.1.1.1", note = "constraint annotation must
specify a groups element")
- public void testConstraintWithNoGroups() {
- Annotation annotation = new NoMessage() {
- public Class<?>[] groups() {
- return null;
- }
-
- public Class<? extends Annotation> annotationType() {
- return this.getClass();
- }
- };
- assertFalse(
- "The constraint annotation should not be valid",
ReflectionHelper.isConstraintAnnotation( annotation )
- );
- }
-
- @Test
- // @SpecAssertion(section = "2.1.1", note = "properties cannot begin with
'valid'")
- public void testConstraintWithValidInPropertyName() {
- Annotation annotation = new ValidProperty() {
- public String message() {
- return null;
- }
-
- public Class<?>[] groups() {
- return null;
- }
-
- public int validLength() {
- return 0;
- }
-
- public Class<? extends Annotation> annotationType() {
- return this.getClass();
- }
- };
- assertFalse(
- "The constraint annotation should not be valid",
ReflectionHelper.isConstraintAnnotation( annotation )
- );
- }
-
- @Test
- public void testGetMultiValueConstraints() throws Exception {
- Engine engine = new Engine();
- Field[] fields = engine.getClass().getDeclaredFields();
- assertNotNull( fields );
- assertTrue( fields.length == 1 );
- ReflectionHelper.setAccessibility( fields[0] );
-
- Annotation annotation = fields[0].getAnnotation( Patterns.class );
- assertNotNull( annotation );
- List<Annotation> multiValueConstraintAnnotations =
ReflectionHelper.getMultiValueConstraints( annotation );
- assertTrue( "There should be two constraint annotations",
multiValueConstraintAnnotations.size() == 2 );
- assertTrue( "Wrong constraint annotation",
multiValueConstraintAnnotations.get( 0 ) instanceof Pattern );
- assertTrue( "Wrong constraint annotation",
multiValueConstraintAnnotations.get( 1 ) instanceof Pattern );
-
-
- Order order = new Order();
- fields = order.getClass().getDeclaredFields();
- assertNotNull( fields );
- assertTrue( fields.length == 1 );
- ReflectionHelper.setAccessibility( fields[0] );
-
- annotation = fields[0].getAnnotation( NotNull.class );
- assertNotNull( annotation );
- multiValueConstraintAnnotations = ReflectionHelper.getMultiValueConstraints( annotation
);
- assertTrue( "There should be no constraint annotations",
multiValueConstraintAnnotations.size() == 0 );
- }
}
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java 2009-02-25
12:21:36 UTC (rev 16030)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java 2009-02-25
13:09:51 UTC (rev 16031)
@@ -18,11 +18,11 @@
package org.hibernate.validation.util.annotationfactory;
import javax.validation.constraints.Size;
+import javax.validation.constraints.Pattern;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import org.hibernate.validation.constraints.Pattern;
/**
* @author Hardy Ferentschik
@@ -44,16 +44,16 @@
@Test(expected = IllegalArgumentException.class)
public void createAnnotationProxyMissingRequiredParamter() {
AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
- Pattern pattern = AnnotationFactory.create( descriptor );
+ AnnotationFactory.create( descriptor );
}
@Test
public void createAnnotationProxyWithRequiredParamter() {
AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
- descriptor.setValue( "regex", ".*" );
+ descriptor.setValue( "regexp", ".*" );
Pattern pattern = AnnotationFactory.create( descriptor );
- assertEquals( "Wrong parameter value", ".*", pattern.regex() );
+ assertEquals( "Wrong parameter value", ".*", pattern.regexp() );
}
}