Skip to content

Commit 5f4ec0e

Browse files
zslaytoncowtowncoder
authored andcommitted
Allow IonWriters to be reused.
1 parent 312fc6a commit 5f4ec0e

File tree

4 files changed

+63
-24
lines changed

4 files changed

+63
-24
lines changed

ion/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ tree model)
2626
<dependency>
2727
<groupId>com.amazon.ion</groupId>
2828
<artifactId>ion-java</artifactId>
29-
<version>1.4.0</version>
29+
<version>1.5.1</version>
3030
</dependency>
3131

3232
<!-- Extends Jackson core, databind -->

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

Lines changed: 6 additions & 6 deletions
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

Lines changed: 7 additions & 4 deletions
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

Lines changed: 49 additions & 13 deletions
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
}

0 commit comments

Comments
 (0)