From 8e2ddba328528994be96330cce0c0e0ceb50bb05 Mon Sep 17 00:00:00 2001 From: Eric Zoerner Date: Mon, 4 Feb 2013 11:47:06 +0100 Subject: [PATCH] Issue #503 Handle Composite's name serialization properly --- .../serializers/CompositeSerializer.java | 26 ++++++++++---- .../serializers/CompositeSerializerTest.java | 35 +++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 core/src/test/java/me/prettyprint/cassandra/serializers/CompositeSerializerTest.java diff --git a/core/src/main/java/me/prettyprint/cassandra/serializers/CompositeSerializer.java b/core/src/main/java/me/prettyprint/cassandra/serializers/CompositeSerializer.java index 3381fd1bd..1dc9ef376 100644 --- a/core/src/main/java/me/prettyprint/cassandra/serializers/CompositeSerializer.java +++ b/core/src/main/java/me/prettyprint/cassandra/serializers/CompositeSerializer.java @@ -3,12 +3,15 @@ */ package me.prettyprint.cassandra.serializers; -import static me.prettyprint.hector.api.ddl.ComparatorType.COMPOSITETYPE; +import me.prettyprint.hector.api.Serializer; +import me.prettyprint.hector.api.beans.Composite; +import me.prettyprint.hector.api.ddl.ComparatorType; import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; -import me.prettyprint.hector.api.beans.Composite; -import me.prettyprint.hector.api.ddl.ComparatorType; +import static me.prettyprint.hector.api.ddl.ComparatorType.COMPOSITETYPE; /** * @author Todd Nine @@ -17,11 +20,17 @@ public class CompositeSerializer extends AbstractSerializer { private static final CompositeSerializer INSTANCE = new CompositeSerializer(); - + + private final List> serializersByPosition; + public static CompositeSerializer get() { return INSTANCE; } - + + public CompositeSerializer(Serializer... serializers) { + serializersByPosition = Arrays.asList(serializers); + } + @Override public ByteBuffer toByteBuffer(Composite obj) { @@ -31,7 +40,7 @@ public ByteBuffer toByteBuffer(Composite obj) { @Override public Composite fromByteBuffer(ByteBuffer byteBuffer) { - Composite composite = new Composite(); + Composite composite = createComposite(); composite.deserialize(byteBuffer); return composite; @@ -43,4 +52,9 @@ public ComparatorType getComparatorType() { return COMPOSITETYPE; } + private Composite createComposite() { + Composite composite = new Composite(); + composite.setSerializersByPosition(serializersByPosition); + return composite; + } } diff --git a/core/src/test/java/me/prettyprint/cassandra/serializers/CompositeSerializerTest.java b/core/src/test/java/me/prettyprint/cassandra/serializers/CompositeSerializerTest.java new file mode 100644 index 000000000..65ea2f73e --- /dev/null +++ b/core/src/test/java/me/prettyprint/cassandra/serializers/CompositeSerializerTest.java @@ -0,0 +1,35 @@ +package me.prettyprint.cassandra.serializers; + +import me.prettyprint.hector.api.beans.Composite; +import org.junit.Test; + +import java.nio.ByteBuffer; + +import static org.junit.Assert.assertEquals; + +/** + * @author Eric Zoerner ezoerner@ebuddy.com + */ +public class CompositeSerializerTest { + + /** Tests deserializing a composite with the singleton CompositeSerializer, which fails. */ + @Test + public void testFromByteBufferWithSingletonCompositeSerializer() throws Exception { + Composite composite = new Composite("test", 42); + CompositeSerializer ser = CompositeSerializer.get(); + ByteBuffer byteBuffer = ser.toByteBuffer(composite); + + assertEquals(composite, ser.fromByteBuffer(byteBuffer)); + } + + /** Tests deserializing a composite with a CompositeSerializer constructed with Serializers. */ + @Test + public void testFromByteBufferWithConstructedSerializer() throws Exception { + Composite composite = new Composite("test", 42); + CompositeSerializer ser = new CompositeSerializer(StringSerializer.get(), BigIntegerSerializer.get()); + ByteBuffer byteBuffer = ser.toByteBuffer(composite); + + assertEquals(composite, ser.fromByteBuffer(byteBuffer)); + + } +}