From be2aedeb1d78565403dc9eb5765d1a0f857bfc06 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 31 Aug 2023 16:58:03 +0100 Subject: [PATCH 1/2] close IOContexts --- .../jackson/dataformat/csv/CsvGenerator.java | 21 ++++++++------- .../jackson/dataformat/csv/CsvParser.java | 11 +++++++- .../javaprop/JavaPropsGenerator.java | 8 +++++- .../dataformat/javaprop/JavaPropsParser.java | 13 +++++++-- .../jackson/dataformat/toml/TomlFactory.java | 8 ++++-- .../dataformat/toml/TomlGenerator.java | 27 ++++++++++--------- .../dataformat/yaml/YAMLGenerator.java | 1 + 7 files changed, 62 insertions(+), 27 deletions(-) diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvGenerator.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvGenerator.java index 76f4cf6d7..224209ccc 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvGenerator.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvGenerator.java @@ -504,17 +504,20 @@ public final void flush() throws IOException { @Override public void close() throws IOException { - super.close(); + if (!isClosed()) { + super.close(); - // Let's mark row as closed, if we had any... - finishRow(); - - // Write the header if necessary, occurs when no rows written - if (_handleFirstLine) { - _handleFirstLine(); + // Let's mark row as closed, if we had any... + finishRow(); + + // Write the header if necessary, occurs when no rows written + if (_handleFirstLine) { + _handleFirstLine(); + } + _writer.close(_ioContext.isResourceManaged() || isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), + isEnabled(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM)); + _ioContext.close(); } - _writer.close(_ioContext.isResourceManaged() || isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), - isEnabled(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM)); } /* diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java index 4df09f825..9f0798890 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java @@ -303,6 +303,11 @@ private Feature(boolean defaultState) { */ protected final StreamReadConstraints _streamReadConstraints; + /** + * @since 2.16 + */ + protected final IOContext _ioContext; + protected int _formatFeatures; /** @@ -411,6 +416,7 @@ public CsvParser(IOContext ctxt, int stdFeatures, int csvFeatures, throw new IllegalArgumentException("Can not pass `null` as `java.io.Reader` to read from"); } _objectCodec = codec; + _ioContext = ctxt; _streamReadConstraints = ctxt.streamReadConstraints(); _textBuffer = ctxt.constructReadConstrainedTextBuffer(); DupDetector dups = JsonParser.Feature.STRICT_DUPLICATE_DETECTION.enabledIn(stdFeatures) @@ -504,7 +510,10 @@ public int releaseBuffered(Writer out) throws IOException { public boolean isClosed() { return _reader.isClosed(); } @Override - public void close() throws IOException { _reader.close(); } + public void close() throws IOException { + _ioContext.close(); + _reader.close(); + } /* /********************************************************** diff --git a/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsGenerator.java b/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsGenerator.java index 581557314..cfb87d475 100644 --- a/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsGenerator.java +++ b/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsGenerator.java @@ -222,7 +222,13 @@ public JsonGenerator overrideFormatFeatures(int values, int mask) { } /********************************************************** */ -// public void close() throws IOException + @Override + public void close() throws IOException { + if (!isClosed()) { + super.close(); + _ioContext.close(); + } + } // public void flush() throws IOException diff --git a/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsParser.java b/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsParser.java index 9df88880e..037064e9e 100644 --- a/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsParser.java +++ b/properties/src/main/java/com/fasterxml/jackson/dataformat/javaprop/JavaPropsParser.java @@ -46,6 +46,11 @@ public class JavaPropsParser extends ParserMinimalBase */ protected final StreamReadConstraints _streamReadConstraints; + /** + * @since 2.16 + */ + protected final IOContext _ioContext; + /** * Although most massaging is done later, caller may be interested in the * ultimate source. @@ -101,6 +106,7 @@ public JavaPropsParser(IOContext ctxt, int parserFeatures, Object inputSource, ObjectCodec codec, Map sourceMap) { super(parserFeatures); + _ioContext = ctxt; _streamReadConstraints = ctxt.streamReadConstraints(); _objectCodec = codec; _inputSource = inputSource; @@ -151,8 +157,11 @@ public int releaseBuffered(Writer w) throws IOException { @Override public void close() throws IOException { - _closed = true; - _readContext = null; + if (!_closed) { + _ioContext.close(); + _closed = true; + _readContext = null; + } } @Override diff --git a/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlFactory.java b/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlFactory.java index 52dd8ea22..539c4db2f 100644 --- a/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlFactory.java +++ b/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlFactory.java @@ -270,8 +270,12 @@ public JsonParser _createParser(InputStream in, IOContext ctxt) throws IOExcepti @Override public JsonParser _createParser(Reader r, IOContext ctxt) throws IOException { - ObjectNode node = parse(ctxt, r); - return new TreeTraversingParser(node); // don't pass our _objectCodec, this part shouldn't be customized + try { + ObjectNode node = parse(ctxt, r); + return new TreeTraversingParser(node); // don't pass our _objectCodec, this part shouldn't be customized + } finally { + ctxt.close(); + } } @Override diff --git a/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlGenerator.java b/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlGenerator.java index 50fc44f50..f7688f47f 100644 --- a/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlGenerator.java +++ b/toml/src/main/java/com/fasterxml/jackson/dataformat/toml/TomlGenerator.java @@ -120,20 +120,23 @@ public Version version() { @Override public void close() throws IOException { - super.close(); - _flushBuffer(); - _outputTail = 0; // just to ensure we don't think there's anything buffered - - if (_out != null) { - if (_ioContext.isResourceManaged() || isEnabled(StreamWriteFeature.AUTO_CLOSE_TARGET)) { - _out.close(); - } else if (isEnabled(StreamWriteFeature.FLUSH_PASSED_TO_STREAM)) { - // If we can't close it, we should at least flush - _out.flush(); + if (!isClosed()) { + super.close(); + _flushBuffer(); + _outputTail = 0; // just to ensure we don't think there's anything buffered + + if (_out != null) { + if (_ioContext.isResourceManaged() || isEnabled(StreamWriteFeature.AUTO_CLOSE_TARGET)) { + _out.close(); + } else if (isEnabled(StreamWriteFeature.FLUSH_PASSED_TO_STREAM)) { + // If we can't close it, we should at least flush + _out.flush(); + } } + _ioContext.close(); + // Internal buffer(s) generator has can now be released as well + _releaseBuffers(); } - // Internal buffer(s) generator has can now be released as well - _releaseBuffers(); } @Override diff --git a/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java b/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java index b9819dfa2..8a5a62a66 100644 --- a/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java +++ b/yaml/src/main/java/com/fasterxml/jackson/dataformat/yaml/YAMLGenerator.java @@ -583,6 +583,7 @@ public void close() throws IOException _writer.flush(); } } + _ioContext.close(); } } From 127c707048ef5bed6b49769945461929f4960ba7 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 31 Aug 2023 17:01:07 +0100 Subject: [PATCH 2/2] Update CsvParser.java --- .../com/fasterxml/jackson/dataformat/csv/CsvParser.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java index 9f0798890..b6dac4e20 100644 --- a/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java +++ b/csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvParser.java @@ -511,8 +511,10 @@ public int releaseBuffered(Writer out) throws IOException { @Override public void close() throws IOException { - _ioContext.close(); - _reader.close(); + if (!isClosed()) { + _reader.close(); + _ioContext.close(); + } } /*