Skip to content

Commit fcb3f73

Browse files
committed
refactor: throw when data provider returns more items than requested
1 parent b694384 commit fcb3f73

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

flow-data/src/main/java/com/vaadin/flow/data/provider/hierarchy/HierarchicalDataCommunicator.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ public void refresh(T item, boolean refreshChildren) {
259259

260260
@Override
261261
public Stream<T> fetchFromProvider(int offset, int limit) {
262-
return fetchDataProviderChildren(null, Range.withLength(offset, limit));
262+
return fetchDataProviderChildren(null, Range.withLength(offset, limit))
263+
.stream();
263264
}
264265

265266
@Override
@@ -516,8 +517,7 @@ && isExpanded(item)) {
516517
private void preloadRange(Cache<T> cache, int start, int length) {
517518
var range = Range.withLength(start, length)
518519
.restrictTo(Range.withLength(0, cache.getSize()));
519-
var items = fetchDataProviderChildren(cache.getParentItem(), range)
520-
.toList();
520+
var items = fetchDataProviderChildren(cache.getParentItem(), range);
521521
cache.setItems(range.getStart(), items);
522522
}
523523

@@ -751,16 +751,21 @@ public HierarchicalQuery<T, Object> buildQuery(T parent, int offset,
751751
}
752752

753753
@SuppressWarnings("unchecked")
754-
private Stream<T> fetchDataProviderChildren(T parent, Range range) {
754+
private List<T> fetchDataProviderChildren(T parent, Range range) {
755755
var query = buildQuery(parent, range.getStart(), range.length());
756756

757-
return ((HierarchicalDataProvider<T, Object>) getDataProvider())
758-
.fetchChildren(query).peek((item) -> {
759-
if (item == null) {
760-
throw new IllegalStateException(
761-
"Data provider returned a null item. Null values are not supported");
762-
}
763-
});
757+
var items = ((HierarchicalDataProvider<T, Object>) getDataProvider())
758+
.fetchChildren(query).toList();
759+
if (items.size() > range.length()) {
760+
throw new IllegalStateException(
761+
"Data provider returned more items than requested. Requested %d but got %d."
762+
.formatted(range.length(), items.size()));
763+
}
764+
if (items.contains(null)) {
765+
throw new IllegalStateException(
766+
"Data provider returned a null item. Null values are not supported");
767+
}
768+
return items;
764769
}
765770

766771
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)