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 {
