diff options
5 files changed, 92 insertions, 3 deletions
diff --git a/server/pom.xml b/server/pom.xml index 91df364a5e..c38f528e70 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -127,7 +127,12 @@ <artifactId>slf4j-log4j12</artifactId> <scope>test</scope> </dependency> - + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + <version>0.9.11</version> + <scope>test</scope> + </dependency> <!-- For manual testing with PostgreSQL (see SQLTestConstants) --> <!-- <dependency><groupId>postgresql</groupId><artifactId>postgresql</artifactId><version>9.1-901.jdbc3</version></dependency> --> </dependencies> diff --git a/server/src/main/java/com/vaadin/data/HasItems.java b/server/src/main/java/com/vaadin/data/HasItems.java index 16a47b9df2..d2890f37ec 100644 --- a/server/src/main/java/com/vaadin/data/HasItems.java +++ b/server/src/main/java/com/vaadin/data/HasItems.java @@ -15,6 +15,7 @@ */ package com.vaadin.data; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.stream.Collectors; @@ -100,7 +101,7 @@ public interface HasItems<T> extends Component { * the data items to display */ public default void setItems(@SuppressWarnings("unchecked") T... items) { - setItems(Arrays.asList(items)); + setItems(new ArrayList<>(Arrays.asList(items))); } /** diff --git a/server/src/main/java/com/vaadin/data/provider/DataProvider.java b/server/src/main/java/com/vaadin/data/provider/DataProvider.java index 936bcc4536..fc62536b3a 100644 --- a/server/src/main/java/com/vaadin/data/provider/DataProvider.java +++ b/server/src/main/java/com/vaadin/data/provider/DataProvider.java @@ -16,6 +16,7 @@ package com.vaadin.data.provider; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Objects; @@ -266,7 +267,7 @@ public interface DataProvider<T, F> extends Serializable { */ @SafeVarargs public static <T> ListDataProvider<T> ofItems(T... items) { - return new ListDataProvider<>(Arrays.asList(items)); + return new ListDataProvider<>(new ArrayList<>(Arrays.asList(items))); } /** diff --git a/server/src/test/java/com/vaadin/data/HasItemsTest.java b/server/src/test/java/com/vaadin/data/HasItemsTest.java new file mode 100644 index 0000000000..6bbdb46f4b --- /dev/null +++ b/server/src/test/java/com/vaadin/data/HasItemsTest.java @@ -0,0 +1,66 @@ +package com.vaadin.data; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Assert; +import org.junit.Test; +import org.reflections.Reflections; + +import com.vaadin.data.provider.DataProvider; +import com.vaadin.data.provider.ListDataProvider; +import com.vaadin.ui.Tree; +import com.vaadin.ui.TreeGrid; + +public class HasItemsTest { + + private static ArrayList<Class<?>> whiteList = new ArrayList<>(); + { + // these create a hierarchical data provider, which is not using + // ArrayList or Arrays.ArrayList in the end + whiteList.add(TreeGrid.class); + whiteList.add(Tree.class); + } + + @Test + public void setItemsVarargsConstructor_createsListDataProvider_itIsEditable() + throws InstantiationException, IllegalAccessException { + Set<Class<? extends HasItems>> subTypesOf = new Reflections( + "com.vaadin.ui").getSubTypesOf(HasItems.class).stream().filter( + clazz -> !Modifier.isAbstract(clazz.getModifiers())) + .filter(clazz -> Stream.of(clazz.getConstructors()) + .anyMatch(constuctor -> constuctor + .getParameterCount() == 0)) + .filter(clazz -> !whiteList.contains(clazz)) + .collect(Collectors.toSet()); + + for (Class<? extends HasItems> hasItemsType : subTypesOf) { + HasItems hasItems = hasItemsType.newInstance(); + + hasItems.setItems("0", "1"); + + DataProvider dataProvider = hasItems.getDataProvider(); + + Assert.assertTrue( + hasItemsType.getSimpleName() + + " setItems method with varargs parameters of does not create a list data provider", + dataProvider instanceof ListDataProvider); + + ListDataProvider listDataProvider = (ListDataProvider) dataProvider; + + Assert.assertTrue( + hasItemsType.getSimpleName() + + " does not have setItems method with varargs parameters of does not create an ArrayList backed list data provider", + listDataProvider.getItems() instanceof ArrayList); + + List list = (List) listDataProvider.getItems(); + // previously the following would explode since Arrays.ArrayList + // does not support it + list.add(0, "2"); + } + } +} diff --git a/server/src/test/java/com/vaadin/data/provider/ListDataProviderTest.java b/server/src/test/java/com/vaadin/data/provider/ListDataProviderTest.java index 8b1792689a..1e367e4e91 100644 --- a/server/src/test/java/com/vaadin/data/provider/ListDataProviderTest.java +++ b/server/src/test/java/com/vaadin/data/provider/ListDataProviderTest.java @@ -4,11 +4,13 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; +import org.junit.Assert; import org.junit.Test; import com.vaadin.server.SerializableComparator; @@ -23,6 +25,20 @@ public class ListDataProviderTest } @Test + public void dataProvider_ofItems_shouldCreateAnEditableDataProvider() { + ListDataProvider<String> dataProvider = DataProvider.ofItems("0", "1"); + + Assert.assertTrue( + "DataProvider.ofItems should create a list data provider backed an ArrayList allowing edits", + dataProvider.getItems() instanceof ArrayList); + + List<String> list = (List<String>) dataProvider.getItems(); + // previously the following would explode since Arrays.ArrayList does + // not support it + list.add(0, "2"); + } + + @Test public void setSortByProperty_ascending() { ListDataProvider<StrBean> dataProvider = getDataProvider(); |