Skip to content

Commit 208b0a7

Browse files
committed
Merge branch '2.10' into 2.11
2 parents 0043642 + bc79f9d commit 208b0a7

File tree

5 files changed

+72
-23
lines changed

5 files changed

+72
-23
lines changed

ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonFactory.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public IonParser createParser(IonValue value) {
189189
* @since 2.7
190190
*/
191191
public JsonGenerator createGenerator(IonWriter out) {
192-
return _createGenerator(out, _createContext(out, false), out);
192+
return _createGenerator(out, false, _createContext(out, false), out);
193193
}
194194

195195
/**
@@ -214,7 +214,7 @@ public IonParser createJsonParser(IonValue value) {
214214
*/
215215
@Deprecated
216216
public JsonGenerator createJsonGenerator(IonWriter out) {
217-
return _createGenerator(out, _createContext(out, false), out);
217+
return _createGenerator(out, false, _createContext(out, false), out);
218218
}
219219

220220
/*
@@ -267,7 +267,7 @@ public JsonGenerator createGenerator(Writer out)
267267
if (createBinaryWriters()) {
268268
throw new IOException("Can only create binary Ion writers that output to OutputStream, not Writer");
269269
}
270-
return _createGenerator(_system.newTextWriter(out), _createContext(out, false), out);
270+
return _createGenerator(_system.newTextWriter(out), true, _createContext(out, false), out);
271271
}
272272

273273
@Override
@@ -340,11 +340,11 @@ protected IonGenerator _createGenerator(OutputStream out, JsonEncoding enc, bool
340340
ion = _system.newTextWriter(w);
341341
dst = w;
342342
}
343-
return _createGenerator(ion, ctxt, dst);
343+
return _createGenerator(ion, true, ctxt, dst);
344344
}
345345

346-
protected IonGenerator _createGenerator(IonWriter ion, IOContext ctxt, Closeable dst)
346+
protected IonGenerator _createGenerator(IonWriter ion, boolean ionWriterIsManaged, IOContext ctxt, Closeable dst)
347347
{
348-
return new IonGenerator(_generatorFeatures, _objectCodec, ion, ctxt, dst);
348+
return new IonGenerator(_generatorFeatures, _objectCodec, ion, ionWriterIsManaged, ctxt, dst);
349349
}
350350
}

ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonGenerator.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public class IonGenerator
5454

5555
/* This is the textual or binary writer */
5656
protected final IonWriter _writer;
57+
/* Indicates whether the IonGenerator is responsible for closing the underlying IonWriter. */
58+
protected final boolean _ionWriterIsManaged;
5759

5860
protected final IOContext _ioContext;
5961

@@ -70,10 +72,11 @@ public class IonGenerator
7072
*/
7173

7274
public IonGenerator(int features, ObjectCodec codec,
73-
IonWriter ion, IOContext ctxt, Closeable dst)
75+
IonWriter ion, boolean ionWriterIsManaged, IOContext ctxt, Closeable dst)
7476
{
7577
super(features, codec);
7678
_writer = ion;
79+
_ionWriterIsManaged = ionWriterIsManaged;
7780
_ioContext = ctxt;
7881
_destination = dst;
7982
}
@@ -94,9 +97,9 @@ public void close() throws IOException
9497
{
9598
if (!_closed) {
9699
_closed = true;
97-
// force flush the writer
98-
_writer.close();
99-
// either way
100+
if (_ionWriterIsManaged) {
101+
_writer.close();
102+
}
100103
if (_ioContext.isResourceManaged()) {
101104
_destination.close();
102105
} else {

ion/src/test/java/com/fasterxml/jackson/dataformat/ion/DataBindWriteTest.java

+49-13
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,26 @@
1414

1515
package com.fasterxml.jackson.dataformat.ion;
1616

17-
import static org.junit.Assert.assertEquals;
18-
import static org.junit.Assert.assertNotNull;
19-
20-
import java.io.ByteArrayOutputStream;
21-
import java.io.IOException;
22-
23-
import org.junit.Before;
24-
import org.junit.Test;
25-
26-
import com.fasterxml.jackson.dataformat.ion.IonFactory;
27-
import com.fasterxml.jackson.dataformat.ion.IonObjectMapper;
28-
2917
import com.amazon.ion.IonDatagram;
3018
import com.amazon.ion.IonList;
19+
import com.amazon.ion.IonReader;
3120
import com.amazon.ion.IonStruct;
3221
import com.amazon.ion.IonSystem;
22+
import com.amazon.ion.IonType;
3323
import com.amazon.ion.IonWriter;
24+
import com.amazon.ion.system.IonBinaryWriterBuilder;
25+
import com.amazon.ion.system.IonReaderBuilder;
3426
import com.amazon.ion.system.IonSystemBuilder;
27+
import com.amazon.ion.system.IonTextWriterBuilder;
28+
import com.amazon.ion.system.IonWriterBuilder;
29+
import org.junit.Before;
30+
import org.junit.Test;
31+
32+
import java.io.ByteArrayOutputStream;
33+
import java.io.IOException;
34+
35+
import static org.junit.Assert.assertEquals;
36+
import static org.junit.Assert.assertNotNull;
3537

3638
public class DataBindWriteTest {
3739

@@ -132,7 +134,19 @@ public void testIntArrayWriteBinary() throws Exception
132134
IonDatagram loadedDatagram = ion.newLoader().load(data);
133135
assertEquals(expectedArray, loadedDatagram);
134136
}
135-
137+
138+
@Test
139+
public void testReusingBinaryIonWriter() throws Exception
140+
{
141+
_testIonWriterReuse(IonBinaryWriterBuilder.standard());
142+
}
143+
144+
@Test
145+
public void testReusingTextIonWriter() throws Exception
146+
{
147+
_testIonWriterReuse(IonTextWriterBuilder.standard());
148+
}
149+
136150
// // Helper methods
137151

138152
private byte[] _writeAsBytes(Object ob) throws IOException
@@ -143,4 +157,26 @@ private byte[] _writeAsBytes(Object ob) throws IOException
143157
m.writeValue(out, ob);
144158
return out.toByteArray();
145159
}
160+
161+
private void _testIonWriterReuse(IonWriterBuilder ionWriterBuilder) throws IOException {
162+
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
163+
IonWriter ionWriter = ionWriterBuilder.build(byteArrayOutputStream);
164+
165+
IonObjectMapper ionObjectMapper = new IonObjectMapper();
166+
ionObjectMapper.writeValue(ionWriter, "Animal");
167+
ionObjectMapper.writeValue(ionWriter, "Vegetable");
168+
ionObjectMapper.writeValue(ionWriter, "Mineral");
169+
ionWriter.close();
170+
171+
byte[] data = byteArrayOutputStream.toByteArray();
172+
assertNotNull(data);
173+
174+
IonReader ionReader = IonReaderBuilder.standard().build(data);
175+
assertEquals(IonType.STRING, ionReader.next());
176+
assertEquals("Animal", ionReader.stringValue());
177+
assertEquals(IonType.STRING, ionReader.next());
178+
assertEquals("Vegetable", ionReader.stringValue());
179+
assertEquals(IonType.STRING, ionReader.next());
180+
assertEquals("Mineral", ionReader.stringValue());
181+
}
146182
}

release-notes/CREDITS-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,7 @@ Yanming Zhou (quaff@github)
117117
* Reported #188: Unexpected `MismatchedInputException` for `byte[]` value bound to `String`
118118
in collection/array
119119
(2.10.1)
120+
121+
Zack Slayton (zslayton@github)
122+
* Reported, contributed fix for #189: IonObjectMapper close()s the provided IonWriter unnecessarily
123+
(2.10.2)

release-notes/VERSION-2.x

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ Project: jackson-datatypes-binaryModules:
1414
fix `java.util.UUID` representation
1515
- `AvroGenerator` overrides `getOutputContext()` properly
1616

17+
2.10.2 (not yet released)
18+
19+
#189: IonObjectMapper close()s the provided IonWriter unnecessarily
20+
(reported, fix contributed by Zack S)
21+
- ion-java dependency 1.4.0 -> 1.5.1
22+
1723
2.10.1 (09-Nov-2019)
1824

1925
#185: (cbor) Internal parsing of tagged arrays can lead to stack overflow

0 commit comments

Comments
 (0)