Skip to content

Commit db347c5

Browse files
committed
Fix a bug when creating nested maps and arrays
1 parent 7559aa9 commit db347c5

File tree

4 files changed

+62
-10
lines changed

4 files changed

+62
-10
lines changed

msgpack-core/src/main/java/org/msgpack/value/holder/ValueHolder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.IOException;
1313
import java.nio.ByteBuffer;
14+
import java.util.ArrayDeque;
1415

1516
import static org.msgpack.core.MessagePackException.UNREACHABLE;
1617

@@ -24,8 +25,8 @@ public class ValueHolder {
2425
private FloatHolder floatHolder = new FloatHolder();
2526
private RawHolder rawHolder = new RawHolder();
2627
private ExtHolder extHolder = new ExtHolder();
27-
private ArrayCursorImpl arrayCursor = new ArrayCursorImpl(this);
28-
private MapCursorImpl mapCursor = new MapCursorImpl(this);
28+
private ArrayCursorImpl arrayCursor;
29+
private MapCursorImpl mapCursor;
2930
private ValueRef currentRef;
3031

3132
public ValueRef getRef() {
@@ -108,12 +109,18 @@ public void setExt(int extType, MessageBuffer b) {
108109

109110
public void prepareArrayCursor(MessageUnpacker unpacker) throws IOException {
110111
vt = ValueType.ARRAY;
112+
113+
// TODO reusing cursor instances
114+
arrayCursor = new ArrayCursorImpl(new ValueHolder());
111115
arrayCursor.reset(unpacker);
112116
currentRef = arrayCursor;
113117
}
114118

115119
public void prepareMapCursor(MessageUnpacker unpacker) throws IOException {
116120
vt = ValueType.MAP;
121+
122+
// TODO reusing cursor instances
123+
mapCursor = new MapCursorImpl(new ValueHolder());
117124
mapCursor.reset(unpacker);
118125
currentRef = mapCursor;
119126
}

msgpack-core/src/main/java/org/msgpack/value/impl/MapCursorImpl.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package org.msgpack.value.impl;
22

3-
import org.msgpack.core.MessageFormatException;
4-
import org.msgpack.core.MessagePacker;
5-
import org.msgpack.core.MessageTypeException;
6-
import org.msgpack.core.MessageUnpacker;
3+
import org.msgpack.core.*;
74
import org.msgpack.value.*;
85
import org.msgpack.value.holder.ValueHolder;
96

@@ -50,7 +47,7 @@ public boolean hasNext() {
5047
@Override
5148
public ValueRef nextKeyOrValue() {
5249
try {
53-
unpacker.unpackValue(valueHolder);
50+
MessageFormat f = unpacker.unpackValue(valueHolder);
5451
cursor++;
5552
return valueHolder.getRef();
5653
}
@@ -78,7 +75,7 @@ public void skipAll() {
7875

7976
private void ensureNotTraversed() {
8077
if(cursor != 0)
81-
throw UNSUPPORTED("ArrayCursor is already traversed");
78+
throw UNSUPPORTED("MapCursor is already traversed");
8279
}
8380

8481

msgpack-core/src/test/scala/org/msgpack/value/CursorTest.scala

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
//
1616
package org.msgpack.value
1717

18+
import java.io.ByteArrayInputStream
19+
1820
import org.msgpack.core.{MessagePack, MessageUnpacker, MessagePackSpec}
1921
import ValueFactory._
2022
import scala.util.Random
21-
import org.msgpack.value.holder.IntegerHolder
23+
import org.msgpack.value.holder.{ValueHolder, IntegerHolder}
2224

2325
/**
2426
* Created on 6/13/14.
@@ -142,8 +144,54 @@ class CursorTest extends MessagePackSpec {
142144
}
143145
}
144146

147+
}
148+
149+
"create immutable map" taggedAs("im-map") in {
150+
151+
val m = createMessagePackData { packer =>
152+
packer.packMapHeader(3)
153+
154+
// A -> [1, "leo"]
155+
packer.packString("A")
156+
packer.packArrayHeader(2)
157+
packer.packInt(1)
158+
packer.packString("leo")
159+
160+
// B -> 10
161+
packer.packString("B")
162+
packer.packInt(10)
163+
164+
// C -> {a -> 1.0f, b -> 5, c -> {cc->1}}
165+
packer.packString("C")
166+
packer.packMapHeader(3)
167+
packer.packString("a")
168+
packer.packFloat(1.0f)
169+
packer.packString("b")
170+
packer.packInt(5)
171+
172+
packer.packString("c")
173+
packer.packMapHeader(1)
174+
packer.packString("cc")
175+
packer.packInt(1)
176+
177+
}
178+
179+
val unpacker = msgpack.newUnpacker(m)
180+
val vh = new ValueHolder
181+
unpacker.unpackValue(vh)
182+
val mapValue = vh.get().asMapValue()
183+
184+
val map = mapValue.toMap
185+
map.size shouldBe 3
186+
187+
val arr = map.get(ValueFactory.newString("A")).asArrayValue()
188+
arr.size shouldBe 2
145189

190+
val cmap = map.get(ValueFactory.newString("C")).asMapValue()
191+
cmap.size shouldBe 3
192+
cmap.toMap.get(ValueFactory.newString("c")).asMapValue().size() shouldBe 1
146193

194+
info(mapValue)
147195
}
148196

149197

version.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version in ThisBuild := "0.7.0-M6-SNAPSHOT"
1+
version in ThisBuild := "0.7.0-p2"

0 commit comments

Comments
 (0)