http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobSignerExpectTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobSignerExpectTest.java b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobSignerExpectTest.java index 1c138ae..ecc6e3f 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobSignerExpectTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobSignerExpectTest.java @@ -19,10 +19,9 @@ package org.jclouds.s3.blobstore; import org.jclouds.blobstore.internal.BaseBlobSignerExpectTest; import org.jclouds.date.TimeStamp; import org.jclouds.http.HttpRequest; -import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.s3.S3AsyncClient; +import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.s3.S3Client; -import org.jclouds.s3.config.S3RestClientModule; +import org.jclouds.s3.config.S3HttpApiModule; import org.testng.SkipException; import org.testng.annotations.Test; @@ -106,11 +105,11 @@ public class S3BlobSignerExpectTest extends BaseBlobSignerExpectTest { @Override protected Module createModule() { - return new TestS3RestClientModule(); + return new TestS3HttpApiModule(); } - @ConfiguresRestClient - private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> { + @ConfiguresHttpApi + private static final class TestS3HttpApiModule extends S3HttpApiModule<S3Client> { @Override protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureTest.java b/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureTest.java index 77cd173..48da148 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureTest.java @@ -26,11 +26,11 @@ import java.util.Properties; import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest; import org.jclouds.http.HttpRequest; import org.jclouds.rest.internal.GeneratedHttpRequest; -import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; import org.jclouds.s3.domain.AccessControlList; import org.jclouds.s3.domain.CannedAccessPolicy; import org.jclouds.s3.domain.S3Object; -import org.jclouds.s3.internal.BaseS3AsyncClientTest; +import org.jclouds.s3.internal.BaseS3ClientTest; import org.jclouds.s3.options.PutObjectOptions; import org.jclouds.s3.reference.S3Headers; import org.testng.annotations.DataProvider; @@ -45,7 +45,7 @@ import com.google.common.net.HttpHeaders; */ // NOTE:without testName, this will not call @Before* and fail w/NPE during surefire @Test(groups = "unit", testName = "RequestAuthorizeSignatureTest") -public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3AsyncClient> { +public class RequestAuthorizeSignatureTest extends BaseS3ClientTest<S3Client> { String bucketName = "bucket"; @DataProvider(parallel = true) @@ -84,7 +84,7 @@ public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3Async @Test void testAppendBucketNameHostHeader() throws SecurityException, NoSuchMethodException { GeneratedHttpRequest request = processor.createRequest( - method(S3AsyncClient.class, "getBucketLocation", String.class), + method(S3Client.class, "getBucketLocation", String.class), ImmutableList.<Object> of("bucket")); StringBuilder builder = new StringBuilder(); filter.appendBucketName(request, builder); @@ -101,7 +101,7 @@ public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3Async private GeneratedHttpRequest putBucketAcl() throws NoSuchMethodException { return processor.createRequest( - method(S3AsyncClient.class, "putBucketACL", String.class, AccessControlList.class), + method(S3Client.class, "putBucketACL", String.class, AccessControlList.class), ImmutableList.<Object> of("bucket", AccessControlList.fromCannedAccessPolicy(CannedAccessPolicy.PRIVATE, "1234"))); } @@ -117,7 +117,7 @@ public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3Async } private GeneratedHttpRequest listOwnedBuckets() throws NoSuchMethodException { - return processor.createRequest(method(S3AsyncClient.class, "listOwnedBuckets"), + return processor.createRequest(method(S3Client.class, "listOwnedBuckets"), ImmutableList.of()); } @@ -134,14 +134,14 @@ public class RequestAuthorizeSignatureTest extends BaseS3AsyncClientTest<S3Async private HttpRequest putObject() throws NoSuchMethodException { S3Object object = blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB); object.getMetadata().getUserMetadata().put("Adrian", "foo"); - return processor.createRequest(method(S3AsyncClient.class, "putObject", String.class, + return processor.createRequest(method(S3Client.class, "putObject", String.class, S3Object.class, PutObjectOptions[].class), ImmutableList.<Object> of("bucket", object)); } @Test void testAppendBucketNameInURIPath() throws SecurityException, NoSuchMethodException { GeneratedHttpRequest request = processor.createRequest( - method(S3AsyncClient.class, "getBucketLocation", String.class), + method(S3Client.class, "getBucketLocation", String.class), ImmutableList.<Object> of(bucketName)); URI uri = request.getEndpoint(); assertEquals(uri.getHost(), "s3.amazonaws.com"); http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureWithSessionCredentialsTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureWithSessionCredentialsTest.java b/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureWithSessionCredentialsTest.java index 396664a..8ae2fc1 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureWithSessionCredentialsTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/filters/RequestAuthorizeSignatureWithSessionCredentialsTest.java @@ -27,12 +27,11 @@ import org.jclouds.domain.Credentials; import org.jclouds.http.HttpRequest; import org.jclouds.logging.config.NullLoggingModule; import org.jclouds.reflect.Invocation; -import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.rest.internal.BaseRestApiTest.MockModule; import org.jclouds.rest.internal.GeneratedHttpRequest; -import org.jclouds.s3.S3AsyncClient; import org.jclouds.s3.S3Client; -import org.jclouds.s3.config.S3RestClientModule; +import org.jclouds.s3.config.S3HttpApiModule; import org.testng.annotations.Test; import com.google.common.base.Supplier; @@ -50,11 +49,11 @@ public class RequestAuthorizeSignatureWithSessionCredentialsTest { public static Injector injector(Credentials creds) { return ContextBuilder.newBuilder("s3") .credentialsSupplier(Suppliers.<Credentials> ofInstance(creds)) - .modules(ImmutableList.<Module> of(new MockModule(), new NullLoggingModule(), new TestS3RestClientModule())).buildInjector(); + .modules(ImmutableList.<Module> of(new MockModule(), new NullLoggingModule(), new TestS3HttpApiModule())).buildInjector(); } - @ConfiguresRestClient - private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> { + @ConfiguresHttpApi + private static final class TestS3HttpApiModule extends S3HttpApiModule<S3Client> { @Override protected String provideTimeStamp(@TimeStamp Supplier<String> cache) { @@ -72,7 +71,7 @@ public class RequestAuthorizeSignatureWithSessionCredentialsTest { .sessionToken("AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT") .expiration(new SimpleDateFormatDateService().iso8601DateParse("2011-07-11T19:55:29.611Z")).build(); - Invocation invocation = Invocation.create(method(S3AsyncClient.class, "bucketExists", String.class), + Invocation invocation = Invocation.create(method(S3Client.class, "bucketExists", String.class), ImmutableList.<Object> of("foo")); HttpRequest bucketFooExists = GeneratedHttpRequest.builder().method("GET") http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3AsyncClientTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3AsyncClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3AsyncClientTest.java deleted file mode 100644 index b1fca99..0000000 --- a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3AsyncClientTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.s3.internal; - -import static org.testng.Assert.assertEquals; - -import java.io.IOException; - -import org.jclouds.http.HttpRequest; -import org.jclouds.rest.internal.BaseAsyncClientTest; -import org.jclouds.s3.S3ApiMetadata; -import org.jclouds.s3.S3AsyncClient; -import org.jclouds.s3.blobstore.functions.BlobToObject; -import org.jclouds.s3.filters.RequestAuthorizeSignature; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -@Test(groups = "unit") -public abstract class BaseS3AsyncClientTest<T extends S3AsyncClient> extends BaseAsyncClientTest<T> { - - protected BlobToObject blobToS3Object; - protected RequestAuthorizeSignature filter; - - @Override - protected void checkFilters(HttpRequest request) { - assertEquals(request.getFilters().size(), 1); - assertEquals(request.getFilters().get(0).getClass(), RequestAuthorizeSignature.class); - } - - - @BeforeClass - @Override - protected void setupFactory() throws IOException { - super.setupFactory(); - blobToS3Object = injector.getInstance(BlobToObject.class); - filter = injector.getInstance(RequestAuthorizeSignature.class); - } - - public BaseS3AsyncClientTest() { - super(); - } - - @Override - public S3ApiMetadata createApiMetadata() { - return new S3ApiMetadata(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java index 0ee36fe..260a242 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientExpectTest.java @@ -17,12 +17,11 @@ package org.jclouds.s3.internal; import org.jclouds.date.TimeStamp; -import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.rest.internal.BaseRestClientExpectTest; import org.jclouds.s3.S3ApiMetadata; -import org.jclouds.s3.S3AsyncClient; import org.jclouds.s3.S3Client; -import org.jclouds.s3.config.S3RestClientModule; +import org.jclouds.s3.config.S3HttpApiModule; import com.google.common.base.Supplier; import com.google.inject.Module; @@ -31,8 +30,8 @@ public abstract class BaseS3ClientExpectTest extends BaseRestClientExpectTest<S3 protected static final String CONSTANT_DATE = "2009-11-08T15:54:08.897Z"; - @ConfiguresRestClient - private static final class TestS3RestClientModule extends S3RestClientModule<S3Client, S3AsyncClient> { + @ConfiguresHttpApi + private static final class TestS3HttpApiModule extends S3HttpApiModule<S3Client> { @Override protected String provideTimeStamp(@TimeStamp Supplier<String> cache) { @@ -42,7 +41,7 @@ public abstract class BaseS3ClientExpectTest extends BaseRestClientExpectTest<S3 @Override protected Module createModule() { - return new TestS3RestClientModule(); + return new TestS3HttpApiModule(); } @Override http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientTest.java new file mode 100644 index 0000000..2b418ae --- /dev/null +++ b/apis/s3/src/test/java/org/jclouds/s3/internal/BaseS3ClientTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.s3.internal; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; + +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.internal.BaseAsyncClientTest; +import org.jclouds.s3.S3ApiMetadata; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.blobstore.functions.BlobToObject; +import org.jclouds.s3.filters.RequestAuthorizeSignature; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +@Test(groups = "unit") +public abstract class BaseS3ClientTest<T extends S3Client> extends BaseAsyncClientTest<T> { + + protected BlobToObject blobToS3Object; + protected RequestAuthorizeSignature filter; + + @Override + protected void checkFilters(HttpRequest request) { + assertEquals(request.getFilters().size(), 1); + assertEquals(request.getFilters().get(0).getClass(), RequestAuthorizeSignature.class); + } + + + @BeforeClass + @Override + protected void setupFactory() throws IOException { + super.setupFactory(); + blobToS3Object = injector.getInstance(BlobToObject.class); + filter = injector.getInstance(RequestAuthorizeSignature.class); + } + + public BaseS3ClientTest() { + super(); + } + + @Override + public S3ApiMetadata createApiMetadata() { + return new S3ApiMetadata(); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java b/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java deleted file mode 100644 index bbd79ff..0000000 --- a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.s3.internal; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.util.concurrent.Futures.immediateFailedFuture; -import static com.google.common.util.concurrent.Futures.immediateFuture; -import static com.google.common.util.concurrent.Futures.transform; - -import java.io.IOException; -import java.util.Date; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.aws.domain.Region; -import org.jclouds.blobstore.AsyncBlobStore; -import org.jclouds.blobstore.KeyNotFoundException; -import org.jclouds.blobstore.LocalAsyncBlobStore; -import org.jclouds.blobstore.domain.Blob; -import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.MutableBlobMetadata; -import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions; -import org.jclouds.blobstore.options.ListContainerOptions; -import org.jclouds.blobstore.util.BlobStoreUtils; -import org.jclouds.date.DateService; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationBuilder; -import org.jclouds.domain.LocationScope; -import org.jclouds.http.options.GetOptions; -import org.jclouds.javax.annotation.Nullable; -import org.jclouds.lifecycle.Closer; -import org.jclouds.s3.S3AsyncClient; -import org.jclouds.s3.blobstore.S3AsyncBlobStore; -import org.jclouds.s3.blobstore.functions.BlobToObject; -import org.jclouds.s3.blobstore.functions.BlobToObjectMetadata; -import org.jclouds.s3.blobstore.functions.BucketToContainerListOptions; -import org.jclouds.s3.blobstore.functions.ObjectToBlob; -import org.jclouds.s3.blobstore.functions.ResourceToBucketList; -import org.jclouds.s3.domain.AccessControlList; -import org.jclouds.s3.domain.AccessControlList.CanonicalUserGrantee; -import org.jclouds.s3.domain.AccessControlList.EmailAddressGrantee; -import org.jclouds.s3.domain.AccessControlList.Grant; -import org.jclouds.s3.domain.BucketLogging; -import org.jclouds.s3.domain.BucketMetadata; -import org.jclouds.s3.domain.CannedAccessPolicy; -import org.jclouds.s3.domain.ListBucketResponse; -import org.jclouds.s3.domain.ObjectMetadata; -import org.jclouds.s3.domain.Payer; -import org.jclouds.s3.domain.S3Object; -import org.jclouds.s3.options.CopyObjectOptions; -import org.jclouds.s3.options.ListBucketOptions; -import org.jclouds.s3.options.PutBucketOptions; -import org.jclouds.s3.options.PutObjectOptions; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; - -/** - * Implementation of {@link S3AsyncBlobStore} which keeps all data in a local Map object. - */ -@Singleton -public class StubS3AsyncClient implements S3AsyncClient { - private final DateService dateService; - private final HttpGetOptionsListToGetOptions httpGetOptionsConverter; - private final AsyncBlobStore blobStore; - private final S3Object.Factory objectProvider; - private final Blob.Factory blobProvider; - private final ObjectToBlob object2Blob; - private final BlobToObject blob2Object; - private final BlobToObjectMetadata blob2ObjectMetadata; - private final BucketToContainerListOptions bucket2ContainerListOptions; - private final ResourceToBucketList resource2BucketList; - private final ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs; - private final ConcurrentMap<String, Location> containerToLocation; - private final ListeningExecutorService userExecutor; - private final Closer closer; - - @Inject - private StubS3AsyncClient(@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, - LocalAsyncBlobStore blobStore, ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs, - ConcurrentMap<String, Location> containerToLocation, DateService dateService, - S3Object.Factory objectProvider, Blob.Factory blobProvider, - HttpGetOptionsListToGetOptions httpGetOptionsConverter, ObjectToBlob object2Blob, BlobToObject blob2Object, - BlobToObjectMetadata blob2ObjectMetadata, BucketToContainerListOptions bucket2ContainerListOptions, - ResourceToBucketList resource2BucketList, Closer closer) { - this.userExecutor = userExecutor; - this.containerToBlobs = containerToBlobs; - this.containerToLocation = containerToLocation; - this.blobStore = blobStore; - this.objectProvider = objectProvider; - this.blobProvider = blobProvider; - this.dateService = dateService; - this.httpGetOptionsConverter = httpGetOptionsConverter; - this.object2Blob = checkNotNull(object2Blob, "object2Blob"); - this.blob2Object = checkNotNull(blob2Object, "blob2Object"); - this.blob2ObjectMetadata = checkNotNull(blob2ObjectMetadata, "blob2ObjectMetadata"); - this.bucket2ContainerListOptions = checkNotNull(bucket2ContainerListOptions, "bucket2ContainerListOptions"); - this.resource2BucketList = checkNotNull(resource2BucketList, "resource2BucketList"); - this.closer = checkNotNull(closer, "closer"); - } - - public static final String TEST_ACL_ID = "1a405254c932b52e5b5caaa88186bc431a1bacb9ece631f835daddaf0c47677c"; - public static final String TEST_ACL_EMAIL = "[email protected]"; - - /** - * An S3 item's "ACL" may be a {@link CannedAccessPolicy} or an {@link AccessControlList}. - */ - private static Map<String, Object> keyToAcl = new ConcurrentHashMap<String, Object>(); - - public static final String DEFAULT_OWNER_ID = "abc123"; - - @Override - public ListenableFuture<Boolean> putBucketInRegion(@Nullable String region, String name, - PutBucketOptions... optionsList) { - region = region == null ? Region.US_STANDARD : region; - final PutBucketOptions options = (optionsList.length == 0) ? new PutBucketOptions() : optionsList[0]; - keyToAcl.put(name, options.getAcl()); - return blobStore.createContainerInLocation(new LocationBuilder().scope(LocationScope.REGION).id(region) - .description(region).build(), name); - } - - public ListenableFuture<ListBucketResponse> listBucket(final String name, ListBucketOptions... optionsList) { - ListContainerOptions options = bucket2ContainerListOptions.apply(optionsList); - return transform(blobStore.list(name, options), resource2BucketList, userExecutor); - } - - public ListenableFuture<ObjectMetadata> copyObject(final String sourceBucket, final String sourceObject, - final String destinationBucket, final String destinationObject, CopyObjectOptions... nullableOptions) { - final CopyObjectOptions options = (nullableOptions.length == 0) ? new CopyObjectOptions() : nullableOptions[0]; - ConcurrentMap<String, Blob> source = containerToBlobs.get(sourceBucket); - ConcurrentMap<String, Blob> dest = containerToBlobs.get(destinationBucket); - if (source.containsKey(sourceObject)) { - Blob object = source.get(sourceObject); - if (options.getIfMatch() != null) { - if (!object.getMetadata().getETag().equals(options.getIfMatch())) - return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412)); - } - if (options.getIfNoneMatch() != null) { - if (object.getMetadata().getETag().equals(options.getIfNoneMatch())) - return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412)); - } - if (options.getIfModifiedSince() != null) { - Date modifiedSince = dateService.rfc822DateParse(options.getIfModifiedSince()); - if (modifiedSince.after(object.getMetadata().getLastModified())) - return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412)); - - } - if (options.getIfUnmodifiedSince() != null) { - Date unmodifiedSince = dateService.rfc822DateParse(options.getIfUnmodifiedSince()); - if (unmodifiedSince.before(object.getMetadata().getLastModified())) - return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412)); - } - Blob sourceS3 = source.get(sourceObject); - MutableBlobMetadata newMd = BlobStoreUtils.copy(sourceS3.getMetadata(), destinationObject); - if (options.getAcl() != null) - keyToAcl.put(destinationBucket + "/" + destinationObject, options.getAcl()); - - newMd.setLastModified(new Date()); - Blob newBlob = blobProvider.create(newMd); - newBlob.setPayload(sourceS3.getPayload()); - dest.put(destinationObject, newBlob); - return immediateFuture((ObjectMetadata) blob2ObjectMetadata.apply(BlobStoreUtils.copy(newMd))); - } - return immediateFailedFuture(new KeyNotFoundException(sourceBucket, sourceObject, sourceBucket + "/" - + sourceObject)); - } - - public ListenableFuture<String> putObject(final String bucketName, final S3Object object, - PutObjectOptions... nullableOptions) { - final PutObjectOptions options = (nullableOptions.length == 0) ? new PutObjectOptions() : nullableOptions[0]; - if (options.getAcl() != null) - keyToAcl.put(bucketName + "/" + object.getMetadata().getKey(), options.getAcl()); - return blobStore.putBlob(bucketName, object2Blob.apply(object)); - } - - protected AccessControlList getACLforS3Item(String bucketAndObjectKey) { - AccessControlList acl = null; - Object aclObj = keyToAcl.get(bucketAndObjectKey); - if (aclObj instanceof AccessControlList) { - acl = (AccessControlList) aclObj; - } else if (aclObj instanceof CannedAccessPolicy) { - acl = AccessControlList.fromCannedAccessPolicy((CannedAccessPolicy) aclObj, DEFAULT_OWNER_ID); - } else if (aclObj == null) { - // Default to private access policy - acl = AccessControlList.fromCannedAccessPolicy(CannedAccessPolicy.PRIVATE, DEFAULT_OWNER_ID); - } - return acl; - } - - public ListenableFuture<AccessControlList> getBucketACL(final String bucket) { - return immediateFuture(getACLforS3Item(bucket)); - } - - public ListenableFuture<AccessControlList> getObjectACL(final String bucket, final String objectKey) { - return immediateFuture(getACLforS3Item(bucket + "/" + objectKey)); - } - - /** - * Replace any AmazonCustomerByEmail grantees with a somewhat-arbitrary canonical user grantee, - * to match S3 which substitutes each email address grantee with that user's corresponding ID. In - * short, although you can PUT email address grantees, these are actually subsequently returned - * by S3 as canonical user grantees. - * - * @param acl - * @return - */ - protected AccessControlList sanitizeUploadedACL(AccessControlList acl) { - // Replace any email address grantees with canonical user grantees, using - // the acl's owner ID as the surrogate replacement. - for (Grant grant : acl.getGrants()) { - if (grant.getGrantee() instanceof EmailAddressGrantee) { - EmailAddressGrantee emailGrantee = (EmailAddressGrantee) grant.getGrantee(); - String id = emailGrantee.getEmailAddress().equals(TEST_ACL_EMAIL) ? TEST_ACL_ID : acl.getOwner().getId(); - grant.setGrantee(new CanonicalUserGrantee(id, acl.getOwner().getDisplayName())); - } - } - return acl; - } - - public ListenableFuture<Boolean> putBucketACL(final String bucket, final AccessControlList acl) { - keyToAcl.put(bucket, sanitizeUploadedACL(acl)); - return immediateFuture(true); - } - - public ListenableFuture<Boolean> putObjectACL(final String bucket, final String objectKey, - final AccessControlList acl) { - keyToAcl.put(bucket + "/" + objectKey, sanitizeUploadedACL(acl)); - return immediateFuture(true); - } - - public ListenableFuture<Boolean> bucketExists(final String bucketName) { - return immediateFuture(containerToBlobs.containsKey(bucketName)); - } - - public ListenableFuture<Boolean> deleteBucketIfEmpty(String bucketName) { - Boolean returnVal = true; - if (containerToBlobs.containsKey(bucketName)) { - if (containerToBlobs.get(bucketName).isEmpty()) - containerToBlobs.remove(bucketName); - else - returnVal = false; - } - return immediateFuture(returnVal); - } - - public ListenableFuture<Void> deleteObject(String bucketName, String key) { - return blobStore.removeBlob(bucketName, key); - } - - public ListenableFuture<S3Object> getObject(final String bucketName, final String key, final GetOptions... options) { - org.jclouds.blobstore.options.GetOptions getOptions = httpGetOptionsConverter.apply(options); - return transform(blobStore.getBlob(bucketName, key, getOptions), blob2Object, userExecutor); - } - - public ListenableFuture<ObjectMetadata> headObject(String bucketName, String key) { - return transform(blobStore.blobMetadata(bucketName, key), new Function<BlobMetadata, ObjectMetadata>() { - public ObjectMetadata apply(BlobMetadata from) { - return blob2ObjectMetadata.apply(from); - } - }, userExecutor); - } - - public ListenableFuture<? extends Set<BucketMetadata>> listOwnedBuckets() { - return immediateFuture(Sets.newLinkedHashSet(Iterables.transform(containerToBlobs.keySet(), - new Function<String, BucketMetadata>() { - public BucketMetadata apply(String name) { - return new BucketMetadata(name, null, null); - } - - }))); - } - - public S3Object newS3Object() { - return objectProvider.create(null); - } - - @Override - public ListenableFuture<String> getBucketLocation(String bucketName) { - Location location = containerToLocation.get(bucketName); - return immediateFuture(location.getId()); - } - - @Override - public ListenableFuture<Payer> getBucketPayer(String bucketName) { - return immediateFuture(Payer.BUCKET_OWNER); - } - - @Override - public ListenableFuture<Void> setBucketPayer(String bucketName, Payer payer) { - return immediateFuture(null); - - } - - @Override - public ListenableFuture<Void> disableBucketLogging(String bucketName) { - return immediateFuture(null); - } - - @Override - public ListenableFuture<Void> enableBucketLogging(String bucketName, BucketLogging logging) { - return immediateFuture(null); - } - - @Override - public ListenableFuture<BucketLogging> getBucketLogging(String bucketName) { - return immediateFuture(null); - } - - @Override - public ListenableFuture<Boolean> objectExists(String bucketName, String key) { - return immediateFuture(containerToBlobs.get(bucketName).containsKey(key)); - } - - @Override - public void close() throws IOException { - closer.close(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java index 558b055..bb9891f 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java @@ -16,6 +16,18 @@ */ package org.jclouds.s3.services; +import static org.jclouds.s3.S3ClientLiveTest.TEST_ACL_EMAIL; +import static org.jclouds.s3.S3ClientLiveTest.TEST_ACL_ID; +import static org.jclouds.s3.domain.AccessControlList.GroupGranteeURI.ALL_USERS; +import static org.jclouds.s3.domain.AccessControlList.GroupGranteeURI.LOG_DELIVERY; +import static org.jclouds.s3.domain.AccessControlList.Permission.FULL_CONTROL; +import static org.jclouds.s3.domain.AccessControlList.Permission.READ; +import static org.jclouds.s3.domain.AccessControlList.Permission.READ_ACP; +import static org.jclouds.s3.domain.AccessControlList.Permission.WRITE; +import static org.jclouds.s3.domain.AccessControlList.Permission.WRITE_ACP; +import static org.jclouds.s3.domain.CannedAccessPolicy.PUBLIC_READ; +import static org.jclouds.s3.domain.Payer.BUCKET_OWNER; +import static org.jclouds.s3.domain.Payer.REQUESTER; import static org.jclouds.s3.options.ListBucketOptions.Builder.afterMarker; import static org.jclouds.s3.options.ListBucketOptions.Builder.delimiter; import static org.jclouds.s3.options.ListBucketOptions.Builder.maxResults; @@ -34,21 +46,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; -import org.jclouds.s3.S3ApiMetadata; import org.jclouds.s3.S3Client; import org.jclouds.s3.domain.AccessControlList; import org.jclouds.s3.domain.AccessControlList.CanonicalUserGrantee; import org.jclouds.s3.domain.AccessControlList.EmailAddressGrantee; import org.jclouds.s3.domain.AccessControlList.Grant; -import org.jclouds.s3.domain.AccessControlList.GroupGranteeURI; -import org.jclouds.s3.domain.AccessControlList.Permission; import org.jclouds.s3.domain.BucketLogging; import org.jclouds.s3.domain.BucketMetadata; -import org.jclouds.s3.domain.CannedAccessPolicy; import org.jclouds.s3.domain.ListBucketResponse; -import org.jclouds.s3.domain.Payer; import org.jclouds.s3.domain.S3Object; -import org.jclouds.s3.internal.StubS3AsyncClient; import org.jclouds.util.Strings2; import org.testng.annotations.Test; @@ -58,13 +64,14 @@ import com.google.common.collect.Iterables; @Test(groups = { "integration", "live" }) public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { + public BucketsLiveTest() { this.provider = "s3"; BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true; } public S3Client getApi() { - return view.unwrap(S3ApiMetadata.CONTEXT_TOKEN).getApi(); + return view.unwrapApi(S3Client.class); } /** @@ -94,7 +101,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { assertEquals(acl.getGrants().size(), 1); assertNotNull(acl.getOwner()); String ownerId = acl.getOwner().getId(); - assertTrue(acl.hasPermission(ownerId, Permission.FULL_CONTROL)); + assertTrue(acl.hasPermission(ownerId, FULL_CONTROL)); } finally { returnContainer(bucketName); } @@ -109,7 +116,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { AccessControlList acl = getApi().getBucketACL(bucketName); String ownerId = acl.getOwner().getId(); assertEquals(acl.getGrants().size(), 1); - assertTrue(acl.hasPermission(ownerId, Permission.FULL_CONTROL)); + assertTrue(acl.hasPermission(ownerId, FULL_CONTROL)); addGrantsToACL(acl); assertEquals(acl.getGrants().size(), 4); @@ -129,26 +136,26 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { assertEquals(acl.getGrants().size(), 4, acl.toString()); - assertTrue(acl.hasPermission(ownerId, Permission.FULL_CONTROL), acl.toString()); - assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString()); - assertTrue(acl.hasPermission(ownerId, Permission.WRITE_ACP), acl.toString()); + assertTrue(acl.hasPermission(ownerId, FULL_CONTROL), acl.toString()); + assertTrue(acl.hasPermission(ALL_USERS, READ), acl.toString()); + assertTrue(acl.hasPermission(ownerId, WRITE_ACP), acl.toString()); // EmailAddressGrantee is replaced by a CanonicalUserGrantee, so we cannot test by email addr - assertTrue(acl.hasPermission(StubS3AsyncClient.TEST_ACL_ID, Permission.READ_ACP), acl.toString()); + assertTrue(acl.hasPermission(TEST_ACL_ID, READ_ACP), acl.toString()); } private void addGrantsToACL(AccessControlList acl) { String ownerId = acl.getOwner().getId(); - acl.addPermission(GroupGranteeURI.ALL_USERS, Permission.READ); - acl.addPermission(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL), Permission.READ_ACP); - acl.addPermission(new CanonicalUserGrantee(ownerId), Permission.WRITE_ACP); + acl.addPermission(ALL_USERS, READ); + acl.addPermission(new EmailAddressGrantee(TEST_ACL_EMAIL), READ_ACP); + acl.addPermission(new CanonicalUserGrantee(ownerId), WRITE_ACP); } public void testPublicReadAccessPolicy() throws Exception { String bucketName = getScratchContainerName(); try { - getApi().putBucketInRegion(null, bucketName, withBucketAcl(CannedAccessPolicy.PUBLIC_READ)); + getApi().putBucketInRegion(null, bucketName, withBucketAcl(PUBLIC_READ)); AccessControlList acl = getApi().getBucketACL(bucketName); - assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString()); + assertTrue(acl.hasPermission(ALL_USERS, READ), acl.toString()); // TODO: I believe that the following should work based on the above acl assertion passing. // However, it fails on 403 // URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName)); @@ -173,23 +180,23 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { public void testBucketPayer() throws Exception { final String bucketName = getContainerName(); try { - assertEquals(Payer.BUCKET_OWNER, getApi().getBucketPayer(bucketName)); - getApi().setBucketPayer(bucketName, Payer.REQUESTER); + assertEquals(BUCKET_OWNER, getApi().getBucketPayer(bucketName)); + getApi().setBucketPayer(bucketName, REQUESTER); assertConsistencyAware(new Runnable() { public void run() { try { - assertEquals(Payer.REQUESTER, getApi().getBucketPayer(bucketName)); + assertEquals(REQUESTER, getApi().getBucketPayer(bucketName)); } catch (Exception e) { Throwables.propagateIfPossible(e); } } }); - getApi().setBucketPayer(bucketName, Payer.BUCKET_OWNER); + getApi().setBucketPayer(bucketName, BUCKET_OWNER); assertConsistencyAware(new Runnable() { public void run() { try { - assertEquals(Payer.BUCKET_OWNER, getApi().getBucketPayer(bucketName)); + assertEquals(BUCKET_OWNER, getApi().getBucketPayer(bucketName)); } catch (Exception e) { Throwables.propagateIfPossible(e); } @@ -208,8 +215,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { setupAclForBucketLoggingTarget(targetBucket); final BucketLogging logging = new BucketLogging(targetBucket, "access_log-", - ImmutableSet.<Grant> of(new Grant(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL), - Permission.FULL_CONTROL))); + ImmutableSet.<Grant> of(new Grant(new EmailAddressGrantee(TEST_ACL_EMAIL), FULL_CONTROL))); getApi().enableBucketLogging(bucketName, logging); @@ -226,7 +232,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } // EmailAddressGrantee is replaced by a CanonicalUserGrantee, so we cannot test by // email addr - assertTrue(acl.hasPermission(StubS3AsyncClient.TEST_ACL_ID, Permission.FULL_CONTROL), acl.toString()); + assertTrue(acl.hasPermission(TEST_ACL_ID, FULL_CONTROL), acl.toString()); assertEquals(logging.getTargetBucket(), newLogging.getTargetBucket()); assertEquals(logging.getTargetPrefix(), newLogging.getTargetPrefix()); } catch (Exception e) { @@ -251,10 +257,9 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } private void setupAclForBucketLoggingTarget(final String targetBucket) { - // http://docs.amazonwebservices.com/AmazonS3/latest/LoggingHowTo.html AccessControlList acl = getApi().getBucketACL(targetBucket); - acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.WRITE); - acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.READ_ACP); + acl.addPermission(LOG_DELIVERY, WRITE); + acl.addPermission(LOG_DELIVERY, READ_ACP); assertTrue(getApi().putBucketACL(targetBucket, acl)); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/blobstore/src/main/java/org/jclouds/blobstore/internal/SubmissionAsyncBlobStore.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/SubmissionAsyncBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/SubmissionAsyncBlobStore.java new file mode 100644 index 0000000..b141008 --- /dev/null +++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/SubmissionAsyncBlobStore.java @@ -0,0 +1,293 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.blobstore.internal; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.Constants.PROPERTY_USER_THREADS; + +import java.util.Set; +import java.util.concurrent.Callable; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.jclouds.blobstore.AsyncBlobStore; +import org.jclouds.blobstore.BlobStore; +import org.jclouds.blobstore.BlobStoreContext; +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.domain.BlobBuilder; +import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.domain.PageSet; +import org.jclouds.blobstore.domain.StorageMetadata; +import org.jclouds.blobstore.options.CreateContainerOptions; +import org.jclouds.blobstore.options.GetOptions; +import org.jclouds.blobstore.options.ListContainerOptions; +import org.jclouds.blobstore.options.PutOptions; +import org.jclouds.domain.Location; + +import com.google.common.collect.ForwardingObject; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; + +/** + * Adapter that allows you to reuse an existing {@link BlobStore} to implement + * the deprecated {@link AsyncBlobStore} interface. + * + * @deprecated will be removed in jclouds 2.0, as async interfaces are no longer + * supported. Please use {@link BlobStore} + */ +@Deprecated +public class SubmissionAsyncBlobStore extends ForwardingObject implements AsyncBlobStore { + private final BlobStore blobstore; + private final ListeningExecutorService executor; + + @Inject + public SubmissionAsyncBlobStore(BlobStore blobstore, @Named(PROPERTY_USER_THREADS) ListeningExecutorService executor) { + this.blobstore = checkNotNull(blobstore, "blobstore"); + this.executor = checkNotNull(executor, "executor"); + } + + @Override + protected BlobStore delegate() { + return blobstore; + } + + @Override + public BlobStoreContext getContext() { + return delegate().getContext(); + } + + @Override + public BlobBuilder blobBuilder(String name) { + return delegate().blobBuilder(name); + } + + @Override + public ListenableFuture<Set<? extends Location>> listAssignableLocations() { + return executor.submit(new Callable<Set<? extends Location>>() { + public Set<? extends Location> call() { + return delegate().listAssignableLocations(); + } + }); + } + + @Override + public ListenableFuture<PageSet<? extends StorageMetadata>> list() { + return executor.submit(new Callable<PageSet<? extends StorageMetadata>>() { + public PageSet<? extends StorageMetadata> call() { + return delegate().list(); + } + }); + } + + @Override + public ListenableFuture<Boolean> containerExists(final String container) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().containerExists(container); + } + }); + } + + @Override + public ListenableFuture<Boolean> createContainerInLocation(final Location location, final String container) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().createContainerInLocation(location, container); + } + }); + } + + @Override + public ListenableFuture<Boolean> createContainerInLocation(final Location location, final String container, + final CreateContainerOptions options) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().createContainerInLocation(location, container, options); + } + }); + } + + @Override + public ListenableFuture<PageSet<? extends StorageMetadata>> list(final String container) { + return executor.submit(new Callable<PageSet<? extends StorageMetadata>>() { + public PageSet<? extends StorageMetadata> call() { + return delegate().list(container); + } + }); + } + + @Override + public ListenableFuture<PageSet<? extends StorageMetadata>> list(final String container, + final ListContainerOptions options) { + return executor.submit(new Callable<PageSet<? extends StorageMetadata>>() { + public PageSet<? extends StorageMetadata> call() { + return delegate().list(container, options); + } + }); + } + + @Override + public ListenableFuture<Void> clearContainer(final String container) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().clearContainer(container); + return null; + } + }); + } + + @Override + public ListenableFuture<Void> clearContainer(final String container, final ListContainerOptions options) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().clearContainer(container, options); + return null; + } + }); + } + + @Override + public ListenableFuture<Void> deleteContainer(final String container) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().deleteContainer(container); + return null; + } + }); + } + + @Override + public ListenableFuture<Boolean> deleteContainerIfEmpty(final String container) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().deleteContainerIfEmpty(container); + } + }); + } + + @Override + public ListenableFuture<Boolean> directoryExists(final String container, final String directory) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().directoryExists(container, directory); + } + }); + } + + @Override + public ListenableFuture<Void> createDirectory(final String container, final String directory) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().createDirectory(container, directory); + return null; + } + }); + } + + @Override + public ListenableFuture<Void> deleteDirectory(final String containerName, final String name) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().deleteDirectory(containerName, name); + return null; + } + }); + } + + @Override + public ListenableFuture<Boolean> blobExists(final String container, final String name) { + return executor.submit(new Callable<Boolean>() { + public Boolean call() { + return delegate().blobExists(container, name); + } + }); + } + + @Override + public ListenableFuture<String> putBlob(final String container, final Blob blob) { + return executor.submit(new Callable<String>() { + public String call() { + return delegate().putBlob(container, blob); + } + }); + } + + @Override + public ListenableFuture<String> putBlob(final String container, final Blob blob, final PutOptions options) { + return executor.submit(new Callable<String>() { + public String call() { + return delegate().putBlob(container, blob, options); + } + }); + } + + @Override + public ListenableFuture<BlobMetadata> blobMetadata(final String container, final String key) { + return executor.submit(new Callable<BlobMetadata>() { + public BlobMetadata call() { + return delegate().blobMetadata(container, key); + } + }); + } + + @Override + public ListenableFuture<Blob> getBlob(final String container, final String key) { + return executor.submit(new Callable<Blob>() { + public Blob call() { + return delegate().getBlob(container, key); + } + }); + } + + @Override + public ListenableFuture<Blob> getBlob(final String container, final String key, final GetOptions options) { + return executor.submit(new Callable<Blob>() { + public Blob call() { + return delegate().getBlob(container, key, options); + } + }); + } + + @Override + public ListenableFuture<Void> removeBlob(final String container, final String key) { + return executor.submit(new Callable<Void>() { + public Void call() { + delegate().removeBlob(container, key); + return null; + } + }); + } + + @Override + public ListenableFuture<Long> countBlobs(final String container) { + return executor.submit(new Callable<Long>() { + public Long call() { + return delegate().countBlobs(container); + } + }); + } + + @Override + public ListenableFuture<Long> countBlobs(final String container, final ListContainerOptions options) { + return executor.submit(new Callable<Long>() { + public Long call() { + return delegate().countBlobs(container, options); + } + }); + } +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java index 707b40a..ae91faf 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java @@ -23,26 +23,16 @@ import java.util.Properties; import org.jclouds.aws.s3.blobstore.AWSS3BlobStoreContext; import org.jclouds.aws.s3.blobstore.config.AWSS3BlobStoreContextModule; -import org.jclouds.aws.s3.config.AWSS3RestClientModule; +import org.jclouds.aws.s3.config.AWSS3HttpApiModule; import org.jclouds.s3.S3ApiMetadata; import com.google.common.collect.ImmutableSet; -import com.google.common.reflect.TypeToken; import com.google.inject.Module; /** - * Implementation of {@link ApiMetadata} for the Amazon-specific S3 API + * Implementation of {@link S3ApiMetadata} for the Amazon-specific S3 API */ public class AWSS3ApiMetadata extends S3ApiMetadata { - - /** - * @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(AWSS3Client.class)} as - * {@link AWSS3AsyncClient} interface will be removed in jclouds 1.7. - */ - @Deprecated - public static final TypeToken<org.jclouds.rest.RestContext<AWSS3Client, AWSS3AsyncClient>> CONTEXT_TOKEN = new TypeToken<org.jclouds.rest.RestContext<AWSS3Client, AWSS3AsyncClient>>() { - private static final long serialVersionUID = 1L; - }; @Override public Builder toBuilder() { @@ -63,16 +53,14 @@ public class AWSS3ApiMetadata extends S3ApiMetadata { return properties; } - public static class Builder extends S3ApiMetadata.Builder<Builder> { - @SuppressWarnings("deprecation") + public static class Builder extends S3ApiMetadata.Builder<AWSS3Client, Builder> { protected Builder() { - super(AWSS3Client.class, AWSS3AsyncClient.class); + super(AWSS3Client.class); id("aws-s3") .name("Amazon-specific S3 API") .defaultProperties(AWSS3ApiMetadata.defaultProperties()) - .context(CONTEXT_TOKEN) .view(typeToken(AWSS3BlobStoreContext.class)) - .defaultModules(ImmutableSet.<Class<? extends Module>>of(AWSS3RestClientModule.class, AWSS3BlobStoreContextModule.class)); + .defaultModules(ImmutableSet.<Class<? extends Module>>of(AWSS3HttpApiModule.class, AWSS3BlobStoreContextModule.class)); } @Override http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3AsyncClient.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3AsyncClient.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3AsyncClient.java deleted file mode 100644 index 366a845..0000000 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3AsyncClient.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.aws.s3; - -import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER; - -import java.util.Map; - -import javax.inject.Named; -import javax.ws.rs.DELETE; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; - -import org.jclouds.Fallbacks.VoidOnNotFoundOr404; -import org.jclouds.aws.s3.binders.BindIterableAsPayloadToDeleteRequest; -import org.jclouds.aws.s3.binders.BindObjectMetadataToRequest; -import org.jclouds.aws.s3.binders.BindPartIdsAndETagsToRequest; -import org.jclouds.aws.s3.domain.DeleteResult; -import org.jclouds.aws.s3.functions.ETagFromHttpResponseViaRegex; -import org.jclouds.aws.s3.functions.ObjectMetadataKey; -import org.jclouds.aws.s3.functions.UploadIdFromHttpResponseViaRegex; -import org.jclouds.aws.s3.xml.DeleteResultHandler; -import org.jclouds.blobstore.attr.BlobScope; -import org.jclouds.http.functions.ParseETagHeader; -import org.jclouds.io.Payload; -import org.jclouds.rest.annotations.BinderParam; -import org.jclouds.rest.annotations.EndpointParam; -import org.jclouds.rest.annotations.Fallback; -import org.jclouds.rest.annotations.ParamParser; -import org.jclouds.rest.annotations.ParamValidators; -import org.jclouds.rest.annotations.QueryParams; -import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.annotations.ResponseParser; -import org.jclouds.rest.annotations.XMLResponseParser; -import org.jclouds.s3.Bucket; -import org.jclouds.s3.S3AsyncClient; -import org.jclouds.s3.binders.BindAsHostPrefixIfConfigured; -import org.jclouds.s3.domain.ObjectMetadata; -import org.jclouds.s3.filters.RequestAuthorizeSignature; -import org.jclouds.s3.functions.AssignCorrectHostnameForBucket; -import org.jclouds.s3.options.PutObjectOptions; -import org.jclouds.s3.predicates.validators.BucketNameValidator; - -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Provides access to amazon-specific S3 features - * - * @deprecated please use - * {@code org.jclouds.ContextBuilder#buildApi(AWSS3Client.class)} - * as {@link AWSS3AsyncClient} interface will be removed in jclouds 1.7. - */ -@RequestFilters(RequestAuthorizeSignature.class) -@BlobScope(CONTAINER) -@Deprecated -public interface AWSS3AsyncClient extends S3AsyncClient { - - /** - * @see AWSS3Client#initiateMultipartUpload - */ - @Named("PutObject") - @POST - @QueryParams(keys = "uploads") - @Path("/{key}") - @ResponseParser(UploadIdFromHttpResponseViaRegex.class) - ListenableFuture<String> initiateMultipartUpload( - @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, - @PathParam("key") @ParamParser(ObjectMetadataKey.class) @BinderParam(BindObjectMetadataToRequest.class) ObjectMetadata objectMetadata, - PutObjectOptions... options); - - /** - * @see AWSS3Client#abortMultipartUpload - */ - @Named("AbortMultipartUpload") - @DELETE - @Path("/{key}") - @Fallback(VoidOnNotFoundOr404.class) - ListenableFuture<Void> abortMultipartUpload( - @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, - @PathParam("key") String key, @QueryParam("uploadId") String uploadId); - - /** - * @see AWSS3Client#uploadPart - */ - @Named("PutObject") - @PUT - @Path("/{key}") - @ResponseParser(ParseETagHeader.class) - ListenableFuture<String> uploadPart( - @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, - @PathParam("key") String key, @QueryParam("partNumber") int partNumber, - @QueryParam("uploadId") String uploadId, Payload part); - - /** - * @see AWSS3Client#completeMultipartUpload - */ - @Named("PutObject") - @POST - @Path("/{key}") - @ResponseParser(ETagFromHttpResponseViaRegex.class) - ListenableFuture<String> completeMultipartUpload( - @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, - @PathParam("key") String key, @QueryParam("uploadId") String uploadId, - @BinderParam(BindPartIdsAndETagsToRequest.class) Map<Integer, String> parts); - - /** - * @see AWSS3Client#deleteObjects - */ - @Named("DeleteObject") - @POST - @Path("/") - @QueryParams(keys = "delete") - @XMLResponseParser(DeleteResultHandler.class) - ListenableFuture<DeleteResult> deleteObjects( - @Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, - @BinderParam(BindIterableAsPayloadToDeleteRequest.class) Iterable<String> keys); - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3Client.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3Client.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3Client.java index 37f9b3b..7dccd70 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3Client.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3Client.java @@ -16,18 +16,53 @@ */ package org.jclouds.aws.s3; +import static org.jclouds.Fallbacks.VoidOnNotFoundOr404; +import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER; + import java.util.Map; + +import javax.inject.Named; +import javax.ws.rs.DELETE; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; + +import org.jclouds.aws.s3.binders.BindIterableAsPayloadToDeleteRequest; +import org.jclouds.aws.s3.binders.BindObjectMetadataToRequest; +import org.jclouds.aws.s3.binders.BindPartIdsAndETagsToRequest; import org.jclouds.aws.s3.domain.DeleteResult; +import org.jclouds.aws.s3.functions.ETagFromHttpResponseViaRegex; +import org.jclouds.aws.s3.functions.ObjectMetadataKey; +import org.jclouds.aws.s3.functions.UploadIdFromHttpResponseViaRegex; +import org.jclouds.aws.s3.xml.DeleteResultHandler; +import org.jclouds.blobstore.attr.BlobScope; +import org.jclouds.http.functions.ParseETagHeader; import org.jclouds.io.Payload; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.ParamParser; +import org.jclouds.rest.annotations.ParamValidators; +import org.jclouds.rest.annotations.QueryParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.ResponseParser; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.s3.Bucket; import org.jclouds.s3.S3Client; +import org.jclouds.s3.binders.BindAsHostPrefixIfConfigured; import org.jclouds.s3.domain.ObjectMetadata; +import org.jclouds.s3.filters.RequestAuthorizeSignature; +import org.jclouds.s3.functions.AssignCorrectHostnameForBucket; import org.jclouds.s3.options.PutObjectOptions; +import org.jclouds.s3.predicates.validators.BucketNameValidator; /** * Provides access to amazon-specific S3 features - * - * @see AWSS3AsyncClient */ +@RequestFilters(RequestAuthorizeSignature.class) +@BlobScope(CONTAINER) public interface AWSS3Client extends S3Client { /** @@ -48,8 +83,15 @@ public interface AWSS3Client extends S3Client { * controls optional parameters such as canned ACL * @return ID for the initiated multipart upload. */ - String initiateMultipartUpload(String bucketName, ObjectMetadata objectMetadata, PutObjectOptions... options); - + @Named("PutObject") + @POST + @QueryParams(keys = "uploads") + @Path("/{key}") + @ResponseParser(UploadIdFromHttpResponseViaRegex.class) + String initiateMultipartUpload(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam( + BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, + @PathParam("key") @ParamParser(ObjectMetadataKey.class) @BinderParam(BindObjectMetadataToRequest.class) + ObjectMetadata objectMetadata, PutObjectOptions... options); /** * This operation aborts a multipart upload. After a multipart upload is aborted, no additional @@ -66,7 +108,13 @@ public interface AWSS3Client extends S3Client { * @param uploadId * id of the multipart upload in progress. */ - void abortMultipartUpload(String bucketName, String key, String uploadId); + @Named("AbortMultipartUpload") + @DELETE + @Path("/{key}") + @Fallback(VoidOnNotFoundOr404.class) + void abortMultipartUpload(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam( + BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, + @PathParam("key") String key, @QueryParam("uploadId") String uploadId); /** * This operation uploads a part in a multipart upload. You must initiate a multipart upload (see @@ -98,10 +146,15 @@ public interface AWSS3Client extends S3Client { * @param part * contains the data to create or overwrite * @return ETag of the content uploaded - * @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPart.html" - * /> */ - String uploadPart(String bucketName, String key, int partNumber, String uploadId, Payload part); + @Named("PutObject") + @PUT + @Path("/{key}") + @ResponseParser(ParseETagHeader.class) + String uploadPart(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam( + BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, + @PathParam("key") String key, @QueryParam("partNumber") int partNumber, + @QueryParam("uploadId") String uploadId, Payload part); /** * @@ -135,7 +188,14 @@ public interface AWSS3Client extends S3Client { * a map of part id to eTag from the {@link #uploadPart} command. * @return ETag of the content uploaded */ - String completeMultipartUpload(String bucketName, String key, String uploadId, Map<Integer, String> parts); + @Named("PutObject") + @POST + @Path("/{key}") + @ResponseParser(ETagFromHttpResponseViaRegex.class) + String completeMultipartUpload(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam( + BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, + @PathParam("key") String key, @QueryParam("uploadId") String uploadId, + @BinderParam(BindPartIdsAndETagsToRequest.class) Map<Integer, String> parts); /** * The Multi-Object Delete operation enables you to delete multiple objects from a bucket using a @@ -151,11 +211,17 @@ public interface AWSS3Client extends S3Client { * By default, the operation uses verbose mode in which the response includes the result of * deletion of each key in your request. * - * @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/API/multiobjectdeleteapi.html" /> * @param bucketName * namespace of the objects you are deleting * @param keys * set of unique keys identifying objects */ - DeleteResult deleteObjects(String bucketName, Iterable<String> keys); + @Named("DeleteObject") + @POST + @Path("/") + @QueryParams(keys = "delete") + @XMLResponseParser(DeleteResultHandler.class) + DeleteResult deleteObjects(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam( + BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName, + @BinderParam(BindIterableAsPayloadToDeleteRequest.class) Iterable<String> keys); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3AsyncBlobStore.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3AsyncBlobStore.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3AsyncBlobStore.java deleted file mode 100644 index 63e084d..0000000 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3AsyncBlobStore.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.aws.s3.blobstore; - -import static org.jclouds.s3.domain.ObjectMetadata.StorageClass.REDUCED_REDUNDANCY; - -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; - -import org.jclouds.Constants; -import org.jclouds.aws.domain.Region; -import org.jclouds.aws.s3.AWSS3ApiMetadata; -import org.jclouds.aws.s3.AWSS3AsyncClient; -import org.jclouds.aws.s3.AWSS3Client; -import org.jclouds.aws.s3.blobstore.options.AWSS3PutObjectOptions; -import org.jclouds.aws.s3.blobstore.options.AWSS3PutOptions; -import org.jclouds.aws.s3.blobstore.strategy.AsyncMultipartUploadStrategy; -import org.jclouds.blobstore.BlobStoreContext; -import org.jclouds.blobstore.domain.Blob; -import org.jclouds.blobstore.domain.PageSet; -import org.jclouds.blobstore.domain.StorageMetadata; -import org.jclouds.blobstore.functions.BlobToHttpGetOptions; -import org.jclouds.blobstore.options.CreateContainerOptions; -import org.jclouds.blobstore.options.PutOptions; -import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; -import org.jclouds.blobstore.util.BlobUtils; -import org.jclouds.collect.Memoized; -import org.jclouds.domain.Location; -import org.jclouds.s3.blobstore.S3AsyncBlobStore; -import org.jclouds.s3.blobstore.functions.BlobToObject; -import org.jclouds.s3.blobstore.functions.BucketToResourceList; -import org.jclouds.s3.blobstore.functions.ContainerToBucketListOptions; -import org.jclouds.s3.blobstore.functions.ObjectToBlob; -import org.jclouds.s3.blobstore.functions.ObjectToBlobMetadata; -import org.jclouds.s3.domain.AccessControlList; -import org.jclouds.s3.domain.BucketMetadata; -import org.jclouds.s3.domain.CannedAccessPolicy; -import org.jclouds.s3.domain.ObjectMetadata; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; - -/** - * - * @deprecated will be removed in jclouds 1.7, as async interfaces are no longer - * supported. Please use {@link AWSS3BlobStore} - */ -@Deprecated -public class AWSS3AsyncBlobStore extends S3AsyncBlobStore { - - private final Provider<AsyncMultipartUploadStrategy> multipartUploadStrategy; - private final LoadingCache<String, AccessControlList> bucketAcls; - private final BlobToObject blob2Object; - - @Inject - public AWSS3AsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, - @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, Supplier<Location> defaultLocation, - @Memoized Supplier<Set<? extends Location>> locations, AWSS3AsyncClient async, AWSS3Client sync, - Function<Set<BucketMetadata>, PageSet<? extends StorageMetadata>> convertBucketsToStorageMetadata, - ContainerToBucketListOptions container2BucketListOptions, BucketToResourceList bucket2ResourceList, - ObjectToBlob object2Blob, BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, - ObjectToBlobMetadata object2BlobMd, Provider<FetchBlobMetadata> fetchBlobMetadataProvider, - LoadingCache<String, AccessControlList> bucketAcls, - Provider<AsyncMultipartUploadStrategy> multipartUploadStrategy) { - super(context, blobUtils, userExecutor, defaultLocation, locations, async, sync, convertBucketsToStorageMetadata, - container2BucketListOptions, bucket2ResourceList, object2Blob, blob2ObjectGetOptions, blob2Object, - object2BlobMd, fetchBlobMetadataProvider, bucketAcls); - this.multipartUploadStrategy = multipartUploadStrategy; - this.bucketAcls = bucketAcls; - this.blob2Object = blob2Object; - } - - @Override - public ListenableFuture<String> putBlob(String container, Blob blob, PutOptions options) { - if (options.isMultipart()) { - // need to use a provider if the strategy object is stateful - return multipartUploadStrategy.get().execute(container, blob, options); - } else if (options instanceof AWSS3PutOptions && - ((AWSS3PutOptions) options).getStorageClass() == REDUCED_REDUNDANCY) { - return putBlobWithReducedRedundancy(container, blob); - - } else { - return super.putBlob(container, blob, options); - } - } - - private ListenableFuture<String> putBlobWithReducedRedundancy(String container, Blob blob) { - AWSS3PutObjectOptions options = new AWSS3PutObjectOptions(); - try { - AccessControlList acl = bucketAcls.getUnchecked(container); - if (acl != null && acl.hasPermission(AccessControlList.GroupGranteeURI.ALL_USERS, - AccessControlList.Permission.READ)) { - options.withAcl(CannedAccessPolicy.PUBLIC_READ); - } - options.storageClass(ObjectMetadata.StorageClass.REDUCED_REDUNDANCY); - - } catch (CacheLoader.InvalidCacheLoadException e) { - // nulls not permitted from cache loader - } - return getContext().unwrap(AWSS3ApiMetadata.CONTEXT_TOKEN).getAsyncApi().putObject(container, - blob2Object.apply(blob), options); - } - - @Override - public ListenableFuture<Boolean> createContainerInLocation(Location location, String container, - CreateContainerOptions options) { - if ((location == null || location.getId().equals(Region.US_STANDARD)) && - Futures.getUnchecked(containerExists(container))) { - // AWS-S3 returns the incorrect creation status when a container - // already exists in the us-standard (or default) region. See - // JCLOUDS-334 for details. - // TODO: executing on the calling thread - return Futures.immediateFuture(Boolean.FALSE); - } - return super.createContainerInLocation(location, container, options); - } -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobRequestSigner.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobRequestSigner.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobRequestSigner.java index 3c26fc6..b719bab 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobRequestSigner.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobRequestSigner.java @@ -24,7 +24,7 @@ import java.net.URLEncoder; import java.util.Date; import java.util.concurrent.TimeUnit; -import org.jclouds.aws.s3.AWSS3AsyncClient; +import org.jclouds.aws.s3.AWSS3Client; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.date.DateService; @@ -44,7 +44,7 @@ import com.google.common.net.HttpHeaders; import com.google.inject.Inject; import com.google.inject.Provider; -public class AWSS3BlobRequestSigner extends S3BlobRequestSigner<AWSS3AsyncClient> { +public class AWSS3BlobRequestSigner extends S3BlobRequestSigner<AWSS3Client> { public static final String TEMPORARY_SIGNATURE_PARAM = "Signature"; private final RequestAuthorizeSignature authSigner; @@ -54,7 +54,7 @@ public class AWSS3BlobRequestSigner extends S3BlobRequestSigner<AWSS3AsyncClient @Inject public AWSS3BlobRequestSigner(RestAnnotationProcessor processor, BlobToObject blobToObject, - BlobToHttpGetOptions blob2HttpGetOptions, Class<AWSS3AsyncClient> interfaceClass, + BlobToHttpGetOptions blob2HttpGetOptions, Class<AWSS3Client> interfaceClass, @org.jclouds.location.Provider Supplier<Credentials> credentials, RequestAuthorizeSignature authSigner, @TimeStamp Provider<String> timeStampProvider, DateService dateService) throws SecurityException, NoSuchMethodException { http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStore.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStore.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStore.java index a6541d6..a9b8b1e 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStore.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStore.java @@ -24,7 +24,6 @@ import javax.inject.Inject; import javax.inject.Provider; import org.jclouds.aws.domain.Region; -import org.jclouds.aws.s3.AWSS3ApiMetadata; import org.jclouds.aws.s3.AWSS3Client; import org.jclouds.aws.s3.blobstore.options.AWSS3PutObjectOptions; import org.jclouds.aws.s3.blobstore.options.AWSS3PutOptions; @@ -110,8 +109,7 @@ public class AWSS3BlobStore extends S3BlobStore { } catch (CacheLoader.InvalidCacheLoadException e) { // nulls not permitted from cache loader } - return getContext().unwrap(AWSS3ApiMetadata.CONTEXT_TOKEN).getApi().putObject(container, blob2Object.apply(blob), - options); + return getContext().unwrapApi(AWSS3Client.class).putObject(container, blob2Object.apply(blob), options); } @Override http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStoreContext.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStoreContext.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStoreContext.java index 7bb0840..bbf834a 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStoreContext.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/AWSS3BlobStoreContext.java @@ -26,7 +26,4 @@ public interface AWSS3BlobStoreContext extends S3BlobStoreContext { @Override AWSS3BlobStore getBlobStore(); - - @Override - AWSS3AsyncBlobStore getAsyncBlobStore(); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/config/AWSS3BlobStoreContextModule.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/config/AWSS3BlobStoreContextModule.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/config/AWSS3BlobStoreContextModule.java index 2b4f21c..bfd6716 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/config/AWSS3BlobStoreContextModule.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/config/AWSS3BlobStoreContextModule.java @@ -16,7 +16,6 @@ */ package org.jclouds.aws.s3.blobstore.config; -import org.jclouds.aws.s3.blobstore.AWSS3AsyncBlobStore; import org.jclouds.aws.s3.blobstore.AWSS3BlobRequestSigner; import org.jclouds.aws.s3.blobstore.AWSS3BlobStore; import org.jclouds.aws.s3.blobstore.strategy.AsyncMultipartUploadStrategy; @@ -24,7 +23,6 @@ import org.jclouds.aws.s3.blobstore.strategy.MultipartUploadStrategy; import org.jclouds.aws.s3.blobstore.strategy.internal.ParallelMultipartUploadStrategy; import org.jclouds.aws.s3.blobstore.strategy.internal.SequentialMultipartUploadStrategy; import org.jclouds.blobstore.BlobRequestSigner; -import org.jclouds.s3.blobstore.S3AsyncBlobStore; import org.jclouds.s3.blobstore.S3BlobStore; import org.jclouds.s3.blobstore.config.S3BlobStoreContextModule; @@ -35,7 +33,6 @@ public class AWSS3BlobStoreContextModule extends S3BlobStoreContextModule { @Override protected void configure() { super.configure(); - bind(S3AsyncBlobStore.class).to(AWSS3AsyncBlobStore.class).in(Scopes.SINGLETON); bind(S3BlobStore.class).to(AWSS3BlobStore.class).in(Scopes.SINGLETON); bind(MultipartUploadStrategy.class).to(SequentialMultipartUploadStrategy.class); bind(AsyncMultipartUploadStrategy.class).to(ParallelMultipartUploadStrategy.class); http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/internal/AWSS3BlobStoreContextImpl.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/internal/AWSS3BlobStoreContextImpl.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/internal/AWSS3BlobStoreContextImpl.java index cad9916..9455f01 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/internal/AWSS3BlobStoreContextImpl.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/internal/AWSS3BlobStoreContextImpl.java @@ -20,7 +20,6 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.Context; -import org.jclouds.aws.s3.blobstore.AWSS3AsyncBlobStore; import org.jclouds.aws.s3.blobstore.AWSS3BlobStore; import org.jclouds.aws.s3.blobstore.AWSS3BlobStoreContext; import org.jclouds.blobstore.AsyncBlobStore; @@ -49,10 +48,4 @@ public class AWSS3BlobStoreContextImpl extends S3BlobStoreContextImpl implements public AWSS3BlobStore getBlobStore() { return AWSS3BlobStore.class.cast(super.getBlobStore()); } - - @Override - public AWSS3AsyncBlobStore getAsyncBlobStore() { - return AWSS3AsyncBlobStore.class.cast(super.getAsyncBlobStore()); - } - } http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/AsyncMultipartUploadStrategy.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/AsyncMultipartUploadStrategy.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/AsyncMultipartUploadStrategy.java index 1431b6d..3f638ae 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/AsyncMultipartUploadStrategy.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/AsyncMultipartUploadStrategy.java @@ -23,9 +23,6 @@ import org.jclouds.blobstore.options.PutOptions; import com.google.common.util.concurrent.ListenableFuture; import com.google.inject.ImplementedBy; -/** - * @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?qfacts.html">AWS Documentation</a> - */ @ImplementedBy(ParallelMultipartUploadStrategy.class) public interface AsyncMultipartUploadStrategy { http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUpload.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUpload.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUpload.java index 622c60e..5342e67 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUpload.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUpload.java @@ -16,9 +16,6 @@ */ package org.jclouds.aws.s3.blobstore.strategy; -/** - * @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?qfacts.html">AWS Documentation</a> - */ public final class MultipartUpload { /* Maximum number of parts per upload */ http://git-wip-us.apache.org/repos/asf/jclouds/blob/b6497556/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUploadStrategy.java ---------------------------------------------------------------------- diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUploadStrategy.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUploadStrategy.java index e00580d..12b7ef3 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUploadStrategy.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/MultipartUploadStrategy.java @@ -21,9 +21,6 @@ import org.jclouds.blobstore.domain.Blob; import com.google.inject.ImplementedBy; -/** - * @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?qfacts.html">AWS Documentation</a> - */ @ImplementedBy(SequentialMultipartUploadStrategy.class) public interface MultipartUploadStrategy {
