[hibernate-commits] Hibernate SVN: r15670 - in validator/trunk: hibernate-validator/src/main/java/org/hibernate/validation/impl and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Dec 5 17:07:07 EST 2008


Author: epbernard
Date: 2008-12-05 17:07:07 -0500 (Fri, 05 Dec 2008)
New Revision: 15670

Added:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/DefaultTraversableResolver.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorBuilderImpl.java
   validator/trunk/validation-api/src/main/java/javax/validation/TraversableResolver.java
   validator/trunk/validation-api/src/main/java/javax/validation/ValidatorBuilder.java
Modified:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryBuilderImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryImpl.java
   validator/trunk/validation-api/src/main/java/javax/validation/Validator.java
   validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactory.java
   validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactoryBuilder.java
   validator/trunk/validation-api/src/main/java/javax/validation/spi/ValidatorFactoryConfiguration.java
Log:
BVAL-82 ValidatorBuilder and BVAL-81 TraversableResolver contract

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	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -32,6 +32,7 @@
 import javax.validation.ConstraintViolation;
 import javax.validation.MessageResolver;
 import javax.validation.Validator;
+import javax.validation.TraversableResolver;
 import javax.validation.groups.Default;
 
 import org.hibernate.validation.Version;
@@ -77,10 +78,13 @@
 	
 	private final ValidatorFactoryImplementor factory;
 	private static final Class<?>[] DEFAULT_GROUP = new Class<?>[] { Default.class };
+	private final TraversableResolver traversableResolver;
 
