[hibernate-commits] Hibernate SVN: r17353 - validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/xml.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Aug 18 13:09:14 EDT 2009


Author: hardy.ferentschik
Date: 2009-08-18 13:09:14 -0400 (Tue, 18 Aug 2009)
New Revision: 17353

Modified:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/xml/XmlMappingParser.java
Log:
HV-203 - the parser does not explicitly close the streams anymore. Also made sure that ValidationExceptions are thrown when gield/getters are defined more than once

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/xml/XmlMappingParser.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/xml/XmlMappingParser.java	2009-08-18 17:08:59 UTC (rev 17352)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/xml/XmlMappingParser.java	2009-08-18 17:09:14 UTC (rev 17353)
@@ -17,7 +17,6 @@
 */
 package org.hibernate.validation.xml;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
@@ -26,6 +25,7 @@
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -33,7 +33,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.security.AccessController;
 import javax.validation.Constraint;
 import javax.validation.ConstraintValidator;
 import javax.validation.ValidationException;
@@ -48,33 +47,20 @@
 import org.slf4j.Logger;
 import org.xml.sax.SAXException;
 
+import org.hibernate.validation.metadata.AnnotationIgnores;
 import org.hibernate.validation.metadata.ConstraintDescriptorImpl;
-import org.hibernate.validation.metadata.MetaConstraint;
 import org.hibernate.validation.metadata.ConstraintHelper;
-import org.hibernate.validation.metadata.AnnotationIgnores;
-import org.hibernate.validation.util.LoggerFactory;
-import org.hibernate.validation.util.ReflectionHelper;
+import org.hibernate.validation.metadata.MetaConstraint;
 import org.hibernate.validation.util.ContainsField;
-import org.hibernate.validation.util.GetMethodFromPropertyName;
 import org.hibernate.validation.util.ContainsMethod;
-import org.hibernate.validation.util.GetMethod;
-import org.hibernate.validation.util.GetDeclaredField;
 import org.hibernate.validation.util.GetClassLoader;
+import org.hibernate.validation.util.GetDeclaredField;
+import org.hibernate.validation.util.GetMethod;
+import org.hibernate.validation.util.GetMethodFromPropertyName;
 import org.hibernate.validation.util.LoadClass;
+import org.hibernate.validation.util.LoggerFactory;
 import org.hibernate.validation.util.annotationfactory.AnnotationDescriptor;
 import org.hibernate.validation.util.annotationfactory.AnnotationFactory;
