Updated Branches: refs/heads/1.6.x f6b502707 -> 1ee9a61fb
JCLOUDS-334. Return URI only if container created This allows us to honor the BlobStore.createContainerInLocation interface and gives consistency with other providers. Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/1ee9a61f Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/1ee9a61f Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/1ee9a61f Branch: refs/heads/1.6.x Commit: 1ee9a61fb55f331aa7e4799e1cd70e03a971ce4d Parents: f6b5027 Author: Andrew Gaul <[email protected]> Authored: Fri Oct 4 21:32:48 2013 -0700 Committer: Andrew Gaul <[email protected]> Committed: Tue Oct 8 13:04:29 2013 -0700 ---------------------------------------------------------------------- .../main/java/org/jclouds/atmos/AtmosAsyncClient.java | 4 ++-- .../jclouds/atmos/blobstore/AtmosAsyncBlobStore.java | 4 ++-- .../org/jclouds/atmos/blobstore/AtmosBlobStore.java | 6 ++---- .../java/org/jclouds/atmos/AtmosAsyncClientTest.java | 5 +++-- .../java/org/jclouds/atmos/AtmosClientLiveTest.java | 3 +++ .../java/org/jclouds/blobstore/BlobStoreFallbacks.java | 13 +++++++++++++ 6 files changed, 25 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/apis/atmos/src/main/java/org/jclouds/atmos/AtmosAsyncClient.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/AtmosAsyncClient.java b/apis/atmos/src/main/java/org/jclouds/atmos/AtmosAsyncClient.java index f8ad725..355e0d5 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/AtmosAsyncClient.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/AtmosAsyncClient.java @@ -42,7 +42,6 @@ import org.jclouds.atmos.domain.BoundedSet; import org.jclouds.atmos.domain.DirectoryEntry; import org.jclouds.atmos.domain.SystemMetadata; import org.jclouds.atmos.domain.UserMetadata; -import org.jclouds.atmos.fallbacks.EndpointIfAlreadyExists; import org.jclouds.atmos.filters.SignRequest; import org.jclouds.atmos.functions.AtmosObjectName; import org.jclouds.atmos.functions.ParseDirectoryListFromContentAndHeaders; @@ -52,6 +51,7 @@ import org.jclouds.atmos.functions.ParseUserMetadataFromHeaders; import org.jclouds.atmos.functions.ReturnTrueIfGroupACLIsOtherRead; import org.jclouds.atmos.options.ListOptions; import org.jclouds.atmos.options.PutOptions; +import org.jclouds.blobstore.BlobStoreFallbacks.NullOnKeyAlreadyExists; import org.jclouds.blobstore.BlobStoreFallbacks.ThrowContainerNotFoundOn404; import org.jclouds.blobstore.BlobStoreFallbacks.ThrowKeyNotFoundOn404; import org.jclouds.http.options.GetOptions; @@ -115,7 +115,7 @@ public interface AtmosAsyncClient extends Closeable { @Named("CreateDirectory") @POST @Path("/{directoryName}/") - @Fallback(EndpointIfAlreadyExists.class) + @Fallback(NullOnKeyAlreadyExists.class) @Produces(MediaType.APPLICATION_OCTET_STREAM) @Consumes(MediaType.WILDCARD) ListenableFuture<URI> createDirectory(@PathParam("directoryName") String directoryName, PutOptions... options); http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosAsyncBlobStore.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosAsyncBlobStore.java b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosAsyncBlobStore.java index 79f7579..2981273 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosAsyncBlobStore.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosAsyncBlobStore.java @@ -131,7 +131,7 @@ public class AtmosAsyncBlobStore extends BaseAsyncBlobStore { public ListenableFuture<Boolean> createContainerInLocation(Location location, String container) { return transform(async.createDirectory(container), new Function<URI, Boolean>() { public Boolean apply(URI from) { - return true; + return from != null; } }, userExecutor); } @@ -277,7 +277,7 @@ public class AtmosAsyncBlobStore extends BaseAsyncBlobStore { return transform(async.createDirectory(container, publicRead()), new Function<URI, Boolean>() { public Boolean apply(URI from) { - return true; + return from != null; } }, userExecutor); http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/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 58eb99b..ce3bcfb 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 @@ -118,8 +118,7 @@ public class AtmosBlobStore extends BaseBlobStore { */ @Override public boolean createContainerInLocation(Location location, String container) { - sync.createDirectory(container); - return true; + return sync.createDirectory(container) != null; } /** @@ -240,8 +239,7 @@ public class AtmosBlobStore extends BaseBlobStore { @Override public boolean createContainerInLocation(Location location, String container, CreateContainerOptions options) { if (options.isPublicRead()) { - sync.createDirectory(container, publicRead()); - return true; + return sync.createDirectory(container, publicRead()) != null; } return createContainerInLocation(location, container); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/apis/atmos/src/test/java/org/jclouds/atmos/AtmosAsyncClientTest.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosAsyncClientTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosAsyncClientTest.java index 2d35c04..8287417 100644 --- a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosAsyncClientTest.java +++ b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosAsyncClientTest.java @@ -38,6 +38,7 @@ import org.jclouds.atmos.functions.ParseSystemMetadataFromHeaders; import org.jclouds.atmos.functions.ReturnTrueIfGroupACLIsOtherRead; import org.jclouds.atmos.options.ListOptions; import org.jclouds.atmos.options.PutOptions; +import org.jclouds.blobstore.BlobStoreFallbacks.NullOnKeyAlreadyExists; import org.jclouds.blobstore.BlobStoreFallbacks.ThrowContainerNotFoundOn404; import org.jclouds.blobstore.BlobStoreFallbacks.ThrowKeyNotFoundOn404; import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest; @@ -137,7 +138,7 @@ public class AtmosAsyncClientTest extends BaseAsyncClientTest<AtmosAsyncClient> assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class); assertSaxResponseParserClassEquals(method, null); - assertFallbackClassEquals(method, EndpointIfAlreadyExists.class); + assertFallbackClassEquals(method, NullOnKeyAlreadyExists.class); checkFilters(request); } @@ -153,7 +154,7 @@ public class AtmosAsyncClientTest extends BaseAsyncClientTest<AtmosAsyncClient> assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class); assertSaxResponseParserClassEquals(method, null); - assertFallbackClassEquals(method, EndpointIfAlreadyExists.class); + assertFallbackClassEquals(method, NullOnKeyAlreadyExists.class); checkFilters(request); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java index dc9fd83..cfc1962 100644 --- a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java +++ b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java @@ -19,6 +19,7 @@ package org.jclouds.atmos; import static com.google.common.base.Preconditions.checkState; import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import static org.testng.Assert.fail; import java.io.IOException; @@ -140,6 +141,8 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest { BoundedSet<? extends DirectoryEntry> r2 = getApi().listDirectory(id.getObjectName()); assert r2 != null; } + // subsequent creation should fail + assertNull(getApi().createDirectory(privateDirectory)); } @Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreateDirectory" }) http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1ee9a61f/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreFallbacks.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreFallbacks.java b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreFallbacks.java index b645ed3..5434545 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreFallbacks.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreFallbacks.java @@ -106,4 +106,17 @@ public final class BlobStoreFallbacks { throw propagate(t); } } + + public static final class NullOnKeyAlreadyExists implements Fallback<Object> { + public ListenableFuture<Object> create(Throwable t) throws Exception { + return immediateFuture(createOrPropagate(t)); + } + + public Object createOrPropagate(Throwable t) throws Exception { + if (checkNotNull(t, "throwable") instanceof KeyAlreadyExistsException) { + return null; + } + throw propagate(t); + } + } }
