Skip to content

Commit 473268e

Browse files
committed
Add MessagePackFactory#setExtTypeCustomDesers
1 parent 4112c0e commit 473268e

File tree

5 files changed

+125
-97
lines changed

5 files changed

+125
-97
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//
2+
// MessagePack for Java
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
package org.msgpack.jackson.dataformat;
17+
18+
import com.fasterxml.jackson.core.type.TypeReference;
19+
import com.fasterxml.jackson.databind.ObjectMapper;
20+
21+
import java.io.IOException;
22+
import java.util.Map;
23+
import java.util.concurrent.ConcurrentHashMap;
24+
25+
public class ExtensionTypeCustomDeserializers
26+
{
27+
private final ObjectMapper objectMapper;
28+
private Map<Byte, Deser> deserTable = new ConcurrentHashMap<Byte, Deser>();
29+
30+
public ExtensionTypeCustomDeserializers()
31+
{
32+
objectMapper = new ObjectMapper(new MessagePackFactory().setReuseResourceInParser(false));
33+
}
34+
35+
public <T> void addTargetClass(byte type, final Class<T> klass)
36+
{
37+
deserTable.put(type, new Deser()
38+
{
39+
@Override
40+
public Object deserialize(byte[] data)
41+
throws IOException
42+
{
43+
return objectMapper.readValue(data, klass);
44+
}
45+
});
46+
}
47+
48+
public void addTargetTypeReference(byte type, final TypeReference typeReference)
49+
{
50+
deserTable.put(type, new Deser()
51+
{
52+
@Override
53+
public Object deserialize(byte[] data)
54+
throws IOException
55+
{
56+
return objectMapper.readValue(data, typeReference);
57+
}
58+
});
59+
}
60+
61+
public void addCustomDeser(byte type, final Deser deser)
62+
{
63+
deserTable.put(type, new Deser()
64+
{
65+
@Override
66+
public Object deserialize(byte[] data)
67+
throws IOException
68+
{
69+
return deser.deserialize(data);
70+
}
71+
});
72+
}
73+
74+
public Deser getDeser(byte type)
75+
{
76+
return deserTable.get(type);
77+
}
78+
79+
public void clearEntries()
80+
{
81+
deserTable.clear();
82+
}
83+
84+
public interface Deser
85+
{
86+
Object deserialize(byte[] data)
87+
throws IOException;
88+
}
89+
}
Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
package org.msgpack.jackson.dataformat;
22

33
import com.fasterxml.jackson.core.JsonGenerator;
4-
import com.fasterxml.jackson.core.JsonParser;
54
import com.fasterxml.jackson.core.JsonProcessingException;
6-
import com.fasterxml.jackson.core.type.TypeReference;
7-
import com.fasterxml.jackson.databind.DeserializationContext;
85
import com.fasterxml.jackson.databind.JsonSerializer;
9-
import com.fasterxml.jackson.databind.ObjectMapper;
106
import com.fasterxml.jackson.databind.SerializerProvider;
117
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
12-
import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer;
138

149
import java.io.IOException;
1510
import java.util.Arrays;
16-
import java.util.Map;
17-
import java.util.concurrent.ConcurrentHashMap;
1811

