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 2014/05/28 21:54:32 UTC
git commit: Remove BlobBuilder and Payloads.calculateMD5
Repository: jclouds
Updated Branches:
refs/heads/master c6d4e6645 -> 186f05202
Remove BlobBuilder and Payloads.calculateMD5
Callers should instead explicitly set contentMD5, usually with the
results from Guava Hashing.md5(). This narrows the API and removes a
strange IOException from callers. Further it removes a dangerous
rebuffering of arbitrarily-large non-repeatable Payloads.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/186f0520
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/186f0520
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/186f0520
Branch: refs/heads/master
Commit: 186f052022cc1ce611fffb809497e22daaaa8d14
Parents: c6d4e66
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon May 26 20:37:56 2014 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Wed May 28 12:54:18 2014 -0700
----------------------------------------------------------------------
.../org/jclouds/atmos/AtmosClientLiveTest.java | 23 +++++++----
.../internal/FilesystemStorageStrategyImpl.java | 7 +++-
.../swift/CommonSwiftClientLiveTest.java | 4 +-
.../src/main/clojure/org/jclouds/blobstore2.clj | 12 ++----
.../blobstore/TransientStorageStrategy.java | 10 +++--
.../jclouds/blobstore/domain/BlobBuilder.java | 9 -----
.../domain/internal/BlobBuilderImpl.java | 10 -----
.../clojure/org/jclouds/blobstore2_test.clj | 21 +++++-----
.../TransientBlobRequestSignerTest.java | 11 +++++-
.../internal/BaseBlobIntegrationTest.java | 7 ++--
.../internal/BaseContainerIntegrationTest.java | 4 +-
core/src/main/java/org/jclouds/io/Payloads.java | 40 --------------------
.../jclouds/rest/internal/BaseRestApiTest.java | 8 +---
.../internal/RestAnnotationProcessorTest.java | 30 ++++++++++-----
.../azureblob/AzureBlobClientLiveTest.java | 4 +-
15 files changed, 84 insertions(+), 116 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
index ce9a07f..987a8d9 100644
--- a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
+++ b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
@@ -16,6 +16,7 @@
*/
package org.jclouds.atmos;
+import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.base.Preconditions.checkState;
import static org.jclouds.util.Predicates2.retry;
import static org.testng.Assert.assertEquals;
@@ -49,6 +50,8 @@ import com.google.common.base.Predicate;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
+import com.google.common.hash.HashCode;
+import com.google.common.hash.Hashing;
/**
* Tests behavior of {@code AtmosClient}
@@ -147,9 +150,11 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest {
@Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreateDirectory" })
public void testListOptions() throws Exception {
- createOrReplaceObject("object2", "here is my data!", "meta-value1");
- createOrReplaceObject("object3", "here is my data!", "meta-value1");
- createOrReplaceObject("object4", "here is my data!", "meta-value1");
+ String data = "here is my data!";
+ HashCode hashCode = Hashing.md5().hashString(data, UTF_8);
+ createOrReplaceObject("object2", data, hashCode, "meta-value1");
+ createOrReplaceObject("object3", data, hashCode, "meta-value1");
+ createOrReplaceObject("object4", data, hashCode, "meta-value1");
BoundedSet<? extends DirectoryEntry> r2 = getApi().listDirectory(privateDirectory, ListOptions.Builder.limit(1));
assertEquals(r2.size(), 1);
assert r2.getToken() != null;
@@ -164,13 +169,15 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest {
public void testFileOperations() throws Exception {
// create the object
System.err.printf("creating%n");
- createOrReplaceObject("object", "here is my data!", "meta-value1");
+ String data1 = "here is my data!";
+ createOrReplaceObject("object", data1, Hashing.md5().hashString(data1, UTF_8), "meta-value1");
assertEventuallyObjectMatches("object", "here is my data!", "meta-value1");
assertEventuallyHeadMatches("object", "meta-value1");
// try overwriting the object
System.err.printf("overwriting%n");
- createOrReplaceObject("object", "here is my data?", "meta-value?");
+ String data2 = "here is my data?";
+ createOrReplaceObject("object", data2, Hashing.md5().hashString(data2, UTF_8), "meta-value?");
assertEventuallyObjectMatches("object", "here is my data?", "meta-value?");
// loop to gather metrics
@@ -199,7 +206,7 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest {
}
private void createOrUpdateWithErrorLoop(boolean stream, String data, String metadataValue) throws Exception {
- createOrReplaceObject("object", makeData(data, stream), metadataValue);
+ createOrReplaceObject("object", makeData(data, stream), Hashing.md5().hashString(data, UTF_8), metadataValue);
assertEventuallyObjectMatches("object", data, metadataValue);
}
@@ -207,13 +214,13 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest {
return stream ? Strings2.toInputStream(in) : in;
}
- private void createOrReplaceObject(String name, Object data, String metadataValue) throws Exception {
+ private void createOrReplaceObject(String name, Object data, HashCode hashCode, String metadataValue) throws Exception {
// Test PUT with string data, ETag hash, and a piece of metadata
AtmosObject object = getApi().newObject();
object.getContentMetadata().setName(name);
object.setPayload(Payloads.newPayload(data));
object.getContentMetadata().setContentLength(16l);
- Payloads.calculateMD5(object);
+ object.getContentMetadata().setContentMD5(hashCode.asBytes());
object.getContentMetadata().setContentType("text/plain");
object.getUserMetadata().getMetadata().put("Metadata", metadataValue);
replaceObject(object);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/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 79bf48f..306b4c8 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
@@ -49,6 +49,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.common.hash.Hashing;
import com.google.common.hash.HashingInputStream;
+import com.google.common.io.ByteSource;
import com.google.common.io.Closeables;
import com.google.common.io.Files;
@@ -176,9 +177,11 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
public Blob getBlob(final String container, final String key) {
BlobBuilder builder = blobBuilders.get();
builder.name(key);
- File file = getFileForBlobKey(container, key);
+ ByteSource byteSource = Files.asByteSource(getFileForBlobKey(container, key));
try {
- builder.payload(file).calculateMD5();
+ builder.payload(byteSource)
+ .contentLength(byteSource.size())
+ .contentMD5(byteSource.hash(Hashing.md5()).asBytes());
} catch (IOException e) {
logger.error("An error occurred calculating MD5 for blob %s from container ", key, container);
Throwables.propagateIfPossible(e);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
index 7221877..e183e22 100644
--- a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
+++ b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
@@ -36,7 +36,6 @@ import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
import org.jclouds.http.HttpResponseException;
import org.jclouds.http.options.GetOptions;
-import org.jclouds.io.Payloads;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
import org.jclouds.openstack.swift.domain.AccountMetadata;
import org.jclouds.openstack.swift.domain.ContainerMetadata;
@@ -50,6 +49,7 @@ import org.testng.annotations.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
+import com.google.common.hash.Hashing;
/**
* Tests behavior of {@code JaxrsAnnotationProcessor}
@@ -365,7 +365,7 @@ public abstract class CommonSwiftClientLiveTest<C extends CommonSwiftClient> ext
SwiftObject object = getApi().newSwiftObject();
object.getInfo().setName(key);
object.setPayload(data);
- Payloads.calculateMD5(object);
+ object.getPayload().getContentMetadata().setContentMD5(Hashing.md5().hashString(data, Charsets.UTF_8).asBytes());
object.getInfo().setContentType("text/plain");
object.getInfo().getMetadata().put("Metadata", "metadata-value");
return object;
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/blobstore/src/main/clojure/org/jclouds/blobstore2.clj
----------------------------------------------------------------------
diff --git a/blobstore/src/main/clojure/org/jclouds/blobstore2.clj b/blobstore/src/main/clojure/org/jclouds/blobstore2.clj
index 99efd55..6eb57d5 100644
--- a/blobstore/src/main/clojure/org/jclouds/blobstore2.clj
+++ b/blobstore/src/main/clojure/org/jclouds/blobstore2.clj
@@ -291,10 +291,8 @@ Options can also be specified for extension modules
The payload argument can be anything accepted by the PayloadSource protocol."
([^String name &
- {:keys [payload content-type content-length content-md5 calculate-md5
+ {:keys [payload content-type content-length content-md5
content-disposition content-encoding content-language metadata]}]
- {:pre [(not (and content-md5 calculate-md5))
- (not (and (nil? payload) calculate-md5))]}
(let [blob-builder (.name (BlobBuilderImpl.) name)
blob-builder (if payload
(.payload blob-builder
@@ -306,11 +304,9 @@ Options can also be specified for extension modules
blob-builder (if content-type
(.contentType blob-builder content-type)
blob-builder)
- blob-builder (if calculate-md5 ;; Only do calculateMD5 OR contentMD5.
- (.calculateMD5 blob-builder)
- (if content-md5
- (.contentMD5 blob-builder content-md5)
- blob-builder))]
+ blob-builder (if content-md5
+ (.contentMD5 blob-builder content-md5)
+ blob-builder)]
(doto blob-builder
(.contentDisposition content-disposition)
(.contentEncoding content-encoding)
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index c157f46..055a6bf 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -46,6 +46,7 @@ import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimaps;
+import com.google.common.hash.Hashing;
import com.google.common.io.ByteStreams;
import com.google.common.net.HttpHeaders;
@@ -125,7 +126,6 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
Blob newBlob = createUpdatedCopyOfBlobInContainer(containerName, blob);
Map<String, Blob> map = containerToBlobs.get(containerName);
map.put(newBlob.getMetadata().getName(), newBlob);
- Payloads.calculateMD5(newBlob);
return base16().lowerCase().encode(newBlob.getPayload().getContentMetadata().getContentMD5());
}
@@ -159,11 +159,13 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
if (payload == null || !(payload instanceof ByteArrayPayload)) {
MutableContentMetadata oldMd = in.getPayload().getContentMetadata();
byte[] out = ByteStreams.toByteArray(in.getPayload());
- payload = (ByteArrayPayload) Payloads.calculateMD5(Payloads.newPayload(out));
+ payload = Payloads.newByteArrayPayload(out);
+ payload.getContentMetadata().setContentMD5(Hashing.md5().hashBytes(out).asBytes());
HttpUtils.copy(oldMd, payload.getContentMetadata());
} else {
- if (payload.getContentMetadata().getContentMD5() == null)
- Payloads.calculateMD5(in);
+ if (payload.getContentMetadata().getContentMD5() == null) {
+ payload.getContentMetadata().setContentMD5(ByteStreams.hash(payload, Hashing.md5()).asBytes());
+ }
}
} catch (IOException e) {
Throwables.propagate(e);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/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 d3425c6..39a71c9 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/domain/BlobBuilder.java
@@ -131,14 +131,5 @@ public interface BlobBuilder {
PayloadBlobBuilder contentEncoding(String contentEncoding);
PayloadBlobBuilder expires(Date expires);
-
- /**
- * @deprecated Callers should instead call BlobBuilder.contentMD5,
- * usually with the results from Guava Hashing.md5().
- * @see Payloads#calculateMD5
- */
- @Deprecated
- PayloadBlobBuilder calculateMD5() throws IOException;
-
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/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 b73a658..dbe69d4 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
@@ -153,16 +153,6 @@ public class BlobBuilderImpl implements BlobBuilder {
return builder.payload(payload);
}
- /**
- * @deprecated Callers should instead call BlobBuilder.contentMD5,
- * usually with the results from Guava Hashing.md5().
- */
- @Deprecated
- @Override
- public PayloadBlobBuilder calculateMD5() throws IOException {
- return builder.payload(Payloads.calculateMD5(payload));
- }
-
@Override
public PayloadBlobBuilder payload(InputStream payload) {
return builder.payload(payload);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj
----------------------------------------------------------------------
diff --git a/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj b/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj
index dd4e515..8ea5b2a 100644
--- a/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj
+++ b/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj
@@ -21,6 +21,7 @@
(:import [java.io ByteArrayInputStream ByteArrayOutputStream
StringBufferInputStream]
[org.jclouds.util Strings2]
+ com.google.common.hash.Hashing
com.google.common.io.ByteSource))
(defn clean-stub-fixture
@@ -64,14 +65,14 @@
(is (create-container blobstore-stub "container"))
(is (empty? (blobs blobstore-stub "container")))
(is (put-blob blobstore-stub "container"
- (blob "blob1" :payload "blob1" :calculate-md5 true)))
+ (blob "blob1" :payload "blob1")))
(is (put-blob blobstore-stub "container"
- (blob "blob2" :payload "blob2" :calculate-md5 true)))
+ (blob "blob2" :payload "blob2")))
(is (= 2 (count (blobs blobstore-stub "container"))))
(is (= 1 (count (blobs blobstore-stub "container" :max-results 1))))
(create-directory blobstore-stub "container" "dir")
(is (put-blob blobstore-stub "container"
- (blob "dir/blob2" :payload "blob2" :calculate-md5 true)))
+ (blob "dir/blob2" :payload "blob2")))
(is (= 3 (count-blobs blobstore-stub "container")))
(is (= 3 (count (blobs blobstore-stub "container"))))
(is (= 4 (count (blobs blobstore-stub "container" :recursive true))))
@@ -85,8 +86,7 @@
(create-container blobstore-stub container-name)
(dotimes [i total-blobs] (put-blob blobstore-stub container-name
(blob (str i)
- :payload (str i)
- :calculate-md5 true)))
+ :payload (str i))))
;; verify
(is (= total-blobs (count-blobs blobstore-stub container-name)))))
@@ -98,9 +98,9 @@
(deftest get-blob-test
(is (create-container blobstore-stub "blob"))
(is (put-blob blobstore-stub "blob"
- (blob "blob1" :payload "blob1" :calculate-md5 true)))
+ (blob "blob1" :payload "blob1")))
(is (put-blob blobstore-stub "blob"
- (blob "blob2" :payload "blob2" :calculate-md5 true)))
+ (blob "blob2" :payload "blob2")))
(is (= "blob2" (Strings2/toStringAndClose (get-blob-stream blobstore-stub
"blob" "blob2")))))
@@ -148,9 +148,10 @@
(is (= "DELETE" (.getMethod request)))))
(deftest blob-test
- (let [a-blob (blob "test-name"
- :payload "test-payload"
- :calculate-md5 true)]
+ (let [byte-source (ByteSource/wrap (.getBytes "test-payload"))
+ a-blob (blob "test-name"
+ :payload byte-source
+ :content-md5 (.asBytes (.hash byte-source (Hashing/md5))))]
(is (= (seq (.. a-blob (getPayload) (getContentMetadata) (getContentMD5)))
(seq (.digest (doto (java.security.MessageDigest/getInstance "MD5")
(.reset)
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
index 9b54ac2..920dfa0 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
@@ -30,6 +30,10 @@ import org.jclouds.rest.internal.BaseAsyncClientTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import com.google.common.base.Charsets;
+import com.google.common.hash.Hashing;
+import com.google.common.io.ByteSource;
+
/**
* Tests behavior of {@code LocalBlobRequestSigner}
*
@@ -88,7 +92,12 @@ public class TransientBlobRequestSignerTest extends BaseAsyncClientTest<LocalAsy
public void testSignPutBlobWithGenerate() throws ArrayIndexOutOfBoundsException, SecurityException,
IllegalArgumentException, NoSuchMethodException, IOException {
- Blob blob = blobFactory.get().name(blobName).payload("foo").calculateMD5().contentType("text/plain").build();
+ ByteSource byteSource = ByteSource.wrap("foo".getBytes(Charsets.UTF_8));
+ Blob blob = blobFactory.get().name(blobName)
+ .payload(byteSource)
+ .contentLength(byteSource.size())
+ .contentMD5(byteSource.hash(Hashing.md5()).asBytes())
+ .contentType("text/plain").build();
byte[] md5 = { -84, -67, 24, -37, 76, -62, -8, 92, -19, -17, 101, 79, -52, -60, -92, -40 };
assertEquals(blob.getPayload().getContentMetadata().getContentMD5(), md5);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/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 c454cd2..bd55894 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
@@ -515,9 +515,6 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder(name).payload(Payloads.newPayload(content))
.contentType(type);
addContentMetadata(blobBuilder);
- if (content instanceof InputStream) {
- blobBuilder.calculateMD5();
- }
Blob blob = blobBuilder.build();
String container = getContainerName();
try {
@@ -621,7 +618,9 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
// normalize the
// providers.
Blob blob = view.getBlobStore().blobBuilder(name).userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
- .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).calculateMD5().build();
+ .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN)
+ .contentMD5(md5().hashString(TEST_STRING, Charsets.UTF_8).asBytes())
+ .build();
String container = getContainerName();
try {
assertNull(view.getBlobStore().blobMetadata(container, "powderpuff"));
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
index 4e23506..40ffcf4 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
@@ -77,7 +77,9 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
// NOTE all metadata in jclouds comes out as lowercase, in an effort to
// normalize the providers.
view.getBlobStore().blobBuilder(key).userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
- .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).calculateMD5().build());
+ .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN)
+ .contentMD5(md5().hashString(TEST_STRING, UTF_8).asBytes())
+ .build());
validateContent(containerName, key);
PageSet<? extends StorageMetadata> container = view.getBlobStore().list(containerName,
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/core/src/main/java/org/jclouds/io/Payloads.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/io/Payloads.java b/core/src/main/java/org/jclouds/io/Payloads.java
index f322d76..a5fa87f 100644
--- a/core/src/main/java/org/jclouds/io/Payloads.java
+++ b/core/src/main/java/org/jclouds/io/Payloads.java
@@ -100,44 +100,4 @@ public class Payloads {
public static UrlEncodedFormPayload newUrlEncodedFormPayload(Multimap<String, String> formParams) {
return new UrlEncodedFormPayload(formParams);
}
-
- /**
- * Calculates and sets {@link Payload#setContentMD5} on the payload.
- *
- * <p/>
- * note that this will rebuffer in memory if the payload is not repeatable.
- *
- * @param payload
- * payload to calculate
- * @return new Payload with md5 set.
- * @throws IOException
- */
- public static Payload calculateMD5(Payload payload) throws IOException {
- checkNotNull(payload, "payload");
- if (!payload.isRepeatable()) {
- MutableContentMetadata oldContentMetadata = payload.getContentMetadata();
- Payload oldPayload = payload;
- try {
- payload = newByteArrayPayload(toByteArray(payload));
- } finally {
- oldPayload.release();
- }
- oldContentMetadata.setContentLength(payload.getContentMetadata().getContentLength());
- oldContentMetadata.setContentMD5(payload.getContentMetadata().getContentMD5());
- payload.setContentMetadata(oldContentMetadata);
- }
- payload.getContentMetadata().setContentMD5(ByteStreams.hash(payload, md5()).asBytes());
- return payload;
- }
-
- /**
- * Calculates the md5 on a payload, replacing as necessary.
- */
- public static <T extends PayloadEnclosing> T calculateMD5(T payloadEnclosing) throws IOException {
- checkNotNull(payloadEnclosing, "payloadEnclosing");
- Payload newPayload = calculateMD5(payloadEnclosing.getPayload());
- if (newPayload != payloadEnclosing.getPayload())
- payloadEnclosing.setPayload(newPayload);
- return payloadEnclosing;
- }
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
index e529429..f6cd07a 100644
--- a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
@@ -123,12 +123,8 @@ public abstract class BaseRestApiTest {
}
assertEquals(payload, toMatch);
Long length = Long.valueOf(payload.getBytes().length);
- try {
- assertContentHeadersEqual(request, contentType, contentDispositon, contentEncoding, contentLanguage,
- length, contentMD5 ? ByteStreams.hash(request.getPayload(), md5()).asBytes() : null, expires);
- } catch (IOException e) {
- propagate(e);
- }
+ assertContentHeadersEqual(request, contentType, contentDispositon, contentEncoding, contentLanguage,
+ length, contentMD5 ? md5().hashBytes(payload.getBytes()).asBytes() : null, expires);
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
index 07c480d..e318e49 100644
--- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
@@ -18,7 +18,6 @@ package org.jclouds.rest.internal;
import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.io.Payloads.calculateMD5;
import static org.jclouds.io.Payloads.newInputStreamPayload;
import static org.jclouds.io.Payloads.newStringPayload;
import static org.jclouds.reflect.Reflection2.method;
@@ -140,6 +139,8 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
+import com.google.common.hash.Hashing;
+import com.google.common.io.ByteSource;
import com.google.common.io.Files;
import com.google.common.net.HttpHeaders;
import com.google.common.reflect.Invokable;
@@ -1970,8 +1971,11 @@ public class RestAnnotationProcessorTest extends BaseRestApiTest {
public void testPutPayloadEnclosingGenerateMD5() throws SecurityException, NoSuchMethodException, IOException {
Invokable<?, ?> method = method(TestTransformers.class, "put", PayloadEnclosing.class);
- PayloadEnclosing payloadEnclosing = new PayloadEnclosingImpl(newStringPayload("whoops"));
- calculateMD5(payloadEnclosing);
+ ByteSource byteSource = ByteSource.wrap("whoops".getBytes(UTF_8));
+ PayloadEnclosing payloadEnclosing = new PayloadEnclosingImpl(Payloads.newByteSourcePayload(byteSource));
+ payloadEnclosing.getPayload().getContentMetadata().setContentLength(byteSource.size());
+ payloadEnclosing.getPayload().getContentMetadata().setContentMD5(byteSource.hash(Hashing.md5()).asBytes());
+
GeneratedHttpRequest request = processor.apply(Invocation.create(method,
ImmutableList.<Object> of(payloadEnclosing)));
assertRequestLineEquals(request, "PUT http://localhost:9999 HTTP/1.1");
@@ -1983,10 +1987,12 @@ public class RestAnnotationProcessorTest extends BaseRestApiTest {
public void testPutInputStreamPayloadEnclosingGenerateMD5() throws SecurityException, NoSuchMethodException,
IOException {
Invokable<?, ?> method = method(TestTransformers.class, "put", PayloadEnclosing.class);
+ ByteSource byteSource = ByteSource.wrap("whoops".getBytes(UTF_8));
PayloadEnclosing payloadEnclosing = new PayloadEnclosingImpl(
- newInputStreamPayload(Strings2.toInputStream("whoops")));
+ newInputStreamPayload(byteSource.openStream()));
+ payloadEnclosing.getPayload().getContentMetadata().setContentLength(byteSource.size());
+ payloadEnclosing.getPayload().getContentMetadata().setContentMD5(byteSource.hash(Hashing.md5()).asBytes());
- calculateMD5(payloadEnclosing);
GeneratedHttpRequest request = processor.apply(Invocation.create(method,
ImmutableList.<Object> of(payloadEnclosing)));
assertRequestLineEquals(request, "PUT http://localhost:9999 HTTP/1.1");
@@ -2048,8 +2054,11 @@ public class RestAnnotationProcessorTest extends BaseRestApiTest {
public void testPutPayloadWithGeneratedMD5AndNoContentType() throws SecurityException, NoSuchMethodException,
IOException {
- Payload payload = newStringPayload("whoops");
- calculateMD5(payload);
+ ByteSource byteSource = ByteSource.wrap("whoops".getBytes(UTF_8));
+ Payload payload = Payloads.newByteSourcePayload(byteSource);
+ payload.getContentMetadata().setContentLength(byteSource.size());
+ payload.getContentMetadata().setContentMD5(byteSource.hash(Hashing.md5()).asBytes());
+
Invokable<?, ?> method = method(TestTransformers.class, "put", Payload.class);
GeneratedHttpRequest request = processor.apply(Invocation.create(method,
ImmutableList.<Object> of(payload)));
@@ -2071,8 +2080,11 @@ public class RestAnnotationProcessorTest extends BaseRestApiTest {
public void testPutInputStreamPayloadWithMD5() throws NoSuchAlgorithmException, IOException, SecurityException,
NoSuchMethodException {
- Payload payload = newStringPayload("whoops");
- calculateMD5(payload);
+ ByteSource byteSource = ByteSource.wrap("whoops".getBytes(UTF_8));
+ Payload payload = Payloads.newByteSourcePayload(byteSource);
+ payload.getContentMetadata().setContentLength(byteSource.size());
+ payload.getContentMetadata().setContentMD5(byteSource.hash(Hashing.md5()).asBytes());
+
Invokable<?, ?> method = method(TestTransformers.class, "put", Payload.class);
GeneratedHttpRequest request = processor.apply(Invocation.create(method,
ImmutableList.<Object> of(payload)));
http://git-wip-us.apache.org/repos/asf/jclouds/blob/186f0520/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
index 0550150..d38714e 100644
--- a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
+++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
@@ -45,7 +45,6 @@ import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
import org.jclouds.http.HttpResponseException;
import org.jclouds.http.options.GetOptions;
-import org.jclouds.io.Payloads;
import org.jclouds.io.payloads.ByteArrayPayload;
import org.jclouds.util.Strings2;
import org.jclouds.util.Throwables2;
@@ -55,6 +54,7 @@ import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Iterables;
+import com.google.common.hash.Hashing;
/**
* Tests behavior of {@code AzureBlobClient}
@@ -223,7 +223,7 @@ public class AzureBlobClientLiveTest extends BaseBlobStoreIntegrationTest {
AzureBlob object = getApi().newBlob();
object.getProperties().setName("object");
object.setPayload(data);
- Payloads.calculateMD5(object);
+ object.getProperties().getContentMetadata().setContentMD5(Hashing.md5().hashString(data, Charsets.UTF_8).asBytes());
object.getProperties().getContentMetadata().setContentType("text/plain");
object.getProperties().getMetadata().put("mykey", "metadata-value");
byte[] md5 = object.getProperties().getContentMetadata().getContentMD5();