Skip to content

Commit

Permalink
Typa and AvroSchema are supplied to AvroJacksonCodec #800
Browse files Browse the repository at this point in the history
  • Loading branch information
Nikita committed Mar 13, 2017
1 parent 2167f7f commit 1caaee7
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 17 deletions.
42 changes: 40 additions & 2 deletions redisson/src/main/java/org/redisson/codec/AvroJacksonCodec.java
Expand Up @@ -15,8 +15,16 @@
*/
package org.redisson.codec;

import java.io.IOException;
import java.io.InputStream;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.avro.AvroFactory;
import com.fasterxml.jackson.dataformat.avro.AvroMapper;
import com.fasterxml.jackson.dataformat.avro.AvroSchema;

/**
* Avro binary codec
Expand All @@ -26,12 +34,42 @@
*/
public class AvroJacksonCodec extends JsonJacksonCodec {

public AvroJacksonCodec() {
super(new ObjectMapper(new AvroFactory()));
public static class AvroExtendedMapper extends AvroMapper {

private static final long serialVersionUID = -560070554221164163L;

private final AvroSchema schema;
private final Class<?> type;

public AvroExtendedMapper(Class<?> type, AvroSchema schema) {
super();
this.type = type;
this.schema = schema;
}

@Override
public byte[] writeValueAsBytes(Object value) throws JsonProcessingException {
return writerFor(type).with(schema).writeValueAsBytes(value);
}

@Override
public <T> T readValue(InputStream src, Class<T> valueType)
throws IOException, JsonParseException, JsonMappingException {
return readerFor(type).with(schema).readValue(src);
}

}

public AvroJacksonCodec(Class<?> type, AvroSchema schema) {
super(new AvroExtendedMapper(type, schema));
}

public AvroJacksonCodec(ClassLoader classLoader) {
super(createObjectMapper(classLoader, new ObjectMapper(new AvroFactory())));
}

@Override
protected void initTypeInclusion(ObjectMapper mapObjectMapper) {
}

}
Expand Up @@ -93,7 +93,10 @@ protected static ObjectMapper createObjectMapper(ClassLoader classLoader, Object
public JsonJacksonCodec(ObjectMapper mapObjectMapper) {
this.mapObjectMapper = mapObjectMapper;
init(mapObjectMapper);
// type info inclusion
initTypeInclusion(mapObjectMapper);
}

protected void initTypeInclusion(ObjectMapper mapObjectMapper) {
TypeResolverBuilder<?> mapTyper = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) {
public boolean useForType(JavaType t) {
switch (_appliesFor) {
Expand Down
39 changes: 25 additions & 14 deletions redisson/src/test/java/org/redisson/RedissonCodecTest.java
@@ -1,35 +1,39 @@
package org.redisson;

import com.fasterxml.jackson.core.type.TypeReference;
import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Assert;
import org.junit.Test;
import org.redisson.api.RBucket;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.Codec;
import org.redisson.client.codec.JsonJacksonMapValueCodec;
import org.redisson.codec.AvroJacksonCodec;
import org.redisson.codec.CborJacksonCodec;
import org.redisson.codec.FstCodec;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.codec.KryoCodec;
import org.redisson.codec.LZ4Codec;
import org.redisson.codec.MsgPackJacksonCodec;
import org.redisson.codec.SerializationCodec;
import org.redisson.codec.AvroJacksonCodec;
import org.redisson.codec.SmileJacksonCodec;
import org.redisson.codec.SnappyCodec;
import org.redisson.config.Config;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.dataformat.avro.AvroMapper;
import com.fasterxml.jackson.dataformat.avro.AvroSchema;

public class RedissonCodecTest extends BaseTest {
private Codec avroCodec = new AvroJacksonCodec();
private Codec smileCodec = new SmileJacksonCodec();
private Codec codec = new SerializationCodec();
private Codec kryoCodec = new KryoCodec();
Expand Down Expand Up @@ -77,14 +81,21 @@ public void testSmile() {

test(redisson);
}

@Test
public void testAvro() {
public void testAvro() throws IOException {
AvroMapper am = new AvroMapper();
AvroSchema schema = am.schemaFor(TestObject.class);
Codec avroCodec = new AvroJacksonCodec(TestObject.class, schema);

Config config = createConfig();
config.setCodec(avroCodec);
RedissonClient redisson = Redisson.create(config);

test(redisson);
RBucket<TestObject> b = redisson.getBucket("bucket");
b.set(new TestObject("1", "2"));

assertThat(b.get()).isEqualTo(new TestObject("1", "2"));
}

@Test
Expand Down

1 comment on commit 1caaee7

@marlonwc3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the fixes, it will be very useful for my project.
Also, when there will be a release? Do you have a estimated date?

Please sign in to comment.