1912
@JsonSerialize(using = MessagePackExtensionType.Serializer.class)
2013
public class MessagePackExtensionType
@@ -79,83 +72,4 @@ public void serialize(MessagePackExtensionType value, JsonGenerator gen, Seriali
7972
}
8073
}
8174
}
82-
83-
public interface Deser
84-
{
85-
Object deserialize(byte[] data)
86-
throws IOException;
87-
}
88-
89-
public static class TypeBasedDeserializer
90-
extends UntypedObjectDeserializer.Vanilla
91-
{
92-
private final ObjectMapper objectMapper;
93-
private Map<Byte, Deser> deserTable = new ConcurrentHashMap<Byte, Deser>();
94-
95-
public TypeBasedDeserializer()
96-
{
97-
MessagePackFactory messagePackFactory = new MessagePackFactory();
98-
messagePackFactory.setReuseResourceInParser(false);
99-
objectMapper = new ObjectMapper(messagePackFactory);
100-
}
101-
102-
public <T> void addTargetClass(byte type, final Class<T> klass)
103-
{
104-
deserTable.put(type, new Deser() {
105-
@Override
106-
public Object deserialize(byte[] data)
107-
throws IOException
108-
{
109-
return objectMapper.readValue(data, klass);
110-
}
111-
});
112-
}
113-
114-
public void addTargetTypeReference(byte type, final TypeReference typeReference)
115-
{
116-
deserTable.put(type, new Deser() {
117-
@Override
118-
public Object deserialize(byte[] data)
119-
throws IOException
120-
{
121-
return objectMapper.readValue(data, typeReference);
122-
}
123-
});
124-
}
125-
126-
public void addCustomDeser(byte type, final Deser deser)
127-
{
128-
deserTable.put(type, new Deser() {
129-
@Override
130-
public Object deserialize(byte[] data)
131-
throws IOException
132-
{
133-
return deser.deserialize(data);
134-
}
135-
});
136-
}
137-
138-
public void clearEntries()
139-
{
140-
deserTable.clear();
141-
}
142-
143-
@Override
144-
public Object deserialize(JsonParser p, DeserializationContext ctxt)
145-
throws IOException
146-
{
147-
Object obj = super.deserialize(p, ctxt);
148-
if (! (obj instanceof MessagePackExtensionType)) {
149-
return obj;
150-
}
151-
152-
MessagePackExtensionType ext = (MessagePackExtensionType) obj;
153-
Deser deser = deserTable.get(ext.getType());
154-
if (deser == null) {
155-
return obj;
156-
}
157-
158-
return deser.deserialize(ext.getData());
159-
}
160-
}
16175
}

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class MessagePackFactory
3939
private final MessagePack.PackerConfig packerConfig;
4040
private boolean reuseResourceInGenerator = true;
4141
private boolean reuseResourceInParser = true;
42+
private ExtensionTypeCustomDeserializers extTypeCustomDesers;
4243

4344
public MessagePackFactory()
4445
{
@@ -50,14 +51,22 @@ public MessagePackFactory(MessagePack.PackerConfig packerConfig)
5051
this.packerConfig = packerConfig;
5152
}
5253

53-
public void setReuseResourceInGenerator(boolean reuseResourceInGenerator)
54+
public MessagePackFactory setReuseResourceInGenerator(boolean reuseResourceInGenerator)
5455
{
5556
this.reuseResourceInGenerator = reuseResourceInGenerator;
57+
return this;
5658
}
5759

58-
public void setReuseResourceInParser(boolean reuseResourceInParser)
60+
public MessagePackFactory setReuseResourceInParser(boolean reuseResourceInParser)
5961
{
6062
this.reuseResourceInParser = reuseResourceInParser;
63+
return this;
64+
}
65+
66+
public MessagePackFactory setExtTypeCustomDesers(ExtensionTypeCustomDeserializers extTypeCustomDesers)
67+
{
68+
this.extTypeCustomDesers = extTypeCustomDesers;
69+
return this;
6170
}
6271

6372
@Override
@@ -102,6 +111,9 @@ protected MessagePackParser _createParser(InputStream in, IOContext ctxt)
102111
throws IOException
103112
{
104113
MessagePackParser parser = new MessagePackParser(ctxt, _parserFeatures, _objectCodec, in, reuseResourceInParser);
114+
if (extTypeCustomDesers != null) {
115+
parser.setExtensionTypeCustomDeserializers(extTypeCustomDesers);
116+
}
105117
return parser;
106118
}
107119

