Skip to content

Commit d2c1760

Browse files
committed
Fix MessagePackGenerator#flush not to output data more than once and add some tests
1 parent 4a92393 commit d2c1760

File tree

4 files changed

+100
-5
lines changed

4 files changed

+100
-5
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
import com.fasterxml.jackson.core.*;
1919
import com.fasterxml.jackson.core.io.IOContext;
2020

21-
import java.io.IOException;
22-
import java.io.InputStream;
23-
import java.io.OutputStream;
21+
import java.io.*;
2422
import java.util.Arrays;
2523

2624
public class MessagePackFactory extends JsonFactory {
@@ -33,6 +31,16 @@ public JsonGenerator createGenerator(OutputStream out, JsonEncoding enc) throws
3331
return new MessagePackGenerator(messagePackGeneratorFeature, _objectCodec, out);
3432
}
3533

34+
@Override
35+
public JsonGenerator createGenerator(File f, JsonEncoding enc) throws IOException {
36+
return createGenerator(new FileOutputStream(f), enc);
37+
}
38+
39+
@Override
40+
public JsonGenerator createGenerator(Writer w) throws IOException {
41+
throw new UnsupportedOperationException();
42+
}
43+
3644
@Override
3745
public JsonParser createParser(byte[] data) throws IOException, JsonParseException {
3846
IOContext ioContext = _createContext(data, false);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ else if (rootStackItem instanceof StackItemForArray) {
327327
else {
328328
throw new IllegalStateException("Unexpected rootStackItem: " + rootStackItem);
329329
}
330+
rootStackItem = null;
330331
MessagePacker messagePacker = getMessagePacker();
331332
messagePacker.flush();
332333
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,23 @@
1515
//
1616
package org.msgpack.jackson.dataformat;
1717

18+
import com.fasterxml.jackson.core.JsonEncoding;
19+
import com.fasterxml.jackson.core.JsonGenerator;
1820
import org.junit.Test;
21+
import org.msgpack.core.MessagePack;
1922
import org.msgpack.core.MessageUnpacker;
2023
import org.msgpack.core.buffer.ArrayBufferInput;
2124

25+
import java.io.File;
26+
import java.io.FileInputStream;
2227
import java.io.IOException;
2328
import java.util.ArrayList;
2429
import java.util.HashMap;
2530
import java.util.List;
2631
import java.util.Map;
2732

2833
import static org.junit.Assert.assertEquals;
34+
import static org.junit.Assert.assertFalse;
2935
import static org.junit.Assert.assertTrue;
3036

3137
public class MessagePackGeneratorTest extends MessagePackDataformatTestBase {
@@ -189,4 +195,30 @@ else if (key.equals("num")) {
189195
// #7
190196
assertEquals(false, messageUnpacker.unpackBoolean());
191197
}
198+
199+
@Test
200+
public void testMessagePackGeneratorDirectly() throws IOException {
201+
MessagePackFactory messagePackFactory = new MessagePackFactory();
202+
File tempFile = File.createTempFile("msgpackTest", "msgpack");
203+
tempFile.deleteOnExit();
204+
205+
JsonGenerator generator = messagePackFactory.createGenerator(tempFile, JsonEncoding.UTF8);
206+
assertTrue(generator instanceof MessagePackGenerator);
207+
generator.writeStartArray();
208+
generator.writeNumber(0);
209+
generator.writeString("one");
210+
generator.writeNumber(2.0f);
211+
generator.writeEndArray();
212+
generator.flush();
213+
generator.flush(); // intentional
214+
generator.close();
215+
216+
FileInputStream fileInputStream = new FileInputStream(tempFile);
217+
MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(fileInputStream);
218+
assertEquals(3, unpacker.unpackArrayHeader());
219+
assertEquals(0, unpacker.unpackInt());
220+
assertEquals("one", unpacker.unpackString());
221+
assertEquals(2.0f, unpacker.unpackFloat(), 0.001f);
222+
assertFalse(unpacker.hasNext());
223+
}
192224
}

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

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package org.msgpack.jackson.dataformat;
22

3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonToken;
35
import com.fasterxml.jackson.core.type.TypeReference;
46
import org.junit.Test;
7+
import org.msgpack.core.MessagePack;
58
import org.msgpack.core.MessagePacker;
69
import org.msgpack.core.buffer.OutputStreamBufferOutput;
710

8-
import java.io.IOException;
9-
import java.io.Serializable;
11+
import java.io.*;
1012
import java.math.BigInteger;
1113
import java.util.Arrays;
1214
import java.util.List;
1315
import java.util.Map;
1416

1517
import static org.junit.Assert.assertEquals;
18+
import static org.junit.Assert.assertTrue;
1619

1720
public class MessagePackParserTest extends MessagePackDataformatTestBase {
1821
@Test
@@ -224,4 +227,55 @@ else if (k.equals("child_map_age")) {
224227
// #10
225228
assertEquals(true, array.get(i++));
226229
}
230+
231+
@Test
232+
public void testMessagePackParserDirectly() throws IOException {
233+
MessagePackFactory messagePackFactory = new MessagePackFactory();
234+
File tempFile = File.createTempFile("msgpackTest", "msgpack");
235+
tempFile.deleteOnExit();
236+
237+
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
238+
MessagePacker packer = MessagePack.newDefaultPacker(fileOutputStream);
239+
packer.packMapHeader(2);
240+
packer.packString("zero");
241+
packer.packInt(0);
242+
packer.packString("one");
243+
packer.packFloat(1.0f);
244+
packer.close();
245+
246+
JsonParser parser = messagePackFactory.createParser(tempFile);
247+
assertTrue(parser instanceof MessagePackParser);
248+
249+
JsonToken jsonToken = parser.nextToken();
250+
assertEquals(JsonToken.START_OBJECT, jsonToken);
251+
252+
jsonToken = parser.nextToken();
253+
assertEquals(JsonToken.FIELD_NAME, jsonToken);
254+
assertEquals("zero", parser.getCurrentName());
255+
256+
jsonToken = parser.nextToken();
257+
assertEquals(JsonToken.VALUE_NUMBER_INT, jsonToken);
258+
assertEquals(0, parser.getIntValue());
259+
260+
jsonToken = parser.nextToken();
261+
assertEquals(JsonToken.FIELD_NAME, jsonToken);
262+
assertEquals("one", parser.getCurrentName());
263+
264+
jsonToken = parser.nextToken();
265+
assertEquals(JsonToken.VALUE_NUMBER_FLOAT, jsonToken);
266+
assertEquals(1.0f, parser.getIntValue(), 0.001f);
267+
268+
jsonToken = parser.nextToken();
269+
assertEquals(JsonToken.END_OBJECT, jsonToken);
270+
271+
try {
272+
parser.nextToken();
273+
assertTrue(false);
274+
}
275+
catch (EOFException e) {
276+
// Expected
277+
}
278+
parser.close();
279+
parser.close(); // Intentional
280+
}
227281
}

0 commit comments

Comments
 (0)