[hibernate-commits] Hibernate SVN: r15983 - validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints and 3 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Feb 17 05:23:38 EST 2009


Author: hardy.ferentschik
Date: 2009-02-17 05:23:38 -0500 (Tue, 17 Feb 2009)
New Revision: 15983

Added:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForNumber.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForString.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForNumberTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForStringTest.java
Modified:
   beanvalidation/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
   validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
   validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
Log:
HV-117 Added builtin constrain Digits based on a modified version of Alaa's patch

Modified: beanvalidation/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java
===================================================================
--- beanvalidation/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java	2009-02-17 10:14:09 UTC (rev 15982)
+++ beanvalidation/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -52,12 +52,12 @@
 	Class<?>[] groups() default { };
 
 	/**
-	 * @return maximum number of integral digits accepted for this number
+	 * @return maximum number of integral digits accepted for this number.
 	 */
 	int integer();
 
 	/**
-	 * @return maximum number of fractional digits accepted for this numbe
+	 * @return maximum number of fractional digits accepted for this number.
 	 */
 	int fraction();
 }
\ No newline at end of file

Added: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForNumber.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForNumber.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForNumber.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -0,0 +1,62 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.constraints;
+
+import java.math.BigDecimal;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.Digits;
+
+/**
+ * Validates that the <code>Number</code> being validates matches the pattern
+ * defined in the constraint.
+ *
+ * @author Alaa Nassef
+ * @author Hardy Ferentschik
+ * @todo Implement exception handling in initalize once exception behaviour is specified BVAL-117
+ */
+public class DigitsValidatorForNumber implements ConstraintValidator<Digits, Number> {
+
+	private int maxIntegerLength;
+	private int maxFractionLength;
+
+	public void initialize(Digits constraintAnnotation) {
+		this.maxIntegerLength = constraintAnnotation.integer();
+		this.maxFractionLength = constraintAnnotation.fraction();
+	}
+
+	public boolean isValid(Number num, ConstraintValidatorContext constraintValidatorContext) {
+		//null values are valid
+		if ( num == null ) {
+			return true;
+		}
+
+		BigDecimal bigNum;
+		if ( num instanceof BigDecimal ) {
+			bigNum = ( BigDecimal ) num;
+		}
+		else  {
+			bigNum = new BigDecimal( num.toString() );
+		}
+
+		int integerPartLength = bigNum.precision() - bigNum.scale();
+		int fractionPartLength = bigNum.scale() < 0 ? 0 : bigNum.scale() ;
+
+		return ( maxIntegerLength >= integerPartLength && maxFractionLength >= fractionPartLength );
+	}
+}


Property changes on: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForNumber.java
___________________________________________________________________
Name: svn:keywords
   + Id

Added: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForString.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForString.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForString.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -0,0 +1,70 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.constraints;
+
+import java.math.BigDecimal;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.Digits;
+
+/**
+ * Validates that the <code>String</code> being validated consists of digits,
+ * and matches the pattern defined in the constraint.
+ *
+ * @author Alaa Nassef
+ * @author Hardy Ferentschik
+ *
+ */
+public class DigitsValidatorForString implements ConstraintValidator<Digits, String> {
+
+	private int maxIntegerLength;
+	private int maxFractionLength;
+
+	public void initialize(Digits constraintAnnotation) {
+		this.maxIntegerLength = constraintAnnotation.integer();
+		this.maxFractionLength = constraintAnnotation.fraction();
+	}
+
+	public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) {
+		//null values are valid
+		if ( str == null ) {
+			return true;
+		}
+
+		BigDecimal bigNum = getBigDecimalValue( str );
+		if ( bigNum == null ) {
+			return false;
+		}
+
+		int integerPartLength = bigNum.precision() - bigNum.scale();
+		int fractionPartLength = bigNum.scale() < 0 ? 0 : bigNum.scale() ;
+
+		return ( maxIntegerLength >= integerPartLength && maxFractionLength >= fractionPartLength );
+	}
+
+	private BigDecimal getBigDecimalValue(String str) {
+		BigDecimal bd;
+		try {
+			bd = new BigDecimal( str );
+		}
+		catch ( NumberFormatException nfe ) {
+			return null;
+		}
+		return bd;
+	}
+}


Property changes on: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/DigitsValidatorForString.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java	2009-02-17 10:14:09 UTC (rev 15982)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -26,6 +26,7 @@
 import javax.validation.ValidationException;
 import javax.validation.constraints.AssertFalse;
 import javax.validation.constraints.AssertTrue;
+import javax.validation.constraints.Digits;
 import javax.validation.constraints.Future;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
@@ -35,6 +36,8 @@
 
 import org.hibernate.validation.constraints.AssertFalseValidator;
 import org.hibernate.validation.constraints.AssertTrueValidator;
+import org.hibernate.validation.constraints.DigitsValidatorForNumber;
+import org.hibernate.validation.constraints.DigitsValidatorForString;
 import org.hibernate.validation.constraints.FutureValidatorForCalendar;
 import org.hibernate.validation.constraints.FutureValidatorForDate;
 import org.hibernate.validation.constraints.MaxValidatorForNumber;