-	public ValidatorImpl(ValidatorFactoryImplementor factory, MessageResolver messageResolver) {
+	public ValidatorImpl(ValidatorFactoryImplementor factory, MessageResolver messageResolver,
+						 TraversableResolver traversableResolver) {
 		this.factory = factory;
 		this.messageResolver = messageResolver;
+		this.traversableResolver = traversableResolver;
 	}
 
 

Added: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/DefaultTraversableResolver.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/DefaultTraversableResolver.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/DefaultTraversableResolver.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -0,0 +1,13 @@
+package org.hibernate.validation.impl;
+
+import java.lang.annotation.ElementType;
+import javax.validation.TraversableResolver;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DefaultTraversableResolver implements TraversableResolver {
+	public boolean isTraversable(Object traversableObject, String traversableProperty, Class<?> rootBeanType, String pathToTraversableObject, ElementType elementType) {
+		return true;
+	}
+}

Added: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorBuilderImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorBuilderImpl.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorBuilderImpl.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -0,0 +1,53 @@
+package org.hibernate.validation.impl;
+
+import javax.validation.ValidatorBuilder;
+import javax.validation.MessageResolver;
+import javax.validation.TraversableResolver;
+import javax.validation.Validator;
+
+import org.hibernate.validation.engine.ValidatorImpl;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ValidatorBuilderImpl implements ValidatorBuilder {
+	private MessageResolver messageResolver;
+	private TraversableResolver traversableResolver;
+	private final MessageResolver factoryMessageResolver;
+	private final TraversableResolver factoryTraversableResolver;
+	private final ValidatorFactoryImpl validatorFactory;
+
+	public ValidatorBuilderImpl(ValidatorFactoryImpl validatorFactory,
+								MessageResolver factoryMessageResolver,
+								TraversableResolver factoryTraversableResolver) {
+		this.validatorFactory = validatorFactory;
+		this.factoryMessageResolver = factoryMessageResolver;
+		this.factoryTraversableResolver = factoryTraversableResolver;
+		messageResolver(factoryMessageResolver);
+		traversableResolver(factoryTraversableResolver);
+	}
+
+	public ValidatorBuilder messageResolver(MessageResolver messageResolver) {
+		if (messageResolver == null) {
+			this.messageResolver = factoryMessageResolver;
+		}
+		else {
+			this.messageResolver = messageResolver;
+		}
+		return this;
+	}
+
+	public ValidatorBuilder traversableResolver(TraversableResolver traversableResolver) {
+		if (traversableResolver == null) {
+			this.traversableResolver = factoryTraversableResolver;
+		}
+		else {
+			this.traversableResolver = traversableResolver;
+		}
+		return this;
+	}
+
+	public Validator getValidator() {
+		return new ValidatorImpl( validatorFactory, messageResolver, traversableResolver );
+	}
+}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryBuilderImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryBuilderImpl.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryBuilderImpl.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -21,14 +21,15 @@
 import java.util.List;
 import javax.validation.ConstraintFactory;
 import javax.validation.MessageResolver;
+import javax.validation.TraversableResolver;
 import javax.validation.ValidationException;
 import javax.validation.ValidationProviderResolver;
+import javax.validation.ValidatorFactory;
 import javax.validation.ValidatorFactoryBuilder;
-import javax.validation.ValidatorFactory;
 import javax.validation.bootstrap.DefaultValidationProviderResolver;
+import javax.validation.spi.BootstrapState;
 import javax.validation.spi.ValidationProvider;
 import javax.validation.spi.ValidatorFactoryConfiguration;
-import javax.validation.spi.BootstrapState;
 
 import org.hibernate.validation.HibernateValidatorFactoryBuilder;
 
@@ -36,12 +37,16 @@
  * @author Emmanuel Bernard
  */
 public class ValidatorFactoryBuilderImpl implements HibernateValidatorFactoryBuilder, ValidatorFactoryConfiguration {
+	//FIXME not sure why it is like that. We should cache these instances somehow. Static?
 	private final MessageResolver defaultMessageResolver = new ResourceBundleMessageResolver();
+	private final TraversableResolver defaultTraversableResolver = new DefaultTraversableResolver();
+
 	private MessageResolver messageResolver;
 	private ConstraintFactory constraintFactory = new ConstraintFactoryImpl();
 	private String configurationFile = "META-INF/validation.xml";
 	private final ValidationProvider provider;
 	private final ValidationProviderResolver providerResolver;
+	private TraversableResolver traversableResolver;
 
 	public ValidatorFactoryBuilderImpl(BootstrapState state) {
 		if (state.getValidationProviderResolver() == null) {
@@ -52,6 +57,7 @@
 		}
 		this.provider = null;
 		this.messageResolver = defaultMessageResolver;
+		this.traversableResolver = defaultTraversableResolver;
 	}
 
 	public ValidatorFactoryBuilderImpl(ValidationProvider provider) {
@@ -61,6 +67,7 @@
 		this.provider = provider;
 		this.providerResolver = null;
 		this.messageResolver = defaultMessageResolver;
+		this.traversableResolver = defaultTraversableResolver;
 	}
 
 	public ValidatorFactoryBuilderImpl messageResolver(MessageResolver resolver) {
@@ -68,6 +75,11 @@
 		return this;
 	}
 
+	public ValidatorFactoryBuilderImpl traversableResolver(TraversableResolver resolver) {
+		this.traversableResolver = resolver;
+		return this;
+	}
+
 	public ValidatorFactoryBuilderImpl constraintFactory(ConstraintFactory constraintFactory) {
 		this.constraintFactory = constraintFactory;
 		return this;
@@ -109,6 +121,10 @@
 		return constraintFactory;
 	}
 
+	public TraversableResolver getTraversableResolver() {
+		return traversableResolver;
+	}
+
 	public ValidatorFactoryBuilderImpl configure(InputStream stream) {
 		return null;  //To change body of implemented methods use File | Settings | File Templates.
 	}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryImpl.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ValidatorFactoryImpl.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -21,13 +21,13 @@
 import java.util.concurrent.ConcurrentHashMap;
 import javax.validation.ConstraintFactory;
 import javax.validation.MessageResolver;
+import javax.validation.TraversableResolver;
 import javax.validation.Validator;
-import javax.validation.ValidatorFactory;
+import javax.validation.ValidatorBuilder;
 import javax.validation.spi.ValidatorFactoryConfiguration;
 
-import org.hibernate.validation.engine.ValidatorImpl;
+import org.hibernate.validation.engine.MetaDataProviderImpl;
 import org.hibernate.validation.engine.ValidatorFactoryImplementor;
-import org.hibernate.validation.engine.MetaDataProviderImpl;
 
 /**
  * @author Emmanuel Bernard
@@ -36,6 +36,7 @@
 public class ValidatorFactoryImpl implements ValidatorFactoryImplementor {
 
 	private final MessageResolver messageResolver;
+	private final TraversableResolver traversableResolver;
 	private final ConstraintFactory constraintFactory;
 
 	//TODO is there a way to replace ? by so kind of <T> to express the correlation?
@@ -46,6 +47,7 @@
 	public ValidatorFactoryImpl(ValidatorFactoryConfiguration configuration) {
 		this.messageResolver = configuration.getMessageResolver();
 		this.constraintFactory = configuration.getConstraintFactory();
+		this.traversableResolver = configuration.getTraversableResolver();
 		//do init metadata from XML form
 	}
 
@@ -53,17 +55,17 @@
 	 * {@inheritDoc}
 	 */
 	public Validator getValidator() {
-		return new ValidatorImpl( this, messageResolver );
+		return defineValidatorState().getValidator();
 	}
 
-	public Validator getValidator(MessageResolver messageResolver) {
-		return new ValidatorImpl( this, messageResolver );
-	}
-
 	public MessageResolver getMessageResolver() {
 		return messageResolver;
 	}
 
+	public ValidatorBuilder defineValidatorState() {
+		return new ValidatorBuilderImpl(this, messageResolver, traversableResolver);
+	}
+
 	public <T> MetaDataProviderImpl<T> getMetadataProvider(Class<T> beanClass) {
 		//FIXME make sure a optimized mock is provided when no constraints are present.
 		if (beanClass == null) throw new IllegalArgumentException( "Class cannot be null" );

Added: validator/trunk/validation-api/src/main/java/javax/validation/TraversableResolver.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/TraversableResolver.java	                        (rev 0)
+++ validator/trunk/validation-api/src/main/java/javax/validation/TraversableResolver.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -0,0 +1,31 @@
+package javax.validation;
+
+import java.lang.annotation.ElementType;
+
+/**
+ * Contract determining if a property can be accessed by the Bean Validation provider
+ * This contract is called for each property either validated or traversed
+ *
+ * A traversable resolver implementation must me thread-safe
+ *
+ * @author Emmanuel Bernard
+ */
+public interface TraversableResolver {
+	/**
+	 * Determine if a property can be traversed by Bean Validation.
+	 *
+	 * @param traversableObject object hosting traversableProperty
+	 * @param traversableProperty name of the traqversable property
+	 * @param rootBeanType type of the root object passed to the Validator.
+	 * @param pathToTraversableObject path from the root object to the traversableObject
+	 *        (using the path specification defined by Bean Validator)	 
+	 * @param elementType either FIELD or METHOD
+	 *
+	 * @return true if the property is traversable by Bean Validation
+	 */
+	boolean isTraversable(Object traversableObject,
+						  String traversableProperty,
+						  Class<?> rootBeanType,
+						  String pathToTraversableObject,
+						  ElementType elementType);
+}

Modified: validator/trunk/validation-api/src/main/java/javax/validation/Validator.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/Validator.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/validation-api/src/main/java/javax/validation/Validator.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -54,7 +54,9 @@
 	 *
 	 * @throws IllegalArgumentException e if object is null or if propertyName is not present
 	 */
-	<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups);
+	<T> Set<ConstraintViolation<T>> validateProperty(T object,
+													 String propertyName,
+													 Class<?>... groups);
 
 	/**
 	 * validate all constraints on <code>propertyName</code> property
@@ -70,8 +72,10 @@
 	 * @return constraint violations or an empty Set if none
 	 * @throws IllegalArgumentException e if propertyName is not present
 	 */
-	<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName,
-												  Object value, Class<?>... groups);
+	<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
+												  String propertyName,
+												  Object value,
+												  Class<?>... groups);
 
 	/**
 	 * Return the descriptor object describing bean constraints

Added: validator/trunk/validation-api/src/main/java/javax/validation/ValidatorBuilder.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/ValidatorBuilder.java	                        (rev 0)
+++ validator/trunk/validation-api/src/main/java/javax/validation/ValidatorBuilder.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -0,0 +1,31 @@
+package javax.validation;
+
+/**
+ * Return a Validator corresponding to the initialized state.
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface ValidatorBuilder {
+	/**
+	 * Defines the message resolver implementation used by the Validator.
+	 * If unset, the message resolver of the ValidatorFactory is used.
+	 *
+	 * @return self following the chaining method pattern
+	 */
+	ValidatorBuilder messageResolver(MessageResolver messageResolver);
+
+	/**
+	 * Defines the traversable resolver implementation used by the Validator.
+	 * If unset, the traversable resolver of the ValidatorFactory is used.
+	 *
+	 * @return self following the chaining method pattern
+	 */
+	ValidatorBuilder traversableResolver(TraversableResolver traversableResolver);
+
+	/**
+	 * return an initialized Validator instance respecting the defined state
+	 * Validator instances can be pooled and shared by the implementation
+	 */
+	Validator getValidator();
+
+}

