Skip to content

Commit b1fad45

Browse files
committed
Upgrade to Jackson 3.0.3
1 parent 3dbfaa6 commit b1fad45

7 files changed

Lines changed: 134 additions & 133 deletions

File tree

codecs/json-codec/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ tasks {
2929
.toString(),
3030
),
3131
)
32-
relocate("com.fasterxml.jackson.core", "software.amazon.smithy.java.internal.shaded.com.fasterxml.jackson.core")
32+
relocate("tools.jackson.core", "software.amazon.smithy.java.internal.shaded.tools.jackson.core")
3333
}
3434
}
3535
jar {

codecs/json-codec/src/main/java/software/amazon/smithy/java/json/jackson/JacksonJsonDeserializer.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@
55

66
package software.amazon.smithy.java.json.jackson;
77

8-
import static com.fasterxml.jackson.core.JsonToken.END_ARRAY;
9-
import static com.fasterxml.jackson.core.JsonToken.END_OBJECT;
10-
import static com.fasterxml.jackson.core.JsonToken.VALUE_NULL;
8+
import static tools.jackson.core.JsonToken.END_ARRAY;
9+
import static tools.jackson.core.JsonToken.END_OBJECT;
10+
import static tools.jackson.core.JsonToken.VALUE_NULL;
1111

12-
import com.fasterxml.jackson.core.Base64Variants;
13-
import com.fasterxml.jackson.core.JsonParser;
14-
import com.fasterxml.jackson.core.JsonToken;
15-
import java.io.IOException;
1612
import java.math.BigDecimal;
1713
import java.math.BigInteger;
1814
import java.nio.ByteBuffer;
@@ -28,6 +24,10 @@
2824
import software.amazon.smithy.java.json.JsonDocuments;
2925
import software.amazon.smithy.java.json.JsonSettings;
3026
import software.amazon.smithy.model.shapes.ShapeType;
27+
import tools.jackson.core.Base64Variants;
28+
import tools.jackson.core.JacksonException;
29+
import tools.jackson.core.JsonParser;
30+
import tools.jackson.core.JsonToken;
3131

3232
final class JacksonJsonDeserializer implements ShapeDeserializer {
3333

@@ -42,7 +42,7 @@ final class JacksonJsonDeserializer implements ShapeDeserializer {
4242
this.settings = settings;
4343
try {
4444
this.parser.nextToken();
45-
} catch (IOException e) {
45+
} catch (JacksonException e) {
4646
throw new SerializationException(e);
4747
}
4848
}
@@ -116,7 +116,7 @@ public float readFloat(Schema schema) {
116116
try {
117117
return switch (parser.currentToken()) {
118118
case VALUE_NUMBER_FLOAT, VALUE_NUMBER_INT -> parser.getFloatValue();
119-
case VALUE_STRING -> switch (parser.getText()) {
119+
case VALUE_STRING -> switch (parser.getString()) {
120120
case "Infinity" -> Float.POSITIVE_INFINITY;
121121
case "-Infinity" -> Float.NEGATIVE_INFINITY;
122122
case "NaN" -> Float.NaN;
@@ -211,15 +211,15 @@ public Document readDocument() {
211211
}
212212
case START_OBJECT -> {
213213
Map<String, Document> values = new LinkedHashMap<>();
214-
for (var field = parser.nextFieldName(); field != null; field = parser.nextFieldName()) {
214+
for (var field = parser.nextName(); field != null; field = parser.nextName()) {
215215
parser.nextToken();
216216
values.put(field, readDocument());
217217
}
218218
yield JsonDocuments.of(values, settings);
219219
}
220220
default -> throw new SerializationException("Unexpected token: " + describeToken());
221221
};
222-
} catch (IOException e) {
222+
} catch (Exception e) {
223223
throw new SerializationException(e);
224224
}
225225
}
@@ -232,7 +232,7 @@ private String describeToken() {
232232
public Instant readTimestamp(Schema schema) {
233233
try {
234234
var format = settings.timestampResolver().resolve(schema);
235-
return switch (parser.getCurrentToken()) {
235+
return switch (parser.currentToken()) {
236236
case VALUE_NUMBER_FLOAT, VALUE_NUMBER_INT -> format.readFromNumber(parser.getNumberValue());
237237
case VALUE_STRING -> format.readFromString(parser.getText(), true);
238238
default -> throw new SerializationException("Expected a timestamp, but found " + describeToken());
@@ -246,7 +246,7 @@ public Instant readTimestamp(Schema schema) {
246246
public <T> void readStruct(Schema schema, T state, StructMemberConsumer<T> structMemberConsumer) {
247247
try {
248248
var fieldToMember = settings.fieldMapper().fieldToMember(schema);
249-
for (var memberName = parser.nextFieldName(); memberName != null; memberName = parser.nextFieldName()) {
249+
for (var memberName = parser.nextName(); memberName != null; memberName = parser.nextName()) {
250250
if (parser.nextToken() != VALUE_NULL) {
251251
var member = fieldToMember.member(memberName);
252252
if (member != null) {
@@ -296,7 +296,7 @@ public <T> void readList(Schema schema, T state, ListMemberConsumer<T> listMembe
296296
@Override
297297
public <T> void readStringMap(Schema schema, T state, MapMemberConsumer<String, T> mapMemberConsumer) {
298298
try {
299-
for (var fieldName = parser.nextFieldName(); fieldName != null; fieldName = parser.nextFieldName()) {
299+
for (var fieldName = parser.nextName(); fieldName != null; fieldName = parser.nextName()) {
300300
parser.nextToken();
301301
mapMemberConsumer.accept(state, fieldName, this);
302302
}

codecs/json-codec/src/main/java/software/amazon/smithy/java/json/jackson/JacksonJsonSerdeProvider.java

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,40 @@
55

66
package software.amazon.smithy.java.json.jackson;
77

8-
import com.fasterxml.jackson.core.JsonFactory;
9-
import com.fasterxml.jackson.core.JsonFactoryBuilder;
10-
import com.fasterxml.jackson.core.StreamReadFeature;
11-
import com.fasterxml.jackson.core.StreamWriteFeature;
12-
import java.io.IOException;
138
import java.io.OutputStream;
149
import java.nio.ByteBuffer;
15-
import software.amazon.smithy.java.core.serde.SerializationException;
1610
import software.amazon.smithy.java.core.serde.ShapeDeserializer;
1711
import software.amazon.smithy.java.core.serde.ShapeSerializer;
1812
import software.amazon.smithy.java.json.JsonSerdeProvider;
1913
import software.amazon.smithy.java.json.JsonSettings;
2014
import software.amazon.smithy.utils.SmithyInternalApi;
15+
import tools.jackson.core.ObjectReadContext;
16+
import tools.jackson.core.ObjectWriteContext;
17+
import tools.jackson.core.PrettyPrinter;
18+
import tools.jackson.core.StreamReadFeature;
19+
import tools.jackson.core.StreamWriteFeature;
20+
import tools.jackson.core.json.JsonFactory;
21+
import tools.jackson.core.util.DefaultPrettyPrinter;
2122

2223
@SmithyInternalApi
2324
public class JacksonJsonSerdeProvider implements JsonSerdeProvider {
2425

2526
private static final JsonFactory FACTORY;
27+
private static final ObjectWriteContext PRETTY_PRINT_CONTEXT;
2628
static final SerializedStringCache SERIALIZED_STRINGS = new SerializedStringCache();
2729

2830
static {
29-
var serBuilder = new JsonFactoryBuilder();
30-
serBuilder.disable(JsonFactory.Feature.INTERN_FIELD_NAMES);
31-
serBuilder.enable(StreamWriteFeature.USE_FAST_DOUBLE_WRITER);
32-
serBuilder.enable(StreamReadFeature.USE_FAST_DOUBLE_PARSER);
33-
serBuilder.enable(StreamReadFeature.USE_FAST_BIG_NUMBER_PARSER);
34-
FACTORY = serBuilder.build();
31+
FACTORY = JsonFactory.builder()
32+
.enable(StreamWriteFeature.USE_FAST_DOUBLE_WRITER)
33+
.enable(StreamReadFeature.USE_FAST_DOUBLE_PARSER)
34+
.enable(StreamReadFeature.USE_FAST_BIG_NUMBER_PARSER)
35+
.build();
36+
PRETTY_PRINT_CONTEXT = new ObjectWriteContext.Base() {
37+
@Override
38+
public PrettyPrinter getPrettyPrinter() {
39+
return new DefaultPrettyPrinter();
40+
}
41+
};
3542
}
3643

3744
@Override
@@ -49,33 +56,31 @@ public ShapeDeserializer newDeserializer(
4956
byte[] source,
5057
JsonSettings settings
5158
) {
52-
try {
53-
return new JacksonJsonDeserializer(FACTORY.createParser(source), settings);
54-
} catch (IOException e) {
55-
throw new SerializationException(e);
56-
}
59+
return new JacksonJsonDeserializer(FACTORY.createParser(readCtx(settings), source), settings);
5760
}
5861

5962
@Override
6063
public ShapeDeserializer newDeserializer(ByteBuffer source, JsonSettings settings) {
61-
try {
62-
int offset = source.arrayOffset() + source.position();
63-
int length = source.remaining();
64-
return new JacksonJsonDeserializer(FACTORY.createParser(source.array(), offset, length), settings);
65-
} catch (IOException e) {
66-
throw new SerializationException(e);
67-
}
64+
int offset = source.arrayOffset() + source.position();
65+
int length = source.remaining();
66+
var ctx = readCtx(settings);
67+
return new JacksonJsonDeserializer(FACTORY.createParser(ctx, source.array(), offset, length), settings);
6868
}
6969

7070
@Override
7171
public ShapeSerializer newSerializer(
7272
OutputStream sink,
7373
JsonSettings settings
7474
) {
75-
try {
76-
return new JacksonJsonSerializer(FACTORY.createGenerator(sink), settings);
77-
} catch (IOException e) {
78-
throw new SerializationException(e);
79-
}
75+
var ctx = writeCtx(settings);
76+
return new JacksonJsonSerializer(FACTORY.createGenerator(ctx, sink), settings);
77+
}
78+
79+
private static ObjectWriteContext writeCtx(JsonSettings settings) {
80+
return settings.prettyPrint() ? PRETTY_PRINT_CONTEXT : ObjectWriteContext.empty();
81+
}
82+
83+
private static ObjectReadContext readCtx(JsonSettings settings) {
84+
return ObjectReadContext.empty();
8085
}
8186
}

codecs/json-codec/src/main/java/software/amazon/smithy/java/json/jackson/JacksonJsonSerializer.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
package software.amazon.smithy.java.json.jackson;
77

8-
import com.fasterxml.jackson.core.JsonGenerator;
9-
import java.io.IOException;
108
import java.math.BigDecimal;
119
import java.math.BigInteger;
1210
import java.nio.ByteBuffer;
@@ -23,6 +21,7 @@
2321
import software.amazon.smithy.java.io.ByteBufferUtils;
2422
import software.amazon.smithy.java.json.JsonSettings;
2523
import software.amazon.smithy.model.shapes.ShapeType;
24+
import tools.jackson.core.JsonGenerator;
2625

2726
final class JacksonJsonSerializer implements ShapeSerializer {
2827

@@ -36,9 +35,6 @@ final class JacksonJsonSerializer implements ShapeSerializer {
3635
JsonSettings settings
3736
) {
3837
this.generator = generator;
39-
if (settings.prettyPrint()) {
40-
generator.useDefaultPrettyPrinter();
41-
}
4238
this.settings = settings;
4339
}
4440

@@ -219,9 +215,9 @@ private final class JsonStructSerializer extends InterceptingSerializer {
219215
protected ShapeSerializer before(Schema schema) {
220216
try {
221217
final String fieldName = settings.fieldMapper().memberToField(schema);
222-
generator.writeFieldName(JacksonJsonSerdeProvider.SERIALIZED_STRINGS.create(fieldName));
218+
generator.writeName(JacksonJsonSerdeProvider.SERIALIZED_STRINGS.create(fieldName));
223219
return JacksonJsonSerializer.this;
224-
} catch (IOException e) {
220+
} catch (Exception e) {
225221
throw new SerializationException(e);
226222
}
227223
}
@@ -258,9 +254,9 @@ public <T> void writeEntry(
258254
BiConsumer<T, ShapeSerializer> valueSerializer
259255
) {
260256
try {
261-
generator.writeFieldName(key);
257+
generator.writeName(key);
262258
valueSerializer.accept(state, JacksonJsonSerializer.this);
263-
} catch (IOException e) {
259+
} catch (Exception e) {
264260
throw new SerializationException(e);
265261
}
266262
}
@@ -291,7 +287,7 @@ public void writeStruct(Schema schema, SerializableStruct struct) {
291287
try {
292288
parent.generator.writeStartObject();
293289
if (parent.settings.serializeTypeInDocuments()) {
294-
parent.generator.writeStringField("__type", schema.id().toString());
290+
parent.generator.writeStringProperty("__type", schema.id().toString());
295291
}
296292
struct.serializeMembers(parent.structSerializer);
297293
parent.generator.writeEndObject();

codecs/json-codec/src/main/java/software/amazon/smithy/java/json/jackson/SerializedStringCache.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
package software.amazon.smithy.java.json.jackson;
77

8-
import com.fasterxml.jackson.core.SerializableString;
9-
import com.fasterxml.jackson.core.io.SerializedString;
108
import java.util.concurrent.ConcurrentHashMap;
119
import java.util.concurrent.ConcurrentMap;
10+
import tools.jackson.core.SerializableString;
11+
import tools.jackson.core.io.SerializedString;
1212

1313
/**
1414
* A cache of structure member field names to SerializableString.

gradle/libs.versions.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ spotbugs = "6.0.22"
88
spotless = "8.1.0"
99
smithy-gradle-plugins = "1.3.0"
1010
assertj = "3.27.6"
11-
jackson = "2.20.1"
11+
jackson = "3.0.0"
1212
netty = "4.2.9.Final"
1313
dep-analysis = "3.5.1"
1414
aws-sdk = "2.40.10"
@@ -20,7 +20,7 @@ jline = "3.30.6"
2020
graalvm-native = "0.11.3"
2121
shadow = "8.3.9"
2222
jazzer = "0.28.0"
23-
json-schema-validator = "2.0.0"
23+
json-schema-validator = "3.0.0"
2424

2525
[libraries]
2626
smithy-model = { module = "software.amazon.smithy:smithy-model", version.ref = "smithy" }
@@ -44,7 +44,7 @@ aws-sdk-retries = {module = "software.amazon.awssdk:retries", version.ref = "aws
4444
aws-sdk-core = {module = "software.amazon.awssdk:sdk-core", version.ref = "aws-sdk"}
4545
aws-sdk-auth = {module = "software.amazon.awssdk:auth", version.ref = "aws-sdk"}
4646

47-
jackson-core = {module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson"}
47+
jackson-core = {module = "tools.jackson.core:jackson-core", version.ref = "jackson"}
4848

4949
netty-all = {module = "io.netty:netty-all", version.ref = "netty"}
5050

0 commit comments

Comments
 (0)