From 30900cb53c30c570593e805c3d24b3c56de648c7 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Mon, 22 Sep 2025 15:30:06 +0400 Subject: [PATCH] refactor: throw when data provider returns more items than requested --- .../HierarchicalDataCommunicator.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/flow-data/src/main/java/com/vaadin/flow/data/provider/hierarchy/HierarchicalDataCommunicator.java b/flow-data/src/main/java/com/vaadin/flow/data/provider/hierarchy/HierarchicalDataCommunicator.java index 1256b032da8..6b536110913 100644 --- a/flow-data/src/main/java/com/vaadin/flow/data/provider/hierarchy/HierarchicalDataCommunicator.java +++ b/flow-data/src/main/java/com/vaadin/flow/data/provider/hierarchy/HierarchicalDataCommunicator.java @@ -259,7 +259,8 @@ public void refresh(T item, boolean refreshChildren) { @Override public Stream fetchFromProvider(int offset, int limit) { - return fetchDataProviderChildren(null, Range.withLength(offset, limit)); + return fetchDataProviderChildren(null, Range.withLength(offset, limit)) + .stream(); } @Override @@ -516,8 +517,7 @@ && isExpanded(item)) { private void preloadRange(Cache cache, int start, int length) { var range = Range.withLength(start, length) .restrictTo(Range.withLength(0, cache.getSize())); - var items = fetchDataProviderChildren(cache.getParentItem(), range) - .toList(); + var items = fetchDataProviderChildren(cache.getParentItem(), range); cache.setItems(range.getStart(), items); } @@ -751,16 +751,24 @@ public HierarchicalQuery buildQuery(T parent, int offset, } @SuppressWarnings("unchecked") - private Stream fetchDataProviderChildren(T parent, Range range) { + private List fetchDataProviderChildren(T parent, Range range) { var query = buildQuery(parent, range.getStart(), range.length()); - return ((HierarchicalDataProvider) getDataProvider()) - .fetchChildren(query).peek((item) -> { - if (item == null) { - throw new IllegalStateException( - "Data provider returned a null item. Null values are not supported"); - } - }); + var items = ((HierarchicalDataProvider) getDataProvider()) + .fetchChildren(query).toList(); + if (items.size() > range.length()) { + throw new IllegalStateException( + """ + Data provider returned more items than requested. Requested %d but got %d. \ + Make sure that your data provider respects the offset and limit in HierarchicalQuery. + """ + .formatted(range.length(), items.size())); + } + if (items.contains(null)) { + throw new IllegalStateException( + "Data provider returned a null item. Null values are not supported"); + } + return items; } @SuppressWarnings("unchecked")