Repository: jclouds Updated Branches: refs/heads/2.0.x 78881d2f5 -> 8ab58f075
Handle empty delimiter/prefix in FS store. When delimiter/prefix is an empty string, jclouds filesystem blobstore should treat them as not being set. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/8ab58f07 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/8ab58f07 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/8ab58f07 Branch: refs/heads/2.0.x Commit: 8ab58f075f9bd9a77ed7fa27ab55c93f96db0aa0 Parents: 78881d2 Author: Timur Alperovich <[email protected]> Authored: Thu Jun 29 00:17:27 2017 -0700 Committer: Andrew Gaul <[email protected]> Committed: Thu Aug 3 14:38:08 2017 -0700 ---------------------------------------------------------------------- .../blobstore/config/LocalBlobStore.java | 6 ++++- .../internal/BaseContainerIntegrationTest.java | 26 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/8ab58f07/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java index f45e27a..6d9533d 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java @@ -90,6 +90,7 @@ import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.FluentIterable; @@ -266,7 +267,7 @@ public final class LocalBlobStore implements BlobStore { if (options != null) { if (options.getDir() != null && !options.getDir().isEmpty()) { contents = filterDirectory(contents, options); - } else if (options.getPrefix() != null) { + } else if (!Strings.isNullOrEmpty(options.getPrefix())) { contents = filterPrefix(contents, options); } else if (!options.isRecursive() || (options.getDelimiter() != null)) { String delimiter = options.getDelimiter() == null ? storageStrategy.getSeparator() : options.getDelimiter(); @@ -349,6 +350,9 @@ public final class LocalBlobStore implements BlobStore { private SortedSet<StorageMetadata> extractCommonPrefixes(SortedSet<StorageMetadata> contents, String delimiter, String prefix) { + if (Strings.isNullOrEmpty(delimiter)) { + return contents; + } SortedSet<String> commonPrefixes = newTreeSet( transform(contents, new CommonPrefixes(prefix, delimiter))); commonPrefixes.remove(CommonPrefixes.NO_PREFIX); http://git-wip-us.apache.org/repos/asf/jclouds/blob/8ab58f07/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java ---------------------------------------------------------------------- diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java index e2cc632..e6cb0ae 100644 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java @@ -53,6 +53,7 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteSource; @@ -595,6 +596,31 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest { } } + /** Test that listing with an empty string for prefix and delimiter returns all of the keys. */ + @Test(groups = {"integration", "live"}) + public void testListEmptyPrefixDelimiter() throws Exception { + final String container = getContainerName(); + BlobStore blobStore = view.getBlobStore(); + blobStore.createContainerInLocation(null, container); + + try { + ImmutableList<String> blobs = ImmutableList.of("a", "b", "c"); + for (String blob : blobs) { + blobStore.putBlob(container, blobStore.blobBuilder(blob).payload("").build()); + } + ListContainerOptions options = ListContainerOptions.Builder.delimiter("") + .prefix("").afterMarker(""); + PageSet<? extends StorageMetadata> rs = blobStore.list(container, options); + ImmutableList.Builder<String> builder = ImmutableList.builder(); + for (StorageMetadata sm : rs) { + builder.add(sm.getName()); + } + assertThat(builder.build()).containsExactlyElementsOf(blobs); + } finally { + returnContainer(container); + } + } + @DataProvider public Object[][] getBlobsToEscape() { ImmutableSet<String> testNames = ImmutableSet.of("%20", "%20 ", " %20", " ", "%", "%%");
