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 <[email protected]>
Authored: Mon May 26 20:37:56 2014 -0700
Committer: Andrew Gaul <[email protected]>
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();

Reply via email to