diff --git a/src/services/ogc-features/src/main/java/com/camptocamp/opendata/ogc/features/model/GeoToolsFeatureCollection.java b/src/services/ogc-features/src/main/java/com/camptocamp/opendata/ogc/features/model/GeoToolsFeatureCollection.java index 39cbde8..3316ab0 100644 --- a/src/services/ogc-features/src/main/java/com/camptocamp/opendata/ogc/features/model/GeoToolsFeatureCollection.java +++ b/src/services/ogc-features/src/main/java/com/camptocamp/opendata/ogc/features/model/GeoToolsFeatureCollection.java @@ -49,7 +49,9 @@ public Stream getFeatures() { int characteristics = Spliterator.DISTINCT | Spliterator.NONNULL; Spliterator spliterator = Spliterators.spliteratorUnknownSize(iterator, characteristics); Stream stream = StreamSupport.stream(spliterator, false); - stream = stream.onClose(it::close); + stream = stream.onClose(() -> { + it.close(); + }); return stream.map(featureMapper); } } diff --git a/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/AbstractCollectionsApiImplIT.java b/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/AbstractCollectionsApiImplIT.java index 7aab96e..ba39f86 100644 --- a/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/AbstractCollectionsApiImplIT.java +++ b/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/AbstractCollectionsApiImplIT.java @@ -33,6 +33,8 @@ import com.camptocamp.opendata.ogc.features.model.FeatureCollection; import com.google.common.base.Splitter; +import lombok.Cleanup; + public abstract class AbstractCollectionsApiImplIT { protected @Autowired CollectionsApiImpl collectionsApi; @@ -66,7 +68,10 @@ public void testGetCollections() { public void testGetItems() { FeaturesQuery query = FeaturesQuery.of("locations").withLimit(10); ResponseEntity response = collectionsApi.getFeatures(query); - assertThat(response.getBody().getFeatures().toList().size()).isEqualTo(10); + + @Cleanup + Stream features = response.getBody().getFeatures(); + assertThat(features.toList().size()).isEqualTo(10); } @Test @@ -74,7 +79,10 @@ public void testGetItemsWithFilter() { FeaturesQuery query = FeaturesQuery.of("locations").withFilter("number = 140"); ResponseEntity response = collectionsApi.getFeatures(query); - assertThat(response.getBody().getFeatures().count()).isEqualTo(1); + @Cleanup + Stream features = response.getBody().getFeatures(); + assertThat(features.count()).isEqualTo(1); + } @ParameterizedTest @@ -144,14 +152,15 @@ private void testPagingConsistency(FeaturesQuery query, Comparator features = collection.getFeatures()) { - features.forEach(rec -> { - String id = rec.getId(); - assertThat(idsReturned).as("Duplicate feature returned on page " + pageNumber).doesNotContain(id); - idsReturned.add(id); - records.add(rec); - }); - } + + @Cleanup + Stream features = collection.getFeatures(); + features.forEach(rec -> { + String id = rec.getId(); + assertThat(idsReturned).as("Duplicate feature returned on page " + pageNumber).doesNotContain(id); + idsReturned.add(id); + records.add(rec); + }); } // verify expected order // var sorted = new ArrayList<>(records); @@ -171,8 +180,10 @@ public void testGetItemsWithFilter_property_name_with_spaces() throws Exception FeatureCollection body = response.getBody(); - int expected = (int) body.getFeatures() - .filter(c -> "B".equals(c.getProperty(propetyName).orElseThrow().getValue())).count(); + @Cleanup + Stream features = body.getFeatures(); + int expected = (int) features.filter(c -> "B".equals(c.getProperty(propetyName).orElseThrow().getValue())) + .count(); assertThat(expected).isGreaterThan(0); final String cqlFilter = "\"%s\" = 'B'".formatted(propetyName); @@ -181,13 +192,18 @@ public void testGetItemsWithFilter_property_name_with_spaces() throws Exception response = collectionsApi.getFeatures(FeaturesQuery.of(collectionName).withFilter(cqlFilter)); body = response.getBody(); - assertThat(body.getFeatures().count()).isEqualTo(expected); + @Cleanup + Stream features1 = body.getFeatures(); + assertThat(features1.count()).isEqualTo(expected); response = collectionsApi .getFeatures(FeaturesQuery.of(collectionName).withFilter(cqlFilter).withLimit(expected)); body = response.getBody(); - assertThat(body.getFeatures().count()).isEqualTo(expected); + + @Cleanup + Stream features2 = body.getFeatures(); + assertThat(features2.count()).isEqualTo(expected); } private void assertECQL_FilterCanBeParsed(final String propetyName, final String filter) { diff --git a/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/CollectionsApiImplPostgisIT.java b/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/CollectionsApiImplPostgisIT.java index 046c7af..7fa0ce1 100644 --- a/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/CollectionsApiImplPostgisIT.java +++ b/src/services/ogc-features/src/test/java/com/camptocamp/opendata/ogc/features/server/impl/CollectionsApiImplPostgisIT.java @@ -14,6 +14,7 @@ import java.util.Comparator; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.sql.DataSource; @@ -41,6 +42,8 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import lombok.Cleanup; + @SpringBootTest(classes = OgcFeaturesApp.class) @ActiveProfiles("postgis") @Testcontainers @@ -183,25 +186,35 @@ public void testGetItems_survives_schema_change() throws SQLException { FeaturesQuery query = FeaturesQuery.of("locations").withLimit(10); ResponseEntity response = collectionsApi.getFeatures(query); - assertThat(response.getBody().getFeatures().toList().size()).isEqualTo(10); + + @Cleanup + Stream features = response.getBody().getFeatures(); + assertThat(features.toList().size()).isEqualTo(10); renameColumn("locations", "year", "año"); response = collectionsApi.getFeatures(query); - assertThat(response.getBody().getFeatures().toList().size()).isEqualTo(10); + @Cleanup + Stream features1 = response.getBody().getFeatures(); + assertThat(features1.toList().size()).isEqualTo(10); dropColumn("locations", "año"); response = collectionsApi.getFeatures(query); - assertThat(response.getBody().getFeatures().toList().size()).isEqualTo(10); + + @Cleanup + Stream features2 = response.getBody().getFeatures(); + assertThat(features2.toList().size()).isEqualTo(10); } @Test public void testGetItem_survives_schema_change() throws SQLException { FeaturesQuery query = FeaturesQuery.of("locations").withLimit(1); - GeodataRecord before = collectionsApi.getFeatures(query).getBody().getFeatures().findFirst().orElseThrow(); - assertThat(before.getProperty("number")).isPresent(); + @Cleanup + Stream features = collectionsApi.getFeatures(query).getBody().getFeatures(); + GeodataRecord before = features.findFirst().orElseThrow(); + assertThat(before.getProperty("number")).isPresent(); final String id = before.getId(); renameColumn("locations", "number", "número");