[hibernate-commits] Hibernate SVN: r17194 - in validator/trunk/hibernate-validator/src: main/java/org/hibernate/validation/metadata and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Jul 23 08:55:51 EDT 2009


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



More information about the hibernate-commits mailing list