mirror of https://github.com/apache/jclouds.git
Update blobstore2 to have a convenience protocol for building blob payloads.
* Added PayloadSource protocol with a number of implementations, including all currently covered classes. * Added implementation for clojure.lang.IFn, so that you can pass in a closure. * Updated blob function to pass the :payload argument through the payload protocol function. * Added some tests for the payload protocol.
This commit is contained in:
parent
ea54958803
commit
cea0e7d7ad
|
@ -50,7 +50,7 @@ See http://code.google.com/p/jclouds for details."
|
||||||
domain.Blob domain.internal.BlobBuilderImpl options.PutOptions
|
domain.Blob domain.internal.BlobBuilderImpl options.PutOptions
|
||||||
options.PutOptions$Builder
|
options.PutOptions$Builder
|
||||||
options.CreateContainerOptions options.ListContainerOptions]
|
options.CreateContainerOptions options.ListContainerOptions]
|
||||||
org.jclouds.io.Payloads
|
[org.jclouds.io Payload Payloads payloads.StreamingPayload]
|
||||||
java.util.Arrays
|
java.util.Arrays
|
||||||
[java.security DigestOutputStream MessageDigest]
|
[java.security DigestOutputStream MessageDigest]
|
||||||
com.google.common.collect.ImmutableSet
|
com.google.common.collect.ImmutableSet
|
||||||
|
@ -73,6 +73,39 @@ See http://code.google.com/p/jclouds for details."
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(JCECrypto.))))
|
(JCECrypto.))))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Payload support for creating Blobs.
|
||||||
|
;;
|
||||||
|
|
||||||
|
(def ^{:doc "Type object for a Java primitive byte array, for use in the
|
||||||
|
PayloadSource protocol."
|
||||||
|
:private true}
|
||||||
|
byte-array-type (class (make-array Byte/TYPE 0)))
|
||||||
|
|
||||||
|
(defprotocol PayloadSource
|
||||||
|
"Various types can have PayloadSource extended onto them so that they are
|
||||||
|
easily coerced into a Payload."
|
||||||
|
(^Payload payload [arg] "Coerce arg into a Payload."))
|
||||||
|
|
||||||
|
(extend-protocol PayloadSource
|
||||||
|
Payload
|
||||||
|
(payload [p] p)
|
||||||
|
java.io.InputStream
|
||||||
|
(payload [is] (Payloads/newInputStreamPayload is))
|
||||||
|
byte-array-type
|
||||||
|
(payload [ba] (Payloads/newByteArrayPayload ba))
|
||||||
|
String
|
||||||
|
(payload [s] (Payloads/newStringPayload s))
|
||||||
|
java.io.File
|
||||||
|
(payload [f] (Payloads/newFilePayload f))
|
||||||
|
clojure.lang.IFn
|
||||||
|
;; This will let you pass a closure to payload that takes an OutputStream
|
||||||
|
;; as argument and writes to it when called from a StreamingPayload.
|
||||||
|
(payload [func]
|
||||||
|
(StreamingPayload. (reify org.jclouds.io.WriteTo
|
||||||
|
(writeTo [this output-stream]
|
||||||
|
(func output-stream))))))
|
||||||
|
|
||||||
(defn blobstore
|
(defn blobstore
|
||||||
"Create a logged in context.
|
"Create a logged in context.
|
||||||
Options for communication style
|
Options for communication style
|
||||||
|
@ -278,7 +311,10 @@ Options can also be specified for extension modules
|
||||||
(.countBlobs blobstore container-name))
|
(.countBlobs blobstore container-name))
|
||||||
|
|
||||||
(defn blob
|
(defn blob
|
||||||
"Create a new blob with the specified payload and options."
|
"Create a new blob with the specified payload and options.
|
||||||
|
|
||||||
|
The payload argument can be anything accepted by org.jclouds.io.Payloads, or
|
||||||
|
you can make one manually (recommended) with the payload protocol function."
|
||||||
([^String name &
|
([^String name &
|
||||||
{:keys [payload content-type content-length content-md5 calculate-md5
|
{:keys [payload content-type content-length content-md5 calculate-md5
|
||||||
content-disposition content-encoding content-language metadata]}]
|
content-disposition content-encoding content-language metadata]}]
|
||||||
|
@ -286,7 +322,8 @@ Options can also be specified for extension modules
|
||||||
(not (and (nil? payload) calculate-md5))]}
|
(not (and (nil? payload) calculate-md5))]}
|
||||||
(let [blob-builder (.name (BlobBuilderImpl. crypto-impl) name)
|
(let [blob-builder (.name (BlobBuilderImpl. crypto-impl) name)
|
||||||
blob-builder (if payload
|
blob-builder (if payload
|
||||||
(.payload blob-builder payload)
|
(.payload blob-builder
|
||||||
|
(org.jclouds.blobstore2/payload payload))
|
||||||
(.forSigning blob-builder))
|
(.forSigning blob-builder))
|
||||||
blob-builder (if content-length ;; Special case, arg is prim.
|
blob-builder (if content-length ;; Special case, arg is prim.
|
||||||
(.contentLength blob-builder content-length)
|
(.contentLength blob-builder content-length)
|
||||||
|
|
|
@ -22,7 +22,8 @@
|
||||||
(:use [clojure.test])
|
(:use [clojure.test])
|
||||||
(:import [org.jclouds.blobstore BlobStoreContextFactory]
|
(:import [org.jclouds.blobstore BlobStoreContextFactory]
|
||||||
[org.jclouds.crypto CryptoStreams]
|
[org.jclouds.crypto CryptoStreams]
|
||||||
[java.io ByteArrayOutputStream]
|
[java.io ByteArrayInputStream ByteArrayOutputStream
|
||||||
|
StringBufferInputStream]
|
||||||
[org.jclouds.util Strings2]))
|
[org.jclouds.util Strings2]))
|
||||||
|
|
||||||
(defn clean-stub-fixture
|
(defn clean-stub-fixture
|
||||||
|
@ -157,4 +158,37 @@
|
||||||
(is (= (seq (.. a-blob (getPayload) (getContentMetadata) (getContentMD5)))
|
(is (= (seq (.. a-blob (getPayload) (getContentMetadata) (getContentMD5)))
|
||||||
(seq (CryptoStreams/md5 (.getBytes "test-payload")))))))
|
(seq (CryptoStreams/md5 (.getBytes "test-payload")))))))
|
||||||
|
|
||||||
|
(deftest payload-protocol-test
|
||||||
|
(is (instance? org.jclouds.io.Payload (payload "test")))
|
||||||
|
(is (blob "blob1" :payload (payload "blob1")))
|
||||||
|
(is (create-container *blobstore* "container"))
|
||||||
|
(is (= "blob1"
|
||||||
|
(do
|
||||||
|
(put-blob *blobstore* "container"
|
||||||
|
(blob "blob1"
|
||||||
|
:payload "blob1"))
|
||||||
|
(Strings2/toStringAndClose (get-blob-stream *blobstore*
|
||||||
|
"container" "blob1")))))
|
||||||
|
(is (= "blob1"
|
||||||
|
(do
|
||||||
|
(put-blob *blobstore* "container"
|
||||||
|
(blob "blob1"
|
||||||
|
:payload (StringBufferInputStream. "blob1")))
|
||||||
|
(Strings2/toStringAndClose (get-blob-stream *blobstore*
|
||||||
|
"container" "blob1")))))
|
||||||
|
(is (= "blob1"
|
||||||
|
(do
|
||||||
|
(put-blob *blobstore* "container"
|
||||||
|
(blob "blob1"
|
||||||
|
:payload (.getBytes "blob1")))
|
||||||
|
(Strings2/toStringAndClose (get-blob-stream *blobstore*
|
||||||
|
"container" "blob1")))))
|
||||||
|
(is (= "blob1"
|
||||||
|
(do
|
||||||
|
(put-blob *blobstore* "container"
|
||||||
|
(blob "blob1"
|
||||||
|
:payload #(.write % (.getBytes "blob1"))))
|
||||||
|
(Strings2/toStringAndClose (get-blob-stream *blobstore*
|
||||||
|
"container" "blob1"))))))
|
||||||
|
|
||||||
;; TODO: more tests involving blob-specific functions
|
;; TODO: more tests involving blob-specific functions
|
||||||
|
|
Loading…
Reference in New Issue