Author: hardy.ferentschik
Date: 2009-07-23 08:55:51 -0400 (Thu, 23 Jul 2009)
New Revision: 17194
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/GlobalExecutionContext.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/PathImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/metadata/MetaConstraint.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/PathImplTest.java
Log:
HV-190 Changes the PathImpl to not contain a ROOT_NODE per default. This had several other
effects.
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java 2009-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintValidatorContextImpl.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -97,8 +97,7 @@
}
public NodeBuilderDefinedContext addSubNode(String name) {
- PathImpl path = PathImpl.createNewRootPath();
- path.addNode( new NodeImpl( name ) );
+ PathImpl path = PathImpl.createNewPath( name );
return new NodeBuilderImpl( messageTemplate, path );
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/GlobalExecutionContext.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/GlobalExecutionContext.java 2009-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/GlobalExecutionContext.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -35,7 +35,7 @@
/**
* Context object keeping track of all important data for a top level {@link
javax.validation.Validator#validate(Object, Class[])} },
* {@link javax.validation.Validator#validateValue(Class, String, Object, Class[])} } or
{@link javax.validation.Validator#validateProperty(Object, String, Class[])} call.
- *
+ * <p/>
* we use this object to collect all failing constraints, but also to cache the caching
traversable resolver for a full stack call.
*
* @author Hardy Ferentschik
@@ -221,7 +221,7 @@
}
for ( PathImpl p : pathSet ) {
- if ( p.isSubPathOf( path ) || path.isSubPathOf( p ) ) {
+ if ( p.isRootPath() || path.isRootPath() || p.isSubPathOf( path ) || path.isSubPathOf(
p ) ) {
return true;
}
}
@@ -235,12 +235,19 @@
}
private void markProcessedForCurrentPath(Object value, PathImpl path) {
+ // hmm - not sure if the current definiton of Path and Node are consistent.
Shouldn't a simple property
+ // of a entity have a parent node?
+ PathImpl parentPath = path.getPathWithoutLeafNode();
+ if ( parentPath == null ) {
+ parentPath = PathImpl.createNewPath( null );
+ }
+
if ( processedPaths.containsKey( value ) ) {
- processedPaths.get( value ).add( path.getPathWithoutLeafNode() );
+ processedPaths.get( value ).add( parentPath );
}
else {
Set<PathImpl> set = new HashSet<PathImpl>();
- set.add( path.getPathWithoutLeafNode() );
+ set.add( parentPath );
processedPaths.put( value, set );
}
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/PathImpl.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/PathImpl.java 2009-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/PathImpl.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -38,8 +38,6 @@
private static final String PROPERTY_PATH_SEPERATOR = ".";
- private static final Node ROOT_NODE = new NodeImpl( ( String ) null );
-
private final List<Node> nodeList;
/**
@@ -57,18 +55,21 @@
}
if ( propertyPath.length() == 0 ) {
- return createNewRootPath();
+ return createNewPath( null );
}
return parseProperty( propertyPath );
}
- public static PathImpl createNewRootPath() {
- return new PathImpl();
+ public static PathImpl createNewPath(String name) {
+ PathImpl path = new PathImpl();
+ NodeImpl node = new NodeImpl( name );
+ path.addNode( node );
+ return path;
}
public static PathImpl createShallowCopy(PathImpl path) {
- return new PathImpl( path );
+ return path == null ? null : new PathImpl( path );
}
private PathImpl(PathImpl path) {
@@ -80,7 +81,6 @@
private PathImpl() {
nodeList = new ArrayList<Node>();
- nodeList.add( ROOT_NODE );
}
private PathImpl(List<Node> nodeList) {
@@ -90,12 +90,18 @@
}
}
+ public boolean isRootPath() {
+ return nodeList.size() == 1 && nodeList.get( 0 ).getName() == null;
+ }
+
public PathImpl getPathWithoutLeafNode() {
List<Node> nodes = new ArrayList<Node>( nodeList );
+ PathImpl path = null;
if ( nodes.size() > 1 ) {
nodes.remove( nodes.size() - 1 );
+ path = new PathImpl( nodes );
}
- return new PathImpl( nodes );
+ return path;
}
public void addNode(Node node) {
@@ -145,9 +151,6 @@
Iterator<Path.Node> iter = iterator();
while ( iter.hasNext() ) {
Node node = iter.next();
- if ( ROOT_NODE.equals( node ) ) {
- continue;
- }
builder.append( node.toString() );
if ( iter.hasNext() ) {
builder.append( PROPERTY_PATH_SEPERATOR );
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-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -116,9 +116,7 @@
object, messageInterpolator, constraintValidatorFactory,
getCachingTraversableResolver()
);
- List<ConstraintViolation<T>> list = validateInContext(
- object, context, groupChain, PathImpl.createNewRootPath()
- );
+ List<ConstraintViolation<T>> list = validateInContext( object, context,
groupChain, null );
return new HashSet<ConstraintViolation<T>>( list );
}
@@ -317,10 +315,16 @@
private <T, U, V> boolean validateConstraint(GlobalExecutionContext<T>
globalExecutionContext, LocalExecutionContext<U, V> localExecutionContext,
MetaConstraint<U, ?> metaConstraint, PathImpl path) {
boolean validationSuccessful = true;
- PathImpl newPath = PathImpl.createShallowCopy( path );
- if ( !"".equals( metaConstraint.getPropertyName() ) ) {
+ PathImpl newPath;
+
+ if ( path == null ) {
+ newPath = PathImpl.createNewPath( metaConstraint.getPropertyName() );
+ }
+ else {
+ newPath = PathImpl.createShallowCopy( path );
newPath.addNode( new NodeImpl( metaConstraint.getPropertyName() ) );
}
+
localExecutionContext.setPropertyPath( newPath );
if ( isValidationRequired( globalExecutionContext, localExecutionContext,
metaConstraint ) ) {
Object valueToValidate = metaConstraint.getValue(
localExecutionContext.getCurrentBean() );
@@ -349,8 +353,14 @@
.getCascadedMembers();
for ( Member member : cascadedMembers ) {
Type type = ReflectionHelper.typeOf( member );
- PathImpl newPath = PathImpl.createShallowCopy( path );
- newPath.addNode( new NodeImpl( ReflectionHelper.getPropertyName( member ) ) );
+ PathImpl newPath;
+ if ( path == null ) {
+ newPath = PathImpl.createNewPath( ReflectionHelper.getPropertyName( member ) );
+ }
+ else {
+ newPath = PathImpl.createShallowCopy( path );
+ newPath.addNode( new NodeImpl( ReflectionHelper.getPropertyName( member ) ) );
+ }
localExecutionContext.setPropertyPath( newPath );
if ( isCascadeRequired( globalExecutionContext, localExecutionContext, member ) ) {
Object value = ReflectionHelper.getValue( member,
localExecutionContext.getCurrentBean() );
@@ -665,9 +675,6 @@
*/
private <T> Object collectMetaConstraintsForPath(Class<T> clazz, Object
value, Iterator<Path.Node> propertyIter, Set<MetaConstraint<T, ?>>
metaConstraints) {
Path.Node elem = propertyIter.next();
- if ( elem.getName() == null ) { // skip root node
- elem = propertyIter.next();
- }
final BeanMetaData<T> metaData = getBeanMetaData( clazz );
if ( !propertyIter.hasNext() ) {
@@ -682,7 +689,7 @@
List<MetaConstraint<T, ? extends Annotation>> metaConstraintList =
metaData.geMetaConstraintsAsList();
for ( MetaConstraint<T, ?> metaConstraint : metaConstraintList ) {
- if ( metaConstraint.getPropertyName().equals( elem.getName() ) ) {
+ if ( elem.getName() != null && elem.getName().equals(
metaConstraint.getPropertyName() ) ) {
metaConstraints.add( metaConstraint );
}
}
@@ -744,12 +751,17 @@
boolean isReachable;
+ Path pathToObject = localContext.getPropertyPath().getPathWithoutLeafNode();
+ if ( pathToObject == null ) {
+ pathToObject = PathImpl.createNewPath( null );
+ }
+
try {
isReachable = globalContext.getTraversableResolver().isReachable(
localContext.getCurrentBean(),
localContext.getPropertyPath().getLeafNode(),
globalContext.getRootBeanClass(),
- localContext.getPropertyPath().getPathWithoutLeafNode(),
+ pathToObject,
metaConstraint.getElementType()
);
}
@@ -765,12 +777,17 @@
boolean isReachable;
boolean isCascadable;
+ Path pathToObject = localContext.getPropertyPath().getPathWithoutLeafNode();
+ if ( pathToObject == null ) {
+ pathToObject = PathImpl.createNewPath( null );
+ }
+
try {
isReachable = globalContext.getTraversableResolver().isReachable(
localContext.getCurrentBean(),
localContext.getPropertyPath().getLeafNode(),
globalContext.getRootBeanClass(),
- localContext.getPropertyPath().getPathWithoutLeafNode(),
+ pathToObject,
type
);
}
@@ -783,7 +800,7 @@
localContext.getCurrentBean(),
localContext.getPropertyPath().getLeafNode(),
globalContext.getRootBeanClass(),
- localContext.getPropertyPath().getPathWithoutLeafNode(),
+ pathToObject,
type
);
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/metadata/MetaConstraint.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/metadata/MetaConstraint.java 2009-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/metadata/MetaConstraint.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -48,7 +48,8 @@
private final Member member;
/**
- * The JavaBeans name for this constraint.
+ * The JavaBeans name of the field/property the constraint was placed on. {@code null}
if this is a
+ * class level constraint.
*/
private final String propertyName;
@@ -71,7 +72,7 @@
public MetaConstraint(Class<T> beanClass, ConstraintDescriptor<A>
constraintDescriptor) {
this.elementType = ElementType.TYPE;
this.member = null;
- this.propertyName = "";
+ this.propertyName = null;
this.beanClass = beanClass;
constraintTree = new ConstraintTree<A>( constraintDescriptor );
}
@@ -109,6 +110,10 @@
return beanClass;
}
+ /**
+ * @return The JavaBeans name of the field/property the constraint was placed on. {@code
null} if this is a
+ * class level constraint.
+ */
public String getPropertyName() {
return propertyName;
}
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/PathImplTest.java
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/PathImplTest.java 2009-07-23
12:35:38 UTC (rev 17193)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/PathImplTest.java 2009-07-23
12:55:51 UTC (rev 17194)
@@ -38,12 +38,6 @@
assertTrue( propIter.hasNext() );
Path.Node elem = propIter.next();
- assertEquals( null, elem.getName() );
- assertFalse( elem.isInIterable() );
- assertEquals( property, path.toString() );
-
- assertTrue( propIter.hasNext() );
- elem = propIter.next();
assertEquals( "order", elem.getName() );
assertTrue( elem.isInIterable() );
assertEquals( new Integer( 3 ), elem.getIndex() );
@@ -71,12 +65,6 @@
assertTrue( propIter.hasNext() );
Path.Node elem = propIter.next();
- assertEquals( null, elem.getName() );
- assertFalse( elem.isInIterable() );
- assertEquals( property, path.toString() );
-
- assertTrue( propIter.hasNext() );
- elem = propIter.next();
assertEquals( "order", elem.getName() );
assertTrue( elem.isInIterable() );
assertEquals( "foo", elem.getKey() );
@@ -120,10 +108,4 @@
Path path = PathImpl.createPathFromString( "" );
assertTrue( path.iterator().hasNext() );
}
-
- @Test
- public void testRootPath() {
- Path path = PathImpl.createNewRootPath();
- assertEquals( path.toString(), "", "Wrong string representation of root
property." );
- }
}
\ No newline at end of file