Modified: validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactory.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactory.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactory.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -26,21 +26,20 @@
  */
 public interface ValidatorFactory {
 	/**
-	 * return an initialized Validator instance.
-	 * Validator instances can be pooled and shared by the implementation
+	 * return an initialized Validator instance using the default factory instances
+	 * for message resolver and traversable resolver.
 	 *
+	 * Validator instances can be pooled and shared by the implementation
 	 */
 	Validator getValidator();
 
 	/**
-	 * return an initialized Validator instance.
-	 * Validator instances can be pooled and shared by the implementation
+	 * Define the validator state and return a
+	 * Validator compliant with this state
 	 *
-	 * The returned Validator instance must use the MessageResolver instance
-	 * passed as a parameter to resolve error messages. 
-	 *
+	 * @return a ValidatorBuilder
 	 */
-	Validator getValidator(MessageResolver messageResolver);
+	ValidatorBuilder defineValidatorState();
 
 	/**
 	 * Returns the MessageResolver instance configured at initialization time

Modified: validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactoryBuilder.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactoryBuilder.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/validation-api/src/main/java/javax/validation/ValidatorFactoryBuilder.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -59,6 +59,16 @@
 	T messageResolver(MessageResolver resolver);
 
 	/**
+	 * Defines the traversable resolver used. Has priority over the configuration
+	 * based traversable resolver.
+	 *
+	 * @param resolver traversable resolver implementation.
+	 *
+	 * @return <code>this</code> following the chaining method pattern.
+	 */
+	T traversableResolver(TraversableResolver resolver);
+
+	/**
 	 * Defines the constraint factory. Has priority over the configuration
 	 * based constraint factory.
 	 *

Modified: validator/trunk/validation-api/src/main/java/javax/validation/spi/ValidatorFactoryConfiguration.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/spi/ValidatorFactoryConfiguration.java	2008-12-05 13:56:19 UTC (rev 15669)
+++ validator/trunk/validation-api/src/main/java/javax/validation/spi/ValidatorFactoryConfiguration.java	2008-12-05 22:07:07 UTC (rev 15670)
@@ -20,6 +20,7 @@
 import java.io.InputStream;
 import javax.validation.ConstraintFactory;
 import javax.validation.MessageResolver;
+import javax.validation.TraversableResolver;
 
 /**
  * Contract between a <code>ValidatorFactoryBuilder</code> and a
@@ -54,4 +55,12 @@
 	 * @return factory instance or null if not defined
 	 */
 	ConstraintFactory getConstraintFactory();
+
+	/**
+	 * Traversable resolver as defined by the client programmatically
+	 * or null if undefined.
+	 *
+	 * @return traversable provider instance or null if not defined
+	 */
+	TraversableResolver getTraversableResolver();
 }




More information about the hibernate-commits mailing list