diff --git a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java index a3abe7ba0..f928239bd 100644 --- a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java +++ b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java @@ -41,6 +41,7 @@ import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.*; import java.util.concurrent.Future; @@ -163,6 +164,52 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue return setWithMetaData(bucket, key, value, metaData, null); } + /*----------------- Put Operations -----------------*/ + + /** + * Save an object to Riak and let it generate an ID for it. + * + * @param bucket + * @param value + * @return The generated ID + */ + public String put(B bucket, V value) { + return put(bucket, value, null); + } + + /** + * Save an object to Riak and let it generate an ID for it. + * + * @param bucket + * @param value + * @param metaData + * @return The generated ID + */ + public String put(B bucket, V value, Map metaData) { + String bucketName = bucket.toString(); + RestTemplate restTemplate = getRestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.set("X-Riak-ClientId", RIAK_CLIENT_ID); + headers.setContentType(extractMediaType(value)); + if (null != metaData) { + for (Map.Entry entry : metaData.entrySet()) { + headers.set(entry.getKey(), entry.getValue()); + } + } + HttpEntity entity = new HttpEntity(value, headers); + try { + URI uri = restTemplate.postForLocation(defaultUri, entity, bucketName, ""); + String suri = uri.toString(); + String id = suri.substring(suri.lastIndexOf("/") + 1); + if (log.isDebugEnabled()) { + log.debug("New ID: " + id); + } + return id; + } catch (RestClientException e) { + throw new DataStoreOperationException(e.getMessage(), e); + } + } + /*----------------- Get Operations -----------------*/ public RiakMetaData getMetaData(B bucket, K key) { diff --git a/spring-data-riak/src/test/groovy/org/springframework/data/keyvalue/riak/core/RiakTemplateSpec.groovy b/spring-data-riak/src/test/groovy/org/springframework/data/keyvalue/riak/core/RiakTemplateSpec.groovy index a911e64ac..f92885321 100644 --- a/spring-data-riak/src/test/groovy/org/springframework/data/keyvalue/riak/core/RiakTemplateSpec.groovy +++ b/spring-data-riak/src/test/groovy/org/springframework/data/keyvalue/riak/core/RiakTemplateSpec.groovy @@ -40,6 +40,7 @@ class RiakTemplateSpec extends Specification { int run = 1 @Shared def riakBin = System.properties["bamboo.RIAK_BIN"] ?: "/usr/sbin/riak" @Shared def p + @Shared def id /* def setupSpec() { p = "$riakBin start".execute() @@ -68,6 +69,20 @@ class RiakTemplateSpec extends Specification { } + def "Test generating ID for object"() { + + given: + def val = "value" + def objIn = [test: val, integer: 12] + + when: + id = riak.put("test", objIn, null) + + then: + null != id + + } + def "Test custom object"() { given: @@ -261,9 +276,10 @@ class RiakTemplateSpec extends Specification { given: def testKey = new SimpleBucketKeyPair("test", "test") def testKey2 = new SimpleBucketKeyPair(TestObject.name, "test") + def testKey3 = new SimpleBucketKeyPair("test", id) when: - def deleted = riak.deleteKeys(testKey, testKey2) + def deleted = riak.deleteKeys(testKey, testKey2, testKey3) then: true == deleted