From: Artur Signell Date: Mon, 25 Jun 2012 12:48:27 +0000 (+0300) Subject: Test for converter factory and related fixes (#8992) X-Git-Tag: 7.0.0.alpha3~65 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4a997b3d5334d07185011f62e5508a88abc370fc;p=vaadin-framework.git Test for converter factory and related fixes (#8992) --- diff --git a/src/com/vaadin/data/util/converter/ConverterUtil.java b/src/com/vaadin/data/util/converter/ConverterUtil.java index 239baf6b6d..206295b293 100644 --- a/src/com/vaadin/data/util/converter/ConverterUtil.java +++ b/src/com/vaadin/data/util/converter/ConverterUtil.java @@ -120,8 +120,11 @@ public class ConverterUtil implements Serializable { return null; } - // check that the value class is compatible with the model type - if (modelType.isAssignableFrom(presentationValue.getClass())) { + if (modelType == null) { + // No model type, return original value + return (MODELTYPE) presentationValue; + } else if (modelType.isAssignableFrom(presentationValue.getClass())) { + // presentation type directly compatible with model type return modelType.cast(presentationValue); } else { throw new Converter.ConversionException( diff --git a/src/com/vaadin/ui/AbstractField.java b/src/com/vaadin/ui/AbstractField.java index 21ca01f592..ce62fb43ed 100644 --- a/src/com/vaadin/ui/AbstractField.java +++ b/src/com/vaadin/ui/AbstractField.java @@ -591,7 +591,7 @@ public abstract class AbstractField extends AbstractComponent implements // Commits the value to datasource committingValueToDataSource = true; getPropertyDataSource().setValue( - convertToDataSource(newFieldValue)); + convertToModel(newFieldValue)); // The buffer is now unmodified setModified(false); @@ -792,13 +792,15 @@ public abstract class AbstractField extends AbstractComponent implements * if there is no converter and the type is not compatible with * the data source type. */ - private Object convertToDataSource(T fieldValue) + private Object convertToModel(T fieldValue) throws Converter.ConversionException { try { Class modelType = null; Property pd = getPropertyDataSource(); if (pd != null) { modelType = pd.getType(); + } else if (getConverter() != null) { + modelType = getConverter().getModelType(); } return ConverterUtil.convertToModel(fieldValue, (Class) modelType, getConverter(), getLocale()); @@ -836,7 +838,7 @@ public abstract class AbstractField extends AbstractComponent implements * @return The converted value that is compatible with the data source type */ public Object getConvertedValue() { - return convertToDataSource(getFieldValue()); + return convertToModel(getFieldValue()); } /** diff --git a/tests/server-side/com/vaadin/tests/data/converter/ConverterFactory.java b/tests/server-side/com/vaadin/tests/data/converter/ConverterFactory.java new file mode 100644 index 0000000000..b97f987ae3 --- /dev/null +++ b/tests/server-side/com/vaadin/tests/data/converter/ConverterFactory.java @@ -0,0 +1,100 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.tests.data.converter; + +import java.util.Locale; + +import junit.framework.TestCase; + +import com.vaadin.Application; +import com.vaadin.data.util.converter.Converter; +import com.vaadin.data.util.converter.DefaultConverterFactory; +import com.vaadin.ui.TextField; + +public class ConverterFactory extends TestCase { + + public static class ConvertTo42 implements Converter { + + public Integer convertToModel(String value, Locale locale) + throws com.vaadin.data.util.converter.Converter.ConversionException { + return 42; + } + + public String convertToPresentation(Integer value, Locale locale) + throws com.vaadin.data.util.converter.Converter.ConversionException { + return "42"; + } + + public Class getModelType() { + return Integer.class; + } + + public Class getPresentationType() { + return String.class; + } + + } + + public static class ConverterFactory42 extends DefaultConverterFactory { + @Override + public Converter createConverter( + Class presentationType, Class modelType) { + if (modelType == Integer.class) { + return (Converter) new ConvertTo42(); + } + + return super.createConverter(presentationType, modelType); + } + } + + public void testApplicationConverterFactoryInBackgroundThread() { + Application.setCurrentApplication(null); + final Application appWithCustomIntegerConverter = new Application(); + appWithCustomIntegerConverter + .setConverterFactory(new ConverterFactory42()); + + TextField tf = new TextField("", "123") { + @Override + public Application getApplication() { + return appWithCustomIntegerConverter; + }; + }; + tf.setConverter(Integer.class); + // The application converter always returns 42. Current application is + // null + assertEquals(42, tf.getConvertedValue()); + } + + public void testApplicationConverterFactoryForDetachedComponent() { + final Application appWithCustomIntegerConverter = new Application(); + appWithCustomIntegerConverter + .setConverterFactory(new ConverterFactory42()); + Application.setCurrentApplication(appWithCustomIntegerConverter); + + TextField tf = new TextField("", "123"); + tf.setConverter(Integer.class); + // The application converter always returns 42. Current application is + // null + assertEquals(42, tf.getConvertedValue()); + } + + public void testApplicationConverterFactoryForDifferentThanCurrentApplication() { + final Application fieldAppWithCustomIntegerConverter = new Application(); + fieldAppWithCustomIntegerConverter + .setConverterFactory(new ConverterFactory42()); + Application.setCurrentApplication(new Application()); + + TextField tf = new TextField("", "123") { + @Override + public Application getApplication() { + return fieldAppWithCustomIntegerConverter; + } + }; + tf.setConverter(Integer.class); + + // The application converter always returns 42. Application.getCurrent() + // should not be used + assertEquals(42, tf.getConvertedValue()); + } +}