Skip to content

Commit c9d07aa

Browse files
committed
Merge pull request #364 from komamitsu/complex_type_key
Support complex type key in MessagePackGenerator
2 parents abe3087 + 8559c14 commit c9d07aa

File tree

3 files changed

+79
-9
lines changed

3 files changed

+79
-9
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class MessagePackFactory
3737
private static final long serialVersionUID = 2578263992015504347L;
3838

3939
private final MessagePack.PackerConfig packerConfig;
40+
private boolean reuseResourceInGenerator = true;
4041

4142
public MessagePackFactory()
4243
{
@@ -48,11 +49,16 @@ public MessagePackFactory(MessagePack.PackerConfig packerConfig)
4849
this.packerConfig = packerConfig;
4950
}
5051

52+
public void setReuseResourceInGenerator(boolean reuseResourceInGenerator)
53+
{
54+
this.reuseResourceInGenerator = reuseResourceInGenerator;
55+
}
56+
5157
@Override
5258
public JsonGenerator createGenerator(OutputStream out, JsonEncoding enc)
5359
throws IOException
5460
{
55-
return new MessagePackGenerator(_generatorFeatures, _objectCodec, out, packerConfig);
61+
return new MessagePackGenerator(_generatorFeatures, _objectCodec, out, packerConfig, reuseResourceInGenerator);
5662
}
5763

5864
@Override

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.msgpack.core.MessagePacker;
2727
import org.msgpack.core.buffer.OutputStreamBufferOutput;
2828

29+
import java.io.ByteArrayOutputStream;
2930
import java.io.IOException;
3031
import java.io.OutputStream;
3132
import java.math.BigDecimal;
@@ -42,6 +43,8 @@ public class MessagePackGenerator
4243
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
4344
private final MessagePacker messagePacker;
4445
private static ThreadLocal<OutputStreamBufferOutput> messageBufferOutputHolder = new ThreadLocal<OutputStreamBufferOutput>();
46+
private final OutputStream output;
47+
private final MessagePack.PackerConfig packerConfig;
4548
private LinkedList<StackItem> stack;
4649
private StackItem rootStackItem;
4750

@@ -97,20 +100,35 @@ List<Object> getKeys()
97100
}
98101
}
99102

100-
public MessagePackGenerator(int features, ObjectCodec codec, OutputStream out, MessagePack.PackerConfig packerConfig)
103+
public MessagePackGenerator(
104+
int features,
105+
ObjectCodec codec,
106+
OutputStream out,
107+
MessagePack.PackerConfig packerConfig,
108+
boolean reuseResourceInGenerator)
101109
throws IOException
102110
{
103111
super(features, codec);
104-
OutputStreamBufferOutput messageBufferOutput = messageBufferOutputHolder.get();
105-
if (messageBufferOutput == null) {
106-
messageBufferOutput = new OutputStreamBufferOutput(out);
112+
this.output = out;
113+
114+
OutputStreamBufferOutput messageBufferOutput;
115+
if (reuseResourceInGenerator) {
116+
messageBufferOutput = messageBufferOutputHolder.get();
117+
if (messageBufferOutput == null) {
118+
messageBufferOutput = new OutputStreamBufferOutput(out);
119+
messageBufferOutputHolder.set(messageBufferOutput);
120+
}
121+
else {
122+
messageBufferOutput.reset(out);
123+
}
107124
}
108125
else {
109-
messageBufferOutput.reset(out);
126+
messageBufferOutput = new OutputStreamBufferOutput(out);
110127
}
111-
messageBufferOutputHolder.set(messageBufferOutput);
112-
113128
this.messagePacker = packerConfig.newPacker(messageBufferOutput);
129+
130+
this.packerConfig = packerConfig;
131+
114132
this.stack = new LinkedList<StackItem>();
115133
}
116134

@@ -224,7 +242,11 @@ else if (v instanceof MessagePackExtensionType) {
224242
messagePacker.writePayload(extData);
225243
}
226244
else {
227-
throw new IllegalArgumentException(v.toString());
245+
messagePacker.flush();
246+
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
247+
MessagePackGenerator messagePackGenerator = new MessagePackGenerator(getFeatureMask(), getCodec(), outputStream, packerConfig, false);
248+
getCodec().writeValue(messagePackGenerator, v);
249+
output.write(outputStream.toByteArray());
228250
}
229251
}
230252

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,4 +690,46 @@ else if (keyName.equals("bigIntMap")) {
690690
}
691691
}
692692
}
693+
694+
@Test
695+
public void testComplexTypeKey()
696+
throws IOException
697+
{
698+
HashMap<TinyPojo, Integer> map = new HashMap<TinyPojo, Integer>();
699+
TinyPojo pojo = new TinyPojo();
700+
pojo.t = "foo";
701+
map.put(pojo, 42);
702+
703+
ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
704+
objectMapper.setSerializerFactory(new MessagePackSerializerFactory());
705+
byte[] bytes = objectMapper.writeValueAsBytes(map);
706+
707+
MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes);
708+
assertThat(unpacker.unpackMapHeader(), is(1));
709+
assertThat(unpacker.unpackMapHeader(), is(1));
710+
assertThat(unpacker.unpackString(), is("t"));
711+
assertThat(unpacker.unpackString(), is("foo"));
712+
assertThat(unpacker.unpackInt(), is(42));
713+
}
714+
715+
@Test
716+
public void testComplexTypeKeyWithV06Format()
717+
throws IOException
718+
{
719+
HashMap<TinyPojo, Integer> map = new HashMap<TinyPojo, Integer>();
720+
TinyPojo pojo = new TinyPojo();
721+
pojo.t = "foo";
722+
map.put(pojo, 42);
723+
724+
ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
725+
objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
726+
objectMapper.setSerializerFactory(new MessagePackSerializerFactory());
727+
byte[] bytes = objectMapper.writeValueAsBytes(map);
728+
729+
MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes);
730+
assertThat(unpacker.unpackMapHeader(), is(1));
731+
assertThat(unpacker.unpackArrayHeader(), is(1));
732+
assertThat(unpacker.unpackString(), is("foo"));
733+
assertThat(unpacker.unpackInt(), is(42));
734+
}
693735
}

0 commit comments

Comments
 (0)