Repository: jclouds Updated Branches: refs/heads/master 8bddbb496 -> 688890819
JCLOUDS-948: Azure Cache-Control support References JCLOUDS-185. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/01e10bba Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/01e10bba Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/01e10bba Branch: refs/heads/master Commit: 01e10bba6692f3904199305d50fea76f5658014e Parents: 77d3db0 Author: Andrew Gaul <[email protected]> Authored: Thu Jan 14 16:18:18 2016 -0800 Committer: Andrew Gaul <[email protected]> Committed: Fri Jan 15 04:41:01 2016 -0800 ---------------------------------------------------------------------- .../storage/reference/AzureStorageHeaders.java | 1 + ...BindAzureBlobMetadataToMultipartRequest.java | 4 ++ .../binders/BindAzureBlobMetadataToRequest.java | 6 +++ .../BindAzureContentMetadataToRequest.java | 5 ++ .../azureblob/blobstore/AzureBlobStore.java | 5 ++ .../domain/internal/BlobPropertiesImpl.java | 1 + .../jclouds/azureblob/AzureBlobClientTest.java | 56 ++++++++++++++++++++ 7 files changed, 78 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azure/storage/reference/AzureStorageHeaders.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azure/storage/reference/AzureStorageHeaders.java b/providers/azureblob/src/main/java/org/jclouds/azure/storage/reference/AzureStorageHeaders.java index 9521e37..37adc2c 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azure/storage/reference/AzureStorageHeaders.java +++ b/providers/azureblob/src/main/java/org/jclouds/azure/storage/reference/AzureStorageHeaders.java @@ -23,6 +23,7 @@ package org.jclouds.azure.storage.reference; */ public final class AzureStorageHeaders { + public static final String CACHE_CONTROL = "x-ms-blob-cache-control"; public static final String CONTENT_DISPOSITION = "x-ms-blob-content-disposition"; public static final String CONTENT_ENCODING = "x-ms-blob-content-encoding"; public static final String CONTENT_LANGUAGE = "x-ms-blob-content-language"; http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToMultipartRequest.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToMultipartRequest.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToMultipartRequest.java index dcf6aaf..969a3c2 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToMultipartRequest.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToMultipartRequest.java @@ -55,6 +55,10 @@ public class BindAzureBlobMetadataToMultipartRequest implements Binder { // bind BlockList-specific headers ImmutableMap.Builder<String, String> headers = ImmutableMap.builder(); ContentMetadata contentMetadata = blob.getProperties().getContentMetadata(); + String cacheControl = contentMetadata.getCacheControl(); + if (cacheControl != null) { + headers.put("x-ms-blob-cache-control", cacheControl); + } String contentDisposition = contentMetadata.getContentDisposition(); if (contentDisposition != null) { headers.put("x-ms-blob-content-disposition", contentDisposition); http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToRequest.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToRequest.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToRequest.java index 2a258d1..6a6904e 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToRequest.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureBlobMetadataToRequest.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.azure.storage.reference.AzureStorageHeaders; import org.jclouds.azureblob.blobstore.functions.AzureBlobToBlob; import org.jclouds.azureblob.domain.AzureBlob; import org.jclouds.blobstore.binders.BindUserMetadataToHeadersWithPrefix; @@ -57,6 +58,11 @@ public class BindAzureBlobMetadataToRequest implements Binder { Builder<String, String> headers = ImmutableMap.builder(); + String cacheControl = blob.getPayload().getContentMetadata().getCacheControl(); + if (cacheControl != null) { + headers.put(AzureStorageHeaders.CACHE_CONTROL, cacheControl); + } + headers.put("x-ms-blob-type", blob.getProperties().getType().toString()); String contentDisposition = blob.getPayload().getContentMetadata().getContentDisposition(); http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java index 6568e4d..2a57775 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java @@ -45,6 +45,11 @@ public class BindAzureContentMetadataToRequest implements Binder { ImmutableMap.Builder<String, String> headers = ImmutableMap.builder(); + String cacheControl = contentMetadata.getCacheControl(); + if (cacheControl != null) { + headers.put(AzureStorageHeaders.CACHE_CONTROL, cacheControl); + } + String contentDisposition = contentMetadata.getContentDisposition(); if (contentDisposition != null) { headers.put(AzureStorageHeaders.CONTENT_DISPOSITION, contentDisposition); http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java index 6029b95..d2cb8ed 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java @@ -249,6 +249,11 @@ public class AzureBlobStore extends BaseBlobStore { if (contentMetadata.isPresent()) { ContentMetadataBuilder builder = ContentMetadataBuilder.create(); + String cacheControl = contentMetadata.get().getCacheControl(); + if (cacheControl != null) { + builder.cacheControl(cacheControl); + } + String contentDisposition = contentMetadata.get().getContentDisposition(); if (contentDisposition != null) { builder.contentDisposition(contentDisposition); http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/internal/BlobPropertiesImpl.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/internal/BlobPropertiesImpl.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/internal/BlobPropertiesImpl.java index 29868d3..27866db 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/internal/BlobPropertiesImpl.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/internal/BlobPropertiesImpl.java @@ -46,6 +46,7 @@ public class BlobPropertiesImpl implements BlobProperties { private final LeaseStatus leaseStatus; private final BaseImmutableContentMetadata contentMetadata; + // TODO: should this take Cache-Control as well? public BlobPropertiesImpl(BlobType type, String name, String container, URI url, Date lastModified, String eTag, long size, String contentType, @Nullable byte[] contentMD5, @Nullable String contentMetadata, @Nullable String contentLanguage, @Nullable Date currentExpires, LeaseStatus leaseStatus, http://git-wip-us.apache.org/repos/asf/jclouds/blob/01e10bba/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java index 48300d2..c6fa723 100644 --- a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java +++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java @@ -26,11 +26,13 @@ import java.net.URI; import java.util.Date; import java.util.Map; +import org.jclouds.ContextBuilder; import org.jclouds.Fallbacks.TrueOnNotFoundOr404; import org.jclouds.Fallbacks.VoidOnNotFoundOr404; import org.jclouds.azure.storage.filters.SharedKeyLiteAuthentication; import org.jclouds.azure.storage.options.ListOptions; import org.jclouds.azureblob.AzureBlobFallbacks.FalseIfContainerAlreadyExists; +import org.jclouds.azureblob.domain.AzureBlob; import org.jclouds.azureblob.domain.PublicAccess; import org.jclouds.azureblob.functions.ParseBlobFromHeadersAndHttpContent; import org.jclouds.azureblob.functions.ParseContainerPropertiesFromHeaders; @@ -48,6 +50,8 @@ import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.http.options.GetOptions; +import org.jclouds.io.ContentMetadata; +import org.jclouds.io.ContentMetadataBuilder; import org.jclouds.rest.internal.BaseRestAnnotationProcessingTest; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.testng.annotations.Test; @@ -60,6 +64,13 @@ import com.google.common.reflect.Invokable; @Test(groups = "unit", testName = "AzureBlobClientTest") public class AzureBlobClientTest extends BaseRestAnnotationProcessingTest<AzureBlobClient> { + private static AzureBlobClient getAzureBlobClient() { + return ContextBuilder + .newBuilder("azureblob") + .credentials("accessKey", "secretKey") + .buildApi(AzureBlobClient.class); + } + public void testListContainers() throws SecurityException, NoSuchMethodException, IOException { Invokable<?, ?> method = method(AzureBlobClient.class, "listContainers", ListOptions[].class); GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.of()); @@ -278,6 +289,30 @@ public class AzureBlobClientTest extends BaseRestAnnotationProcessingTest<AzureB assertFallbackClassEquals(method, null); } + public void testPutBlob() throws Exception { + Invokable<?, ?> method = method(AzureBlobClient.class, "putBlob", String.class, AzureBlob.class); + String payload = "payload"; + String cacheControl = "max-age=3600"; + AzureBlob object = getAzureBlobClient().newBlob(); + object.setPayload(payload); + object.getProperties().setName("blob"); + object.getProperties().getContentMetadata().setCacheControl(cacheControl); + object.getProperties().getContentMetadata().setContentLength(7L); + GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("container", object)); + + assertRequestLineEquals(request, "PUT https://identity.blob.core.windows.net/container/blob HTTP/1.1"); + assertNonPayloadHeadersEqual(request, + "Expect: 100-continue\n" + + "x-ms-blob-cache-control: " + cacheControl + "\n" + + "x-ms-blob-type: BlockBlob\n" + + "x-ms-version: 2013-08-15\n"); + assertPayloadEquals(request, payload, "application/unknown", false); + + assertResponseParserClassEquals(method, request, ParseETagHeader.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + } + public void testGetBlob() throws SecurityException, NoSuchMethodException, IOException { Invokable<?, ?> method = method(AzureBlobClient.class, "getBlob", String.class, String.class, GetOptions[].class); GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("container", "blob")); @@ -307,6 +342,27 @@ public class AzureBlobClientTest extends BaseRestAnnotationProcessingTest<AzureB assertFallbackClassEquals(method, null); } + public void testSetBlobProperties() throws Exception { + String cacheControl = "max-age=3600"; + ContentMetadata metadata = ContentMetadataBuilder.create() + .cacheControl(cacheControl) + .build(); + Invokable<?, ?> method = method(AzureBlobClient.class, "setBlobProperties", String.class, String.class, ContentMetadata.class); + GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("container", "blob", metadata)); + + assertRequestLineEquals(request, + "PUT https://identity.blob.core.windows.net/container/blob?comp=properties HTTP/1.1"); + assertNonPayloadHeadersEqual(request, + "x-ms-blob-cache-control: " + cacheControl + "\n" + + "x-ms-blob-content-type: application/unknown\n" + + "x-ms-version: 2013-08-15\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseETagHeader.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + } + public void testCopyBlob() throws Exception { Invokable<?, ?> method = method(AzureBlobClient.class, "copyBlob", URI.class, String.class, String.class, CopyBlobOptions.class); GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of(
