JCLOUDS-641 etag is content-md5 in swift.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/90b4367f Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/90b4367f Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/90b4367f Branch: refs/heads/master Commit: 90b4367f8c71bc05a3ab0a6f4ae2d4ac63dd5d93 Parents: bde513f Author: Adrian Cole <[email protected]> Authored: Tue Oct 7 20:11:29 2014 -0700 Committer: Adrian Cole <[email protected]> Committed: Tue Oct 7 22:05:58 2014 -0700 ---------------------------------------------------------------------- .../swift/v1/functions/ParseObjectFromResponse.java | 9 ++++++++- .../swift/v1/functions/ParseObjectListFromResponse.java | 9 +++++++-- .../openstack/swift/v1/features/ObjectApiMockTest.java | 11 +++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/90b4367f/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectFromResponse.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectFromResponse.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectFromResponse.java index 714a403..cc934e4 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectFromResponse.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectFromResponse.java @@ -16,6 +16,7 @@ */ package org.jclouds.openstack.swift.v1.functions; +import static com.google.common.io.BaseEncoding.base16; import static com.google.common.net.HttpHeaders.ETAG; import static com.google.common.net.HttpHeaders.LAST_MODIFIED; import static org.jclouds.openstack.swift.v1.reference.SwiftHeaders.OBJECT_DELETE_AT; @@ -35,6 +36,7 @@ import org.jclouds.rest.InvocationContext; import org.jclouds.rest.internal.GeneratedHttpRequest; import com.google.common.base.Function; +import com.google.common.hash.HashCode; public class ParseObjectFromResponse implements Function<HttpResponse, SwiftObject>, InvocationContext<ParseObjectFromResponse> { @@ -61,10 +63,15 @@ public class ParseObjectFromResponse implements Function<HttpResponse, SwiftObje payload.setContentMetadata(contentMeta); } + String etag = from.getFirstHeaderOrNull(ETAG); + if (etag != null) { + payload.getContentMetadata().setContentMD5(HashCode.fromBytes(base16().lowerCase().decode(etag))); + } + return SwiftObject.builder() .uri(URI.create(uri)) .name(name) - .etag(from.getFirstHeaderOrNull(ETAG)) + .etag(etag) .payload(payload) .lastModified(dates.rfc822DateParse(from.getFirstHeaderOrNull(LAST_MODIFIED))) .headers(from.getHeaders()) http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/90b4367f/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectListFromResponse.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectListFromResponse.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectListFromResponse.java index 73f5a29..ff12e0f 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectListFromResponse.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/ParseObjectListFromResponse.java @@ -16,6 +16,7 @@ */ package org.jclouds.openstack.swift.v1.functions; +import static com.google.common.io.BaseEncoding.base16; import static org.jclouds.http.Uris.uriBuilder; import java.util.Date; @@ -36,6 +37,7 @@ import org.jclouds.rest.internal.GeneratedHttpRequest; import com.google.common.base.Function; import com.google.common.collect.Lists; +import com.google.common.hash.HashCode; import com.google.common.io.ByteSource; public class ParseObjectListFromResponse implements Function<HttpResponse, ObjectList>, @@ -81,7 +83,7 @@ public class ParseObjectListFromResponse implements Function<HttpResponse, Objec .uri(uriBuilder(containerUri).clearQuery().appendPath(input.name).build()) .name(input.name) .etag(input.hash) - .payload(payload(input.bytes, input.content_type, input.expires)) + .payload(payload(input.bytes, input.hash, input.content_type, input.expires)) .lastModified(input.last_modified).build(); } } @@ -98,11 +100,14 @@ public class ParseObjectListFromResponse implements Function<HttpResponse, Objec return this; } - private static Payload payload(long bytes, String contentType, Date expires) { + private static Payload payload(long bytes, String hash, String contentType, Date expires) { Payload payload = Payloads.newByteSourcePayload(ByteSource.empty()); payload.getContentMetadata().setContentLength(bytes); payload.getContentMetadata().setContentType(contentType); payload.getContentMetadata().setExpires(expires); + if (hash != null) { + payload.getContentMetadata().setContentMD5(HashCode.fromBytes(base16().lowerCase().decode(hash))); + } return payload; } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/90b4367f/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java index ed73cd4..8c0e4d1 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java @@ -17,6 +17,7 @@ package org.jclouds.openstack.swift.v1.features; import static com.google.common.base.Charsets.US_ASCII; +import static com.google.common.io.BaseEncoding.base16; import static com.google.common.net.HttpHeaders.EXPIRES; import static org.jclouds.Constants.PROPERTY_MAX_RETRIES; import static org.jclouds.Constants.PROPERTY_RETRY_DELAY_START; @@ -108,6 +109,11 @@ public class ObjectApiMockTest extends BaseOpenStackMockTest<SwiftApi> { assertEquals(objects.getContainer().getName(), "myContainer"); assertTrue(objects.getContainer().getAnybodyRead().get()); + // Check MD5 is parsed from the ETag header. + SwiftObject object1 = objects.get(1); + assertEquals(base16().lowerCase().decode(object1.getETag()), + object1.getPayload().getContentMetadata().getContentMD5AsHashCode().asBytes()); + assertEquals(server.getRequestCount(), 2); assertAuthentication(server); assertRequest(server.takeRequest(), "GET", "/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer"); @@ -259,6 +265,11 @@ public class ObjectApiMockTest extends BaseOpenStackMockTest<SwiftApi> { SwiftObject object = api.getObjectApi("DFW", "myContainer").getWithoutBody("myObject"); assertEquals(object.getName(), "myObject"); assertEquals(object.getETag(), "8a964ee2a5e88be344f36c22562a6486"); + + // Check MD5 is parsed from the ETag header. + assertEquals(base16().lowerCase().decode(object.getETag()), + object.getPayload().getContentMetadata().getContentMD5AsHashCode().asBytes()); + assertEquals(object.getLastModified(), dates.rfc822DateParse("Fri, 12 Jun 2010 13:40:18 GMT")); for (Entry<String, String> entry : object.getMetadata().entrySet()) { assertEquals(object.getMetadata().get(entry.getKey().toLowerCase()), entry.getValue());
