From 1b0a214100e6270abea8b9f415a0873de88aab95 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 31 May 2013 09:56:58 +0300 Subject: [PATCH] Pass ConversionException to getConversionError (#11960) Change-Id: I6a25c4e4bfd9fe73f973670583c708503f77f60a --- server/src/com/vaadin/ui/AbstractField.java | 37 ++++++---- .../AbsFieldValueConversionError.java | 72 +++++++++++++++++++ 2 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversionError.java diff --git a/server/src/com/vaadin/ui/AbstractField.java b/server/src/com/vaadin/ui/AbstractField.java index 606bf5fb21..7ac3a57c46 100644 --- a/server/src/com/vaadin/ui/AbstractField.java +++ b/server/src/com/vaadin/ui/AbstractField.java @@ -751,24 +751,36 @@ public abstract class AbstractField extends AbstractComponent implements return ConverterUtil.convertToModel(fieldValue, (Class) modelType, getConverter(), locale); } catch (ConversionException e) { - throw new ConversionException(getConversionError(modelType), e); + throw new ConversionException(getConversionError(modelType, e), e); } } /** - * Returns the conversion error with {0} replaced by the data source type. + * Returns the conversion error with {0} replaced by the data source type + * and {1} replaced by the exception (localized) message. * + * @since 7.1 * @param dataSourceType - * The type of the data source + * the type of the data source + * @param e + * a conversion exception which can provide additional + * information * @return The value conversion error string with parameters replaced. */ - protected String getConversionError(Class dataSourceType) { - if (dataSourceType == null) { - return getConversionError(); - } else { - return getConversionError().replace("{0}", + protected String getConversionError(Class dataSourceType, + ConversionException e) { + String conversionError = getConversionError(); + + if (dataSourceType != null) { + conversionError = conversionError.replace("{0}", dataSourceType.getSimpleName()); } + if (e != null) { + conversionError = conversionError.replace("{1}", + e.getLocalizedMessage()); + } + + return conversionError; } /** @@ -924,9 +936,9 @@ public abstract class AbstractField extends AbstractComponent implements try { valueToValidate = getConverter().convertToModel(fieldValue, getLocale()); - } catch (Exception e) { - throw new InvalidValueException( - getConversionError(getConverter().getModelType())); + } catch (ConversionException e) { + throw new InvalidValueException(getConversionError( + getConverter().getModelType(), e)); } } @@ -1461,7 +1473,8 @@ public abstract class AbstractField extends AbstractComponent implements /** * Sets the error that is shown if the field value cannot be converted to * the data source type. If {0} is present in the message, it will be - * replaced by the simple name of the data source type. + * replaced by the simple name of the data source type. If {1} is present in + * the message, it will be replaced by the ConversionException message. * * @param valueConversionError * Message to be shown when conversion of the value fails diff --git a/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversionError.java b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversionError.java new file mode 100644 index 0000000000..ad762f8931 --- /dev/null +++ b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbsFieldValueConversionError.java @@ -0,0 +1,72 @@ +package com.vaadin.tests.server.component.abstractfield; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.data.util.converter.Converter.ConversionException; +import com.vaadin.data.util.converter.StringToIntegerConverter; +import com.vaadin.tests.data.bean.Address; +import com.vaadin.tests.data.bean.Country; +import com.vaadin.tests.data.bean.Person; +import com.vaadin.tests.data.bean.Sex; +import com.vaadin.ui.TextField; + +public class AbsFieldValueConversionError extends TestCase { + + Person paulaBean = new Person("Paula", "Brilliant", "paula@brilliant.com", + 34, Sex.FEMALE, new Address("Paula street 1", 12345, "P-town", + Country.FINLAND)); + + public void testValidateConversionErrorParameters() { + TextField tf = new TextField(); + tf.setConverter(new StringToIntegerConverter()); + tf.setPropertyDataSource(new MethodProperty(paulaBean, "age")); + tf.setConversionError("(Type: {0}) Converter exception message: {1}"); + tf.setValue("abc"); + try { + tf.validate(); + fail(); + } catch (InvalidValueException e) { + Assert.assertEquals( + "(Type: Integer) Converter exception message: Could not convert 'abc' to java.lang.Integer", + e.getMessage()); + } + + } + + public void testConvertToModelConversionErrorParameters() { + TextField tf = new TextField(); + tf.setConverter(new StringToIntegerConverter()); + tf.setPropertyDataSource(new MethodProperty(paulaBean, "age")); + tf.setConversionError("(Type: {0}) Converter exception message: {1}"); + tf.setValue("abc"); + try { + tf.getConvertedValue(); + fail(); + } catch (ConversionException e) { + Assert.assertEquals( + "(Type: Integer) Converter exception message: Could not convert 'abc' to java.lang.Integer", + e.getMessage()); + } + + } + + public void testDefaultConversionErrorMessage() { + TextField tf = new TextField(); + tf.setConverter(new StringToIntegerConverter()); + tf.setPropertyDataSource(new MethodProperty(paulaBean, "age")); + tf.setValue("abc"); + + try { + tf.validate(); + fail(); + } catch (InvalidValueException e) { + Assert.assertEquals("Could not convert value to Integer", + e.getMessage()); + } + + } +} -- 2.39.5