diff options
author | Leif Åstrand <legioth@gmail.com> | 2017-01-10 12:22:22 +0200 |
---|---|---|
committer | Denis <denis@vaadin.com> | 2017-01-10 12:22:22 +0200 |
commit | b4af93bebf1b7e51d33330c42e3c89d5e3e4fd45 (patch) | |
tree | c6684248c5276da05ce50b7e92fcd7a87eaedd01 /server | |
parent | cba4eb476b559cc97ccf2d8197d176a0813707c7 (diff) | |
download | vaadin-framework-b4af93bebf1b7e51d33330c42e3c89d5e3e4fd45.tar.gz vaadin-framework-b4af93bebf1b7e51d33330c42e3c89d5e3e4fd45.zip |
Allow AbstractField to override value equality (#8201)
* Allow AbstractField to override value equality
Fixes #8089
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main/java/com/vaadin/ui/AbstractField.java | 20 | ||||
-rw-r--r-- | server/src/test/java/com/vaadin/ui/AbstractFieldTest.java | 57 |
2 files changed, 76 insertions, 1 deletions
diff --git a/server/src/main/java/com/vaadin/ui/AbstractField.java b/server/src/main/java/com/vaadin/ui/AbstractField.java index f19e1fd8fc..9f1a275ad0 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractField.java +++ b/server/src/main/java/com/vaadin/ui/AbstractField.java @@ -133,7 +133,7 @@ public abstract class AbstractField<T> extends AbstractComponent if (userOriginated && isReadOnly()) { return false; } - if (Objects.equals(value, getValue())) { + if (!isDifferentValue(value)) { return false; } doSetValue(value); @@ -146,6 +146,24 @@ public abstract class AbstractField<T> extends AbstractComponent } /** + * Called when a new value is set to determine whether the provided new + * value is considered to be a change compared to the current value. This is + * used to determine whether {@link #doSetValue(Object)} should be called + * and a value change event fired. + * + * @param newValue + * the new value candidate to check, may be <code>null</code> + * + * @return <code>true</code> if the provided value is considered to be + * different and a value change event should be fired; + * <code>false</code> if the values are considered to be the same + * and no value change should be fired + */ + protected boolean isDifferentValue(T newValue) { + return !Objects.equals(newValue, getValue()); + } + + /** * Sets the value of this field. May do sanitization or throw * {@code IllegalArgumentException} if the value is invalid. Typically saves * the value to shared state. diff --git a/server/src/test/java/com/vaadin/ui/AbstractFieldTest.java b/server/src/test/java/com/vaadin/ui/AbstractFieldTest.java index 7f66ca5ed3..8d8d9a6499 100644 --- a/server/src/test/java/com/vaadin/ui/AbstractFieldTest.java +++ b/server/src/test/java/com/vaadin/ui/AbstractFieldTest.java @@ -15,6 +15,14 @@ import com.vaadin.server.ClientConnector; public class AbstractFieldTest extends EasyMockSupport { + private final class IdentityTextField extends TextField { + @Override + protected boolean isDifferentValue(String newValue) { + // Checks for identity instead of equality + return newValue != getValue(); + } + } + class TextField extends AbstractField<String> { String value = ""; @@ -119,4 +127,53 @@ public class AbstractFieldTest extends EasyMockSupport { assertSame("event source connector", source, e.getSource()); assertEquals("event from user", userOriginated, e.isUserOriginated()); } + + @Test + public void identityField_realChange() { + TextField identityField = new IdentityTextField(); + + identityField.addValueChangeListener(l); + + // Expect event to both listeners for actual change + l.valueChange(EasyMock.capture(capture)); + + replayAll(); + + identityField.setValue("value"); + + verifyAll(); + } + + @Test + public void identityField_onlyIdentityChange() { + TextField identityField = new IdentityTextField(); + identityField.setValue("value"); + + identityField.addValueChangeListener(l); + + // Expect event to both listeners for actual change + l.valueChange(EasyMock.capture(capture)); + + replayAll(); + + String sameValueDifferentIdentity = new String("value"); + identityField.setValue(sameValueDifferentIdentity); + + verifyAll(); + } + + @Test + public void identityField_noChange() { + TextField identityField = new IdentityTextField(); + identityField.setValue("value"); + + identityField.addValueChangeListener(l); + + // Expect no event for identical value + replayAll(); + + identityField.setValue(identityField.getValue()); + + verifyAll(); + } } |