@@ -52,6 +55,7 @@
 
 /**
  * @author Hardy Ferentschik
+ * @author Alaa Nassef
  */
 public class BuiltinConstraints {
 
@@ -97,6 +101,11 @@
 		builtinConstraints.put( Future.class, constraintList );
 
 		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( DigitsValidatorForString.class );
+		constraintList.add( DigitsValidatorForNumber.class );
+		builtinConstraints.put( Digits.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
 		constraintList.add( SizeValidatorForString.class );
 		constraintList.add( SizeValidatorForCollection.class );
 		constraintList.add( SizeValidatorForArray.class );

Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties	2009-02-17 10:14:09 UTC (rev 15982)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties	2009-02-17 10:23:38 UTC (rev 15983)
@@ -11,3 +11,4 @@
 validator.future=must be in the future
 validator.assertTrue=must be true
 validator.assertFalse=must be false
+validator.digits=numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)

Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties	2009-02-17 10:14:09 UTC (rev 15982)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties	2009-02-17 10:23:38 UTC (rev 15983)
@@ -11,3 +11,4 @@
 validator.future=muss in der Zukunft liegen
 validator.assertTrue=muss wahr sein
 validator.assertFalse=muss falsch sein
+validator.digits=numerischer Wert aus\u00DFerhalb erlaubten Wertebereichs (<{integer} Ziffern>.<{fraction} Ziffern> erwarted)

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForNumberTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForNumberTest.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForNumberTest.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -0,0 +1,82 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.constraints;
+
+import java.math.BigDecimal;
+import javax.validation.constraints.Digits;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+import org.hibernate.validation.util.annotationfactory.AnnotationDescriptor;
+import org.hibernate.validation.util.annotationfactory.AnnotationFactory;
+
+/**
+ * @author Alaa Nassef
+ * @author Hardy Ferentschik
+ */
+public class DigitsValidatorForNumberTest {
+
+	@Test
+	public void testIsValid() {
+
+		AnnotationDescriptor descriptor = new AnnotationDescriptor( Digits.class );
+		descriptor.setValue( "integer", 5 );
+		descriptor.setValue( "fraction", 2 );
+		descriptor.setValue( "message", "{validator.digits}" );
+		Digits p = AnnotationFactory.create( descriptor );
+
+		DigitsValidatorForNumber constraint = new DigitsValidatorForNumber();
+		constraint.initialize( p );
+
+
+		assertTrue( constraint.isValid( null, null ) );
+		assertTrue( constraint.isValid( Byte.valueOf( "0" ), null ) );
+		assertTrue( constraint.isValid( Double.valueOf( "500.2" ), null ) );
+
+		assertTrue( constraint.isValid( new BigDecimal( "-12345.12" ), null ) );
+		assertFalse( constraint.isValid( new BigDecimal( "-123456.12" ), null ) );
+		assertFalse( constraint.isValid( new BigDecimal( "-123456.123" ), null ) );
+		assertFalse( constraint.isValid( new BigDecimal( "-12345.123" ), null ) );
+		assertFalse( constraint.isValid( new BigDecimal( "12345.123" ), null ) );
+
+		assertTrue( constraint.isValid( Float.valueOf( "-000000000.22" ), null ) );
+		assertFalse( constraint.isValid( Integer.valueOf( "256874" ), null ) );
+		assertFalse( constraint.isValid( Double.valueOf( "12.0001" ), null ) );
+	}
+
+	@Test
+	public void testIsValidZeroLength() {
+
+		AnnotationDescriptor descriptor = new AnnotationDescriptor( Digits.class );
+		descriptor.setValue( "integer", 0 );
+		descriptor.setValue( "fraction", 0 );
+		descriptor.setValue( "message", "{validator.digits}" );
+		Digits p = AnnotationFactory.create( descriptor );
+
+		DigitsValidatorForNumber constraint = new DigitsValidatorForNumber();
+		constraint.initialize( p );
+
+
+		assertTrue( constraint.isValid( null, null ) );
+		assertFalse( constraint.isValid( Byte.valueOf( "0" ), null ) );
+		assertFalse( constraint.isValid( Double.valueOf( "500.2" ), null ) );
+	}
+
+}


Property changes on: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForNumberTest.java
___________________________________________________________________
Name: svn:keywords
   + Id

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForStringTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForStringTest.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForStringTest.java	2009-02-17 10:23:38 UTC (rev 15983)
@@ -0,0 +1,63 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.constraints;
+
+import javax.validation.constraints.Digits;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.hibernate.validation.util.annotationfactory.AnnotationDescriptor;
+import org.hibernate.validation.util.annotationfactory.AnnotationFactory;
+
+/**
+ * @author Alaa Nassef
+ */
+public class DigitsValidatorForStringTest {
+
+	private static DigitsValidatorForString constraint;
+
+	@BeforeClass
+	public static void init() {
+
+		AnnotationDescriptor descriptor = new AnnotationDescriptor( Digits.class );
+		descriptor.setValue( "integer", 5 );
+		descriptor.setValue( "fraction", 2 );
+		descriptor.setValue( "message", "{validator.digits}" );
+		Digits p = AnnotationFactory.create( descriptor );
+
+		constraint = new DigitsValidatorForString();
+		constraint.initialize( p );
+	}
+
+	@Test
+	public void testIsValid() {
+
+		assertTrue( constraint.isValid( null, null ) );
+		assertTrue( constraint.isValid( "0", null ) );
+		assertTrue( constraint.isValid( "500.2", null ) );
+		assertTrue( constraint.isValid( "-12456.22", null ) );
+		assertTrue( constraint.isValid( "-000000000.22", null ) );
+		//should throw number format exception
+		assertFalse( constraint.isValid( "", null ) );
+		assertFalse( constraint.isValid( "256874.0", null ) );
+		assertFalse( constraint.isValid( "12.0001", null ) );
+	}
+}


Property changes on: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/DigitsValidatorForStringTest.java
___________________________________________________________________
Name: svn:keywords
   + Id




More information about the hibernate-commits mailing list