Implement partial prefix support for Atmos

Atmos only supports listing by directories while other blobstores
allow listing via arbitrary prefixes.  Allow requests which list
directories via both prefix and delimiter = "/" to succeed instead of
failing all requests.  Also change a test which specified recursive to
instead be delimiter = "/".  Fixes gaul/s3proxy#244.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/c61e8bc2
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/c61e8bc2
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/c61e8bc2

Branch: refs/heads/2.0.x
Commit: c61e8bc28b75687375c503de080498633e999856
Parents: b958090
Author: Andrew Gaul <[email protected]>
Authored: Mon Oct 30 12:44:25 2017 -0700
Committer: Andrew Gaul <[email protected]>
Committed: Fri Nov 24 19:25:35 2017 -0800

----------------------------------------------------------------------
 .../java/org/jclouds/atmos/blobstore/AtmosBlobStore.java    | 9 ++++++++-
 .../integration/AtmosContainerIntegrationLiveTest.java      | 7 +------
 .../integration/internal/BaseContainerIntegrationTest.java  | 2 +-
 3 files changed, 10 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/c61e8bc2/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java
----------------------------------------------------------------------
diff --git 
a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java 
b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java
index 1550932..ca84fe8 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java
@@ -220,8 +220,15 @@ public class AtmosBlobStore extends BaseBlobStore {
    @Override
    public PageSet<? extends StorageMetadata> list(String container,
             org.jclouds.blobstore.options.ListContainerOptions options) {
-      checkArgument(Strings.isNullOrEmpty(options.getPrefix()), "does not 
support prefixes");
+      // TODO: recursive?
+      if (!Strings.nullToEmpty(options.getDelimiter()).equals("/") && 
!Strings.isNullOrEmpty(options.getPrefix())) {
+         throw new IllegalArgumentException("Atmos can only list via prefix if 
delimiter is / and the prefix matches an existing directory");
+      }
       container = AtmosUtils.adjustContainerIfDirOptionPresent(container, 
options);
+      if (!Strings.isNullOrEmpty(options.getPrefix())) {
+         // this only works when the prefix exactly matches a directory, the 
common usage
+         container += "/" + options.getPrefix();
+      }
       ListOptions nativeOptions = 
container2ContainerListOptions.apply(options);
       // until includeMeta() option works for namespace interface
       PageSet<? extends StorageMetadata> list = 
container2ResourceList.apply(sync.listDirectory(container,

http://git-wip-us.apache.org/repos/asf/jclouds/blob/c61e8bc2/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosContainerIntegrationLiveTest.java
----------------------------------------------------------------------
diff --git 
a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosContainerIntegrationLiveTest.java
 
b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosContainerIntegrationLiveTest.java
index c29f80c..4814918 100644
--- 
a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosContainerIntegrationLiveTest.java
+++ 
b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosContainerIntegrationLiveTest.java
@@ -58,16 +58,11 @@ public class AtmosContainerIntegrationLiveTest extends 
BaseContainerIntegrationT
 
    @Override
    public void testContainerListWithPrefix() {
-      throw new SkipException("Prefix option has not been plumbed down to 
Atmos");
+      throw new SkipException("Atmos can only list prefix which matches an 
existing directory");
    }
 
    @Override
    public void testDelimiterList() {
       throw new SkipException("Delimiter support is not yet implemented");
    }
-
-   @Override
-   public void testListContainerPrefix() throws InterruptedException {
-      throw new SkipException("Prefix support is not yet implemented");
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/c61e8bc2/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 e6cb0ae..554c75a 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
@@ -310,7 +310,7 @@ public class BaseContainerIntegrationTest extends 
BaseBlobStoreIntegrationTest {
          add15UnderRoot(containerName);
          awaitConsistency();
          PageSet<? extends StorageMetadata> container = 
view.getBlobStore().list(
-               containerName, new 
ListContainerOptions().recursive().prefix(prefix));
+               containerName, new 
ListContainerOptions().prefix(prefix).delimiter("/"));
          assert container.getNextMarker() == null;
          assertEquals(container.size(), 10);
       } finally {

Reply via email to