Skip to content

Commit fa12233

Browse files
committed
WIP on jackson smile
1 parent 42a988d commit fa12233

File tree

12 files changed

+223
-32
lines changed

12 files changed

+223
-32
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.scalecube</groupId>
9+
<artifactId>scalecube-codec-parent</artifactId>
10+
<version>2.4.10-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>codec-jackson-smile</artifactId>
14+
<name>ScaleCube/ClusterCodecJacksonSmile</name>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>com.fasterxml.jackson.dataformat</groupId>
19+
<artifactId>jackson-dataformat-smile</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>com.fasterxml.jackson.core</groupId>
23+
<artifactId>jackson-core</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>com.fasterxml.jackson.core</groupId>
27+
<artifactId>jackson-databind</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>com.fasterxml.jackson.datatype</groupId>
31+
<artifactId>jackson-datatype-jsr310</artifactId>
32+
</dependency>
33+
</dependencies>
34+
35+
</project>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.scalecube.cluster.codec.jackson.smile;
2+
3+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
6+
import com.fasterxml.jackson.annotation.PropertyAccessor;
7+
import com.fasterxml.jackson.databind.DeserializationFeature;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
10+
import com.fasterxml.jackson.databind.SerializationFeature;
11+
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
12+
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
13+
14+
final class DefaultObjectMapper {
15+
16+
public static final ObjectMapper OBJECT_MAPPER = initMapper();
17+
18+
private DefaultObjectMapper() {
19+
// Do not instantiate
20+
}
21+
22+
private static ObjectMapper initMapper() {
23+
ObjectMapper mapper = new ObjectMapper(new SmileFactory());
24+
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
25+
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
26+
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
27+
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
28+
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
29+
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
30+
mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
31+
mapper.enableDefaultTyping(
32+
LaissezFaireSubTypeValidator.instance,
33+
DefaultTyping.JAVA_LANG_OBJECT,
34+
JsonTypeInfo.As.WRAPPER_OBJECT);
35+
return mapper;
36+
}
37+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.scalecube.cluster.codec.jackson.smile;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import io.scalecube.cluster.transport.api.Message;
5+
import io.scalecube.cluster.transport.api.MessageCodec;
6+
import java.io.InputStream;
7+
import java.io.OutputStream;
8+
9+
/** JacksonSmile based message codec. */
10+
public class JacksonSmileMessageCodec implements MessageCodec {
11+
12+
private final ObjectMapper delegate;
13+
14+
/** Default constructor. */
15+
public JacksonSmileMessageCodec() {
16+
this(DefaultObjectMapper.OBJECT_MAPPER);
17+
}
18+
19+
/**
20+
* Create instance with external {@link ObjectMapper}.
21+
*
22+
* @param delegate jackson object mapper
23+
*/
24+
public JacksonSmileMessageCodec(ObjectMapper delegate) {
25+
this.delegate = delegate;
26+
}
27+
28+
/**
29+
* Deserializes message from given input stream.
30+
*
31+
* @param stream input stream
32+
* @return message from the input stream
33+
*/
34+
@Override
35+
public Message deserialize(InputStream stream) throws Exception {
36+
return this.delegate.readValue(stream, Message.class);
37+
}
38+
39+
/**
40+
* Serializes given message into given output stream.
41+
*
42+
* @param message message
43+
* @param stream output stream
44+
*/
45+
@Override
46+
public void serialize(Message message, OutputStream stream) throws Exception {
47+
this.delegate.writeValue(stream, message);
48+
}
49+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.scalecube.cluster.codec.jackson.smile;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import io.scalecube.cluster.metadata.MetadataCodec;
5+
import java.io.IOException;
6+
import java.nio.ByteBuffer;
7+
import reactor.core.Exceptions;
8+
9+
public class JacksonSmileMetadataCodec implements MetadataCodec {
10+
11+
private final ObjectMapper delegate;
12+
13+
public JacksonSmileMetadataCodec() {
14+
this(DefaultObjectMapper.OBJECT_MAPPER);
15+
}
16+
17+
public JacksonSmileMetadataCodec(ObjectMapper delegate) {
18+
this.delegate = delegate;
19+
}
20+
21+
@Override
22+
public Object deserialize(ByteBuffer buffer) {
23+
if (buffer.remaining() == 0) {
24+
return null;
25+
}
26+
try {
27+
final MetadataWrapper metadataWrapper =
28+
this.delegate.readValue(buffer.array(), MetadataWrapper.class);
29+
return metadataWrapper.getMetadata();
30+
} catch (IOException e) {
31+
throw Exceptions.propagate(e);
32+
}
33+
}
34+
35+
@Override
36+
public ByteBuffer serialize(Object metadata) {
37+
if (metadata == null) {
38+
return null;
39+
}
40+
try {
41+
final MetadataWrapper metadataWrapper = new MetadataWrapper(metadata);
42+
return ByteBuffer.wrap(this.delegate.writeValueAsBytes(metadataWrapper));
43+
} catch (IOException e) {
44+
throw Exceptions.propagate(e);
45+
}
46+
}
47+
48+
public static class MetadataWrapper {
49+
50+
private Object metadata;
51+
52+
public MetadataWrapper() {}
53+
54+
public MetadataWrapper(Object metadata) {
55+
this.metadata = metadata;
56+
}
57+
58+
public Object getMetadata() {
59+
return metadata;
60+
}
61+
62+
public void setMetadata(Object metadata) {
63+
this.metadata = metadata;
64+
}
65+
}
66+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.scalecube.cluster.codec.jackson.smile.JacksonSmileMetadataCodec
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.scalecube.cluster.codec.jackson.smile.JacksonSmileMessageCodec

codec-parent/codec-jackson/pom.xml

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns="http://maven.apache.org/POM/4.0.0"
3-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<parent>
66
<artifactId>scalecube-codec-parent</artifactId>
77
<groupId>io.scalecube</groupId>
@@ -12,20 +12,18 @@
1212
<artifactId>scalecube-codec-jackson</artifactId>
1313
<name>ScaleCube/ClusterCodecJackson</name>
1414

15-
<properties>
16-
<jackson.version>2.10.0.pr1</jackson.version>
17-
</properties>
18-
1915
<dependencies>
2016
<dependency>
2117
<groupId>com.fasterxml.jackson.core</groupId>
2218
<artifactId>jackson-core</artifactId>
23-
<version>${jackson.version}</version>
2419
</dependency>
2520
<dependency>
2621
<groupId>com.fasterxml.jackson.core</groupId>
2722
<artifactId>jackson-databind</artifactId>
28-
<version>${jackson.version}</version>
23+
</dependency>
24+
<dependency>
25+
<groupId>com.fasterxml.jackson.datatype</groupId>
26+
<artifactId>jackson-datatype-jsr310</artifactId>
2927
</dependency>
3028
</dependencies>
3129

codec-parent/codec-jackson/src/main/java/io/scalecube/cluster/codec/jackson/DefaultObjectMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.fasterxml.jackson.databind.SerializationFeature;
1111
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
1212

13-
public class DefaultObjectMapper {
13+
final class DefaultObjectMapper {
1414

1515
public static final ObjectMapper OBJECT_MAPPER = initMapper();
1616

codec-parent/codec-jackson/src/main/java/io/scalecube/cluster/codec/jackson/JacksonMessageCodec.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,16 @@
66
import java.io.InputStream;
77
import java.io.OutputStream;
88

9-
/** Jackson-based message codec. */
109
public class JacksonMessageCodec implements MessageCodec {
1110

1211
private final ObjectMapper delegate;
1312

14-
/**
15-
* Create instance with external {@link ObjectMapper}.
16-
*
17-
* @param delegate jackson object mapper
18-
*/
19-
public JacksonMessageCodec(ObjectMapper delegate) {
20-
this.delegate = delegate;
13+
public JacksonMessageCodec() {
14+
this(DefaultObjectMapper.OBJECT_MAPPER);
2115
}
2216

23-
public JacksonMessageCodec() {
24-
this.delegate = DefaultObjectMapper.OBJECT_MAPPER;
17+
public JacksonMessageCodec(ObjectMapper delegate) {
18+
this.delegate = delegate;
2519
}
2620

2721
/**

codec-parent/codec-jackson/src/main/java/io/scalecube/cluster/codec/jackson/JacksonMetadataCodec.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,16 @@
66
import java.nio.ByteBuffer;
77
import reactor.core.Exceptions;
88

9-
/**
10-
* Jackson-based metadata codec.
11-
*
12-
* @author eutkin
13-
*/
149
public class JacksonMetadataCodec implements MetadataCodec {
1510

1611
private final ObjectMapper delegate;
1712

18-
public JacksonMetadataCodec(ObjectMapper delegate) {
19-
this.delegate = delegate;
13+
public JacksonMetadataCodec() {
14+
this(DefaultObjectMapper.OBJECT_MAPPER);
2015
}
2116

22-
public JacksonMetadataCodec() {
23-
this.delegate = DefaultObjectMapper.OBJECT_MAPPER;
17+
public JacksonMetadataCodec(ObjectMapper delegate) {
18+
this.delegate = delegate;
2419
}
2520

2621
@Override

0 commit comments

Comments
 (0)