]> source.dussan.org Git - vaadin-framework.git/commitdiff
Remove Locale from BeanValidator because of ValueContext
authorPekka Hyvönen <pekka@vaadin.com>
Mon, 31 Oct 2016 10:15:20 +0000 (12:15 +0200)
committerPekka Hyvönen <pekka@vaadin.com>
Mon, 31 Oct 2016 10:16:32 +0000 (12:16 +0200)
Fixes vaadin/framework8-issues#417

Change-Id: I0d299cb040cc21e9708906f12f4133109f1b2a90

server/src/main/java/com/vaadin/data/BeanBinder.java
server/src/main/java/com/vaadin/data/validator/BeanValidator.java
server/src/test/java/com/vaadin/data/validator/BeanValidatorTest.java

index ab87643451524102f4d7432ec9135e14a9a35e14..b05e24fc9c6071b3559d206114c520220855de52 100644 (file)
@@ -187,8 +187,8 @@ public class BeanBinder<BEAN> extends Binder<BEAN> {
             finalBinding = withConverter(createConverter(), false);
 
             if (BeanUtil.checkBeanValidationAvailable()) {
-                finalBinding = finalBinding.withValidator(new BeanValidator(
-                        getBinder().beanType, propertyName, findLocale()));
+                finalBinding = finalBinding.withValidator(
+                        new BeanValidator(getBinder().beanType, propertyName));
             }
 
             PropertyDescriptor descriptor = getDescriptor(propertyName);
@@ -389,7 +389,7 @@ public class BeanBinder<BEAN> extends Binder<BEAN> {
      * Binds {@code property} with {@code propertyType} to the field in the
      * {@code objectWithMemberFields} instance using {@code memberField} as a
      * reference to a member.
-     * 
+     *
      * @param objectWithMemberFields
      *            the object that contains (Java) member fields to build and
      *            bind
@@ -448,7 +448,7 @@ public class BeanBinder<BEAN> extends Binder<BEAN> {
      * class. If there is no suitable default constructor or you want to
      * configure the instantiated class then override this method and provide
      * your own implementation.
-     * 
+     *
      * @see #bindInstanceFields(Object)
      * @param fieldClass
      *            type of the field
index 170f5a5f04f63918df8aa03a4dcd196ffadbea84..53886c98407830a969ad9769a2e6680703634aec 100644 (file)
@@ -73,7 +73,6 @@ public class BeanValidator implements Validator<Object> {
 
     private String propertyName;
     private Class<?> beanType;
-    private Locale locale;
 
     /**
      * Creates a new JSR-303 {@code BeanValidator} that validates values of the
@@ -89,25 +88,6 @@ public class BeanValidator implements Validator<Object> {
      *             false
      */
     public BeanValidator(Class<?> beanType, String propertyName) {
-        this(beanType, propertyName, Locale.getDefault());
-    }
-
-    /**
-     * Creates a new JSR-303 {@code BeanValidator} that validates values of the
-     * specified property. Localizes validation messages using the given locale.
-     *
-     * @param beanType
-     *            the bean class declaring the property, not null
-     * @param propertyName
-     *            the property to validate, not null
-     * @param locale
-     *            the locale to use, not null
-     * @throws IllegalStateException
-     *             if {@link BeanUtil#checkBeanValidationAvailable()} returns
-     *             false
-     */
-    public BeanValidator(Class<?> beanType, String propertyName,
-            Locale locale) {
         if (!BeanUtil.checkBeanValidationAvailable()) {
             throw new IllegalStateException("Cannot create a "
                     + BeanValidator.class.getSimpleName()
@@ -118,7 +98,6 @@ public class BeanValidator implements Validator<Object> {
 
         this.beanType = beanType;
         this.propertyName = propertyName;
-        setLocale(locale);
     }
 
     /**
@@ -129,6 +108,12 @@ public class BeanValidator implements Validator<Object> {
      * <p>
      * Null values are accepted unless the property has an {@code @NotNull}
      * annotation or equivalent.
+     *
+     * @param value
+     *            the input value to validate
+     * @param context
+     *            the value context for validation
+     * @return the validation result
      */
     @Override
     public Result<Object> apply(final Object value, ValueContext context) {
@@ -137,20 +122,12 @@ public class BeanValidator implements Validator<Object> {
 
         BinaryOperator<Result<Object>> accumulator = (result1,
                 result2) -> result1.flatMap(val -> result2);
+        Locale locale = context.getLocale().orElse(Locale.getDefault());
 
-        return violations.stream().map(v -> Result.error(getMessage(v)))
+        return violations.stream().map(v -> Result.error(getMessage(v, locale)))
                 .reduce(Result.ok(value), accumulator);
     }
 
-    /**
-     * Returns the locale used for validation error messages.
-     *
-     * @return the locale used for error messages
-     */
-    public Locale getLocale() {
-        return locale;
-    }
-
     @Override
     public String toString() {
         return String.format("%s[%s.%s]", getClass().getSimpleName(),
@@ -180,13 +157,17 @@ public class BeanValidator implements Validator<Object> {
      * Returns the interpolated error message for the given constraint violation
      * using the locale specified for this validator.
      *
-     * @param v
+     * @param violation
      *            the constraint violation
+     * @param locale
+     *            the used locale
      * @return the localized error message
      */
-    protected String getMessage(ConstraintViolation<?> v) {
+    protected String getMessage(ConstraintViolation<?> violation,
+            Locale locale) {
         return getJavaxBeanValidatorFactory().getMessageInterpolator()
-                .interpolate(v.getMessageTemplate(), createContext(v), locale);
+                .interpolate(violation.getMessageTemplate(),
+                        createContext(violation), locale);
     }
 
     /**
@@ -201,18 +182,6 @@ public class BeanValidator implements Validator<Object> {
         return new ContextImpl(violation);
     }
 
-    /**
-     * Sets the locale used for validation error messages. Revalidation is not
-     * automatically triggered by setting the locale.
-     *
-     * @param locale
-     *            the locale to use for error messages, not null
-     */
-    private void setLocale(Locale locale) {
-        Objects.requireNonNull(locale, "locale cannot be null");
-        this.locale = locale;
-    }
-
     private static class LazyFactoryInitializer implements Serializable {
         private static final ValidatorFactory FACTORY = getFactory();
 
index 2d3db779393f801d31103834f79ebbb974734972..fb504eea6514f1dfa455c96c718f928a568a5f2d 100644 (file)
@@ -7,6 +7,8 @@ import org.junit.Test;
 
 import com.vaadin.tests.data.bean.Address;
 import com.vaadin.tests.data.bean.BeanToValidate;
+import com.vaadin.tests.util.MockUI;
+import com.vaadin.ui.UI;
 
 public class BeanValidatorTest extends ValidatorTestBase {
 
@@ -56,7 +58,10 @@ public class BeanValidatorTest extends ValidatorTestBase {
 
     @Test
     public void testInvalidDecimalsFailsInFrench() {
-        BeanValidator v = validator("decimals", Locale.FRENCH);
+        MockUI ui = new MockUI();
+        ui.setLocale(Locale.FRENCH);
+        UI.setCurrent(ui);
+        BeanValidator v = validator("decimals");
         assertFails("1234.567", "Valeur numérique hors limite "
                 + "(<3 chiffres>.<2 chiffres> attendus)", v);
     }
@@ -76,7 +81,4 @@ public class BeanValidatorTest extends ValidatorTestBase {
         return new BeanValidator(BeanToValidate.class, propertyName);
     }
 
-    private BeanValidator validator(String propertyName, Locale locale) {
-        return new BeanValidator(BeanToValidate.class, propertyName, locale);
-    }
 }