-import org.hibernate.validation.xml.AnnotationType;
-import org.hibernate.validation.xml.BeanType;
-import org.hibernate.validation.xml.ClassType;
-import org.hibernate.validation.xml.ConstraintDefinitionType;
-import org.hibernate.validation.xml.ConstraintMappingsType;
-import org.hibernate.validation.xml.ConstraintType;
-import org.hibernate.validation.xml.ElementType;
-import org.hibernate.validation.xml.FieldType;
-import org.hibernate.validation.xml.GetterType;
-import org.hibernate.validation.xml.GroupSequenceType;
-import org.hibernate.validation.xml.GroupsType;
-import org.hibernate.validation.xml.ValidatedByType;
 
 /**
  * @author Hardy Ferentschik
@@ -104,28 +90,18 @@
 
 	public void parse(Set<InputStream> mappingStreams) {
 		for ( InputStream in : mappingStreams ) {
-			try {
-				ConstraintMappingsType mapping = getValidationConfig( in );
-				parseConstraintDefinitions( mapping.getConstraintDefinition() );
-				String defaultPackage = mapping.getDefaultPackage();
-				for ( BeanType bean : mapping.getBean() ) {
-					Class<?> beanClass = getClass( bean.getClazz(), defaultPackage );
-					checkClassHasNotBeenProcessed( processedClasses, beanClass );
-					annotationIgnores.setDefaultIgnoreAnnotation( beanClass, bean.isIgnoreAnnotations() );
-					parseClassLevelOverrides( bean.getClassType(), beanClass, defaultPackage );
-					parseFieldLevelOverrides( bean.getField(), beanClass, defaultPackage );
-					parsePropertyLevelOverrides( bean.getGetter(), beanClass, defaultPackage );
-					processedClasses.add( beanClass );
-				}
+			ConstraintMappingsType mapping = getValidationConfig( in );
+			parseConstraintDefinitions( mapping.getConstraintDefinition() );
+			String defaultPackage = mapping.getDefaultPackage();
+			for ( BeanType bean : mapping.getBean() ) {
+				Class<?> beanClass = getClass( bean.getClazz(), defaultPackage );
+				checkClassHasNotBeenProcessed( processedClasses, beanClass );
+				annotationIgnores.setDefaultIgnoreAnnotation( beanClass, bean.isIgnoreAnnotations() );
+				parseClassLevelOverrides( bean.getClassType(), beanClass, defaultPackage );
+				parseFieldLevelOverrides( bean.getField(), beanClass, defaultPackage );
+				parsePropertyLevelOverrides( bean.getGetter(), beanClass, defaultPackage );
+				processedClasses.add( beanClass );
 			}
-			finally {
-				try {
-					in.close();
-				}
-				catch ( IOException e ) {
-					log.warn( "Error closing input stream: {}", e.getMessage() );
-				}
-			}
 		}
 	}
 
@@ -141,8 +117,8 @@
 		List<MetaConstraint<T, ? extends Annotation>> list = new ArrayList<MetaConstraint<T, ? extends Annotation>>();
 		if ( constraintMap.containsKey( beanClass ) ) {
 			for ( MetaConstraint<?, ? extends Annotation> metaConstraint : constraintMap.get( beanClass ) ) {
-				@SuppressWarnings( "unchecked") // safe cast since the list of meta constraints is always specific to the bean type
-				MetaConstraint<T, ? extends Annotation> boundMetaConstraint = ( MetaConstraint<T, ? extends Annotation> ) metaConstraint;
+				@SuppressWarnings("unchecked") // safe cast since the list of meta constraints is always specific to the bean type
+						MetaConstraint<T, ? extends Annotation> boundMetaConstraint = ( MetaConstraint<T, ? extends Annotation> ) metaConstraint;
 				list.add( boundMetaConstraint );
 			}
 			return list;
@@ -210,7 +186,7 @@
 
 	private Class<?> loadClass(String className, Class<?> caller) {
 		LoadClass action = LoadClass.action( className, caller );
-		if (System.getSecurityManager() != null) {
+		if ( System.getSecurityManager() != null ) {
 			return AccessController.doPrivileged( action );
 		}
 		else {
@@ -245,8 +221,15 @@
 	}
 
 	private void parseFieldLevelOverrides(List<FieldType> fields, Class<?> beanClass, String defaultPackage) {
+		List<String> fieldNames = new ArrayList<String>();
 		for ( FieldType fieldType : fields ) {
 			String fieldName = fieldType.getName();
+			if ( fieldNames.contains( fieldName ) ) {
+				throw new ValidationException( fieldName + "is defined twice in mapping xml." );
+			}
+			else {
+				fieldNames.add( fieldName );
+			}
 			final boolean containsField;
 			ContainsField containsAction = ContainsField.action( beanClass, fieldName );
 			if ( System.getSecurityManager() != null ) {
@@ -289,9 +272,16 @@
 	}
 
 	private void parsePropertyLevelOverrides(List<GetterType> getters, Class<?> beanClass, String defaultPackage) {
+		List<String> getterNames = new ArrayList<String>();
 		for ( GetterType getterType : getters ) {
 			String getterName = getterType.getName();
-			ContainsMethod cmAction =  ContainsMethod.action( beanClass, getterName );
+			if ( getterNames.contains( getterName ) ) {
+				throw new ValidationException( getterName + "is defined twice in mapping xml." );
+			}
+			else {
+				getterNames.add( getterName );
+			}
+			ContainsMethod cmAction = ContainsMethod.action( beanClass, getterName );
 			boolean containsMethod;
 			if ( System.getSecurityManager() != null ) {
 				containsMethod = AccessController.doPrivileged( cmAction );
@@ -400,7 +390,7 @@
 		for ( ElementType elementType : constraint.getElement() ) {
 			String name = elementType.getName();
 			checkNameIsValid( name );
-			Class<?> returnType = getAnnotationParamterType( annotationClass, name );
+			Class<?> returnType = getAnnotationParameterType( annotationClass, name );
 			Object elementValue = getElementValue( elementType, returnType );
 			annotationDescriptor.setValue( name, elementValue );
 		}
@@ -420,7 +410,7 @@
 		return metaConstraint;
 	}
 
-	private <A extends Annotation> Class<?> getAnnotationParamterType(Class<A> annotationClass, String name) {
+	private <A extends Annotation> Class<?> getAnnotationParameterType(Class<A> annotationClass, String name) {
 		Method m;
 		GetMethod action = GetMethod.action( annotationClass, name );
 		if ( System.getSecurityManager() != null ) {
@@ -431,7 +421,7 @@
 		}
 
 		if ( m == null ) {
-			throw new ValidationException( "Annotation of type " + annotationClass.getName() + " does not contain a paramter " + name + "." );
+			throw new ValidationException( "Annotation of type " + annotationClass.getName() + " does not contain a parameter " + name + "." );
 		}
 		return m.getReturnType();
 	}
@@ -488,11 +478,11 @@
 				returnValue = createAnnotation( annotationType, annotationClass );
 			}
 			catch ( ClassCastException e ) {
-				throw new ValidationException( "Unexpected paramter value" );
+				throw new ValidationException( "Unexpected parameter value" );
 			}
 		}
 		else {
-			throw new ValidationException( "Unexpected paramter value" );
+			throw new ValidationException( "Unexpected parameter value" );
 		}
 		return returnValue;
 
@@ -502,7 +492,7 @@
 		AnnotationDescriptor<A> annotationDescriptor = new AnnotationDescriptor<A>( returnType );
 		for ( ElementType elementType : annotationType.getElement() ) {
 			String name = elementType.getName();
-			Class<?> paramterType = getAnnotationParamterType( returnType, name );
+			Class<?> paramterType = getAnnotationParameterType( returnType, name );
 			Object elementValue = getElementValue( elementType, paramterType );
 			annotationDescriptor.setValue( name, elementValue );
 		}



More information about the hibernate-commits mailing list