From 19b42d6ee408d0711ed6e13c3d833b487e36e834 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leif=20=C3=85strand?= Date: Tue, 24 Jan 2017 10:38:57 +0200 Subject: [PATCH] Unify container wrapping (#8312) * Method names unified to withXyzFilter * withConfigurableFilter moved to DataProvider * Remove DataProviderWrapper.convert since it does the same as DataProvider.withConvertedFilter * Make javadocs slightly more consistent * Make type parameters consistent --- .../data/provider/BackEndDataProvider.java | 41 ---------- .../vaadin/data/provider/DataProvider.java | 80 ++++++++++++++++--- .../data/provider/DataProviderWrapper.java | 33 -------- .../data/provider/ListDataProvider.java | 2 +- .../data/provider/DataProviderTestBase.java | 2 +- .../combobox/ComboBoxFilteringTest.java | 4 +- 6 files changed, 71 insertions(+), 91 deletions(-) diff --git a/server/src/main/java/com/vaadin/data/provider/BackEndDataProvider.java b/server/src/main/java/com/vaadin/data/provider/BackEndDataProvider.java index 199d0b64fe..f20b22fa17 100644 --- a/server/src/main/java/com/vaadin/data/provider/BackEndDataProvider.java +++ b/server/src/main/java/com/vaadin/data/provider/BackEndDataProvider.java @@ -18,8 +18,6 @@ package com.vaadin.data.provider; import java.util.Collections; import java.util.List; -import com.vaadin.server.SerializableBiFunction; - /** * A data provider that lazy loads items from a back end. * @@ -74,43 +72,4 @@ public interface BackEndDataProvider extends DataProvider { return false; } - /** - * Wraps this data provider to create a data provider that supports - * programmatically setting a filter that will be combined with a filter - * provided through the query. - * - * @see #withConfigurableFilter() - * - * @param filterCombiner - * a callback for combining and the configured filter with the - * filter from the query to get a filter to pass to the wrapped - * provider. Will only be called if the query contains a filter. - * - * @return a data provider with a configurable filter, not null - */ - public default ConfigurableFilterDataProvider withConfigurableFilter( - SerializableBiFunction filterCombiner) { - return new ConfigurableFilterDataProviderWrapper(this) { - @Override - protected F combineFilters(F configuredFilter, C queryFilter) { - return filterCombiner.apply(configuredFilter, queryFilter); - } - }; - } - - /** - * Wraps this data provider to create a data provider that supports - * programmatically setting a filter but no filtering through the query. - * - * @see #withConfigurableFilter(SerializableBiFunction) - * - * @return a data provider with a configurable filter, not null - */ - public default ConfigurableFilterDataProvider withConfigurableFilter() { - return withConfigurableFilter((configuredFilter, queryFilter) -> { - assert queryFilter == null : "Filter from Void query must be null"; - - return configuredFilter; - }); - } } 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 324ee1aac4..69d4d8edbc 100644 --- a/server/src/main/java/com/vaadin/data/provider/DataProvider.java +++ b/server/src/main/java/com/vaadin/data/provider/DataProvider.java @@ -24,6 +24,7 @@ import java.util.stream.Stream; import com.vaadin.data.HasDataProvider; import com.vaadin.data.HasFilterableDataProvider; +import com.vaadin.server.SerializableBiFunction; import com.vaadin.server.SerializableFunction; import com.vaadin.shared.Registration; @@ -105,9 +106,9 @@ public interface DataProvider extends Serializable { Registration addDataProviderListener(DataProviderListener listener); /** - * Convert the data provider to use a different filter type. It is used for - * adapting this data provider to a filter type provided by a Component such - * as ComboBox. + * Wraps this data provider to create a data provider that uses a different + * filter type. This can be used for adapting this data provider to a filter + * type provided by a Component such as ComboBox. *

* For example receiving a String from ComboBox and making a Predicate based * on it: @@ -116,7 +117,7 @@ public interface DataProvider extends Serializable { * DataProvider<Person, Predicate<Person>> dataProvider; * // ComboBox uses String as the filter type * DataProvider<Person, String> wrappedProvider = dataProvider - * .convertFilter(filterText -> { + * .withConvertedFilter(filterText -> { * Predicate<Person> predicate = person -> person.getName() * .startsWith(filterText); * return predicate; @@ -124,18 +125,71 @@ public interface DataProvider extends Serializable { * comboBox.setDataProvider(wrappedProvider); * * - * @param mapper - * the mapper from new filter type to old filter type; not null + * @param filterConverter + * callback that converts the filter in the query of the wrapped + * data provider into a filter supported by this data provider. + * Will only be called if the query contains a filter. Not + * null * - * @param - * the filter type to map from; typically provided by a Component + * @param + * the filter type that the wrapped data provider accepts; + * typically provided by a Component * - * @return wrapped data provider + * @return wrapped data provider, not null */ - public default DataProvider convertFilter( - SerializableFunction mapper) { - Objects.requireNonNull(mapper, "Filter mapper can't be null"); - return DataProviderWrapper.convert(this, mapper); + public default DataProvider withConvertedFilter( + SerializableFunction filterConverter) { + Objects.requireNonNull(filterConverter, + "Filter converter can't be null"); + return new DataProviderWrapper(this) { + @Override + protected F getFilter(Query query) { + return query.getFilter().map(filterConverter).orElse(null); + } + }; + } + + /** + * Wraps this data provider to create a data provider that supports + * programmatically setting a filter that will be combined with a filter + * provided through the query. + * + * @see #withConfigurableFilter() + * @see ConfigurableFilterDataProvider#setFilter(Object) + * + * @param filterCombiner + * a callback for combining and the configured filter with the + * filter from the query to get a filter to pass to the wrapped + * provider. Will only be called if the query contains a filter. + * Not null + * + * @return a data provider with a configurable filter, not null + */ + public default ConfigurableFilterDataProvider withConfigurableFilter( + SerializableBiFunction filterCombiner) { + return new ConfigurableFilterDataProviderWrapper(this) { + @Override + protected F combineFilters(F configuredFilter, C queryFilter) { + return filterCombiner.apply(configuredFilter, queryFilter); + } + }; + } + + /** + * Wraps this data provider to create a data provider that supports + * programmatically setting a filter but no filtering through the query. + * + * @see #withConfigurableFilter(SerializableBiFunction) + * @see ConfigurableFilterDataProvider#setFilter(Object) + * + * @return a data provider with a configurable filter, not null + */ + public default ConfigurableFilterDataProvider withConfigurableFilter() { + return withConfigurableFilter((configuredFilter, queryFilter) -> { + assert queryFilter == null : "Filter from Void query must be null"; + + return configuredFilter; + }); } /** diff --git a/server/src/main/java/com/vaadin/data/provider/DataProviderWrapper.java b/server/src/main/java/com/vaadin/data/provider/DataProviderWrapper.java index 7db22ae311..1eabb67abe 100644 --- a/server/src/main/java/com/vaadin/data/provider/DataProviderWrapper.java +++ b/server/src/main/java/com/vaadin/data/provider/DataProviderWrapper.java @@ -18,7 +18,6 @@ package com.vaadin.data.provider; import java.util.Objects; import java.util.stream.Stream; -import com.vaadin.server.SerializableFunction; import com.vaadin.shared.Registration; /** @@ -90,36 +89,4 @@ public abstract class DataProviderWrapper * @return filter for the modified Query */ protected abstract M getFilter(Query query); - - /** - * Creates a data provider wrapper with filter type mapping. The mapper - * function will be applied to a query filter if it is present. - * - * @see DataProvider#convertFilter(SerializableFunction) - * - * @param dataProvider - * the underlying data provider - * @param mapper - * the function to map from one filter type to another - * - * @param - * data provider data type - * @param - * wrapper query filter type - * @param - * underlying data provider filter type - * - * @return wrapped data provider with filter conversion - */ - public static DataProvider convert( - DataProvider dataProvider, - SerializableFunction mapper) { - return new DataProviderWrapper(dataProvider) { - - @Override - protected M getFilter(Query query) { - return query.getFilter().map(mapper).orElse(null); - } - }; - } } diff --git a/server/src/main/java/com/vaadin/data/provider/ListDataProvider.java b/server/src/main/java/com/vaadin/data/provider/ListDataProvider.java index 70a3538bea..b452a16383 100644 --- a/server/src/main/java/com/vaadin/data/provider/ListDataProvider.java +++ b/server/src/main/java/com/vaadin/data/provider/ListDataProvider.java @@ -402,7 +402,7 @@ public class ListDataProvider SerializableBiPredicate predicate) { Objects.requireNonNull(predicate, "Predicate cannot be null"); - return convertFilter( + return withConvertedFilter( filterValue -> item -> predicate.test(item, filterValue)); } diff --git a/server/src/test/java/com/vaadin/data/provider/DataProviderTestBase.java b/server/src/test/java/com/vaadin/data/provider/DataProviderTestBase.java index 79426f8c6c..0aa9bb80ba 100644 --- a/server/src/test/java/com/vaadin/data/provider/DataProviderTestBase.java +++ b/server/src/test/java/com/vaadin/data/provider/DataProviderTestBase.java @@ -163,7 +163,7 @@ public abstract class DataProviderTestBase strFilterDataProvider = dataProvider - .convertFilter( + .withConvertedFilter( text -> strBean -> strBean.getValue().contains(text)); Assert.assertEquals("Only one item should match 'Xyz'", 1, strFilterDataProvider.size(new Query<>("Xyz"))); diff --git a/server/src/test/java/com/vaadin/tests/server/component/combobox/ComboBoxFilteringTest.java b/server/src/test/java/com/vaadin/tests/server/component/combobox/ComboBoxFilteringTest.java index d4681151d5..f44c7924a0 100644 --- a/server/src/test/java/com/vaadin/tests/server/component/combobox/ComboBoxFilteringTest.java +++ b/server/src/test/java/com/vaadin/tests/server/component/combobox/ComboBoxFilteringTest.java @@ -155,7 +155,7 @@ public class ComboBoxFilteringTest { // Filters by last name, regardless of the item caption generator ListDataProvider ldp = DataProvider.create(getPersonArray()); - comboBox.setDataProvider(ldp.convertFilter( + comboBox.setDataProvider(ldp.withConvertedFilter( text -> person -> person.getLastName().contains(text))); checkFiltering("u", "ab", 3, 1); @@ -170,7 +170,7 @@ public class ComboBoxFilteringTest { ldp.setFilter(person -> person.getFirstName().contains("nr")); // Same as above, but only showing a subset of the persons - comboBox.setDataProvider(ldp.convertFilter( + comboBox.setDataProvider(ldp.withConvertedFilter( text -> person -> person.getLastName().contains(text))); checkFiltering("t", "Engel", 2, 1); -- 2.39.5