Skip to content

Commit b79f4a0

Browse files
authored
Merge pull request msgpack#454 from msgpack/support-jackson-om-copy
Support ObjectMapper#copy with MessagePackFactory
2 parents 9e43f79 + b82e4d3 commit b79f4a0

3 files changed

Lines changed: 103 additions & 0 deletions

File tree

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/ExtensionTypeCustomDeserializers.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ public ExtensionTypeCustomDeserializers()
3232
objectMapper = new ObjectMapper(new MessagePackFactory().setReuseResourceInParser(false));
3333
}
3434

35+
public ExtensionTypeCustomDeserializers(ExtensionTypeCustomDeserializers src)
36+
{
37+
this();
38+
this.deserTable.putAll(src.deserTable);
39+
}
40+
3541
public <T> void addTargetClass(byte type, final Class<T> klass)
3642
{
3743
deserTable.put(type, new Deser()

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackFactory.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.fasterxml.jackson.core.JsonParser;
2323
import com.fasterxml.jackson.core.io.IOContext;
2424
import org.msgpack.core.MessagePack;
25+
import org.msgpack.core.annotations.VisibleForTesting;
2526

2627
import java.io.File;
2728
import java.io.FileOutputStream;
@@ -51,6 +52,15 @@ public MessagePackFactory(MessagePack.PackerConfig packerConfig)
5152
this.packerConfig = packerConfig;
5253
}
5354

55+
public MessagePackFactory(MessagePackFactory src)
56+
{
57+
super(src, null);
58+
this.packerConfig = src.packerConfig.clone();
59+
this.reuseResourceInGenerator = src.reuseResourceInGenerator;
60+
this.reuseResourceInParser = src.reuseResourceInParser;
61+
this.extTypeCustomDesers = new ExtensionTypeCustomDeserializers(src.extTypeCustomDesers);
62+
}
63+
5464
public MessagePackFactory setReuseResourceInGenerator(boolean reuseResourceInGenerator)
5565
{
5666
this.reuseResourceInGenerator = reuseResourceInGenerator;
@@ -130,4 +140,34 @@ protected JsonParser _createParser(byte[] data, int offset, int len, IOContext c
130140
}
131141
return parser;
132142
}
143+
144+
@Override
145+
public JsonFactory copy()
146+
{
147+
return new MessagePackFactory(this);
148+
}
149+
150+
@VisibleForTesting
151+
MessagePack.PackerConfig getPackerConfig()
152+
{
153+
return packerConfig;
154+
}
155+
156+
@VisibleForTesting
157+
boolean isReuseResourceInGenerator()
158+
{
159+
return reuseResourceInGenerator;
160+
}
161+
162+
@VisibleForTesting
163+
boolean isReuseResourceInParser()
164+
{
165+
return reuseResourceInParser;
166+
}
167+
168+
@VisibleForTesting
169+
ExtensionTypeCustomDeserializers getExtTypeCustomDesers()
170+
{
171+
return extTypeCustomDesers;
172+
}
133173
}

msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackFactoryTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,26 @@
1616
package org.msgpack.jackson.dataformat;
1717

1818
import com.fasterxml.jackson.core.JsonEncoding;
19+
import com.fasterxml.jackson.core.JsonFactory;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.core.JsonParser;
22+
import com.fasterxml.jackson.core.type.TypeReference;
23+
import com.fasterxml.jackson.databind.AnnotationIntrospector;
24+
import com.fasterxml.jackson.databind.ObjectMapper;
2125
import org.junit.Test;
26+
import org.msgpack.core.MessagePack;
2227

2328
import java.io.IOException;
29+
import java.util.Collection;
30+
import java.util.HashMap;
31+
import java.util.Map;
2432

33+
import static org.hamcrest.CoreMatchers.instanceOf;
34+
import static org.hamcrest.CoreMatchers.is;
35+
import static org.hamcrest.CoreMatchers.notNullValue;
36+
import static org.hamcrest.CoreMatchers.nullValue;
2537
import static org.junit.Assert.assertEquals;
38+
import static org.junit.Assert.assertThat;
2639

2740
public class MessagePackFactoryTest
2841
extends MessagePackDataformatTestBase
@@ -43,4 +56,48 @@ public void testCreateParser()
4356
JsonParser parser = factory.createParser(in);
4457
assertEquals(MessagePackParser.class, parser.getClass());
4558
}
59+
60+
@Test
61+
public void copy()
62+
throws IOException
63+
{
64+
ExtensionTypeCustomDeserializers extTypeCustomDesers = new ExtensionTypeCustomDeserializers();
65+
extTypeCustomDesers.addTargetClass((byte) 42, TinyPojo.class);
66+
67+
MessagePack.PackerConfig msgpackPackerConfig = new MessagePack.PackerConfig().withStr8FormatSupport(false);
68+
69+
MessagePackFactory messagePackFactory = new MessagePackFactory(msgpackPackerConfig);
70+
messagePackFactory.setExtTypeCustomDesers(extTypeCustomDesers);
71+
72+
ObjectMapper objectMapper = new ObjectMapper(messagePackFactory);
73+
74+
objectMapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
75+
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
76+
77+
objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
78+
79+
ObjectMapper copiedObjectMapper = objectMapper.copy();
80+
JsonFactory copiedFactory = copiedObjectMapper.getFactory();
81+
assertThat(copiedFactory, is(instanceOf(MessagePackFactory.class)));
82+
MessagePackFactory copiedMessagePackFactory = (MessagePackFactory) copiedFactory;
83+
84+
assertThat(copiedMessagePackFactory.getPackerConfig().isStr8FormatSupport(), is(false));
85+
86+
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 42), is(notNullValue()));
87+
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 43), is(nullValue()));
88+
89+
assertThat(copiedMessagePackFactory.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), is(false));
90+
assertThat(copiedMessagePackFactory.isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE), is(false));
91+
92+
Collection<AnnotationIntrospector> annotationIntrospectors = copiedObjectMapper.getSerializationConfig().getAnnotationIntrospector().allIntrospectors();
93+
assertThat(annotationIntrospectors.size(), is(1));
94+
assertThat(annotationIntrospectors.stream().findFirst().get(), is(instanceOf(JsonArrayFormat.class)));
95+
96+
HashMap<String, Integer> map = new HashMap<>();
97+
map.put("one", 1);
98+
Map<String, Integer> deserialized = copiedObjectMapper
99+
.readValue(objectMapper.writeValueAsBytes(map), new TypeReference<Map<String, Integer>>() {});
100+
assertThat(deserialized.size(), is(1));
101+
assertThat(deserialized.get("one"), is(1));
102+
}
46103
}

0 commit comments

Comments
 (0)