From 66f6df486007a066150edd2e7ac9eff68f245e8f Mon Sep 17 00:00:00 2001 From: Michael Nitschinger Date: Tue, 22 Jan 2013 15:54:34 +0100 Subject: [PATCH] Cleanup and adding class-level expiry. --- .../spring/core/CouchbaseTemplate.java | 1 - .../convert/MappingCouchbaseConverter.java | 5 +--- .../BasicCouchbasePersistentEntity.java | 10 +++++++ .../mapping/CouchbasePersistentEntity.java | 6 ++++ .../spring/core/mapping/Document.java | 5 ++++ .../spring/core/CouchbaseTemplateTest.java | 30 +++++++++++++++++-- 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java b/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java index fdf21a00..048168c1 100644 --- a/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java +++ b/src/main/java/com/couchbase/spring/core/CouchbaseTemplate.java @@ -52,7 +52,6 @@ public class CouchbaseTemplate implements CouchbaseOperations { public void insert(Object objectToSave) { ConvertedCouchbaseDocument converted = new ConvertedCouchbaseDocument(); couchbaseConverter.write(objectToSave, converted); - client.set(converted.getId(), converted.getExpiry(), converted.getValue()); } diff --git a/src/main/java/com/couchbase/spring/core/convert/MappingCouchbaseConverter.java b/src/main/java/com/couchbase/spring/core/convert/MappingCouchbaseConverter.java index 545edfdf..1d7a56f6 100644 --- a/src/main/java/com/couchbase/spring/core/convert/MappingCouchbaseConverter.java +++ b/src/main/java/com/couchbase/spring/core/convert/MappingCouchbaseConverter.java @@ -28,11 +28,8 @@ import com.couchbase.spring.core.mapping.CouchbasePersistentProperty; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.util.logging.Level; -import java.util.logging.Logger; import org.codehaus.jackson.JsonEncoding; import org.codehaus.jackson.JsonFactory; -import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -43,7 +40,6 @@ import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.mapping.model.MappingException; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; -import org.springframework.core.convert.ConversionService; import org.springframework.data.mapping.PropertyHandler; public class MappingCouchbaseConverter extends AbstractCouchbaseConverter @@ -110,6 +106,7 @@ public class MappingCouchbaseConverter extends AbstractCouchbaseConverter String id = wrapper.getProperty(idProperty, String.class, false); target.setId(id); + target.setExpiry(entity.getExpiry()); JsonFactory jsonFactory = new JsonFactory(); OutputStream jsonStream = new ByteArrayOutputStream(); diff --git a/src/main/java/com/couchbase/spring/core/mapping/BasicCouchbasePersistentEntity.java b/src/main/java/com/couchbase/spring/core/mapping/BasicCouchbasePersistentEntity.java index 1a3c4a11..ba34de13 100644 --- a/src/main/java/com/couchbase/spring/core/mapping/BasicCouchbasePersistentEntity.java +++ b/src/main/java/com/couchbase/spring/core/mapping/BasicCouchbasePersistentEntity.java @@ -50,4 +50,14 @@ public class BasicCouchbasePersistentEntity context.setBeanResolver(new BeanFactoryResolver(applicationContext)); context.setRootObject(applicationContext); } + + public int getExpiry() { + com.couchbase.spring.core.mapping.Document annotation = + getType().getAnnotation(com.couchbase.spring.core.mapping.Document.class); + + if(annotation == null) { + return 0; + } + return annotation.expiry(); + } } diff --git a/src/main/java/com/couchbase/spring/core/mapping/CouchbasePersistentEntity.java b/src/main/java/com/couchbase/spring/core/mapping/CouchbasePersistentEntity.java index 26d7c56a..1d42d104 100644 --- a/src/main/java/com/couchbase/spring/core/mapping/CouchbasePersistentEntity.java +++ b/src/main/java/com/couchbase/spring/core/mapping/CouchbasePersistentEntity.java @@ -27,4 +27,10 @@ import org.springframework.data.mapping.PersistentEntity; public interface CouchbasePersistentEntity extends PersistentEntity { + /** + * Returns the expiry time for the document. + * + * @return + */ + int getExpiry(); } diff --git a/src/main/java/com/couchbase/spring/core/mapping/Document.java b/src/main/java/com/couchbase/spring/core/mapping/Document.java index e0b4dd19..69792ba9 100644 --- a/src/main/java/com/couchbase/spring/core/mapping/Document.java +++ b/src/main/java/com/couchbase/spring/core/mapping/Document.java @@ -37,5 +37,10 @@ import org.springframework.data.annotation.Persistent; @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE }) public @interface Document { + + /** + * An optional expiry time for the document. + */ + int expiry() default 0; } diff --git a/src/test/java/com/couchbase/spring/core/CouchbaseTemplateTest.java b/src/test/java/com/couchbase/spring/core/CouchbaseTemplateTest.java index 8b58cbec..3ef5304d 100644 --- a/src/test/java/com/couchbase/spring/core/CouchbaseTemplateTest.java +++ b/src/test/java/com/couchbase/spring/core/CouchbaseTemplateTest.java @@ -24,11 +24,13 @@ package com.couchbase.spring.core; import com.couchbase.client.CouchbaseClient; import com.couchbase.spring.TestApplicationConfig; -import net.spy.memcached.internal.GetFuture; +import com.couchbase.spring.core.mapping.Document; + import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.annotation.Id; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -50,10 +52,34 @@ public class CouchbaseTemplateTest { Beer beer = new Beer(id).setName(name).setActive(active); template.insert(beer); - Object result = (String) client.get(id); + String result = (String) client.get(id); String expected = "{\"active\":" + active + ",\"name\":\"" + name + "\"}"; assertNotNull(result); assertEquals(expected, result); } + + @Test + public void insertDocumentWithExpiry() throws Exception { + String id = "simple-doc-with-expiry"; + DocumentWithExpiry doc = new DocumentWithExpiry(id); + template.insert(doc); + assertNotNull(client.get(id)); + Thread.sleep(3000); + assertNull(client.get(id)); + } + + /** + * A sample document that expires in 2 seconds. + */ + @Document(expiry=2) + class DocumentWithExpiry { + @Id + private final String id; + + public DocumentWithExpiry(String id) { + this.id = id; + } + + } }