Skip to content

Commit 3440c73

Browse files
committed
Fixed #630
1 parent be5af88 commit 3440c73

File tree

5 files changed

+119
-1
lines changed

5 files changed

+119
-1
lines changed

release-notes/VERSION-2.x

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ JSON library.
2121
#619: Add `StreamReadCapability` for further format-based/format-agnostic
2222
handling improvements
2323
#627: Add `JsonParser.isExpectedNumberIntToken()` convenience method
24+
#630: Add `StreamWriteCapability` for further format-based/format-agnostic
25+
handling improvements
2426
- Deprecate `JsonParser.getCurrentTokenId()` (use `#currentTokenId()` instead)
2527

2628
2.11.1 (25-Jun-2020)

src/main/java/com/fasterxml/jackson/core/JsonGenerator.java

+42-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.fasterxml.jackson.core.io.CharacterEscapes;
1616
import com.fasterxml.jackson.core.type.WritableTypeId;
1717
import com.fasterxml.jackson.core.type.WritableTypeId.Inclusion;
18+
import com.fasterxml.jackson.core.util.JacksonFeatureSet;
1819
import com.fasterxml.jackson.core.util.VersionUtil;
1920

2021
import static com.fasterxml.jackson.core.JsonTokenId.*;
@@ -29,6 +30,34 @@
2930
public abstract class JsonGenerator
3031
implements Closeable, Flushable, Versioned
3132
{
33+
/**
34+
* Default set of {@link StreamReadCapability}ies that may be used as
35+
* basis for format-specific readers (or as bogus instance if non-null
36+
* set needs to be passed).
37+
*
38+
* @since 2.12
39+
*/
40+
protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_WRITE_CAPABILITIES
41+
= JacksonFeatureSet.fromDefaults(StreamWriteCapability.values());
42+
43+
/**
44+
* Default set of {@link StreamReadCapability}ies for typical textual formats,
45+
* to use either as-is, or as a base with possible differences.
46+
*
47+
* @since 2.12
48+
*/
49+
protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_TEXTUAL_WRITE_CAPABILITIES
50+
= DEFAULT_WRITE_CAPABILITIES.with(StreamWriteCapability.CAN_WRITE_FORMATTED_NUMBERS);
51+
52+
/**
53+
* Default set of {@link StreamReadCapability}ies for typical binary formats,
54+
* to use either as-is, or as a base with possible differences.
55+
*
56+
* @since 2.12
57+
*/
58+
protected final static JacksonFeatureSet<StreamWriteCapability> DEFAULT_BINARY_WRITE_CAPABILITIES
59+
= DEFAULT_WRITE_CAPABILITIES.with(StreamWriteCapability.CAN_WRITE_BINARY_NATIVELY);
60+
3261
/**
3362
* Enumeration that defines all togglable features for generators.
3463
*/
@@ -634,7 +663,7 @@ public void setCurrentValue(Object v) {
634663
ctxt.setCurrentValue(v);
635664
}
636665
}
637-
666+
638667
/*
639668
/**********************************************************
640669
/* Public API, capability introspection methods
@@ -719,6 +748,18 @@ public void setCurrentValue(Object v) {
719748
*/
720749
public boolean canWriteFormattedNumbers() { return false; }
721750

751+
/**
752+
* Accessor for getting metadata on capabilities of this parser, based on
753+
* underlying data format being read (directly or indirectly).
754+
*
755+
* @return Set of read capabilities for content to read via this parser
756+
*
757+
* @since 2.12
758+
*/
759+
public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() {
760+
return DEFAULT_WRITE_CAPABILITIES;
761+
}
762+
722763
/*
723764
/**********************************************************
724765
/* Public API, write methods, structural
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.fasterxml.jackson.core;
2+
3+
import com.fasterxml.jackson.core.util.JacksonFeature;
4+
5+
/**
6+
* Set of on/off capabilities that a {@link JsonGenerator} for given format
7+
* (or in case of buffering, original format) has.
8+
* Used in some cases to adjust aspects of things like content conversions and
9+
* coercions by format-agnostic functionality.
10+
* Specific or expected usage documented by individual capability entry Javadocs.
11+
*
12+
* @since 2.12
13+
*/
14+
public enum StreamWriteCapability
15+
implements JacksonFeature
16+
{
17+
/**
18+
* Capability that indicates that the data format is able to express binary
19+
* data natively, without using textual encoding like Base64.
20+
*<p>
21+
* Capability is currently enabled for all binary formats and none of textual
22+
* formats.
23+
*/
24+
CAN_WRITE_BINARY_NATIVELY(false),
25+
26+
/**
27+
* Capability that indicates that the data format is able to write
28+
* "formatted numbers": that is, output of numbers is done as Strings
29+
* and caller is allowed to pass in logical number values as Strings.
30+
*<p>
31+
* Capability is currently enabled for most textual formats and none of binary
32+
* formats.
33+
*/
34+
CAN_WRITE_FORMATTED_NUMBERS(false)
35+
;
36+
37+
/**
38+
* Whether feature is enabled or disabled by default.
39+
*/
40+
private final boolean _defaultState;
41+
42+
private final int _mask;
43+
44+
private StreamWriteCapability(boolean defaultState) {
45+
_defaultState = defaultState;
46+
_mask = (1 << ordinal());
47+
}
48+
49+
@Override
50+
public boolean enabledByDefault() { return _defaultState; }
51+
@Override
52+
public boolean enabledIn(int flags) { return (flags & _mask) != 0; }
53+
@Override
54+
public int getMask() { return _mask; }
55+
}

src/main/java/com/fasterxml/jackson/core/json/JsonGeneratorImpl.java

+15
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.fasterxml.jackson.core.io.CharacterEscapes;
99
import com.fasterxml.jackson.core.io.IOContext;
1010
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
11+
import com.fasterxml.jackson.core.util.JacksonFeatureSet;
1112
import com.fasterxml.jackson.core.util.VersionUtil;
1213

1314
/**
@@ -30,6 +31,15 @@ public abstract class JsonGeneratorImpl extends GeneratorBase
3031
*/
3132
protected final static int[] sOutputEscapes = CharTypes.get7BitOutputEscapes();
3233

34+
/**
35+
* Default capabilities for JSON generator implementations which do not
36+
* different from "general textual" defaults
37+
*
38+
* @since 2.12
39+
*/
40+
protected final static JacksonFeatureSet<StreamWriteCapability> JSON_WRITE_CAPABILITIES
41+
= DEFAULT_TEXTUAL_WRITE_CAPABILITIES;
42+
3343
/*
3444
/**********************************************************
3545
/* Configuration, basic I/O
@@ -192,6 +202,11 @@ public JsonGenerator setRootValueSeparator(SerializableString sep) {
192202
return this;
193203
}
194204

205+
@Override
206+
public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() {
207+
return JSON_WRITE_CAPABILITIES;
208+
}
209+
195210
/*
196211
/**********************************************************
197212
/* Shared helper methods

src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java

+5
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ public void setCurrentValue(Object v) {
9696
@Override
9797
public boolean canWriteFormattedNumbers() { return delegate.canWriteFormattedNumbers(); }
9898

99+
@Override
100+
public JacksonFeatureSet<StreamWriteCapability> getWriteCapabilities() {
101+
return delegate.getWriteCapabilities();
102+
}
103+
99104
/*
100105
/**********************************************************
101106
/* Public API, configuration

0 commit comments

Comments
 (0)