From dd0300c4011da40e8688580d75876abaa6d6acdd Mon Sep 17 00:00:00 2001 From: "J. Brisbin" Date: Fri, 19 Nov 2010 16:46:59 -0600 Subject: [PATCH] Bug fixes, added link(), started on linkWalk() --- .../datastore/riak/core/RiakTemplate.java | 90 ++++++++++++++----- .../riak/core/SimpleBucketKeyPair.java | 5 ++ 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/RiakTemplate.java b/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/RiakTemplate.java index 933c1633c..9e46bf4bd 100644 --- a/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/RiakTemplate.java +++ b/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/RiakTemplate.java @@ -45,6 +45,7 @@ import org.springframework.web.client.support.RestGatewaySupport; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.StringWriter; import java.lang.annotation.Annotation; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -144,20 +145,7 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe /*----------------- Set Operations -----------------*/ public KeyValueStoreOperations set(K key, V value) { - BucketKeyPair bucketKeyPair = resolveBucketKeyPair(key, value); - RestTemplate restTemplate = getRestTemplate(); - HttpHeaders headers = new HttpHeaders(); - headers.set("X-Riak-ClientId", RIAK_CLIENT_ID); - headers.setContentType(extractMediaType(value)); - HttpEntity entity = new HttpEntity(value, headers); - restTemplate.put(defaultUri, entity, bucketKeyPair.getBucket(), bucketKeyPair.getKey()); - if (log.isDebugEnabled()) { - log.debug(String.format("PUT object: bucket=%s, key=%s, value=%s", - bucketKeyPair.getBucket(), - bucketKeyPair.getKey(), - value)); - } - return this; + return setWithMetaData(key, value, null); } public KeyValueStoreOperations setAsBytes(K key, byte[] value) { @@ -176,6 +164,28 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe return this; } + public KeyValueStoreOperations setWithMetaData(K key, V value, Map metaData) { + BucketKeyPair bucketKeyPair = resolveBucketKeyPair(key, value); + 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); + restTemplate.put(defaultUri, entity, bucketKeyPair.getBucket(), bucketKeyPair.getKey()); + if (log.isDebugEnabled()) { + log.debug(String.format("PUT object: bucket=%s, key=%s, value=%s", + bucketKeyPair.getBucket(), + bucketKeyPair.getKey(), + value)); + } + return this; + } + /*----------------- Get Operations -----------------*/ public RiakValue getWithMetaData(K key, Class requiredType) { @@ -221,11 +231,13 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe } catch (Throwable ignored) { targetClass = Map.class; } - return (V) getWithMetaData(bucketKeyPair, targetClass).get(); + RiakValue obj = getWithMetaData(bucketKeyPair, targetClass); + return (null != obj ? obj.get() : null); } public byte[] getAsBytes(K key) { - return getAsBytesWithMetaData(key).get(); + RiakValue obj = getAsBytesWithMetaData(key); + return (null != obj ? obj.get() : null); } public RiakValue getAsBytesWithMetaData(K key) { @@ -283,7 +295,8 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe return (T) obj; } } - return getWithMetaData(key, requiredType).get(); + RiakValue obj = getWithMetaData(key, requiredType); + return (null != obj ? obj.get() : null); } public V getAndSet(K key, V value) { @@ -410,9 +423,9 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe throw new DataAccessResourceFailureException(e.getMessage(), e); } } - if (!stillExists) { - stillExists = containsKey(key); - } + //if (!stillExists) { + //stillExists = containsKey(key); + //} } return !stillExists; } @@ -448,6 +461,9 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe RestTemplate restTemplate = getRestTemplate(); RiakValue fromObj = getAsBytesWithMetaData(source); + if (null == fromObj) { + throw new DataStoreOperationException("Cannot link from a non-existent source: " + source); + } HttpHeaders headers = new HttpHeaders(); headers.setContentType(fromObj.getMetaData().getContentType()); Object linksObj = fromObj.getMetaData().getProperties().get("Link"); @@ -458,15 +474,45 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe links.add(linksObj.toString()); } links.add(String.format("<%s/%s/%s>; riaktag=\"%s\"", extractPrefix(), bkpTo.getBucket(), bkpTo.getKey(), tag)); + StringWriter sw = new StringWriter(); + boolean needsComma = false; for (String link : links) { - headers.set("Link", link); + if (!sw.toString().contains(link)) { + if (needsComma) { + sw.write(", "); + } else { + needsComma = true; + } + sw.write(link); + } } + headers.set("Link", sw.toString()); HttpEntity entity = new HttpEntity(fromObj.get(), headers); restTemplate.put(defaultUri, entity, bkpFrom.getBucket(), bkpFrom.getKey()); return this; } + public T linkWalk(K source, String tag) { + BucketKeyPair bkpSource = resolveBucketKeyPair(source, null); + RestTemplate restTemplate = getRestTemplate(); + final List types = new ArrayList(); + types.add(MediaType.ALL); + restTemplate.execute(defaultUri + "/_,{tag},_", HttpMethod.GET, new RequestCallback() { + public void doWithRequest(ClientHttpRequest request) throws IOException { + request.getHeaders().setAccept(types); + } + }, new ResponseExtractor() { + public Object extractData(ClientHttpResponse response) throws IOException { + response.getHeaders(); + return null; //To change body of implemented methods use File | Settings | File Templates. + } + }, bkpSource.getBucket(), + bkpSource.getKey(), + tag); + return null; + } + /*----------------- Bucket Operations -----------------*/ public Map getBucketSchema(B bucket) { @@ -493,13 +539,13 @@ public class RiakTemplate extends RestGatewaySupport implements KeyValueStoreOpe bucketKeyResolvers.add(new SimpleBucketKeyResolver()); } + List> converters = getRestTemplate().getMessageConverters(); if (groovyPresent) { // Native conversion for Groovy GString objects ObjectMapper mapper = new ObjectMapper(); CustomSerializerFactory fac = new CustomSerializerFactory(); fac.addSpecificMapping(GStringImpl.class, ToStringSerializer.instance); mapper.setSerializerFactory(fac); - List> converters = getRestTemplate().getMessageConverters(); for (HttpMessageConverter converter : converters) { if (converter instanceof MappingJacksonHttpMessageConverter) { ((MappingJacksonHttpMessageConverter) converter).setObjectMapper(mapper); diff --git a/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/SimpleBucketKeyPair.java b/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/SimpleBucketKeyPair.java index 04c20bbc8..beb287517 100644 --- a/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/SimpleBucketKeyPair.java +++ b/spring-datastore-riak/src/main/java/org/springframework/datastore/riak/core/SimpleBucketKeyPair.java @@ -31,4 +31,9 @@ public class SimpleBucketKeyPair implements BucketKeyPair, Comparable { } return -1; } + + @Override + public String toString() { + return String.format("{bucket=%s, key=%s}", bucket, key); + } }