From 6fb2d1a98076c6fbb9ba014fab37d7bf7a6e6a62 Mon Sep 17 00:00:00 2001 From: Anastasia Smirnova Date: Thu, 22 Mar 2018 15:39:18 +0200 Subject: Correctly handle data providers with overriden getId (#10728) Fixes #10647 Fixes #10498 --- .../checkboxgroup/CheckCheckBoxGroupWithId.java | 71 +++++++++++++ .../TwinColSelectAndIdBasedDataProvider.java | 110 +++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 uitest/src/main/java/com/vaadin/tests/components/checkboxgroup/CheckCheckBoxGroupWithId.java create mode 100644 uitest/src/main/java/com/vaadin/tests/components/twincolselect/TwinColSelectAndIdBasedDataProvider.java (limited to 'uitest/src/main/java') diff --git a/uitest/src/main/java/com/vaadin/tests/components/checkboxgroup/CheckCheckBoxGroupWithId.java b/uitest/src/main/java/com/vaadin/tests/components/checkboxgroup/CheckCheckBoxGroupWithId.java new file mode 100644 index 0000000000..408e786a91 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/checkboxgroup/CheckCheckBoxGroupWithId.java @@ -0,0 +1,71 @@ +package com.vaadin.tests.components.checkboxgroup; + +import com.vaadin.data.provider.DataProvider; +import com.vaadin.data.provider.ListDataProvider; +import com.vaadin.server.SerializablePredicate; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.CheckBoxGroup; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Objects; + +public class CheckCheckBoxGroupWithId extends AbstractTestUIWithLog { + + @Override + protected void setup(VaadinRequest request) { + DataProvider> dataProvider = new ListDataProvider( + Arrays.asList(new MyObject("Yellow", "real"), + new MyObject("Red", "real"))) { + @Override + public Object getId(MyObject item) { + return item.getName(); + } + }; + + CheckBoxGroup checkBoxGroup = new CheckBoxGroup<>(); + checkBoxGroup.setItemCaptionGenerator(MyObject::getName); + checkBoxGroup.setDataProvider(dataProvider); + checkBoxGroup.setValue( + new HashSet<>(Arrays.asList(new MyObject("Yellow", null)))); + + addComponent(checkBoxGroup); + addButton("Deselect", + event -> checkBoxGroup.deselect(new MyObject("Yellow", "XX"))); + } + + public static class MyObject { + private final String name; + private final String other; + + public MyObject(String name, String other) { + this.name = name; + this.other = other; + } + + public String getName() { + return name; + } + + public String getOther() { + return other; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + MyObject myObject = (MyObject) o; + return Objects.equals(name, myObject.name) + && Objects.equals(other, myObject.other); + } + + @Override + public int hashCode() { + return Objects.hash(name, other); + } + } +} diff --git a/uitest/src/main/java/com/vaadin/tests/components/twincolselect/TwinColSelectAndIdBasedDataProvider.java b/uitest/src/main/java/com/vaadin/tests/components/twincolselect/TwinColSelectAndIdBasedDataProvider.java new file mode 100644 index 0000000000..e6dce9a443 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/twincolselect/TwinColSelectAndIdBasedDataProvider.java @@ -0,0 +1,110 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.twincolselect; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Objects; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.data.provider.ListDataProvider; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.ui.Button; +import com.vaadin.ui.TwinColSelect; + +@Widgetset("com.vaadin.DefaultWidgetSet") +public class TwinColSelectAndIdBasedDataProvider extends AbstractTestUIWithLog { + + public static class MyObject { + private int id; + private String name; + + public MyObject() { + + } + + public MyObject(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "MyObject{" + "id=" + id + ", name='" + name + '\'' + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MyObject myObject = (MyObject) o; + return id == myObject.id && Objects.equals(name, myObject.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + } + + @Override + protected void setup(VaadinRequest request) { + ListDataProvider dataProvider = new ListDataProvider( + Arrays.asList(new MyObject(0, "Zero"), + new MyObject(1, "One"))) { + + @Override + public Object getId(MyObject item) { + return item.getId(); + } + }; + + TwinColSelect twinColSelect = new TwinColSelect<>(); + twinColSelect.setDataProvider(dataProvider); + + twinColSelect.setValue(Collections.singleton(new MyObject(1, null))); + + twinColSelect.addValueChangeListener( + event1 -> log.log("value: " + event1.getValue())); + + addComponent(twinColSelect); + addComponent(new Button("Deselect id=1", e -> { + twinColSelect.deselect(new MyObject(1, "foo")); + })); + } + +} -- cgit v1.2.3