diff options
author | Denis Anisimov <denis@vaadin.com> | 2016-10-20 08:27:11 +0000 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-10-20 08:43:41 +0000 |
commit | 1c11016e7a5b3528001b9ddab513a9d2a94012bc (patch) | |
tree | 5a443a8295238289ce5459471c4879fd7dae3e09 /server/src/main/java/com/vaadin | |
parent | 4e33a308d3fd24747e4c16094a0f60b75f60a2a8 (diff) | |
download | vaadin-framework-1c11016e7a5b3528001b9ddab513a9d2a94012bc.tar.gz vaadin-framework-1c11016e7a5b3528001b9ddab513a9d2a94012bc.zip |
Revert "Initial support for null representations in Binder"
This reverts commit 9f672890c143098b266ede6397e89379a38cc098.
Change-Id: I0952a7f9c7efc8a5d7de9987277b835d92d52b39
Diffstat (limited to 'server/src/main/java/com/vaadin')
4 files changed, 30 insertions, 86 deletions
diff --git a/server/src/main/java/com/vaadin/data/BeanBinder.java b/server/src/main/java/com/vaadin/data/BeanBinder.java index 4af38f7862..c73b89de81 100644 --- a/server/src/main/java/com/vaadin/data/BeanBinder.java +++ b/server/src/main/java/com/vaadin/data/BeanBinder.java @@ -269,11 +269,8 @@ public class BeanBinder<BEAN> extends Binder<BEAN> { @Override public <FIELDVALUE> BeanBinding<BEAN, FIELDVALUE, FIELDVALUE> forField( HasValue<FIELDVALUE> field) { - BeanBindingImpl<BEAN, FIELDVALUE, FIELDVALUE> binding = createBinding( - field, Converter.identity(), this::handleValidationStatus); - return binding.withConverter(fieldValue -> fieldValue, - modelValue -> modelValue != null ? modelValue - : field.getEmptyValue()); + return createBinding(field, Converter.identity(), + this::handleValidationStatus); } @Override diff --git a/server/src/main/java/com/vaadin/data/Binder.java b/server/src/main/java/com/vaadin/data/Binder.java index 8603ed9946..df29f8d480 100644 --- a/server/src/main/java/com/vaadin/data/Binder.java +++ b/server/src/main/java/com/vaadin/data/Binder.java @@ -282,23 +282,6 @@ public class Binder<BEAN> implements Serializable { } /** - * Maps binding value {@code null} to given null representation and back - * to {@code null} when converting back to model value. - * - * @param nullRepresentation - * the value to use instead of {@code null} - * @return a new binding with null representation handling. - */ - public default Binding<BEAN, FIELDVALUE, TARGET> withNullRepresentation( - TARGET nullRepresentation) { - return withConverter( - fieldValue -> Objects.equals(fieldValue, nullRepresentation) - ? null : fieldValue, - modelValue -> Objects.equals(modelValue, null) - ? nullRepresentation : modelValue); - } - - /** * Gets the field the binding uses. * * @return the field for the binding @@ -634,6 +617,10 @@ public class Binder<BEAN> implements Serializable { return validationStatus; } + private void setBeanValue(BEAN bean, TARGET value) { + setter.accept(bean, value); + } + private void notifyStatusHandler(ValidationStatus<?> status) { statusHandler.accept(status); } @@ -709,13 +696,6 @@ public class Binder<BEAN> implements Serializable { * {@link Binding#bind(Function, BiConsumer) Binding.bind} which completes * the binding. Until {@code Binding.bind} is called, the binding has no * effect. - * <p> - * <strong>Note:</strong> Not all {@link HasValue} implementations support - * passing {@code null} as the value. For these the Binder will - * automatically change {@code null} to a null representation provided by - * {@link HasValue#getEmptyValue()}. This conversion is one-way only, if you - * want to have a two-way mapping back to {@code null}, use - * {@link Binding#withNullRepresentation(Object))}. * * @param <FIELDVALUE> * the value type of the field @@ -732,12 +712,8 @@ public class Binder<BEAN> implements Serializable { clearError(field); getStatusLabel().ifPresent(label -> label.setValue("")); - BindingImpl<BEAN, FIELDVALUE, FIELDVALUE> createBinding = createBinding( - field, Converter.identity(), this::handleValidationStatus); - - return createBinding.withConverter(fieldValue -> fieldValue, - modelValue -> modelValue != null ? modelValue - : field.getEmptyValue()); + return createBinding(field, Converter.identity(), + this::handleValidationStatus); } /** @@ -826,14 +802,6 @@ public class Binder<BEAN> implements Serializable { * Use the {@link #forField(HasValue)} overload instead if you want to * further configure the new binding. * <p> - * <strong>Note:</strong> Not all {@link HasValue} implementations support - * passing {@code null} as the value. For these the Binder will - * automatically change {@code null} to a null representation provided by - * {@link HasValue#getEmptyValue()}. This conversion is one-way only, if you - * want to have a two-way mapping back to {@code null}, use - * {@link #forField(HasValue)} and - * {@link Binding#withNullRepresentation(Object))}. - * <p> * When a bean is bound with {@link Binder#bind(BEAN)}, the field value is * set to the return value of the given getter. The property value is then * updated via the given setter whenever the field value changes. The setter @@ -954,7 +922,7 @@ public class Binder<BEAN> implements Serializable { * <pre> * class Feature { * public enum Browser { CHROME, EDGE, FIREFOX, IE, OPERA, SAFARI } - + * public Set<Browser> getSupportedBrowsers() { ... } * public void setSupportedBrowsers(Set<Browser> title) { ... } * } @@ -1122,8 +1090,8 @@ public class Binder<BEAN> implements Serializable { // Save old bean values so we can restore them if validators fail Map<Binding<BEAN, ?, ?>, Object> oldValues = new HashMap<>(); - bindings.forEach( - binding -> oldValues.put(binding, binding.getter.apply(bean))); + bindings.forEach(binding -> oldValues.put(binding, + binding.convertDataToFieldType(bean))); bindings.forEach(binding -> binding.storeFieldValue(bean)); // Now run bean level validation against the updated bean @@ -1132,8 +1100,8 @@ public class Binder<BEAN> implements Serializable { .findAny().isPresent(); if (hasErrors) { // Bean validator failed, revert values - bindings.forEach((BindingImpl binding) -> binding.setter - .accept(bean, oldValues.get(binding))); + bindings.forEach((BindingImpl binding) -> binding.setBeanValue(bean, + oldValues.get(binding))); } else { // Save successful, reset hasChanges to false setHasChanges(false); diff --git a/server/src/main/java/com/vaadin/data/HasValue.java b/server/src/main/java/com/vaadin/data/HasValue.java index 26fd345d91..8333c8a02a 100644 --- a/server/src/main/java/com/vaadin/data/HasValue.java +++ b/server/src/main/java/com/vaadin/data/HasValue.java @@ -17,9 +17,6 @@ package com.vaadin.data; import java.io.Serializable; import java.lang.reflect.Method; -import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.Function; import com.vaadin.event.ConnectorEvent; import com.vaadin.event.EventListener; @@ -119,8 +116,8 @@ public interface HasValue<V> extends Serializable { * @see Registration */ @FunctionalInterface - public interface ValueChangeListener<V> - extends EventListener<ValueChange<V>> { + public interface ValueChangeListener<V> extends + EventListener<ValueChange<V>> { @Deprecated public static final Method VALUE_CHANGE_METHOD = ReflectTools @@ -173,29 +170,4 @@ public interface HasValue<V> extends Serializable { */ public Registration addValueChangeListener( ValueChangeListener<? super V> listener); - - /** - * Returns the value that represents an empty value. - * <p> - * By default {@link HasValue} is expected to support {@code null} as empty - * values. Specific implementations might not support this. - * - * @return empty value - * @see Binder#bind(HasValue, Function, BiConsumer) - */ - public default V getEmptyValue() { - return null; - } - - /** - * Returns whether this {@code HasValue} is considered to be empty. - * <p> - * By default this is an equality check between current value and empty - * value. - * - * @return {@code true} if considered empty; {@code false} if not - */ - public default boolean isEmpty() { - return Objects.equals(getValue(), getEmptyValue()); - } } diff --git a/server/src/main/java/com/vaadin/ui/AbstractTextField.java b/server/src/main/java/com/vaadin/ui/AbstractTextField.java index 9c2720efd8..b5119ec92c 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractTextField.java +++ b/server/src/main/java/com/vaadin/ui/AbstractTextField.java @@ -17,7 +17,6 @@ package com.vaadin.ui; import java.util.Collection; -import java.util.Objects; import org.jsoup.nodes.Attributes; import org.jsoup.nodes.Element; @@ -81,8 +80,11 @@ public abstract class AbstractTextField extends AbstractField<String> @Override public void setValue(String value) { - Objects.requireNonNull(value, "Null value not supported"); - setValue(value, false); + if (value == null) { + setValue("", false); + } else { + setValue(value, false); + } } /** @@ -268,6 +270,16 @@ public abstract class AbstractTextField extends AbstractField<String> setValue(""); } + /** + * Checks if the field is empty. + * + * @return <code>true</code> if the field value is an empty string, + * <code>false</code> otherwise + */ + public boolean isEmpty() { + return "".equals(getValue()); + } + @Override public void writeDesign(Element design, DesignContext designContext) { super.writeDesign(design, designContext); @@ -287,9 +299,4 @@ public abstract class AbstractTextField extends AbstractField<String> customAttributes.add("cursor-position"); return customAttributes; } - - @Override - public String getEmptyValue() { - return ""; - } } |