Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions server/src/main/java/com/vaadin/data/Binder.java
Original file line number Diff line number Diff line change
Expand Up @@ -2387,4 +2387,50 @@ private <V> void fireValueChangeEvent(ValueChangeEvent<V> event) {
public Stream<HasValue<?>> getFields() {
return bindings.stream().map(Binding::getField);
}

/**
* Finds and removes all Bindings for the given field.
*
* @param field
* the field to remove from bindings
*
* @since 8.2
*/
public void removeBinding(HasValue<?> field) {
Objects.requireNonNull(field, "Field can not be null");
Set<BindingImpl<BEAN, ?, ?>> toRemove = bindings.stream()
.filter(binding -> field.equals(binding.getField()))
.collect(Collectors.toSet());
toRemove.forEach(this::removeBinding);
}

/**
* Removes the given Binding from this Binder.
*
* @param binding
* the binding to remove
*
* @since 8.2
*/
public void removeBinding(Binding<BEAN, ?> binding) {
Objects.requireNonNull(binding, "Binding can not be null");
if (bindings.remove(binding)) {
boundProperties.entrySet()
.removeIf(entry -> entry.getValue().equals(binding));
}
}

/**
* Finds and removes the Binding for the given property name.
*
* @param propertyName
* the propertyName to remove from bindings
*
* @since 8.2
*/
public void removeBinding(String propertyName) {
Objects.requireNonNull(propertyName, "Property name can not be null");
Optional.ofNullable(boundProperties.get(propertyName))
.ifPresent(this::removeBinding);
}
}
71 changes: 71 additions & 0 deletions server/src/test/java/com/vaadin/data/BinderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.junit.Before;
import org.junit.Test;

import com.vaadin.data.Binder.Binding;
import com.vaadin.data.Binder.BindingBuilder;
import com.vaadin.data.converter.StringToDoubleConverter;
import com.vaadin.data.converter.StringToIntegerConverter;
Expand Down Expand Up @@ -682,4 +683,74 @@ public void multiple_calls_to_same_binder_throws() {
forField.withConverter(new StringToDoubleConverter("Failed"));
forField.bind(Person::getFirstName, Person::setFirstName);
}

@Test
public void remove_field_binding() {
binder.forField(ageField)
.withConverter(new StringToIntegerConverter("Can't convert"))
.bind(Person::getAge, Person::setAge);

// Test that the binding does work
Assert.assertTrue("Field not initially empty", ageField.isEmpty());
binder.setBean(item);
Assert.assertEquals("Binding did not work",
String.valueOf(item.getAge()), ageField.getValue());
binder.setBean(null);
Assert.assertTrue("Field not cleared", ageField.isEmpty());

// Remove the binding
binder.removeBinding(ageField);

// Test that it does not work anymore
binder.setBean(item);
Assert.assertNotEquals("Binding was not removed",
String.valueOf(item.getAge()), ageField.getValue());
}

@Test
public void remove_propertyname_binding() {
// Use a bean aware binder
Binder<Person> binder = new Binder<>(Person.class);

binder.bind(nameField, "firstName");

// Test that the binding does work
Assert.assertTrue("Field not initially empty", nameField.isEmpty());
binder.setBean(item);
Assert.assertEquals("Binding did not work", item.getFirstName(),
nameField.getValue());
binder.setBean(null);
Assert.assertTrue("Field not cleared", nameField.isEmpty());

// Remove the binding
binder.removeBinding("firstName");

// Test that it does not work anymore
binder.setBean(item);
Assert.assertNotEquals("Binding was not removed", item.getFirstName(),
nameField.getValue());
}

@Test
public void remove_binding() {
Binding<Person, Integer> binding = binder.forField(ageField)
.withConverter(new StringToIntegerConverter("Can't convert"))
.bind(Person::getAge, Person::setAge);

// Test that the binding does work
Assert.assertTrue("Field not initially empty", ageField.isEmpty());
binder.setBean(item);
Assert.assertEquals("Binding did not work",
String.valueOf(item.getAge()), ageField.getValue());
binder.setBean(null);
Assert.assertTrue("Field not cleared", ageField.isEmpty());

// Remove the binding
binder.removeBinding(binding);

// Test that it does not work anymore
binder.setBean(item);
Assert.assertNotEquals("Binding was not removed",
String.valueOf(item.getAge()), ageField.getValue());
}
}