diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-07-08 17:46:14 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-07-08 17:46:14 -0700 |
commit | 3440c7336c12dee7be78fe07f9b2e588acdfbce9 (patch) | |
tree | c3c96cf50a8bf9744331ae1d95a4d06315e085f7 | |
parent | be5af8876fe9013f218daa33be61a854d61dde6d (diff) | |
download | jackson-core-3440c7336c12dee7be78fe07f9b2e588acdfbce9.tar.gz |
Fixed #630
5 files changed, 119 insertions, 1 deletions
diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 729ec1f0..f56c0a23 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -21,6 +21,8 @@ JSON library. #619: Add `StreamReadCapability` for further format-based/format-agnostic handling improvements #627: Add `JsonParser.isExpectedNumberIntToken()` convenience method +#630: Add `StreamWriteCapability` for further format-based/format-agnostic + handling improvements - Deprecate `JsonParser.getCurrentTokenId()` (use `#currentTokenId()` instead) 2.11.1 (25-Jun-2020) diff --git a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java index feac224c..49404341 100644 --- a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java +++ b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.io.CharacterEscapes; import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.core.type.WritableTypeId.Inclusion; +import com.fasterxml.jackson.core.util.JacksonFeatureSet; import com.fasterxml.jackson.core.util.VersionUtil; import static com.fasterxml.jackson.core.JsonTokenId.*; @@ -30,6 +31,34 @@ public abstract class JsonGenerator implements Closeable, Flushable, Versioned { /** + * Default set of {@link StreamReadCapability}ies that may be used as + * basis for format-specific readers (or as bogus instance if non-null + * set needs to be passed). + * + * @since 2.12 + */ + protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_WRITE_CAPABILITIES + = JacksonFeatureSet.fromDefaults(StreamWriteCapability.values()); + + /** + * Default set of {@link StreamReadCapability}ies for typical textual formats, + * to use either as-is, or as a base with possible differences. + * + * @since 2.12 + */ + protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_TEXTUAL_WRITE_CAPABILITIES + = DEFAULT_WRITE_CAPABILITIES.with(StreamWriteCapability.CAN_WRITE_FORMATTED_NUMBERS); + + /** + * Default set of {@link StreamReadCapability}ies for typical binary formats, + * to use either as-is, or as a base with possible differences. + * + * @since 2.12 + */ + protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_BINARY_WRITE_CAPABILITIES + = DEFAULT_WRITE_CAPABILITIES.with(StreamWriteCapability.CAN_WRITE_BINARY_NATIVELY); + + /** * Enumeration that defines all togglable features for generators. */ public enum Feature { @@ -634,7 +663,7 @@ public abstract class JsonGenerator ctxt.setCurrentValue(v); } } - + /* /********************************************************** /* Public API, capability introspection methods @@ -719,6 +748,18 @@ public abstract class JsonGenerator */ public boolean canWriteFormattedNumbers() { return false; } + /** + * Accessor for getting metadata on capabilities of this parser, based on + * underlying data format being read (directly or indirectly). + * + * @return Set of read capabilities for content to read via this parser + * + * @since 2.12 + */ + public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() { + return DEFAULT_WRITE_CAPABILITIES; + } + /* /********************************************************** /* Public API, write methods, structural diff --git a/src/main/java/com/fasterxml/jackson/core/StreamWriteCapability.java b/src/main/java/com/fasterxml/jackson/core/StreamWriteCapability.java new file mode 100644 index 00000000..ba1cf6fc --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/core/StreamWriteCapability.java @@ -0,0 +1,55 @@ +package com.fasterxml.jackson.core; + +import com.fasterxml.jackson.core.util.JacksonFeature; + +/** + * Set of on/off capabilities that a {@link JsonGenerator} for given format + * (or in case of buffering, original format) has. + * Used in some cases to adjust aspects of things like content conversions and + * coercions by format-agnostic functionality. + * Specific or expected usage documented by individual capability entry Javadocs. + * + * @since 2.12 + */ +public enum StreamWriteCapability + implements JacksonFeature +{ + /** + * Capability that indicates that the data format is able to express binary + * data natively, without using textual encoding like Base64. + *<p> + * Capability is currently enabled for all binary formats and none of textual + * formats. + */ + CAN_WRITE_BINARY_NATIVELY(false), + + /** + * Capability that indicates that the data format is able to write + * "formatted numbers": that is, output of numbers is done as Strings + * and caller is allowed to pass in logical number values as Strings. + *<p> + * Capability is currently enabled for most textual formats and none of binary + * formats. + */ + CAN_WRITE_FORMATTED_NUMBERS(false) + ; + + /** + * Whether feature is enabled or disabled by default. + */ + private final boolean _defaultState; + + private final int _mask; + + private StreamWriteCapability(boolean defaultState) { + _defaultState = defaultState; + _mask = (1 << ordinal()); + } + + @Override + public boolean enabledByDefault() { return _defaultState; } + @Override + public boolean enabledIn(int flags) { return (flags & _mask) != 0; } + @Override + public int getMask() { return _mask; } +} diff --git a/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java b/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java index 152e8dca..b9a4a3fb 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java +++ b/src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.io.CharTypes; import com.fasterxml.jackson.core.io.CharacterEscapes; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import com.fasterxml.jackson.core.util.JacksonFeatureSet; import com.fasterxml.jackson.core.util.VersionUtil; /** @@ -30,6 +31,15 @@ public abstract class JsonGeneratorImpl extends GeneratorBase */ protected final static int[] sOutputEscapes = CharTypes.get7BitOutputEscapes(); + /** + * Default capabilities for JSON generator implementations which do not + * different from "general textual" defaults + * + * @since 2.12 + */ + protected final static JacksonFeatureSet<StreamWriteCapability> JSON_WRITE_CAPABILITIES + = DEFAULT_TEXTUAL_WRITE_CAPABILITIES; + /* /********************************************************** /* Configuration, basic I/O @@ -192,6 +202,11 @@ public abstract class JsonGeneratorImpl extends GeneratorBase return this; } + @Override + public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() { + return JSON_WRITE_CAPABILITIES; + } + /* /********************************************************** /* Shared helper methods diff --git a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java index c7e3cd7b..ae6d67cd 100644 --- a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java @@ -96,6 +96,11 @@ public class JsonGeneratorDelegate extends JsonGenerator @Override public boolean canWriteFormattedNumbers() { return delegate.canWriteFormattedNumbers(); } + @Override + public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() { + return delegate.getWriteCapabilities(); + } + /* /********************************************************** /* Public API, configuration |