You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2016/01/17 02:15:16 UTC
[1/7] jclouds git commit: JCLOUDS-948: Azure Cache-Control support
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 <ga...@apache.org>
Authored: Thu Jan 14 16:18:18 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
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(
[6/7] jclouds git commit: JCLOUDS-948: Swift Cache-Control support
Posted by ga...@apache.org.
JCLOUDS-948: Swift Cache-Control support
Not supported.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/b63f74a6
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/b63f74a6
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/b63f74a6
Branch: refs/heads/master
Commit: b63f74a6ebb025b5cdeca7b35dff08e03af2378b
Parents: f292408
Author: Andrew Gaul <ga...@apache.org>
Authored: Fri Jan 15 03:54:05 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 13:22:15 2016 -0800
----------------------------------------------------------------------
.../blobstore/integration/SwiftBlobIntegrationLiveTest.java | 9 +++++++++
1 file changed, 9 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/b63f74a6/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/blobstore/integration/SwiftBlobIntegrationLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/blobstore/integration/SwiftBlobIntegrationLiveTest.java b/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/blobstore/integration/SwiftBlobIntegrationLiveTest.java
index 6f62958..6440788 100644
--- a/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/blobstore/integration/SwiftBlobIntegrationLiveTest.java
+++ b/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/blobstore/integration/SwiftBlobIntegrationLiveTest.java
@@ -16,6 +16,7 @@
*/
package org.jclouds.openstack.swift.v1.blobstore.integration;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
import java.util.Properties;
@@ -68,6 +69,14 @@ public class SwiftBlobIntegrationLiveTest extends BaseBlobIntegrationTest {
return 422;
}
+ // not supported
+ @Override
+ protected void checkCacheControl(Blob blob, String cacheControl) {
+ assertThat(blob.getPayload().getContentMetadata().getCacheControl()).isNull();
+ assertThat(blob.getMetadata().getContentMetadata().getCacheControl()).isNull();
+ }
+
+ // not supported
@Override
protected void checkContentLanguage(Blob blob, String contentLanguage) {
assert blob.getPayload().getContentMetadata().getContentLanguage() == null;
[2/7] jclouds git commit: JCLOUDS-948: Atmos Cache-Control support
Posted by ga...@apache.org.
JCLOUDS-948: Atmos Cache-Control support
Not supported.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/77d3db00
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/77d3db00
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/77d3db00
Branch: refs/heads/master
Commit: 77d3db0058a0c16b8deb8b24bb9c6b111de1bea4
Parents: 5fd7b1a
Author: Andrew Gaul <ga...@apache.org>
Authored: Fri Jan 15 04:12:32 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 04:41:01 2016 -0800
----------------------------------------------------------------------
.../internal/DelegatingMutableContentMetadata.java | 11 ++++++++++-
.../blobstore/integration/AtmosIntegrationLiveTest.java | 8 ++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/77d3db00/apis/atmos/src/main/java/org/jclouds/atmos/domain/internal/DelegatingMutableContentMetadata.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/domain/internal/DelegatingMutableContentMetadata.java b/apis/atmos/src/main/java/org/jclouds/atmos/domain/internal/DelegatingMutableContentMetadata.java
index 8e09ecb..eea8987 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/domain/internal/DelegatingMutableContentMetadata.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/domain/internal/DelegatingMutableContentMetadata.java
@@ -132,9 +132,13 @@ public class DelegatingMutableContentMetadata implements MutableContentMetadata
}
@Override
+ public void setCacheControl(String cacheControl) {
+ delegate.setCacheControl(cacheControl);
+ }
+
+ @Override
public void setContentDisposition(String contentDisposition) {
delegate.setContentDisposition(contentDisposition);
-
}
@Override
@@ -148,6 +152,11 @@ public class DelegatingMutableContentMetadata implements MutableContentMetadata
}
@Override
+ public String getCacheControl() {
+ return delegate.getCacheControl();
+ }
+
+ @Override
public String getContentDisposition() {
return delegate.getContentDisposition();
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/77d3db00/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosIntegrationLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosIntegrationLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosIntegrationLiveTest.java
index ee2590d..f534787 100644
--- a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosIntegrationLiveTest.java
+++ b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosIntegrationLiveTest.java
@@ -16,6 +16,7 @@
*/
package org.jclouds.atmos.blobstore.integration;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
@@ -78,6 +79,13 @@ public class AtmosIntegrationLiveTest extends BaseBlobIntegrationTest {
// not supported
@Override
+ protected void checkCacheControl(Blob blob, String cacheControl) {
+ assertThat(blob.getPayload().getContentMetadata().getCacheControl()).isNull();
+ assertThat(blob.getMetadata().getContentMetadata().getCacheControl()).isNull();
+ }
+
+ // not supported
+ @Override
protected void checkContentDisposition(Blob blob, String contentDisposition) {
assert blob.getPayload().getContentMetadata().getContentDisposition() == null;
assert blob.getMetadata().getContentMetadata().getContentDisposition() == null;
[4/7] jclouds git commit: JCLOUDS-948: Filesystem Cache-Control
support
Posted by ga...@apache.org.
JCLOUDS-948: Filesystem Cache-Control support
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/82ad05e9
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/82ad05e9
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/82ad05e9
Branch: refs/heads/master
Commit: 82ad05e98eaab5e69d8a788b5a9162fdabfc78c9
Parents: 01e10bb
Author: Andrew Gaul <ga...@apache.org>
Authored: Fri Jan 15 04:42:31 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 04:43:39 2016 -0800
----------------------------------------------------------------------
.../strategy/internal/FilesystemStorageStrategyImpl.java | 5 +++++
1 file changed, 5 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/82ad05e9/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 893d944..91750d5 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -95,6 +95,7 @@ import com.google.common.primitives.Longs;
*/
public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
+ private static final String XATTR_CACHE_CONTROL = "user.cache-control";
private static final String XATTR_CONTENT_DISPOSITION = "user.content-disposition";
private static final String XATTR_CONTENT_ENCODING = "user.content-encoding";
private static final String XATTR_CONTENT_LANGUAGE = "user.content-language";
@@ -326,6 +327,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
byteSource = Files.asByteSource(file);
}
try {
+ String cacheControl = null;
String contentDisposition = null;
String contentEncoding = null;
String contentLanguage = null;
@@ -338,6 +340,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
if (view != null) {
Set<String> attributes = ImmutableSet.copyOf(view.list());
+ cacheControl = readStringAttributeIfPresent(view, attributes, XATTR_CACHE_CONTROL);
contentDisposition = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_DISPOSITION);
contentEncoding = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_ENCODING);
contentLanguage = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_LANGUAGE);
@@ -370,6 +373,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
}
builder.payload(byteSource)
+ .cacheControl(cacheControl)
.contentDisposition(contentDisposition)
.contentEncoding(contentEncoding)
.contentLanguage(contentLanguage)
@@ -397,6 +401,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
private void writeCommonMetadataAttr(UserDefinedFileAttributeView view, Blob blob) throws IOException {
ContentMetadata metadata = blob.getMetadata().getContentMetadata();
+ writeStringAttributeIfPresent(view, XATTR_CACHE_CONTROL, metadata.getCacheControl());
writeStringAttributeIfPresent(view, XATTR_CONTENT_DISPOSITION, metadata.getContentDisposition());
writeStringAttributeIfPresent(view, XATTR_CONTENT_ENCODING, metadata.getContentEncoding());
writeStringAttributeIfPresent(view, XATTR_CONTENT_LANGUAGE, metadata.getContentLanguage());
[7/7] jclouds git commit: Fix replacing metadata in BaseBlobStore
Posted by ga...@apache.org.
Fix replacing metadata in BaseBlobStore
Fixes Atmos errors. Uncovered by removing unneeded addContentMetadata
call in BaseBlobIntegrationTest.testCopyBlobReplaceMetadata.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/68889081
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/68889081
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/68889081
Branch: refs/heads/master
Commit: 688890819e05013209af3b2b43cfc021f6f3887f
Parents: b63f74a
Author: Andrew Gaul <ga...@apache.org>
Authored: Fri Jan 15 04:13:04 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 13:22:15 2016 -0800
----------------------------------------------------------------------
.../blobstore/internal/BaseBlobStore.java | 21 +++++++++++++-------
.../internal/BaseBlobIntegrationTest.java | 1 -
2 files changed, 14 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/68889081/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
index 782d60b..3c14f5f 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
@@ -262,18 +262,25 @@ public abstract class BaseBlobStore implements BlobStore {
InputStream is = null;
try {
is = blob.getPayload().openStream();
- ContentMetadata metadata = blob.getMetadata().getContentMetadata();
BlobBuilder.PayloadBlobBuilder builder = blobBuilder(toName)
- .payload(is)
- .cacheControl(metadata.getCacheControl())
+ .payload(is);
+ Long contentLength = blob.getMetadata().getContentMetadata().getContentLength();
+ if (contentLength != null) {
+ builder.contentLength(contentLength);
+ }
+
+ ContentMetadata metadata;
+ if (options.getContentMetadata().isPresent()) {
+ metadata = options.getContentMetadata().get();
+ } else {
+ metadata = blob.getMetadata().getContentMetadata();
+ }
+ builder.cacheControl(metadata.getCacheControl())
.contentDisposition(metadata.getContentDisposition())
.contentEncoding(metadata.getContentEncoding())
.contentLanguage(metadata.getContentLanguage())
.contentType(metadata.getContentType());
- Long contentLength = metadata.getContentLength();
- if (contentLength != null) {
- builder.contentLength(contentLength);
- }
+
Optional<Map<String, String>> userMetadata = options.getUserMetadata();
if (userMetadata.isPresent()) {
builder.userMetadata(userMetadata.get());
http://git-wip-us.apache.org/repos/asf/jclouds/blob/68889081/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
index 1732e67..479c174 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
@@ -906,7 +906,6 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
.contentEncoding("compress")
.contentLanguage("fr")
.contentType("audio/ogg");
- addContentMetadata(blobBuilder);
Blob blob = blobBuilder.build();
String fromContainer = getContainerName();
[3/7] jclouds git commit: JCLOUDS-948: Portable Cache-Control support
Posted by ga...@apache.org.
JCLOUDS-948: Portable Cache-Control support
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/5fd7b1aa
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/5fd7b1aa
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/5fd7b1aa
Branch: refs/heads/master
Commit: 5fd7b1aa782399958e90ed9a16a3b20a0fc35d07
Parents: 8bddbb4
Author: Andrew Gaul <ga...@apache.org>
Authored: Thu Jan 14 15:52:46 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 04:41:01 2016 -0800
----------------------------------------------------------------------
.../blobstore/config/LocalBlobStore.java | 11 +++++++++-
.../jclouds/blobstore/domain/BlobBuilder.java | 2 ++
.../domain/internal/BlobBuilderImpl.java | 6 +++++
.../blobstore/internal/BaseBlobStore.java | 1 +
.../internal/BaseBlobIntegrationTest.java | 9 ++++++++
.../main/java/org/jclouds/http/HttpUtils.java | 8 +++++++
.../java/org/jclouds/io/ContentMetadata.java | 15 +++++++++++--
.../org/jclouds/io/ContentMetadataBuilder.java | 17 +++++++++++----
.../org/jclouds/io/ContentMetadataCodec.java | 7 +++++-
.../org/jclouds/io/MutableContentMetadata.java | 2 ++
.../payloads/BaseImmutableContentMetadata.java | 19 +++++++++++++++-
.../io/payloads/BaseMutableContentMetadata.java | 23 ++++++++++++++++----
.../java/org/jclouds/logging/internal/Wire.java | 1 +
13 files changed, 108 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
index 06b3367..9c06f21 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -544,6 +544,10 @@ public final class LocalBlobStore implements BlobStore {
if (options.getContentMetadata().isPresent()) {
ContentMetadata contentMetadata = options.getContentMetadata().get();
+ String cacheControl = contentMetadata.getCacheControl();
+ if (cacheControl != null) {
+ builder.cacheControl(cacheControl);
+ }
String contentDisposition = contentMetadata.getContentDisposition();
if (contentDisposition != null) {
builder.contentDisposition(contentDisposition);
@@ -561,7 +565,8 @@ public final class LocalBlobStore implements BlobStore {
builder.contentType(contentType);
}
} else {
- builder.contentDisposition(metadata.getContentDisposition())
+ builder.cacheControl(metadata.getCacheControl())
+ .contentDisposition(metadata.getContentDisposition())
.contentEncoding(metadata.getContentEncoding())
.contentLanguage(metadata.getContentLanguage())
.contentType(metadata.getContentType());
@@ -782,6 +787,10 @@ public final class LocalBlobStore implements BlobStore {
.userMetadata(mpu.blobMetadata().getUserMetadata())
.payload(new SequenceInputStream(Iterators.asEnumeration(streams.build().iterator())))
.contentLength(contentLength);
+ String cacheControl = mpu.blobMetadata().getContentMetadata().getCacheControl();
+ if (cacheControl != null) {
+ blobBuilder.cacheControl(cacheControl);
+ }
String contentDisposition = mpu.blobMetadata().getContentMetadata().getContentDisposition();
if (contentDisposition != null) {
blobBuilder.contentDisposition(contentDisposition);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java b/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
index e2d4c62..5d0bb0f 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
@@ -108,6 +108,8 @@ public interface BlobBuilder {
public interface PayloadBlobBuilder extends BlobBuilder {
+ PayloadBlobBuilder cacheControl(String cacheControl);
+
PayloadBlobBuilder contentLength(long contentLength);
/** @deprecated use {@link #contentMD5(HashCode)} instead. */
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/BlobBuilderImpl.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/BlobBuilderImpl.java b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/BlobBuilderImpl.java
index e6d94e1..e819001 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/BlobBuilderImpl.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/BlobBuilderImpl.java
@@ -180,6 +180,12 @@ public class BlobBuilderImpl implements BlobBuilder {
}
@Override
+ public PayloadBlobBuilder cacheControl(String cacheControl) {
+ payload.getContentMetadata().setCacheControl(cacheControl);
+ return this;
+ }
+
+ @Override
public PayloadBlobBuilder contentLength(long contentLength) {
checkArgument(contentLength >= 0, "content length must be non-negative, was: %s", contentLength);
payload.getContentMetadata().setContentLength(contentLength);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
index a608b18..782d60b 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
@@ -265,6 +265,7 @@ public abstract class BaseBlobStore implements BlobStore {
ContentMetadata metadata = blob.getMetadata().getContentMetadata();
BlobBuilder.PayloadBlobBuilder builder = blobBuilder(toName)
.payload(is)
+ .cacheControl(metadata.getCacheControl())
.contentDisposition(metadata.getContentDisposition())
.contentEncoding(metadata.getContentEncoding())
.contentLanguage(metadata.getContentLanguage())
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
index 0240602..1732e67 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
@@ -756,6 +756,7 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
}
protected void checkContentMetadata(Blob blob) {
+ checkCacheControl(blob, "max-age=3600");
checkContentType(blob, "text/csv");
checkContentDisposition(blob, "attachment; filename=photo.jpg");
checkContentEncoding(blob, "gzip");
@@ -763,12 +764,18 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
}
protected void addContentMetadata(PayloadBlobBuilder blobBuilder) {
+ blobBuilder.cacheControl("max-age=3600");
blobBuilder.contentType("text/csv");
blobBuilder.contentDisposition("attachment; filename=photo.jpg");
blobBuilder.contentEncoding("gzip");
blobBuilder.contentLanguage("en");
}
+ protected void checkCacheControl(Blob blob, String cacheControl) {
+ assertThat(blob.getPayload().getContentMetadata().getCacheControl()).isEqualTo(cacheControl);
+ assertThat(blob.getMetadata().getContentMetadata().getCacheControl()).isEqualTo(cacheControl);
+ }
+
protected void checkContentType(Blob blob, String contentType) {
assert blob.getPayload().getContentMetadata().getContentType().startsWith(contentType) : blob.getPayload()
.getContentMetadata().getContentType();
@@ -893,6 +900,7 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
.blobBuilder(fromName)
.userMetadata(ImmutableMap.of("key1", "value1", "key2", "value2"))
.payload(payload)
+ .cacheControl("max-age=1800")
.contentLength(payload.size())
.contentDisposition("attachment; filename=original.jpg")
.contentEncoding("compress")
@@ -908,6 +916,7 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
Map<String, String> userMetadata = ImmutableMap.of("key3", "value3", "key4", "value4");
blobStore.copyBlob(fromContainer, fromName, toContainer, toName, CopyOptions.builder()
.contentMetadata(ContentMetadataBuilder.create()
+ .cacheControl("max-age=3600")
.contentType("text/csv")
.contentDisposition("attachment; filename=photo.jpg")
.contentEncoding("gzip")
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/http/HttpUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/http/HttpUtils.java b/core/src/main/java/org/jclouds/http/HttpUtils.java
index 5c026de..5b636a9 100644
--- a/core/src/main/java/org/jclouds/http/HttpUtils.java
+++ b/core/src/main/java/org/jclouds/http/HttpUtils.java
@@ -30,6 +30,7 @@ import static com.google.common.collect.Iterables.size;
import static com.google.common.collect.Multimaps.filterKeys;
import static com.google.common.io.BaseEncoding.base64;
import static com.google.common.io.ByteStreams.toByteArray;
+import static com.google.common.net.HttpHeaders.CACHE_CONTROL;
import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION;
import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
import static com.google.common.net.HttpHeaders.CONTENT_LANGUAGE;
@@ -168,6 +169,7 @@ public class HttpUtils {
}
public static void copy(ContentMetadata fromMd, MutableContentMetadata toMd) {
+ toMd.setCacheControl(fromMd.getCacheControl());
toMd.setContentLength(fromMd.getContentLength());
toMd.setContentMD5(fromMd.getContentMD5());
toMd.setContentType(fromMd.getContentType());
@@ -190,6 +192,8 @@ public class HttpUtils {
logger.debug("%s %s: %s", prefix, header.getKey(), header.getValue());
}
if (message.getPayload() != null) {
+ if (message.getPayload().getContentMetadata().getCacheControl() != null)
+ logger.debug("%s %s: %s", prefix, CACHE_CONTROL, message.getPayload().getContentMetadata().getCacheControl());
if (message.getPayload().getContentMetadata().getContentType() != null)
logger.debug("%s %s: %s", prefix, CONTENT_TYPE, message.getPayload().getContentMetadata().getContentType());
if (message.getPayload().getContentMetadata().getContentLength() != null)
@@ -221,6 +225,10 @@ public class HttpUtils {
public void checkRequestHasRequiredProperties(HttpRequest message) {
checkArgument(
+ message.getPayload() == null || message.getFirstHeaderOrNull(CACHE_CONTROL) == null,
+ "configuration error please use request.getPayload().getContentMetadata().setCacheControl(value) as opposed to adding a cache control header: %s",
+ message);
+ checkArgument(
message.getPayload() == null || message.getFirstHeaderOrNull(CONTENT_TYPE) == null,
"configuration error please use request.getPayload().getContentMetadata().setContentType(value) as opposed to adding a content type header: %s",
message);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/ContentMetadata.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/ContentMetadata.java b/core/src/main/java/org/jclouds/io/ContentMetadata.java
index 316567e..382d6b5 100644
--- a/core/src/main/java/org/jclouds/io/ContentMetadata.java
+++ b/core/src/main/java/org/jclouds/io/ContentMetadata.java
@@ -15,6 +15,7 @@
* limitations under the License.
*/
package org.jclouds.io;
+import static com.google.common.net.HttpHeaders.CACHE_CONTROL;
import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION;
import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
import static com.google.common.net.HttpHeaders.CONTENT_LANGUAGE;
@@ -32,13 +33,23 @@ import com.google.common.hash.HashCode;
import com.google.common.collect.ImmutableSet;
public interface ContentMetadata {
- Set<String> HTTP_HEADERS = ImmutableSet.of(CONTENT_LENGTH, CONTENT_MD5, CONTENT_TYPE,
- CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE, EXPIRES);
+ Set<String> HTTP_HEADERS = ImmutableSet.of(
+ CACHE_CONTROL,
+ CONTENT_LENGTH,
+ CONTENT_MD5,
+ CONTENT_TYPE,
+ CONTENT_DISPOSITION,
+ CONTENT_ENCODING,
+ CONTENT_LANGUAGE,
+ EXPIRES);
// See http://stackoverflow.com/questions/10584647/simpledateformat-parse-is-one-hour-out-using-rfc-1123-gmt-in-summer
// for why not using "zzz"
String RFC1123_DATE_PATTERN = "EEE, dd MMM yyyyy HH:mm:ss Z";
+ @Nullable
+ String getCacheControl();
+
/**
* Returns the total size of the payload, or the chunk that's available.
* <p/>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/ContentMetadataBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/ContentMetadataBuilder.java b/core/src/main/java/org/jclouds/io/ContentMetadataBuilder.java
index 48d3eff..c63e052 100644
--- a/core/src/main/java/org/jclouds/io/ContentMetadataBuilder.java
+++ b/core/src/main/java/org/jclouds/io/ContentMetadataBuilder.java
@@ -31,6 +31,7 @@ public class ContentMetadataBuilder {
return new ContentMetadataBuilder();
}
+ protected String cacheControl;
protected String contentType = "application/unknown";
protected Long contentLength;
protected HashCode contentMD5;
@@ -39,6 +40,11 @@ public class ContentMetadataBuilder {
protected String contentEncoding;
protected Date expires;
+ public ContentMetadataBuilder cacheControl(@Nullable String cacheControl) {
+ this.cacheControl = cacheControl;
+ return this;
+ }
+
public ContentMetadataBuilder contentLength(@Nullable Long contentLength) {
this.contentLength = contentLength;
return this;
@@ -85,13 +91,14 @@ public class ContentMetadataBuilder {
}
public ContentMetadata build() {
- return new BaseImmutableContentMetadata(contentType, contentLength,
+ return new BaseImmutableContentMetadata(cacheControl, contentType, contentLength,
contentMD5 == null ? null : contentMD5.asBytes(), contentDisposition,
contentLanguage, contentEncoding, expires);
}
public static ContentMetadataBuilder fromContentMetadata(ContentMetadata in) {
- return new ContentMetadataBuilder().contentType(in.getContentType()).contentLength(in.getContentLength())
+ return new ContentMetadataBuilder()
+ .cacheControl(in.getCacheControl()).contentType(in.getContentType()).contentLength(in.getContentLength())
.contentMD5(in.getContentMD5()).contentDisposition(in.getContentDisposition()).contentLanguage(
in.getContentLanguage()).contentEncoding(in.getContentEncoding()).expires(in.getExpires());
}
@@ -111,7 +118,8 @@ public class ContentMetadataBuilder {
if (getClass() != obj.getClass())
return false;
ContentMetadataBuilder other = (ContentMetadataBuilder) obj;
- return Objects.equal(contentDisposition, other.contentDisposition) &&
+ return Objects.equal(cacheControl, other.cacheControl) &&
+ Objects.equal(contentDisposition, other.contentDisposition) &&
Objects.equal(contentEncoding, other.contentEncoding) &&
Objects.equal(contentLanguage, other.contentLanguage) &&
Objects.equal(contentLength, other.contentLength) &&
@@ -122,7 +130,8 @@ public class ContentMetadataBuilder {
@Override
public String toString() {
- return "[contentDisposition=" + contentDisposition + ", contentEncoding=" + contentEncoding
+ return "[cacheControl=" + cacheControl
+ + ", contentDisposition=" + contentDisposition + ", contentEncoding=" + contentEncoding
+ ", contentLanguage=" + contentLanguage + ", contentLength=" + contentLength + ", contentMD5="
+ contentMD5 + ", contentType=" + contentType + ", expires=" + expires + "]";
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java b/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
index 5bc607d..05de972 100644
--- a/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
+++ b/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
@@ -18,6 +18,7 @@ package org.jclouds.io;
import static com.google.common.collect.Iterables.any;
import static com.google.common.io.BaseEncoding.base64;
+import static com.google.common.net.HttpHeaders.CACHE_CONTROL;
import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION;
import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
import static com.google.common.net.HttpHeaders.CONTENT_LANGUAGE;
@@ -85,6 +86,8 @@ public interface ContentMetadataCodec {
@Override
public Multimap<String, String> toHeaders(ContentMetadata md) {
Builder<String, String> builder = ImmutableMultimap.builder();
+ if (md.getCacheControl() != null)
+ builder.put(CACHE_CONTROL, md.getCacheControl());
if (md.getContentType() != null)
builder.put(CONTENT_TYPE, md.getContentType());
if (md.getContentDisposition() != null)
@@ -111,7 +114,9 @@ public interface ContentMetadataCodec {
}
});
for (Entry<String, String> header : headers.entries()) {
- if (!chunked && CONTENT_LENGTH.equalsIgnoreCase(header.getKey())) {
+ if (CACHE_CONTROL.equalsIgnoreCase(header.getKey())) {
+ contentMetadata.setCacheControl(header.getValue());
+ } else if (!chunked && CONTENT_LENGTH.equalsIgnoreCase(header.getKey())) {
contentMetadata.setContentLength(Long.valueOf(header.getValue()));
} else if (CONTENT_MD5.equalsIgnoreCase(header.getKey())) {
contentMetadata.setContentMD5(base64().decode(header.getValue()));
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/MutableContentMetadata.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/MutableContentMetadata.java b/core/src/main/java/org/jclouds/io/MutableContentMetadata.java
index 6efa771..6fb0a74 100644
--- a/core/src/main/java/org/jclouds/io/MutableContentMetadata.java
+++ b/core/src/main/java/org/jclouds/io/MutableContentMetadata.java
@@ -24,6 +24,8 @@ import com.google.common.hash.HashCode;
public interface MutableContentMetadata extends ContentMetadata {
+ void setCacheControl(@Nullable String cacheControl);
+
void setContentLength(@Nullable Long contentLength);
/** @deprecated use {@link #setContentMD5(HashCode)} instead. */
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/payloads/BaseImmutableContentMetadata.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/payloads/BaseImmutableContentMetadata.java b/core/src/main/java/org/jclouds/io/payloads/BaseImmutableContentMetadata.java
index 9624717..8578687 100644
--- a/core/src/main/java/org/jclouds/io/payloads/BaseImmutableContentMetadata.java
+++ b/core/src/main/java/org/jclouds/io/payloads/BaseImmutableContentMetadata.java
@@ -26,6 +26,7 @@ import com.google.common.hash.HashCode;
public class BaseImmutableContentMetadata implements ContentMetadata {
+ protected String cacheControl;
protected String contentType;
protected Long contentLength;
protected HashCode contentMD5;
@@ -34,8 +35,15 @@ public class BaseImmutableContentMetadata implements ContentMetadata {
protected String contentEncoding;
protected Date expires;
+ @Deprecated
public BaseImmutableContentMetadata(String contentType, Long contentLength, byte[] contentMD5,
String contentDisposition, String contentLanguage, String contentEncoding, Date expires) {
+ this(null, contentType, contentLength, contentMD5, contentDisposition, contentLanguage, contentEncoding, expires);
+ }
+
+ public BaseImmutableContentMetadata(String cacheControl, String contentType, Long contentLength, byte[] contentMD5,
+ String contentDisposition, String contentLanguage, String contentEncoding, Date expires) {
+ this.cacheControl = cacheControl;
this.contentType = contentType;
this.contentLength = contentLength;
this.contentMD5 = contentMD5 == null ? null : HashCode.fromBytes(contentMD5);
@@ -45,6 +53,11 @@ public class BaseImmutableContentMetadata implements ContentMetadata {
this.expires = expires;
}
+ @Override
+ public String getCacheControl() {
+ return cacheControl;
+ }
+
/**
* {@inheritDoc}
*/
@@ -108,7 +121,8 @@ public class BaseImmutableContentMetadata implements ContentMetadata {
@Override
public String toString() {
- return "[contentType=" + contentType + ", contentLength=" + contentLength + ", contentDisposition="
+ return "[cacheControl=" + cacheControl
+ + "contentType=" + contentType + ", contentLength=" + contentLength + ", contentDisposition="
+ contentDisposition + ", contentEncoding=" + contentEncoding + ", contentLanguage=" + contentLanguage
+ ", contentMD5=" + contentMD5 + ", expires = " + expires + "]";
}
@@ -128,6 +142,9 @@ public class BaseImmutableContentMetadata implements ContentMetadata {
if (getClass() != obj.getClass())
return false;
BaseImmutableContentMetadata other = (BaseImmutableContentMetadata) obj;
+ if (!Objects.equal(cacheControl, other.cacheControl)) {
+ return false;
+ }
if (contentDisposition == null) {
if (other.contentDisposition != null)
return false;
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/io/payloads/BaseMutableContentMetadata.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/payloads/BaseMutableContentMetadata.java b/core/src/main/java/org/jclouds/io/payloads/BaseMutableContentMetadata.java
index 33e1793..5fd2880 100644
--- a/core/src/main/java/org/jclouds/io/payloads/BaseMutableContentMetadata.java
+++ b/core/src/main/java/org/jclouds/io/payloads/BaseMutableContentMetadata.java
@@ -27,6 +27,16 @@ import com.google.common.hash.HashCode;
public class BaseMutableContentMetadata extends ContentMetadataBuilder implements MutableContentMetadata {
+ @Override
+ public String getCacheControl() {
+ return cacheControl;
+ }
+
+ @Override
+ public void setCacheControl(@Nullable String cacheControl) {
+ cacheControl(cacheControl);
+ }
+
/**
* {@inheritDoc}
*/
@@ -154,9 +164,14 @@ public class BaseMutableContentMetadata extends ContentMetadataBuilder implement
}
public static BaseMutableContentMetadata fromContentMetadata(ContentMetadata in) {
- return (BaseMutableContentMetadata) new BaseMutableContentMetadata().contentType(in.getContentType())
- .contentLength(in.getContentLength()).contentMD5(in.getContentMD5()).contentDisposition(
- in.getContentDisposition()).contentLanguage(in.getContentLanguage()).contentEncoding(
- in.getContentEncoding()).expires(in.getExpires());
+ return (BaseMutableContentMetadata) new BaseMutableContentMetadata()
+ .cacheControl(in.getCacheControl())
+ .contentDisposition(in.getContentDisposition())
+ .contentEncoding(in.getContentEncoding())
+ .contentLanguage(in.getContentLanguage())
+ .contentLength(in.getContentLength())
+ .contentMD5(in.getContentMD5())
+ .contentType(in.getContentType())
+ .expires(in.getExpires());
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5fd7b1aa/core/src/main/java/org/jclouds/logging/internal/Wire.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/logging/internal/Wire.java b/core/src/main/java/org/jclouds/logging/internal/Wire.java
index 8c20c2d..b58a680 100644
--- a/core/src/main/java/org/jclouds/logging/internal/Wire.java
+++ b/core/src/main/java/org/jclouds/logging/internal/Wire.java
@@ -159,6 +159,7 @@ public abstract class Wire {
MutableContentMetadata wiredMd = wiredPayload.getContentMetadata();
if (oldMd.getContentLength() != null)
wiredMd.setContentLength(oldMd.getContentLength());
+ wiredMd.setCacheControl(oldMd.getCacheControl());
wiredMd.setContentType(oldMd.getContentType());
wiredMd.setContentMD5(oldMd.getContentMD5());
wiredMd.setContentDisposition(oldMd.getContentDisposition());
[5/7] jclouds git commit: JCLOUDS-948: S3 Cache-Control support
Posted by ga...@apache.org.
JCLOUDS-948: S3 Cache-Control support
Deprecate older S3-specific Cache-Control mechanism.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/f292408a
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/f292408a
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/f292408a
Branch: refs/heads/master
Commit: f292408af4f9700fdde3f35c45a97cfb64793319
Parents: 82ad05e
Author: Andrew Gaul <ga...@apache.org>
Authored: Fri Jan 15 04:18:52 2016 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 15 13:22:14 2016 -0800
----------------------------------------------------------------------
.../s3/binders/BindObjectMetadataToRequest.java | 4 ++--
.../s3/binders/BindS3ObjectMetadataToRequest.java | 6 ------
.../java/org/jclouds/s3/blobstore/S3BlobStore.java | 5 +++++
.../org/jclouds/s3/domain/MutableObjectMetadata.java | 3 +++
.../java/org/jclouds/s3/domain/ObjectMetadata.java | 3 +++
.../org/jclouds/s3/domain/ObjectMetadataBuilder.java | 4 +---
.../domain/internal/MutableObjectMetadataImpl.java | 10 ++++++----
.../org/jclouds/s3/options/CopyObjectOptions.java | 15 +++++++++++++++
.../binders/BindS3ObjectMetadataToRequestTest.java | 3 +--
9 files changed, 36 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/binders/BindObjectMetadataToRequest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/binders/BindObjectMetadataToRequest.java b/apis/s3/src/main/java/org/jclouds/s3/binders/BindObjectMetadataToRequest.java
index 1f96b7a..84948e1 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/binders/BindObjectMetadataToRequest.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/binders/BindObjectMetadataToRequest.java
@@ -54,8 +54,8 @@ public class BindObjectMetadataToRequest implements Binder {
request = metadataPrefixer.bindToRequest(request, md.getUserMetadata());
Builder<String, String> headers = ImmutableMultimap.builder();
- if (md.getCacheControl() != null) {
- headers.put(HttpHeaders.CACHE_CONTROL, md.getCacheControl());
+ if (md.getContentMetadata().getCacheControl() != null) {
+ headers.put(HttpHeaders.CACHE_CONTROL, md.getContentMetadata().getCacheControl());
}
if (md.getContentMetadata().getContentDisposition() != null) {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequest.java b/apis/s3/src/main/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequest.java
index f35ff5c..d35a3e6 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequest.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequest.java
@@ -27,8 +27,6 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.rest.Binder;
import org.jclouds.s3.domain.S3Object;
-import com.google.common.net.HttpHeaders;
-
@Singleton
public class BindS3ObjectMetadataToRequest implements Binder {
protected final BindMapToHeadersWithPrefix metadataPrefixer;
@@ -53,10 +51,6 @@ public class BindS3ObjectMetadataToRequest implements Binder {
request = metadataPrefixer.bindToRequest(request, s3Object.getMetadata().getUserMetadata());
- if (s3Object.getMetadata().getCacheControl() != null) {
- request = (R) request.toBuilder()
- .replaceHeader(HttpHeaders.CACHE_CONTROL, s3Object.getMetadata().getCacheControl()).build();
- }
return request;
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/blobstore/S3BlobStore.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/blobstore/S3BlobStore.java b/apis/s3/src/main/java/org/jclouds/s3/blobstore/S3BlobStore.java
index 4cb5ea2..fbb481c 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/blobstore/S3BlobStore.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/blobstore/S3BlobStore.java
@@ -278,6 +278,11 @@ public class S3BlobStore extends BaseBlobStore {
Optional<ContentMetadata> contentMetadata = options.getContentMetadata();
if (contentMetadata.isPresent()) {
+ String cacheControl = contentMetadata.get().getCacheControl();
+ if (cacheControl != null) {
+ s3Options.cacheControl(cacheControl);
+ }
+
String contentDisposition = contentMetadata.get().getContentDisposition();
if (contentDisposition != null) {
s3Options.contentDisposition(contentDisposition);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/domain/MutableObjectMetadata.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/domain/MutableObjectMetadata.java b/apis/s3/src/main/java/org/jclouds/s3/domain/MutableObjectMetadata.java
index 5af1025..8ec9a71 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/domain/MutableObjectMetadata.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/domain/MutableObjectMetadata.java
@@ -59,7 +59,10 @@ public interface MutableObjectMetadata extends ObjectMetadata {
* Can be used to specify caching behavior along the request/reply chain.
*
* @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html?sec14.9.
+ *
+ * @deprecated call getContentMetadata().setCacheControl(String) instead
*/
+ @Deprecated
void setCacheControl(String cacheControl);
@Override
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadata.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadata.java b/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadata.java
index 10e56f5..d7dd394 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadata.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadata.java
@@ -63,7 +63,10 @@ public interface ObjectMetadata extends Comparable<ObjectMetadata> {
* Can be used to specify caching behavior along the request/reply chain.
*
* @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html?sec14.9.
+ *
+ * @deprecated call getContentMetadata().getCacheControl() instead
*/
+ @Deprecated
String getCacheControl();
Date getLastModified();
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadataBuilder.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadataBuilder.java b/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadataBuilder.java
index ba6c938..e142ca7 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadataBuilder.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/domain/ObjectMetadataBuilder.java
@@ -42,7 +42,6 @@ public class ObjectMetadataBuilder {
private String bucket;
private URI uri;
private StorageClass storageClass = StorageClass.STANDARD;
- private String cacheControl;
private Date lastModified;
private String eTag;
private CanonicalUser owner;
@@ -84,7 +83,7 @@ public class ObjectMetadataBuilder {
}
public ObjectMetadataBuilder cacheControl(String cacheControl) {
- this.cacheControl = cacheControl;
+ contentMetadataBuilder.cacheControl(cacheControl);
return this;
}
@@ -130,7 +129,6 @@ public class ObjectMetadataBuilder {
public ObjectMetadata build() {
MutableObjectMetadataImpl toReturn = new MutableObjectMetadataImpl();
toReturn.setContentMetadata(BaseMutableContentMetadata.fromContentMetadata(contentMetadataBuilder.build()));
- toReturn.setCacheControl(cacheControl);
toReturn.setKey(key);
toReturn.setBucket(bucket);
toReturn.setUri(uri);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/domain/internal/MutableObjectMetadataImpl.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/domain/internal/MutableObjectMetadataImpl.java b/apis/s3/src/main/java/org/jclouds/s3/domain/internal/MutableObjectMetadataImpl.java
index e2692cb..6fc329f 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/domain/internal/MutableObjectMetadataImpl.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/domain/internal/MutableObjectMetadataImpl.java
@@ -108,11 +108,12 @@ public class MutableObjectMetadataImpl implements MutableObjectMetadata {
}
/**
- *{@inheritDoc}
+ * @deprecated call getContentMetadata().getCacheControl() instead
*/
+ @Deprecated
@Override
public String getCacheControl() {
- return cacheControl;
+ return contentMetadata.getCacheControl();
}
/**
@@ -148,11 +149,12 @@ public class MutableObjectMetadataImpl implements MutableObjectMetadata {
}
/**
- *{@inheritDoc}
+ * @deprecated call getContentMetadata().setCacheControl(String) instead
*/
+ @Deprecated
@Override
public void setCacheControl(String cacheControl) {
- this.cacheControl = cacheControl;
+ contentMetadata.setCacheControl(cacheControl);
}
/**
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java b/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java
index 2370bf5..374278d 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java
@@ -72,6 +72,7 @@ import com.google.common.net.HttpHeaders;
public class CopyObjectOptions extends BaseHttpRequestOptions {
private static final DateService dateService = new SimpleDateFormatDateService();
public static final CopyObjectOptions NONE = new CopyObjectOptions();
+ private String cacheControl;
private String contentDisposition;
private String contentEncoding;
private String contentLanguage;
@@ -255,6 +256,10 @@ public class CopyObjectOptions extends BaseHttpRequestOptions {
returnVal.put(entry.getKey().replace(DEFAULT_AMAZON_HEADERTAG, headerTag), entry.getValue());
}
boolean replace = false;
+ if (cacheControl != null) {
+ returnVal.put(HttpHeaders.CACHE_CONTROL, cacheControl);
+ replace = true;
+ }
if (contentDisposition != null) {
returnVal.put(HttpHeaders.CONTENT_DISPOSITION, contentDisposition);
replace = true;
@@ -284,6 +289,11 @@ public class CopyObjectOptions extends BaseHttpRequestOptions {
return returnVal.build();
}
+ public CopyObjectOptions cacheControl(String cacheControl) {
+ this.cacheControl = checkNotNull(cacheControl, "cacheControl");
+ return this;
+ }
+
public CopyObjectOptions contentDisposition(String contentDisposition) {
this.contentDisposition = checkNotNull(contentDisposition, "contentDisposition");
return this;
@@ -354,6 +364,11 @@ public class CopyObjectOptions extends BaseHttpRequestOptions {
return options.ifSourceETagDoesntMatch(eTag);
}
+ public static CopyObjectOptions cacheControl(String cacheControl) {
+ CopyObjectOptions options = new CopyObjectOptions();
+ return options.cacheControl(cacheControl);
+ }
+
public static CopyObjectOptions contentDisposition(String contentDisposition) {
CopyObjectOptions options = new CopyObjectOptions();
return options.contentDisposition(contentDisposition);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f292408a/apis/s3/src/test/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequestTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequestTest.java b/apis/s3/src/test/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequestTest.java
index b65c2b9..229f4a1 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequestTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/binders/BindS3ObjectMetadataToRequestTest.java
@@ -62,7 +62,6 @@ public class BindS3ObjectMetadataToRequestTest extends BaseS3ClientTest<S3Client
payload.getContentMetadata().setContentLength(5368709120l);
object.setPayload(payload);
object.getMetadata().setKey("foo");
- object.getMetadata().setCacheControl("no-cache");
object.getMetadata().setUserMetadata(ImmutableMap.of("foo", "bar"));
HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build();
@@ -70,7 +69,7 @@ public class BindS3ObjectMetadataToRequestTest extends BaseS3ClientTest<S3Client
assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint(
URI.create("http://localhost")).headers(
- ImmutableMultimap.of("Cache-Control", "no-cache", "x-amz-meta-foo", "bar")).build());
+ ImmutableMultimap.of("x-amz-meta-foo", "bar")).build());
}
@Test(expectedExceptions = IllegalArgumentException.class)