Skip to content

Commit 2e52808

Browse files
committed
Migrate JSON bindings to Jackson 3
Rename module and package to jackson3, move to tools.jackson 3.2.0, translate unchecked JacksonException to IOException, target Java 17.
1 parent fcdb530 commit 2e52808

72 files changed

Lines changed: 553 additions & 488 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/maven.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ jobs:
5757
echo 'HC_BUILD_TOOLCHAIN_VERSION=${{ matrix.java }}' >> "$GITHUB_ENV"
5858
;;
5959
esac
60+
# The httpcore5-jackson3 module is compiled for Java 17 (Jackson 3
61+
# requirement), so it must be excluded from the reactor whenever the
62+
# selected toolchain is older than 17.
63+
case '${{ matrix.java }}' in
64+
8|11)
65+
echo 'HC_PROFILE_ARGS=-Dhc.jackson3.skip=true' >> "$GITHUB_ENV"
66+
;;
67+
*)
68+
echo 'HC_PROFILE_ARGS=' >> "$GITHUB_ENV"
69+
;;
70+
esac
6071
- name: Set up toolchain JDK ${{ matrix.java }}
6172
id: setup-java-toolchain
6273
uses: actions/setup-java@v5
@@ -88,4 +99,4 @@ jobs:
8899
</toolchains>
89100
EOF
90101
- name: Build with Maven
91-
run: ./mvnw -V --file pom.xml --no-transfer-progress -DtrimStackTrace=false -Djunit.jupiter.execution.parallel.enabled=false -Dhc.build.toolchain.version="${HC_BUILD_TOOLCHAIN_VERSION}" -Pdocker
102+
run: ./mvnw -V --file pom.xml --no-transfer-progress -DtrimStackTrace=false -Djunit.jupiter.execution.parallel.enabled=false -Dhc.build.toolchain.version="${HC_BUILD_TOOLCHAIN_VERSION}" ${HC_PROFILE_ARGS} -Pdocker
Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,29 @@
3131
</parent>
3232
<modelVersion>4.0.0</modelVersion>
3333

34-
<artifactId>httpcore5-jackson2</artifactId>
35-
<name>Jackson 2 bindings for Apache HttpComponents Core</name>
34+
<artifactId>httpcore5-jackson3</artifactId>
35+
<name>Jackson 3 bindings for Apache HttpComponents Core</name>
3636
<description>Apache HttpComponents JSON bindings</description>
3737

3838
<properties>
3939
<Automatic-Module-Name>org.apache.httpcomponents.core5.httpcore5.json</Automatic-Module-Name>
40+
<!--
41+
Jackson 3 is compiled for Java 17 and cannot be read by javac 8 or 11.
42+
This module therefore builds against a Java 17 toolchain, while the rest
43+
of HttpCore continues to target Java 8. The root POM keeps the module out
44+
of the reactor when an older toolchain is selected.
45+
-->
46+
<maven.compiler.source>17</maven.compiler.source>
47+
<maven.compiler.target>17</maven.compiler.target>
48+
<maven.compiler.release>17</maven.compiler.release>
49+
<hc.build.toolchain.version>17</hc.build.toolchain.version>
50+
<!--
51+
Animal Sniffer derives its signature artifact from the compiler target
52+
(java${major}${minor}); target 17 resolves to the non-existent
53+
"java170" signature. The API-level check is moot for a module that
54+
deliberately targets Java 17, so it is disabled here.
55+
-->
56+
<animal.sniffer.skip>true</animal.sniffer.skip>
4057
</properties>
4158

4259
<dependencies>
@@ -45,9 +62,9 @@
4562
<artifactId>httpcore5</artifactId>
4663
</dependency>
4764
<dependency>
48-
<groupId>com.fasterxml.jackson.core</groupId>
65+
<groupId>tools.jackson.core</groupId>
4966
<artifactId>jackson-databind</artifactId>
50-
<version>2.21.3</version>
67+
<version>${jackson.version}</version>
5168
</dependency>
5269
<dependency>
5370
<groupId>org.junit.jupiter</groupId>

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonAsyncTokenizer.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonAsyncTokenizer.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.io.IOException;
3030
import java.nio.ByteBuffer;
3131

