From e61f32585955b9e9ea61397c8fbc90deff91266c Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Thu, 27 Apr 2023 15:48:46 -0600 Subject: [PATCH] Make FilteredIterator::hasNext idempotent --- .../java/thredds/filesystem/s3/ControllerS3.java | 7 +++++-- .../thredds/filesystem/s3/TestControllerS3.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cdm/s3/src/main/java/thredds/filesystem/s3/ControllerS3.java b/cdm/s3/src/main/java/thredds/filesystem/s3/ControllerS3.java index c15d03b144..b123a6ab34 100644 --- a/cdm/s3/src/main/java/thredds/filesystem/s3/ControllerS3.java +++ b/cdm/s3/src/main/java/thredds/filesystem/s3/ControllerS3.java @@ -141,6 +141,7 @@ private static class FilteredIterator implements Iterator { this.mc = mc; this.wantDirs = wantDirs; this.fullInventory = false; + this.next = nextFilteredFile(); } FilteredIterator(CollectionConfig mc, Iterator iter, boolean wantDirs, boolean fullInventory) { @@ -148,17 +149,19 @@ private static class FilteredIterator implements Iterator { this.mc = mc; this.wantDirs = wantDirs; this.fullInventory = fullInventory; + this.next = nextFilteredFile(); } public boolean hasNext() { - next = nextFilteredFile(); return (next != null); } public MFile next() { if (next == null) throw new NoSuchElementException(); - return next; + final MFile mFile = next; + next = nextFilteredFile(); + return mFile; } public void remove() { diff --git a/cdm/s3/src/test/java/thredds/filesystem/s3/TestControllerS3.java b/cdm/s3/src/test/java/thredds/filesystem/s3/TestControllerS3.java index 86a23fa1b4..342cbec4dd 100644 --- a/cdm/s3/src/test/java/thredds/filesystem/s3/TestControllerS3.java +++ b/cdm/s3/src/test/java/thredds/filesystem/s3/TestControllerS3.java @@ -64,6 +64,21 @@ public static void setup() { } + @Test + public void shouldReturnSameValueFromHasNext() throws URISyntaxException { + final CdmS3Uri uri = new CdmS3Uri("cdms3:thredds-test-data"); + final MFileFilter filter = new WildcardMatchOnName("testData.nc"); + final CollectionConfig collectionConfig = new CollectionConfig(uri.getBucket(), uri.toString(), true, filter, null); + final ControllerS3 controller = new ControllerS3(); + final Iterator iterator = controller.getInventoryTop(collectionConfig, false); + + assertThat(iterator.hasNext()).isTrue(); + assertThat(iterator.hasNext()).isTrue(); + iterator.next(); + assertThat(iterator.hasNext()).isFalse(); + assertThat(iterator.hasNext()).isFalse(); + } + ////////////////////// // getInventoryTop() tests //