From 5f4ec0ef316d59eaed390e3c531c0129165143d1 Mon Sep 17 00:00:00 2001 From: Zack Slayton Date: Tue, 17 Dec 2019 10:44:26 -0500 Subject: [PATCH] Allow IonWriters to be reused. --- ion/pom.xml | 2 +- .../jackson/dataformat/ion/IonFactory.java | 12 ++-- .../jackson/dataformat/ion/IonGenerator.java | 11 ++-- .../dataformat/ion/DataBindWriteTest.java | 62 +++++++++++++++---- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/ion/pom.xml b/ion/pom.xml index d9798b172..2ed5982ed 100644 --- a/ion/pom.xml +++ b/ion/pom.xml @@ -26,7 +26,7 @@ tree model) com.amazon.ion ion-java - 1.4.0 + 1.5.1 diff --git a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonFactory.java b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonFactory.java index 2eb87d761..2f771a559 100644 --- a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonFactory.java +++ b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonFactory.java @@ -189,7 +189,7 @@ public IonParser createParser(IonValue value) { * @since 2.7 */ public JsonGenerator createGenerator(IonWriter out) { - return _createGenerator(out, _createContext(out, false), out); + return _createGenerator(out, false, _createContext(out, false), out); } /** @@ -214,7 +214,7 @@ public IonParser createJsonParser(IonValue value) { */ @Deprecated public JsonGenerator createJsonGenerator(IonWriter out) { - return _createGenerator(out, _createContext(out, false), out); + return _createGenerator(out, false, _createContext(out, false), out); } /* @@ -267,7 +267,7 @@ public JsonGenerator createGenerator(Writer out) if (createBinaryWriters()) { throw new IOException("Can only create binary Ion writers that output to OutputStream, not Writer"); } - return _createGenerator(_system.newTextWriter(out), _createContext(out, false), out); + return _createGenerator(_system.newTextWriter(out), true, _createContext(out, false), out); } @Override @@ -340,11 +340,11 @@ protected IonGenerator _createGenerator(OutputStream out, JsonEncoding enc, bool ion = _system.newTextWriter(w); dst = w; } - return _createGenerator(ion, ctxt, dst); + return _createGenerator(ion, true, ctxt, dst); } - protected IonGenerator _createGenerator(IonWriter ion, IOContext ctxt, Closeable dst) + protected IonGenerator _createGenerator(IonWriter ion, boolean ionWriterIsManaged, IOContext ctxt, Closeable dst) { - return new IonGenerator(_generatorFeatures, _objectCodec, ion, ctxt, dst); + return new IonGenerator(_generatorFeatures, _objectCodec, ion, ionWriterIsManaged, ctxt, dst); } } diff --git a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonGenerator.java b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonGenerator.java index a6d0fbb87..fbe5334e3 100644 --- a/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonGenerator.java +++ b/ion/src/main/java/com/fasterxml/jackson/dataformat/ion/IonGenerator.java @@ -54,6 +54,8 @@ public class IonGenerator /* This is the textual or binary writer */ protected final IonWriter _writer; + /* Indicates whether the IonGenerator is responsible for closing the underlying IonWriter. */ + protected final boolean _ionWriterIsManaged; protected final IOContext _ioContext; @@ -70,10 +72,11 @@ public class IonGenerator */ public IonGenerator(int features, ObjectCodec codec, - IonWriter ion, IOContext ctxt, Closeable dst) + IonWriter ion, boolean ionWriterIsManaged, IOContext ctxt, Closeable dst) { super(features, codec); _writer = ion; + _ionWriterIsManaged = ionWriterIsManaged; _ioContext = ctxt; _destination = dst; } @@ -94,9 +97,9 @@ public void close() throws IOException { if (!_closed) { _closed = true; - // force flush the writer - _writer.close(); - // either way + if (_ionWriterIsManaged) { + _writer.close(); + } if (_ioContext.isResourceManaged()) { _destination.close(); } else { diff --git a/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/DataBindWriteTest.java b/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/DataBindWriteTest.java index aa9809c39..f1e5a3918 100644 --- a/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/DataBindWriteTest.java +++ b/ion/src/test/java/com/fasterxml/jackson/dataformat/ion/DataBindWriteTest.java @@ -14,24 +14,26 @@ package com.fasterxml.jackson.dataformat.ion; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.junit.Before; -import org.junit.Test; - -import com.fasterxml.jackson.dataformat.ion.IonFactory; -import com.fasterxml.jackson.dataformat.ion.IonObjectMapper; - import com.amazon.ion.IonDatagram; import com.amazon.ion.IonList; +import com.amazon.ion.IonReader; import com.amazon.ion.IonStruct; import com.amazon.ion.IonSystem; +import com.amazon.ion.IonType; import com.amazon.ion.IonWriter; +import com.amazon.ion.system.IonBinaryWriterBuilder; +import com.amazon.ion.system.IonReaderBuilder; import com.amazon.ion.system.IonSystemBuilder; +import com.amazon.ion.system.IonTextWriterBuilder; +import com.amazon.ion.system.IonWriterBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class DataBindWriteTest { @@ -132,7 +134,19 @@ public void testIntArrayWriteBinary() throws Exception IonDatagram loadedDatagram = ion.newLoader().load(data); assertEquals(expectedArray, loadedDatagram); } - + + @Test + public void testReusingBinaryIonWriter() throws Exception + { + _testIonWriterReuse(IonBinaryWriterBuilder.standard()); + } + + @Test + public void testReusingTextIonWriter() throws Exception + { + _testIonWriterReuse(IonTextWriterBuilder.standard()); + } + // // Helper methods private byte[] _writeAsBytes(Object ob) throws IOException @@ -143,4 +157,26 @@ private byte[] _writeAsBytes(Object ob) throws IOException m.writeValue(out, ob); return out.toByteArray(); } + + private void _testIonWriterReuse(IonWriterBuilder ionWriterBuilder) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024); + IonWriter ionWriter = ionWriterBuilder.build(byteArrayOutputStream); + + IonObjectMapper ionObjectMapper = new IonObjectMapper(); + ionObjectMapper.writeValue(ionWriter, "Animal"); + ionObjectMapper.writeValue(ionWriter, "Vegetable"); + ionObjectMapper.writeValue(ionWriter, "Mineral"); + ionWriter.close(); + + byte[] data = byteArrayOutputStream.toByteArray(); + assertNotNull(data); + + IonReader ionReader = IonReaderBuilder.standard().build(data); + assertEquals(IonType.STRING, ionReader.next()); + assertEquals("Animal", ionReader.stringValue()); + assertEquals(IonType.STRING, ionReader.next()); + assertEquals("Vegetable", ionReader.stringValue()); + assertEquals(IonType.STRING, ionReader.next()); + assertEquals("Mineral", ionReader.stringValue()); + } }