32-
import com.fasterxml.jackson.core.JsonFactory;
33-
import com.fasterxml.jackson.core.JsonParser;
34-
import com.fasterxml.jackson.core.JsonToken;
35-
import com.fasterxml.jackson.core.JsonTokenId;
36-
import com.fasterxml.jackson.core.async.ByteArrayFeeder;
32+
import tools.jackson.core.TokenStreamFactory;
33+
import tools.jackson.core.JsonParser;
34+
import tools.jackson.core.JsonToken;
35+
import tools.jackson.core.JsonTokenId;
36+
import tools.jackson.core.ObjectReadContext;
37+
import tools.jackson.core.async.ByteArrayFeeder;
3738

3839
import org.apache.hc.core5.util.Args;
3940

@@ -45,13 +46,13 @@
4546
*/
4647
public final class JsonAsyncTokenizer {
4748

48-
private final JsonFactory jsonFactory;
49+
private final TokenStreamFactory jsonFactory;
4950

5051
private JsonTokenConsumer consumer;
5152
private JsonParser parser;
5253
private ByteArrayFeeder inputFeeder;
5354

54-
public JsonAsyncTokenizer(final JsonFactory jsonFactory) {
55+
public JsonAsyncTokenizer(final TokenStreamFactory jsonFactory) {
5556
this.jsonFactory = jsonFactory;
5657
}
5758

@@ -62,8 +63,8 @@ public JsonAsyncTokenizer(final JsonFactory jsonFactory) {
6263
*/
6364
public void initialize(final JsonTokenConsumer consumer) throws IOException {
6465
Args.notNull(consumer, "Consumer");
65-
this.parser = jsonFactory.createNonBlockingByteArrayParser();
66-
this.inputFeeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
66+
this.parser = jsonFactory.createNonBlockingByteArrayParser(ObjectReadContext.empty());
67+
this.inputFeeder = (ByteArrayFeeder) parser.nonBlockingInputFeeder();
6768
this.consumer = consumer;
6869
}
6970

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonConsumer.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonConsumer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.io.IOException;
3030

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonNodeAssembler.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonNodeAssembler.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.util.LinkedList;
3030
import java.util.function.Consumer;
3131

32-
import com.fasterxml.jackson.databind.JsonNode;
33-
import com.fasterxml.jackson.databind.node.ArrayNode;
34-
import com.fasterxml.jackson.databind.node.ContainerNode;
35-
import com.fasterxml.jackson.databind.node.JsonNodeCreator;
36-
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
37-
import com.fasterxml.jackson.databind.node.ObjectNode;
32+
import tools.jackson.databind.JsonNode;
33+
import tools.jackson.databind.node.ArrayNode;
34+
import tools.jackson.databind.node.ContainerNode;
35+
import tools.jackson.databind.node.JsonNodeCreator;
36+
import tools.jackson.databind.node.JsonNodeFactory;
37+
import tools.jackson.databind.node.ObjectNode;
3838

3939
/**
4040
* {@link JsonTokenEventHandler} implementation that assembles an {@link JsonNode}

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonResultSink.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonResultSink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.util.function.Consumer;
3030

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonTokenConsumer.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonTokenConsumer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.io.IOException;
3030

31-
import com.fasterxml.jackson.core.JsonParser;
31+
import tools.jackson.core.JsonParser;
3232

3333
/**
3434
* Represents an event recipient that can react to a stream of consecutive JSON tokens.
@@ -43,7 +43,7 @@ public interface JsonTokenConsumer {
4343
*
4444
* @param tokenId Id representing of the current token held by the parser.
4545
* @param jsonParser the JSON parser.
46-
* @see com.fasterxml.jackson.core.JsonTokenId
46+
* @see tools.jackson.core.JsonTokenId
4747
*/
4848
void accept(int tokenId, JsonParser jsonParser) throws IOException;
4949

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonTokenEventHandler.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonTokenEventHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
/**
3030
* Represents a handler of JSON token events.

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonTokenEventHandlerAdaptor.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonTokenEventHandlerAdaptor.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.io.IOException;
3030

31-
import com.fasterxml.jackson.core.JsonParser;
32-
import com.fasterxml.jackson.core.JsonTokenId;
31+
import tools.jackson.core.JsonParser;
32+
import tools.jackson.core.JsonTokenId;
33+
import tools.jackson.core.exc.InputCoercionException;
3334

3435
/**
3536
* {@link JsonTokenConsumer} implementation that converts JSON tokens into
@@ -59,11 +60,11 @@ public void accept(final int tokenId, final JsonParser jsonParser) throws IOExce
5960
case JsonTokenId.ID_END_ARRAY:
6061
eventHandler.arrayEnd();
6162
break;
62-
case JsonTokenId.ID_FIELD_NAME:
63-
eventHandler.field(jsonParser.getText());
63+
case JsonTokenId.ID_PROPERTY_NAME:
64+
eventHandler.field(jsonParser.currentName());
6465
break;
6566
case JsonTokenId.ID_STRING:
66-
eventHandler.value(jsonParser.getText());
67+
eventHandler.value(jsonParser.getString());
6768
break;
6869
case JsonTokenId.ID_NUMBER_INT:
6970
final JsonParser.NumberType numberType = jsonParser.getNumberType();
@@ -72,8 +73,8 @@ public void accept(final int tokenId, final JsonParser jsonParser) throws IOExce
7273
} else if (numberType == JsonParser.NumberType.BIG_INTEGER) {
7374
try {
7475
eventHandler.value(jsonParser.getLongValue());
75-
} catch (final IOException ex) {
76-
throw new IOException("Integer value is out of range for 64-bit signed long: " + jsonParser.getText(), ex);
76+
} catch (final InputCoercionException ex) {
77+
throw new IOException("Integer value is out of range for 64-bit signed long: " + jsonParser.getString(), ex);
7778
}
7879
} else {
7980
eventHandler.value(jsonParser.getIntValue());

httpcore5-jackson2/src/main/java/org/apache/hc/core5/jackson2/JsonTokenizer.java renamed to httpcore5-jackson3/src/main/java/org/apache/hc/core5/jackson3/JsonTokenizer.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,16 @@
2424
* <http://www.apache.org/>.
2525
*
2626
*/
27-
package org.apache.hc.core5.jackson2;
27+
package org.apache.hc.core5.jackson3;
2828

2929
import java.io.IOException;
3030
import java.io.InputStream;
3131

32-
import com.fasterxml.jackson.core.JsonFactory;
33-
import com.fasterxml.jackson.core.JsonParser;
34-
import com.fasterxml.jackson.core.JsonToken;
35-
import com.fasterxml.jackson.core.JsonTokenId;
32+
import tools.jackson.core.TokenStreamFactory;
33+
import tools.jackson.core.JsonParser;
34+
import tools.jackson.core.JsonToken;
35+
import tools.jackson.core.JsonTokenId;
36+
import tools.jackson.core.ObjectReadContext;
3637

3738
import org.apache.hc.core5.util.Args;
3839

@@ -44,16 +45,16 @@
4445
*/
4546
public final class JsonTokenizer {
4647

47-
private final JsonFactory jsonFactory;
48+
private final TokenStreamFactory jsonFactory;
4849

49-
public JsonTokenizer(final JsonFactory jsonFactory) {
50+
public JsonTokenizer(final TokenStreamFactory jsonFactory) {
5051
this.jsonFactory = jsonFactory;
5152
}
5253

5354
public void tokenize(final InputStream inputStream,
5455
final JsonTokenConsumer consumer) throws IOException {
5556
Args.notNull(consumer, "Consumer");
56-
final JsonParser parser = jsonFactory.createParser(inputStream);
57+
final JsonParser parser = jsonFactory.createParser(ObjectReadContext.empty(), inputStream);
5758
while (!parser.isClosed()) {
5859
final JsonToken jsonToken = parser.nextToken();
5960
if (jsonToken != null) {

0 commit comments

Comments
 (0)