Author: hardy.ferentschik
Date: 2010-06-15 05:40:40 -0400 (Tue, 15 Jun 2010)
New Revision: 19735
Added:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/test/engine/messageinterpolation/MessageInterpolatorContextTest.java
Modified:
validator/trunk/hibernate-validator/pom.xml
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/MessageInterpolatorContext.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidationContext.java
validator/trunk/pom.xml
Log:
HV-333 Makde sure the actual validated value is passed to interpolate via
MessageInterpolatorContext
Modified: validator/trunk/hibernate-validator/pom.xml
===================================================================
--- validator/trunk/hibernate-validator/pom.xml 2010-06-15 06:40:13 UTC (rev 19734)
+++ validator/trunk/hibernate-validator/pom.xml 2010-06-15 09:40:40 UTC (rev 19735)
@@ -82,6 +82,11 @@
<classifier>jdk15</classifier>
</dependency>
<dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymock</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<scope>test</scope>
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/MessageInterpolatorContext.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/MessageInterpolatorContext.java 2010-06-15
06:40:13 UTC (rev 19734)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/MessageInterpolatorContext.java 2010-06-15
09:40:40 UTC (rev 19735)
@@ -21,9 +21,10 @@
import javax.validation.MessageInterpolator;
/**
- * Takes mandatory elements in the constructor
+ * Implementation of the context used during message interpolation.
*
* @author Emmanuel Bernard
+ * @author Hardy Ferentschik
*/
public class MessageInterpolatorContext implements MessageInterpolator.Context {
private final ConstraintDescriptor<?> constraintDescriptor;
@@ -41,4 +42,42 @@
public Object getValidatedValue() {
return validatedValue;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ MessageInterpolatorContext that = ( MessageInterpolatorContext ) o;
+
+ if ( constraintDescriptor != null ? !constraintDescriptor.equals(
that.constraintDescriptor ) : that.constraintDescriptor != null ) {
+ return false;
+ }
+ if ( validatedValue != null ? !validatedValue.equals( that.validatedValue ) :
that.validatedValue != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = constraintDescriptor != null ? constraintDescriptor.hashCode() : 0;
+ result = 31 * result + ( validatedValue != null ? validatedValue.hashCode() : 0 );
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append( "MessageInterpolatorContext" );
+ sb.append( "{constraintDescriptor=" ).append( constraintDescriptor );
+ sb.append( ", validatedValue=" ).append( validatedValue );
+ sb.append( '}' );
+ return sb.toString();
+ }
}
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidationContext.java
===================================================================
---
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidationContext.java 2010-06-15
06:40:13 UTC (rev 19734)
+++
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validator/engine/ValidationContext.java 2010-06-15
09:40:40 UTC (rev 19735)
@@ -149,7 +149,7 @@
String messageTemplate = messageAndPath.getMessage();
String interpolatedMessage = messageInterpolator.interpolate(
messageTemplate,
- new MessageInterpolatorContext( descriptor, localContext.getCurrentBean() )
+ new MessageInterpolatorContext( descriptor, localContext.getCurrentValidatedValue()
)
);
return new ConstraintViolationImpl<T>(
messageTemplate,
Copied:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/test/engine/messageinterpolation/MessageInterpolatorContextTest.java
(from rev 19558,
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/test/engine/messageinterpolation/MessageInterpolationTest.java)
===================================================================
---
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/test/engine/messageinterpolation/MessageInterpolatorContextTest.java
(rev 0)
+++
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validator/test/engine/messageinterpolation/MessageInterpolatorContextTest.java 2010-06-15
09:40:40 UTC (rev 19735)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and/or its affiliates, 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.
+ */
+
+// $Id$
+
+package org.hibernate.validator.test.engine.messageinterpolation;
+
+import java.util.Set;
+import javax.validation.ConstraintViolation;
+import javax.validation.MessageInterpolator;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import javax.validation.metadata.BeanDescriptor;
+import javax.validation.metadata.ConstraintDescriptor;
+import javax.validation.metadata.PropertyDescriptor;
+
+import org.hibernate.validator.HibernateValidator;
+import org.hibernate.validator.HibernateValidatorConfiguration;
+import org.hibernate.validator.cfg.ConstraintMapping;
+import org.hibernate.validator.cfg.defs.MinDef;
+import org.hibernate.validator.engine.MessageInterpolatorContext;
+import org.hibernate.validator.test.util.TestUtil;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.hibernate.validator.test.util.TestUtil.assertNumberOfViolations;
+import static org.testng.Assert.assertTrue;
+
+
+/**
+ * Tests for HV-333
+ *
+ * @author Hardy Ferentschik
+ */
+public class MessageInterpolatorContextTest {
+
+ @org.testng.annotations.Test
+ public void testInterpolatorContext() throws Exception {
+
+ // use programmatic mapping api to configure constraint
+ ConstraintMapping mapping = new ConstraintMapping();
+ mapping.type( Test.class )
+ .property( "test", FIELD )
+ .constraint( MinDef.class )
+ .value( 10 )
+ .message( "{foo}" );
+
+ // use a easy mock message interpolator to verify the right for verifying that the
right MessageInterpolatorContext
+ // will be passed
+ MessageInterpolator mock = createMock( MessageInterpolator.class );
+ HibernateValidatorConfiguration config = TestUtil.getConfiguration(
HibernateValidator.class );
+ config.messageInterpolator( mock );
+ config.addMapping( mapping );
+
+ ValidatorFactory factory = config.buildValidatorFactory();
+ Validator validator = factory.getValidator();
+
+ BeanDescriptor beanDescriptor = validator.getConstraintsForClass( Test.class );
+ PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(
"test" );
+ Set<ConstraintDescriptor<?>> constraintDescriptors =
propertyDescriptor.getConstraintDescriptors();
+ assertTrue( constraintDescriptors.size() == 1 );
+
+ // prepare the mock interpolator to expect the right interpolate call
+ String validatedValue = "value";
+ expect(
+ mock.interpolate(
+ "{foo}",
+ new MessageInterpolatorContext( constraintDescriptors.iterator().next(),
validatedValue )
+ )
+ ).andReturn( "{foo}" );
+ replay( mock );
+
+ Set<ConstraintViolation<Test>> violations = validator.validate( new Test(
validatedValue ) );
+ assertNumberOfViolations( violations, 1 );
+
+ // verify that the right validatedValue was passed
+ verify( mock );
+ }
+
+
+ public static class Test {
+ private String test;
+
+ public Test(String test) {
+ this.test = test;
+ }
+
+ public String getTest() {
+ return test;
+ }
+
+ public void setTest(String test) {
+ this.test = test;
+ }
+ }
+}
\ No newline at end of file
Modified: validator/trunk/pom.xml
===================================================================
--- validator/trunk/pom.xml 2010-06-15 06:40:13 UTC (rev 19734)
+++ validator/trunk/pom.xml 2010-06-15 09:40:40 UTC (rev 19735)
@@ -105,6 +105,11 @@
<classifier>jdk15</classifier>
</dependency>
<dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymock</artifactId>
+ <version>3.0</version>
+ </dependency>
+ <dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.2.124</version>