aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-07-08 17:46:14 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-07-08 17:46:14 -0700
commit3440c7336c12dee7be78fe07f9b2e588acdfbce9 (patch)
treec3c96cf50a8bf9744331ae1d95a4d06315e085f7
parentbe5af8876fe9013f218daa33be61a854d61dde6d (diff)
downloadjackson-core-3440c7336c12dee7be78fe07f9b2e588acdfbce9.tar.gz
Fixed #630
-rw-r--r--release-notes/VERSION-2.x2
-rw-r--r--src/main/java/com/fasterxml/jackson/core/JsonGenerator.java43
-rw-r--r--src/main/java/com/fasterxml/jackson/core/StreamWriteCapability.java55
-rw-r--r--src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java15
-rw-r--r--src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java5
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