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();
}