From f6fee2f3bceca8e17de0934df81052bb9dea91e8 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Thu, 27 Jul 2023 23:57:58 +0900 Subject: [PATCH 01/10] Add ErrorReportConfiguration --- .../core/ErrorReportConfiguration.java | 191 ++++++++++++++++++ .../core/ErrorReportConfigurationTest.java | 96 +++++++++ 2 files changed, 287 insertions(+) create mode 100644 src/main/java/com/fasterxml/jackson/core/ErrorReportConfiguration.java create mode 100644 src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java diff --git a/src/main/java/com/fasterxml/jackson/core/ErrorReportConfiguration.java b/src/main/java/com/fasterxml/jackson/core/ErrorReportConfiguration.java new file mode 100644 index 0000000000..5ad4c27738 --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/core/ErrorReportConfiguration.java @@ -0,0 +1,191 @@ +package com.fasterxml.jackson.core; + +import java.io.Serializable; + +/** + * Container for configuration values used when handling errorneous token inputs. + * For example, unquoted text segments. + *

+ * Currently default settings are + *

+ * + * @since 2.16 + */ +public class ErrorReportConfiguration + implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * Default value for {@link #_maxErrorTokenLength}. + */ + public static final int DEFAULT_MAX_ERROR_TOKEN_LENGTH = 256; + + /** + * Previous was {@link com.fasterxml.jackson.core.io.ContentReference#DEFAULT_MAX_CONTENT_SNIPPET}. + * Default value for {@link #_maxRawContentLength}. + */ + public static final int DEFAULT_MAX_RAW_CONTENT_LENGTH = 500; + + /** + * Maximum length of token to include in error messages + * + * @see Builder#maxErrorTokenLength(int) + */ + protected final int _maxErrorTokenLength; + + /** + * Maximum length of raw content to include in error messages + * + * @see Builder#maxRawContentLength(int) + */ + protected final int _maxRawContentLength; + + private static ErrorReportConfiguration DEFAULT = + new ErrorReportConfiguration(DEFAULT_MAX_ERROR_TOKEN_LENGTH, DEFAULT_MAX_RAW_CONTENT_LENGTH); + + public static void overrideDefaultErrorReportConfiguration(final ErrorReportConfiguration errorReportConfiguration) { + if (errorReportConfiguration == null) { + DEFAULT = new ErrorReportConfiguration(DEFAULT_MAX_ERROR_TOKEN_LENGTH, DEFAULT_MAX_RAW_CONTENT_LENGTH); + } else { + DEFAULT = errorReportConfiguration; + } + } + + /* + /********************************************************************** + /* Builder + /********************************************************************** + */ + + public static final class Builder { + private int maxErrorTokenLength; + private int maxRawContentLength; + + /** + * @param maxErrorTokenLength Constraints + * @return This factory instance (to allow call chaining) + * @throws IllegalArgumentException if {@code maxErrorTokenLength} is less than 0 + */ + public Builder maxErrorTokenLength(final int maxErrorTokenLength) { + validateMaxErrorTokenLength(maxErrorTokenLength); + this.maxErrorTokenLength = maxErrorTokenLength; + return this; + } + + /** + * + * @see ErrorReportConfiguration#_maxRawContentLength + * @return This factory instance (to allow call chaining) + */ + public Builder maxRawContentLength(final int maxRawContentLength) { + validateMaxRawContentLength(maxRawContentLength); + this.maxRawContentLength = maxRawContentLength; + return this; + } + + Builder() { + this(DEFAULT_MAX_ERROR_TOKEN_LENGTH, DEFAULT_MAX_RAW_CONTENT_LENGTH); + } + + Builder(final int maxErrorTokenLength, final int maxRawContentLength) { + this.maxErrorTokenLength = maxErrorTokenLength; + this.maxRawContentLength = maxRawContentLength; + } + + Builder(ErrorReportConfiguration src) { + this.maxErrorTokenLength = src._maxErrorTokenLength; + this.maxRawContentLength = src._maxRawContentLength; + } + + public ErrorReportConfiguration build() { + return new ErrorReportConfiguration(maxErrorTokenLength, maxRawContentLength); + } + } + + /* + /********************************************************************** + /* Life-cycle + /********************************************************************** + */ + + protected ErrorReportConfiguration(final int maxErrorTokenLength, final int maxRawContentLength) { + _maxErrorTokenLength = maxErrorTokenLength; + _maxRawContentLength = maxRawContentLength; + } + + public static Builder builder() { + return new Builder(); + } + + /** + * @return the default {@link ErrorReportConfiguration} (when none is set on the {@link JsonFactory} explicitly) + * @see #overrideDefaultErrorReportConfiguration(ErrorReportConfiguration) + */ + public static ErrorReportConfiguration defaults() { + return DEFAULT; + } + + /** + * @return New {@link Builder} initialized with settings of configuration + * instance + */ + public Builder rebuild() { + return new Builder(this); + } + + /* + /********************************************************************** + /* Accessors + /********************************************************************** + */ + + /** + * Accessor for {@link #_maxErrorTokenLength} + * + * @return Maximum length of token to include in error messages + * @see Builder#maxErrorTokenLength(int) + */ + public int getMaxErrorTokenLength() { + return _maxErrorTokenLength; + } + + /** + * Accessor for {@link #_maxRawContentLength} + * + * @return Maximum length of token to include in error messages + * @see Builder#maxRawContentLength + */ + public int getMaxRawContentLength() { + return _maxRawContentLength; + } + + /* + /********************************************************************** + /* Convenience methods for validation + /********************************************************************** + */ + + /** + * Convenience method that can be used verify valid {@link #_maxErrorTokenLength}. + * If invalid value is passed in, {@link IllegalArgumentException} is thrown. + * + * @param maxErrorTokenLength Maximum length of token to include in error messages + */ + private static void validateMaxErrorTokenLength(int maxErrorTokenLength) throws IllegalArgumentException { + if (maxErrorTokenLength < 0) { + throw new IllegalArgumentException( + String.format("Value of maxErrorTokenLength (%d) cannot be negative", maxErrorTokenLength)); + } + } + + private static void validateMaxRawContentLength(int maxRawContentLength) { + if (maxRawContentLength < 0) { + throw new IllegalArgumentException( + String.format("Value of maxRawContentLength (%d) cannot be negative", maxRawContentLength)); + } + } + +} diff --git a/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java new file mode 100644 index 0000000000..48458ba0e1 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java @@ -0,0 +1,96 @@ +package com.fasterxml.jackson.core; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; + +public class ErrorReportConfigurationTest +{ + @Test + public void testMaxErrorTokenLength() + { + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + int maxLength = 128; + builder.maxErrorTokenLength(maxLength); + ErrorReportConfiguration config = builder.build(); + assertEquals(maxLength, config.getMaxErrorTokenLength()); + } + + @Test + public void testInvalidMaxErrorTokenLength() + { + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + try { + builder.maxErrorTokenLength(-1); + fail("Should not reach here as exception is expected"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + @Test + public void testMaxRawContentLength() + { + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + int maxLength = 256; + builder.maxRawContentLength(maxLength); + ErrorReportConfiguration config = builder.build(); + assertEquals(maxLength, config.getMaxRawContentLength()); + } + + @Test + public void testInvalidMaxRawContentLength() + { + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + try { + builder.maxRawContentLength(-1); + fail("Should not reach here as exception is expected"); + } catch (IllegalArgumentException ex) { + // expected + } + } + + @Test + public void testDefaults() + { + ErrorReportConfiguration config = ErrorReportConfiguration.defaults(); + + // default value + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH, config.getMaxErrorTokenLength()); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH, config.getMaxRawContentLength()); + + // equals + assertEquals(ErrorReportConfiguration.defaults(), ErrorReportConfiguration.defaults()); + } + + @Test + public void testOverrideDefaultErrorReportConfiguration() + { + // try override static + ErrorReportConfiguration newConfig = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(128) + .maxRawContentLength(256) + .build(); + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(newConfig); + + ErrorReportConfiguration config = ErrorReportConfiguration.defaults(); + assertEquals(128, config.getMaxErrorTokenLength()); + assertEquals(256, config.getMaxRawContentLength()); + + // IMPORTANT : make sure to revert back, otherwise other tests will be affected + ErrorReportConfiguration defaultConfig = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH) + .maxRawContentLength(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH) + .build(); + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(defaultConfig); + } + + @Test + public void testRebuild() + { + ErrorReportConfiguration config = new ErrorReportConfiguration.Builder().build(); + ErrorReportConfiguration rebuiltConfig = config.rebuild().build(); + assertEquals(config.getMaxErrorTokenLength(), rebuiltConfig.getMaxErrorTokenLength()); + assertEquals(config.getMaxRawContentLength(), rebuiltConfig.getMaxRawContentLength()); + } +} From efec88fc8a616a153016ca885db560bcda9c3481 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Fri, 28 Jul 2023 00:10:05 +0900 Subject: [PATCH 02/10] Add doc on the test also --- .../core/ErrorReportConfigurationTest.java | 68 ++++++++++++++----- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java index 48458ba0e1..363d13e6e8 100644 --- a/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java +++ b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java @@ -4,16 +4,24 @@ import static org.junit.jupiter.api.Assertions.fail; import org.junit.jupiter.api.Test; +/** + * Unit tests for class {@link ErrorReportConfiguration}. + * + * @since 2.16 + */ public class ErrorReportConfigurationTest { + private final ErrorReportConfiguration DEFAULTS = ErrorReportConfiguration.defaults(); + @Test - public void testMaxErrorTokenLength() + public void testZeroLengths() { ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); - int maxLength = 128; - builder.maxErrorTokenLength(maxLength); + builder.maxErrorTokenLength(0); + builder.maxRawContentLength(0); ErrorReportConfiguration config = builder.build(); - assertEquals(maxLength, config.getMaxErrorTokenLength()); + assertEquals(0, config.getMaxErrorTokenLength()); + assertEquals(0, config.getMaxRawContentLength()); } @Test @@ -53,11 +61,9 @@ public void testInvalidMaxRawContentLength() @Test public void testDefaults() { - ErrorReportConfiguration config = ErrorReportConfiguration.defaults(); - // default value - assertEquals(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH, config.getMaxErrorTokenLength()); - assertEquals(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH, config.getMaxRawContentLength()); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH, DEFAULTS.getMaxErrorTokenLength()); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH, DEFAULTS.getMaxRawContentLength()); // equals assertEquals(ErrorReportConfiguration.defaults(), ErrorReportConfiguration.defaults()); @@ -66,23 +72,26 @@ public void testDefaults() @Test public void testOverrideDefaultErrorReportConfiguration() { - // try override static - ErrorReportConfiguration newConfig = new ErrorReportConfiguration.Builder() + // try with null, no change + ErrorReportConfiguration nullDefaults = ErrorReportConfiguration.defaults(); + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(null); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH, nullDefaults.getMaxErrorTokenLength()); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH, nullDefaults.getMaxRawContentLength()); + + // try override defaults + ErrorReportConfiguration overrideDefaults = new ErrorReportConfiguration.Builder() .maxErrorTokenLength(128) .maxRawContentLength(256) .build(); - ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(newConfig); - - ErrorReportConfiguration config = ErrorReportConfiguration.defaults(); - assertEquals(128, config.getMaxErrorTokenLength()); - assertEquals(256, config.getMaxRawContentLength()); + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(overrideDefaults); + assertEquals(128, overrideDefaults.getMaxErrorTokenLength()); + assertEquals(256, overrideDefaults.getMaxRawContentLength()); // IMPORTANT : make sure to revert back, otherwise other tests will be affected - ErrorReportConfiguration defaultConfig = new ErrorReportConfiguration.Builder() + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(new ErrorReportConfiguration.Builder() .maxErrorTokenLength(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH) .maxRawContentLength(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH) - .build(); - ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(defaultConfig); + .build()); } @Test @@ -93,4 +102,27 @@ public void testRebuild() assertEquals(config.getMaxErrorTokenLength(), rebuiltConfig.getMaxErrorTokenLength()); assertEquals(config.getMaxRawContentLength(), rebuiltConfig.getMaxRawContentLength()); } + + + @Test + public void testBuilderConstructorWithTwoParams() + { + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(128, 256); + ErrorReportConfiguration config = builder.build(); + assertEquals(128, config.getMaxErrorTokenLength()); + assertEquals(256, config.getMaxRawContentLength()); + } + + @Test + public void testBuilderConstructorWithErrorReportConfiguration() + { + ErrorReportConfiguration newConfig = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(128) + .maxRawContentLength(256) + .build(); + ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(newConfig); + ErrorReportConfiguration config = builder.build(); + assertEquals(newConfig.getMaxErrorTokenLength(), config.getMaxErrorTokenLength()); + assertEquals(newConfig.getMaxRawContentLength(), config.getMaxRawContentLength()); + } } From 0cf0068f9604d4fe489c80de5dbbc935cfa544e7 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Fri, 28 Jul 2023 00:20:41 +0900 Subject: [PATCH 03/10] Improve test cases --- .../core/ErrorReportConfigurationTest.java | 92 ++++++++++--------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java index 363d13e6e8..fe27572e33 100644 --- a/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java +++ b/src/test/java/com/fasterxml/jackson/core/ErrorReportConfigurationTest.java @@ -11,15 +11,30 @@ */ public class ErrorReportConfigurationTest { + private final ErrorReportConfiguration DEFAULTS = ErrorReportConfiguration.defaults(); + @Test + public void testNormalBuild() + { + ErrorReportConfiguration config = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(1004) + .maxRawContentLength(2008) + .build(); + + assertEquals(1004, config.getMaxErrorTokenLength()); + assertEquals(2008, config.getMaxRawContentLength()); + } + @Test public void testZeroLengths() { - ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); - builder.maxErrorTokenLength(0); - builder.maxRawContentLength(0); - ErrorReportConfiguration config = builder.build(); + // boundary tests, because we throw error on negative values + ErrorReportConfiguration config = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(0) + .maxRawContentLength(0) + .build(); + assertEquals(0, config.getMaxErrorTokenLength()); assertEquals(0, config.getMaxRawContentLength()); } @@ -28,28 +43,14 @@ public void testZeroLengths() public void testInvalidMaxErrorTokenLength() { ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + try { builder.maxErrorTokenLength(-1); fail("Should not reach here as exception is expected"); } catch (IllegalArgumentException ex) { // expected } - } - - @Test - public void testMaxRawContentLength() - { - ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); - int maxLength = 256; - builder.maxRawContentLength(maxLength); - ErrorReportConfiguration config = builder.build(); - assertEquals(maxLength, config.getMaxRawContentLength()); - } - - @Test - public void testInvalidMaxRawContentLength() - { - ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(); + try { builder.maxRawContentLength(-1); fail("Should not reach here as exception is expected"); @@ -72,21 +73,26 @@ public void testDefaults() @Test public void testOverrideDefaultErrorReportConfiguration() { - // try with null, no change - ErrorReportConfiguration nullDefaults = ErrorReportConfiguration.defaults(); + // (1) override with null, will be no change ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(null); + + ErrorReportConfiguration nullDefaults = ErrorReportConfiguration.defaults(); + assertEquals(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH, nullDefaults.getMaxErrorTokenLength()); assertEquals(ErrorReportConfiguration.DEFAULT_MAX_RAW_CONTENT_LENGTH, nullDefaults.getMaxRawContentLength()); - // try override defaults - ErrorReportConfiguration overrideDefaults = new ErrorReportConfiguration.Builder() - .maxErrorTokenLength(128) - .maxRawContentLength(256) - .build(); - ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(overrideDefaults); - assertEquals(128, overrideDefaults.getMaxErrorTokenLength()); - assertEquals(256, overrideDefaults.getMaxRawContentLength()); + // (2) override wiht other value that actually changes default values + ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(10101) + .maxRawContentLength(20202) + .build()); + + ErrorReportConfiguration overrideDefaults = ErrorReportConfiguration.defaults(); + + assertEquals(10101, overrideDefaults.getMaxErrorTokenLength()); + assertEquals(20202, overrideDefaults.getMaxRawContentLength()); + // (3) revert back to default values // IMPORTANT : make sure to revert back, otherwise other tests will be affected ErrorReportConfiguration.overrideDefaultErrorReportConfiguration(new ErrorReportConfiguration.Builder() .maxErrorTokenLength(ErrorReportConfiguration.DEFAULT_MAX_ERROR_TOKEN_LENGTH) @@ -98,7 +104,9 @@ public void testOverrideDefaultErrorReportConfiguration() public void testRebuild() { ErrorReportConfiguration config = new ErrorReportConfiguration.Builder().build(); + ErrorReportConfiguration rebuiltConfig = config.rebuild().build(); + assertEquals(config.getMaxErrorTokenLength(), rebuiltConfig.getMaxErrorTokenLength()); assertEquals(config.getMaxRawContentLength(), rebuiltConfig.getMaxRawContentLength()); } @@ -107,22 +115,24 @@ public void testRebuild() @Test public void testBuilderConstructorWithTwoParams() { - ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(128, 256); - ErrorReportConfiguration config = builder.build(); - assertEquals(128, config.getMaxErrorTokenLength()); - assertEquals(256, config.getMaxRawContentLength()); + ErrorReportConfiguration config = new ErrorReportConfiguration.Builder(1313, 2424) + .build(); + + assertEquals(1313, config.getMaxErrorTokenLength()); + assertEquals(2424, config.getMaxRawContentLength()); } @Test public void testBuilderConstructorWithErrorReportConfiguration() { - ErrorReportConfiguration newConfig = new ErrorReportConfiguration.Builder() - .maxErrorTokenLength(128) - .maxRawContentLength(256) + ErrorReportConfiguration configA = new ErrorReportConfiguration.Builder() + .maxErrorTokenLength(1234) + .maxRawContentLength(5678) .build(); - ErrorReportConfiguration.Builder builder = new ErrorReportConfiguration.Builder(newConfig); - ErrorReportConfiguration config = builder.build(); - assertEquals(newConfig.getMaxErrorTokenLength(), config.getMaxErrorTokenLength()); - assertEquals(newConfig.getMaxRawContentLength(), config.getMaxRawContentLength()); + + ErrorReportConfiguration configB = new ErrorReportConfiguration.Builder(configA).build(); + + assertEquals(configA.getMaxErrorTokenLength(), configB.getMaxErrorTokenLength()); + assertEquals(configA.getMaxRawContentLength(), configB.getMaxRawContentLength()); } } From 38f8009c85147959a16e13d5b49e2b2308f5421e Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Fri, 28 Jul 2023 00:52:57 +0900 Subject: [PATCH 04/10] Add IOContext --- .../jackson/core/base/ParserMinimalBase.java | 3 ++ .../fasterxml/jackson/core/io/IOContext.java | 44 +++++++++++++++++++ .../core/json/ReaderBasedJsonParser.java | 2 +- .../core/json/UTF8StreamJsonParser.java | 2 +- .../async/NonBlockingUtf8JsonParserBase.java | 2 +- 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java b/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java index 37b1ebef74..15306ef2c1 100644 --- a/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java +++ b/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java @@ -128,7 +128,10 @@ public abstract class ParserMinimalBase extends JsonParser * as part of error messages. * * @since 2.9 + * @deprecated Since 2.16 + * @see ErrorReportConfiguration#getMaxErrorTokenLength() */ + @Deprecated protected final static int MAX_ERROR_TOKEN_LENGTH = 256; /* diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index 203318c3f3..eacf56988d 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -1,5 +1,6 @@ package com.fasterxml.jackson.core.io; +import com.fasterxml.jackson.core.ErrorReportConfiguration; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.StreamReadConstraints; import com.fasterxml.jackson.core.StreamWriteConstraints; @@ -68,6 +69,12 @@ public class IOContext */ protected final StreamReadConstraints _streamReadConstraints; + /** + * @see ErrorReportConfiguration + * @since 2.16 + */ + protected final ErrorReportConfiguration _errorReportConfiguration; + /** * @since 2.16 */ @@ -129,6 +136,8 @@ public class IOContext * @param managedResource Whether input source is managed (owned) by Jackson library * * @since 2.16 + * @deprecated Since 2.16, use {@link #IOContext(StreamReadConstraints, StreamWriteConstraints, BufferRecycler, + * ContentReference, boolean, ErrorReportConfiguration)} instead. */ public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRecycler br, ContentReference contentRef, boolean managedResource) @@ -141,6 +150,30 @@ public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRe _contentReference = contentRef; _sourceRef = contentRef.getRawContent(); _managedResource = managedResource; + _errorReportConfiguration = ErrorReportConfiguration.defaults(); + } + + /** + * Main constructor to use. + * + * @param src constraints for streaming reads + * @param swc constraints for streaming writes + * @param br BufferRecycler to use, if any ({@code null} if none) + * @param contentRef Input source reference for location reporting + * @param managedResource Whether input source is managed (owned) by Jackson library + * + * @since 2.16 + */ + public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRecycler br, + ContentReference contentRef, boolean managedResource, ErrorReportConfiguration erc) + { + _streamReadConstraints = src; + _streamWriteConstraints = swc; + _bufferRecycler = br; + _contentReference = contentRef; + _sourceRef = contentRef.getRawContent(); + _managedResource = managedResource; + _errorReportConfiguration = erc; } /** @@ -163,6 +196,7 @@ public IOContext(StreamReadConstraints src, BufferRecycler br, _contentReference = contentRef; _sourceRef = contentRef.getRawContent(); _managedResource = managedResource; + _errorReportConfiguration = ErrorReportConfiguration.defaults(); } /** @@ -199,6 +233,16 @@ public StreamWriteConstraints streamWriteConstraints() { return _streamWriteConstraints; } + /** + * Returns : {@link ErrorReportConfiguration}, container for configuration values used when + * handling errorneous token inputs. + * + * @since 2.16 + */ + public ErrorReportConfiguration errorReportConfiguration() { + return _errorReportConfiguration; + } + public void setEncoding(JsonEncoding enc) { _encoding = enc; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java index ccbfa7d2fe..22aedb5ae9 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java @@ -3033,7 +3033,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce } ++_inputPtr; sb.append(c); - if (sb.length() >= MAX_ERROR_TOKEN_LENGTH) { + if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java index 48d71b6af7..125e9c530c 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java @@ -3691,7 +3691,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce break; } sb.append(c); - if (sb.length() >= MAX_ERROR_TOKEN_LENGTH) { + if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java index d5a962e556..e581fb663d 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java +++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java @@ -1244,7 +1244,7 @@ protected JsonToken _finishErrorToken() throws IOException // 11-Jan-2016, tatu: note: we will fully consume the character, // included or not, so if recovery was possible, it'd be off-by-one... _textBuffer.append(ch); - if (_textBuffer.size() < MAX_ERROR_TOKEN_LENGTH) { + if (_textBuffer.size() < _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { continue; } } From 1cd5cef20d1f49fa3533ffe830e6a753b7821ed3 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Fri, 28 Jul 2023 22:26:09 +0900 Subject: [PATCH 05/10] Prefix `errorReportConfiguration` with `get` --- src/main/java/com/fasterxml/jackson/core/io/IOContext.java | 2 +- .../com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java | 2 +- .../com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java | 2 +- .../jackson/core/json/async/NonBlockingUtf8JsonParserBase.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index eacf56988d..510934da9f 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -239,7 +239,7 @@ public StreamWriteConstraints streamWriteConstraints() { * * @since 2.16 */ - public ErrorReportConfiguration errorReportConfiguration() { + public ErrorReportConfiguration getErrorReportConfiguration() { return _errorReportConfiguration; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java index 22aedb5ae9..f1898d8942 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java @@ -3033,7 +3033,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce } ++_inputPtr; sb.append(c); - if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { + if (sb.length() >= _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java index 125e9c530c..a64b567e32 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java @@ -3691,7 +3691,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce break; } sb.append(c); - if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { + if (sb.length() >= _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java index e581fb663d..27301089c3 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java +++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java @@ -1244,7 +1244,7 @@ protected JsonToken _finishErrorToken() throws IOException // 11-Jan-2016, tatu: note: we will fully consume the character, // included or not, so if recovery was possible, it'd be off-by-one... _textBuffer.append(ch); - if (_textBuffer.size() < _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { + if (_textBuffer.size() < _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { continue; } } From 8fe4bdc01582b3334e3a0cb9e6c61659d45557b1 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Sat, 29 Jul 2023 14:19:03 +0900 Subject: [PATCH 06/10] Move back to without get --- src/main/java/com/fasterxml/jackson/core/io/IOContext.java | 2 +- .../com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java | 2 +- .../com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java | 2 +- .../jackson/core/json/async/NonBlockingUtf8JsonParserBase.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index 510934da9f..eacf56988d 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -239,7 +239,7 @@ public StreamWriteConstraints streamWriteConstraints() { * * @since 2.16 */ - public ErrorReportConfiguration getErrorReportConfiguration() { + public ErrorReportConfiguration errorReportConfiguration() { return _errorReportConfiguration; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java index f1898d8942..22aedb5ae9 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java @@ -3033,7 +3033,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce } ++_inputPtr; sb.append(c); - if (sb.length() >= _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { + if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java index a64b567e32..125e9c530c 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java @@ -3691,7 +3691,7 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce break; } sb.append(c); - if (sb.length() >= _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { + if (sb.length() >= _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { sb.append("..."); break; } diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java index 27301089c3..e581fb663d 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java +++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingUtf8JsonParserBase.java @@ -1244,7 +1244,7 @@ protected JsonToken _finishErrorToken() throws IOException // 11-Jan-2016, tatu: note: we will fully consume the character, // included or not, so if recovery was possible, it'd be off-by-one... _textBuffer.append(ch); - if (_textBuffer.size() < _ioContext.getErrorReportConfiguration().getMaxErrorTokenLength()) { + if (_textBuffer.size() < _ioContext.errorReportConfiguration().getMaxErrorTokenLength()) { continue; } } From 9b442f6d985de33e800f04c5b75b60e9059c4474 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Sat, 29 Jul 2023 14:25:14 +0900 Subject: [PATCH 07/10] Use new constructor in `IOContext` --- .../fasterxml/jackson/core/io/IOContext.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index eacf56988d..e52ae88bef 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -142,15 +142,7 @@ public class IOContext public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRecycler br, ContentReference contentRef, boolean managedResource) { - _streamReadConstraints = (src == null) ? - StreamReadConstraints.defaults() : src; - _streamWriteConstraints = (swc == null) ? - StreamWriteConstraints.defaults() : swc; - _bufferRecycler = br; - _contentReference = contentRef; - _sourceRef = contentRef.getRawContent(); - _managedResource = managedResource; - _errorReportConfiguration = ErrorReportConfiguration.defaults(); + this(src, swc, br, contentRef, managedResource, ErrorReportConfiguration.defaults(); } /** @@ -189,14 +181,7 @@ public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRe public IOContext(StreamReadConstraints src, BufferRecycler br, ContentReference contentRef, boolean managedResource) { - _streamReadConstraints = (src == null) ? - StreamReadConstraints.defaults() : src; - _streamWriteConstraints = StreamWriteConstraints.defaults(); - _bufferRecycler = br; - _contentReference = contentRef; - _sourceRef = contentRef.getRawContent(); - _managedResource = managedResource; - _errorReportConfiguration = ErrorReportConfiguration.defaults(); + this(src, StreamWriteConstraints.defaults(), br, contentRef, managedResource, ErrorReportConfiguration.defaults()); } /** From 9f70f33238b90bb5a0e1b333eca7c7a2023c16d4 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Sat, 29 Jul 2023 14:28:57 +0900 Subject: [PATCH 08/10] Add deprecation notes --- src/main/java/com/fasterxml/jackson/core/io/IOContext.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index e52ae88bef..2aa6d7da1f 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -139,10 +139,11 @@ public class IOContext * @deprecated Since 2.16, use {@link #IOContext(StreamReadConstraints, StreamWriteConstraints, BufferRecycler, * ContentReference, boolean, ErrorReportConfiguration)} instead. */ + @Deprecated public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRecycler br, ContentReference contentRef, boolean managedResource) { - this(src, swc, br, contentRef, managedResource, ErrorReportConfiguration.defaults(); + this(src, swc, br, contentRef, managedResource, ErrorReportConfiguration.defaults()); } /** @@ -175,7 +176,8 @@ public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRe * @param managedResource Whether input source is managed (owned) by Jackson library * * @since 2.15 - * @deprecated use v2.16 constructor with additional StreamWriteConstraints + * @deprecated Since 2.16. Use {@link #IOContext(StreamReadConstraints, StreamWriteConstraints, BufferRecycler, + * ContentReference, boolean, ErrorReportConfiguration)} instead. */ @Deprecated public IOContext(StreamReadConstraints src, BufferRecycler br, From 34f642e8c27ca309e96c76a1339fabb2c56b1785 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Sun, 30 Jul 2023 21:44:13 +0900 Subject: [PATCH 09/10] Minor JavaDoc fixes --- src/main/java/com/fasterxml/jackson/core/io/IOContext.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index 2aa6d7da1f..cb50463879 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -154,6 +154,7 @@ public IOContext(StreamReadConstraints src, StreamWriteConstraints swc, BufferRe * @param br BufferRecycler to use, if any ({@code null} if none) * @param contentRef Input source reference for location reporting * @param managedResource Whether input source is managed (owned) by Jackson library + * @param erc Error report configuration to use * * @since 2.16 */ @@ -221,7 +222,7 @@ public StreamWriteConstraints streamWriteConstraints() { } /** - * Returns : {@link ErrorReportConfiguration}, container for configuration values used when + * @return Configured {@link ErrorReportConfiguration}, container for configuration values used when * handling errorneous token inputs. * * @since 2.16 From e6bb4cbfef68db502e1bf4ffa08e7f4b3f5020a3 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Sun, 30 Jul 2023 21:48:29 +0900 Subject: [PATCH 10/10] Make JavaDoc more concise. --- .../com/fasterxml/jackson/core/base/ParserMinimalBase.java | 3 +-- src/main/java/com/fasterxml/jackson/core/io/IOContext.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java b/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java index 15306ef2c1..2f37c22a73 100644 --- a/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java +++ b/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java @@ -128,8 +128,7 @@ public abstract class ParserMinimalBase extends JsonParser * as part of error messages. * * @since 2.9 - * @deprecated Since 2.16 - * @see ErrorReportConfiguration#getMaxErrorTokenLength() + * @deprecated Since 2.16. {@link ErrorReportConfiguration#getMaxErrorTokenLength()} will be used instead. */ @Deprecated protected final static int MAX_ERROR_TOKEN_LENGTH = 256; diff --git a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java index cb50463879..b80ade5d9e 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/IOContext.java +++ b/src/main/java/com/fasterxml/jackson/core/io/IOContext.java @@ -70,7 +70,6 @@ public class IOContext protected final StreamReadConstraints _streamReadConstraints; /** - * @see ErrorReportConfiguration * @since 2.16 */ protected final ErrorReportConfiguration _errorReportConfiguration; @@ -222,8 +221,8 @@ public StreamWriteConstraints streamWriteConstraints() { } /** - * @return Configured {@link ErrorReportConfiguration}, container for configuration values used when - * handling errorneous token inputs. + * @return Configured {@link ErrorReportConfiguration}, containing configured values for + * handling error reporting. * * @since 2.16 */