@@ -113,6 +125,9 @@ protected JsonParser _createParser(byte[] data, int offset, int len, IOContext c
113125
data = Arrays.copyOfRange(data, offset, offset + len);
114126
}
115127
MessagePackParser parser = new MessagePackParser(ctxt, _parserFeatures, _objectCodec, data, reuseResourceInParser);
128+
if (extTypeCustomDesers != null) {
129+
parser.setExtensionTypeCustomDeserializers(extTypeCustomDesers);
130+
}
116131
return parser;
117132
}
118133
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public class MessagePackParser
6262
private long tokenPosition;
6363
private long currentPosition;
6464
private final IOContext ioContext;
65+
private ExtensionTypeCustomDeserializers extTypeCustomDesers;
6566

6667
private enum Type
6768
{
@@ -191,6 +192,11 @@ private MessagePackParser(IOContext ctxt,
191192
messageUnpackerHolder.set(new Tuple<Object, MessageUnpacker>(src, messageUnpacker));
192193
}
193194

195+
public void setExtensionTypeCustomDeserializers(ExtensionTypeCustomDeserializers extTypeCustomDesers)
196+
{
197+
this.extTypeCustomDesers = extTypeCustomDesers;
198+
}
199+
194200
@Override
195201
public ObjectCodec getCodec()
196202
{
@@ -551,6 +557,12 @@ public Object getEmbeddedObject()
551557
case BYTES:
552558
return bytesValue;
553559
case EXT:
560+
if (extTypeCustomDesers != null) {
561+
ExtensionTypeCustomDeserializers.Deser deser = extTypeCustomDesers.getDeser(extensionTypeValue.getType());
562+
if (deser != null) {
563+
return deser.deserialize(extensionTypeValue.getData());
564+
}
565+
}
554566
return extensionTypeValue;
555567
default:
556568
throw new IllegalStateException("Invalid type=" + type);

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ public Object deserializeKey(String key, DeserializationContext ctxt)
678678
}
679679

680680
@Test
681-
public void typeBasedDeserialize()
681+
public void extensionTypeCustomDeserializers()
682682
throws IOException
683683
{
684684
ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -717,12 +717,10 @@ public void typeBasedDeserialize()
717717
}
718718
packer.close();
719719

720-
ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
721-
MessagePackExtensionType.TypeBasedDeserializer typeBasedDeserializer
722-
= new MessagePackExtensionType.TypeBasedDeserializer();
723-
typeBasedDeserializer.addTargetClass((byte) 17, NestedListComplexPojo.class);
724-
typeBasedDeserializer.addTargetTypeReference((byte) 99, new TypeReference<Map<String, Integer>>() {});
725-
typeBasedDeserializer.addCustomDeser((byte) 31, new MessagePackExtensionType.Deser() {
720+
ExtensionTypeCustomDeserializers extTypeCustomDesers = new ExtensionTypeCustomDeserializers();
721+
extTypeCustomDesers.addTargetClass((byte) 17, NestedListComplexPojo.class);
722+
extTypeCustomDesers.addTargetTypeReference((byte) 99, new TypeReference<Map<String, Integer>>() {});
723+
extTypeCustomDesers.addCustomDeser((byte) 31, new ExtensionTypeCustomDeserializers.Deser() {
726724
@Override
727725
public Object deserialize(byte[] data)
728726
throws IOException
@@ -734,8 +732,8 @@ public Object deserialize(byte[] data)
734732
}
735733
}
736734
);
737-
SimpleModule module = new SimpleModule("MyModule").addDeserializer(Object.class, typeBasedDeserializer);
738-
objectMapper.registerModule(module);
735+
ObjectMapper objectMapper =
736+
new ObjectMapper(new MessagePackFactory().setExtTypeCustomDesers(extTypeCustomDesers));
739737

740738
List<Object> values = objectMapper.readValue(new ByteArrayInputStream(out.toByteArray()), new TypeReference<List<Object>>() {});
741739
assertThat(values.size(), is(5));

0 commit comments

Comments
 (0)