Repository: jclouds
Updated Branches:
  refs/heads/master 6de7974a6 -> d07c4a215


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/d07c4a21
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/d07c4a21
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/d07c4a21

Branch: refs/heads/master
Commit: d07c4a215e452c99f5ddae7fe006d801339d96e7
Parents: 6de7974
Author: Timur Alperovich <[email protected]>
Authored: Thu Jun 29 00:17:27 2017 -0700
Committer: Andrew Gaul <[email protected]>
Committed: Thu Aug 3 14:37:12 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/d07c4a21/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/d07c4a21/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", 
" ", "%", "%%");

Reply via email to