From 28196c6a5edd359d2145c461d7faf355633355da Mon Sep 17 00:00:00 2001 From: Yoann Vernageau <6807151+yvrng@users.noreply.github.com> Date: Sun, 21 Apr 2024 16:57:56 +0200 Subject: [PATCH] Don't close IonParser on EOF to be compatible with MappingIterator when source is an empty InputStream --- .../jackson/dataformat/ion/IonParser.java | 1 - .../ion/sequence/MappingIteratorTest.java | 50 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 ion/src/test/java/com/fasterxml/jackson/dataformat/ion/sequence/MappingIteratorTest.java diff --git a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonParser.java b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonParser.java index ecde53318..e449a9e69 100644 --- a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonParser.java +++ b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonParser.java @@ -676,7 +676,6 @@ public JsonToken nextToken() throws IOException } if (type == null) { if (_parsingContext.inRoot()) { // EOF? - close(); _currToken = null; } else { _parsingContext = _parsingContext.getParent(); diff --git a/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/sequence/MappingIteratorTest.java b/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/sequence/MappingIteratorTest.java new file mode 100644 index 000000000..62f6d1239 --- /dev/null +++ b/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/sequence/MappingIteratorTest.java @@ -0,0 +1,50 @@ +package com.fasterxml.jackson.dataformat.ion.sequence; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.fasterxml.jackson.databind.MappingIterator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SequenceWriter; +import com.fasterxml.jackson.dataformat.ion.IonObjectMapper; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import org.junit.Test; + +public class MappingIteratorTest { + + private static final ObjectMapper MAPPER = new IonObjectMapper(); + + @Test + public void testReadFromWrite() throws Exception { + final Object[] values = new String[]{"1", "2", "3", "4"}; + + // write + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (SequenceWriter seq = MAPPER.writer().writeValues(out)) { + for (Object value : values) { + seq.write(value); + } + } + + // read + final ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + try (MappingIterator it = MAPPER.readerFor(Object.class).readValues(in)) { + for (Object value : values) { + assertTrue(it.hasNext()); + assertTrue(it.hasNext()); // should not alter the iterator state + assertEquals(value, it.next()); + } + assertFalse(it.hasNext()); + } + } + + @Test + public void testReadFromEmpty() throws Exception { + final ByteArrayInputStream in = new ByteArrayInputStream(new byte[0]); + try (MappingIterator it = MAPPER.readerFor(Object.class).readValues(in)) { + assertFalse(it.hasNext()); + } + } +}