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(

Reply via email to