From 857d3842df8212bbc2f395eb6d682c3ab352c950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?= Date: Sat, 22 Nov 2025 23:22:02 +0100 Subject: [PATCH 1/5] Jackson 3 upgrade --- build.gradle | 272 +++++------------- .../fge/jackson/JsonNumEquivalence.java | 2 +- .../fge/jackson/JsonNumEquivalenceTest.java | 8 +- gradle/wrapper/gradle-wrapper.properties | 2 +- project.gradle | 3 +- .../com/github/fge/jackson/JacksonUtils.java | 51 ++-- .../com/github/fge/jackson/JsonLoader.java | 2 +- .../github/fge/jackson/JsonNodeReader.java | 43 +-- .../com/github/fge/jackson/JsonNumEquals.java | 38 ++- .../java/com/github/fge/jackson/NodeType.java | 6 +- .../jackson/jsonpointer/JsonNodeResolver.java | 4 +- .../fge/jackson/jsonpointer/JsonPointer.java | 6 +- .../jackson/jsonpointer/TokenResolver.java | 4 +- .../fge/jackson/jsonpointer/TreePointer.java | 10 +- .../fge/jackson/jsonpointer/package-info.java | 2 +- .../com/github/fge/jackson/package-info.java | 10 +- .../github/fge/jackson/JacksonUtilsTest.java | 4 +- .../fge/jackson/JsonNodeReaderTest.java | 8 +- .../github/fge/jackson/JsonNumEqualsTest.java | 8 +- .../fge/jackson/SampleNodeProvider.java | 4 +- .../jsonpointer/JsonNodeResolverTest.java | 8 +- .../jackson/jsonpointer/JsonPointerTest.java | 2 +- .../jackson/jsonpointer/TreePointerTest.java | 2 +- 23 files changed, 179 insertions(+), 320 deletions(-) diff --git a/build.gradle b/build.gradle index a679f48..ca44b53 100644 --- a/build.gradle +++ b/build.gradle @@ -17,226 +17,92 @@ * - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt */ -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'biz.aQute.bnd:biz.aQute.bnd.gradle:4.2.0' - } -} - plugins { - id("net.ltgt.errorprone") version "0.8.1" apply false + id "java-library" + id "maven-publish" + id "signing" + id "idea" + id "eclipse" + id "com.github.ben-manes.versions" version "0.51.0" } -allprojects { - apply(plugin: "java"); - apply(plugin: "maven"); - apply(plugin: "signing"); - apply(plugin: "biz.aQute.bnd.builder"); - apply(plugin: "idea"); - apply(plugin: "eclipse"); - apply(plugin: "net.ltgt.errorprone"); - - apply(from: "project.gradle"); - - group = "com.github.java-json-tools"; - - ext.forRelease = !version.endsWith("-SNAPSHOT"); - - /* - * Repositories to use - */ - repositories { - mavenCentral(); - if (!forRelease) { - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - } - } - /* Allow staging references for last pre-release testing. */ - if (project.properties.containsKey("sonatypeUsername")) { - maven { - url "https://oss.sonatype.org/service/local/staging/deploy/maven2" - credentials { - username = project.properties["sonatypeUsername"] - password = project.properties["sonatypePassword"] - } - } - } - } - - /* - * Add errorprone checking. - */ - dependencies { - errorprone("com.google.errorprone:error_prone_core:2.3.3") - errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") - } - - /* - * Necessary! Otherwise TestNG will not be used... - * - * Also, we don't want gradle's default HTML report: it does not support - * parameterized tests which I use a _lot_. - */ - test { - useTestNG() { - useDefaultListeners = true; - }; - } - - /* - * Necessary to generate the source and javadoc jars - */ - task sourcesJar(type: Jar, dependsOn: classes) { - classifier = "sources"; - from sourceSets.main.allSource; - } - - /* - * Lint all the things! - */ - gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:all" << "-Werror" - } - tasks.withType(Javadoc) { - options.addStringOption('Xwerror', '-quiet') - } - } - - task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = "javadoc"; - from javadoc.destinationDir; - } - - artifacts { - archives jar; - archives sourcesJar; - archives javadocJar; - } - - wrapper { - gradleVersion = "5.6.3"; - distributionUrl = "https://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip"; - } +group = "com.github.java-json-tools" +version = "1.9-SNAPSHOT" +description = "Core utility classes for Jackson" - task pom { - doLast { - pom {}.writeTo("${projectDir}/pom.xml"); - } - } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + withSourcesJar() + withJavadocJar() +} - /* - * SIGNING - */ +repositories { + mavenCentral() +} - project.ext { - description = "JSON Pointer (RFC 6901) and numeric equality for Jackson (2.2.x)"; - scmUrl = sprintf("git@github.com:java-json-tools/%s.git", rootProject.name) - projectURL = sprintf("https://github.com/java-json-tools/%s", rootProject.name); - sonatypeStaging = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"; - sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots/"; - }; +dependencies { + api "com.google.code.findbugs:jsr305:3.0.2" + api "tools.jackson.core:jackson-databind:3.0.0" + api "com.github.java-json-tools:msg-simple:1.2" + + testImplementation "org.testng:testng:7.9.0" + testImplementation "org.assertj:assertj-core:3.25.3" + testImplementation "org.mockito:mockito-core:5.11.0" +} - task checkSigningRequirements { - doLast { - def requiredProperties = [ "sonatypeUsername", "sonatypePassword" ]; - def noDice = false; - requiredProperties.each { - if (project.properties[it] == null) { - noDice = true; - System.err.printf("property \"%s\" is not defined!") - } - } - if (noDice) - throw new IllegalStateException("missing required properties for " + - "upload"); - } +test { + useTestNG() + testLogging { + events "passed", "skipped", "failed" + exceptionFormat = "full" } +} - uploadArchives { - dependsOn(checkSigningRequirements); - repositories { - mavenDeployer { - beforeDeployment { - MavenDeployment deployment -> signing.signPom(deployment); - } - - repository(url: "${sonatypeStaging}") { - authentication( - userName: project.properties["sonatypeUsername"], - password: project.properties["sonatypePassword"] - ); - } +javadoc { + options.links("https://docs.oracle.com/en/java/javase/17/docs/api/") +} - snapshotRepository(url: "${sonatypeSnapshots}") { - authentication( - userName: project.properties["sonatypeUsername"], - password: project.properties["sonatypePassword"] - ); +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + + pom { + name = "Jackson coreutils" + description = "A set of utility classes for use with Jackson" + url = "https://github.com/java-json-tools/jackson-coreutils" + + licenses { + license { + name = "Lesser General Public License, version 3 or greater" + url = "http://www.gnu.org/licenses/lgpl.html" + } + license { + name = "Apache Software License, version 2.0" + url = "http://www.apache.org/licenses/LICENSE-2.0" + } } - } - } - } - - /* - * Configure pom.xml on install, uploadArchives - */ - [ - install.repositories.mavenInstaller, - uploadArchives.repositories.mavenDeployer - ]*.pom*.whenConfigured { pom -> - pom.project { - name "${project.name}"; - packaging "jar"; - description "${project.ext.description}"; - url "${projectURL}"; - - scm { - url "${scmUrl}"; - connection "${scmUrl}"; - developerConnection "scm:git:${scmUrl}"; - } - - licenses { - license { - name "Lesser General Public License, version 3 or greater"; - url "http://www.gnu.org/licenses/lgpl.html"; - distribution "repo"; - }; - license { - name "Apache Software License, version 2.0"; - url "http://www.apache.org/licenses/LICENSE-2.0"; - distribution "repo"; + + scm { + url = "https://github.com/java-json-tools/jackson-coreutils" + connection = "scm:git:git://github.com/java-json-tools/jackson-coreutils" } - } - - developers { - developer { - id "huggsboson"; - name "John Huffaker"; - email "jhuffaker+java-json-tools@gmail.com"; + + developers { + developer { + id = "fge" + name = "Francis Galiegue" + email = "fgaliegue@gmail.com" + } } } } } - - signing { - required { forRelease && gradle.taskGraph.hasTask("uploadArchives") }; - sign configurations.archives; - } } -/* - * Javadoc: we need to tell where the overview.html is, it will not pick it up - * automatically... - */ - -javadoc { - options.overview = "src/main/java/overview.html"; +signing { + required { gradle.taskGraph.hasTask("publish") } + sign publishing.publications.mavenJava } - diff --git a/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java b/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java index 29c2618..160c67d 100644 --- a/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java +++ b/equivalence/src/main/java/com/github/fge/jackson/JsonNumEquivalence.java @@ -18,7 +18,7 @@ */ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.base.Equivalence; /** diff --git a/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java b/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java index 939778b..7a613b5 100644 --- a/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java +++ b/equivalence/src/test/java/com/github/fge/jackson/JsonNumEquivalenceTest.java @@ -19,10 +19,10 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3a54a33..e69d040 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/project.gradle b/project.gradle index bd7379a..a2b9ddd 100644 --- a/project.gradle +++ b/project.gradle @@ -29,7 +29,8 @@ targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibilit * List of dependencies */ dependencies { - implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0"); + implementation(group: "tools.jackson.core", name: "jackson-databind", version: "3.0.0"); +// implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0"); implementation(group: "com.github.java-json-tools", name: "msg-simple", version: "1.2"); implementation(group: "com.google.code.findbugs", name: "jsr305", version: "3.0.2"); testImplementation(group: "org.testng", name: "testng", version: "7.1.0") { diff --git a/src/main/java/com/github/fge/jackson/JacksonUtils.java b/src/main/java/com/github/fge/jackson/JacksonUtils.java index 01750a6..aa2dde8 100644 --- a/src/main/java/com/github/fge/jackson/JacksonUtils.java +++ b/src/main/java/com/github/fge/jackson/JacksonUtils.java @@ -19,21 +19,20 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.core.exc.StreamWriteException; +import tools.jackson.core.StreamWriteFeature; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; +import tools.jackson.databind.ObjectWriter; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; -import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; /** @@ -98,15 +97,10 @@ public static Map asMap(final JsonNode node) if (!node.isObject()) return ret; - final Iterator> iterator = node.fields(); - - Map.Entry entry; - - while (iterator.hasNext()) { - entry = iterator.next(); - ret.put(entry.getKey(), entry.getValue()); + for (Map.Entry property : node.properties()) { + ret.put(property.getKey(), property.getValue()); } - + return ret; } @@ -124,11 +118,11 @@ public static String prettyPrint(final JsonNode node) try { WRITER.writeValue(writer, node); writer.flush(); - } catch (JsonGenerationException e) { + } catch (StreamWriteException e) { throw new RuntimeException("How did I get there??", e); - } catch (JsonMappingException e) { + } catch (DatabindException e) { throw new RuntimeException("How did I get there??", e); - } catch (IOException ignored) { + //} catch (IOException ignored) { // cannot happen } @@ -142,7 +136,7 @@ public static String prettyPrint(final JsonNode node) * *
    *
  • {@link DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS};
  • - *
  • {@link com.fasterxml.jackson.core.JsonGenerator.Feature#WRITE_BIGDECIMAL_AS_PLAIN};
  • + *
  • {@link StreamWriteFeature#WRITE_BIGDECIMAL_AS_PLAIN};
  • *
  • {@link SerializationFeature#INDENT_OUTPUT}.
  • *
* @@ -152,9 +146,10 @@ public static String prettyPrint(final JsonNode node) */ public static ObjectMapper newMapper() { - return new ObjectMapper().setNodeFactory(FACTORY) - .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS) - .enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN) - .enable(SerializationFeature.INDENT_OUTPUT); + return JsonMapper.builder().nodeFactory(FACTORY) + .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS) + .enable(StreamWriteFeature.WRITE_BIGDECIMAL_AS_PLAIN) + .enable(SerializationFeature.INDENT_OUTPUT) + .build(); } } diff --git a/src/main/java/com/github/fge/jackson/JsonLoader.java b/src/main/java/com/github/fge/jackson/JsonLoader.java index 5a3467b..3101daf 100644 --- a/src/main/java/com/github/fge/jackson/JsonLoader.java +++ b/src/main/java/com/github/fge/jackson/JsonLoader.java @@ -19,7 +19,7 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import javax.annotation.Nonnull; import java.io.File; diff --git a/src/main/java/com/github/fge/jackson/JsonNodeReader.java b/src/main/java/com/github/fge/jackson/JsonNodeReader.java index 2e6c622..1590521 100644 --- a/src/main/java/com/github/fge/jackson/JsonNodeReader.java +++ b/src/main/java/com/github/fge/jackson/JsonNodeReader.java @@ -20,13 +20,13 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.core.JsonLocation; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.MappingIterator; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; +import tools.jackson.core.TokenStreamLocation; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.MappingIterator; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; import com.github.fge.Builder; import com.github.fge.msgsimple.bundle.MessageBundle; import com.github.fge.msgsimple.bundle.PropertiesBundle; @@ -36,6 +36,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; +import tools.jackson.core.StreamReadFeature; /** * Class dedicated to reading JSON values from {@link InputStream}s and {@link @@ -69,8 +70,10 @@ public final class JsonNodeReader public JsonNodeReader(final ObjectMapper mapper) { - reader = mapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true) - .readerFor(JsonNode.class); + reader = mapper.rebuild() + .enable(StreamReadFeature.AUTO_CLOSE_SOURCE) + .build() + .readerFor(JsonNode.class); } /** @@ -96,7 +99,7 @@ public JsonNode fromInputStream(final InputStream in) MappingIterator iterator = null; try { - parser = reader.getFactory().createParser(in); + parser = reader.createParser(in); iterator = reader.readValues(parser); return readNode(iterator); } finally { @@ -124,7 +127,7 @@ public JsonNode fromReader(final Reader r) MappingIterator iterator = null; try { - parser = reader.getFactory().createParser(r); + parser = reader.createParser(r); iterator = reader.readValues(parser); return readNode(iterator); } finally { @@ -140,7 +143,7 @@ public JsonNode fromReader(final Reader r) private static JsonNode readNode(final MappingIterator iterator) throws IOException { - final JsonParser parser = iterator.getParser(); + final JsonParser parser = iterator.parser(); final JsonParseExceptionBuilder builder = new JsonParseExceptionBuilder(parser); @@ -152,12 +155,12 @@ private static JsonNode readNode(final MappingIterator iterator) final JsonNode ret = iterator.nextValue(); builder.setMessage(BUNDLE.getMessage("read.trailingData")) - .setLocation(iterator.getCurrentLocation()); + .setLocation(iterator.currentLocation()); try { if (iterator.hasNextValue()) throw builder.build(); - } catch (JsonParseException e) { + } catch (StreamReadException e) { throw builder.setLocation(e.getLocation()).build(); } @@ -165,17 +168,17 @@ private static JsonNode readNode(final MappingIterator iterator) } private static final class JsonParseExceptionBuilder - implements Builder + implements Builder { private JsonParser parser; private String message = ""; - private JsonLocation location; + private TokenStreamLocation location; private JsonParseExceptionBuilder(@Nonnull final JsonParser parser) { BUNDLE.checkNotNull(parser, "read.nullArgument"); this.parser = parser; - location = parser.getCurrentLocation(); + location = parser.currentLocation(); } private JsonParseExceptionBuilder setMessage( @@ -186,16 +189,16 @@ private JsonParseExceptionBuilder setMessage( } private JsonParseExceptionBuilder setLocation( - @Nonnull final JsonLocation location) + @Nonnull final TokenStreamLocation location) { this.location = BUNDLE.checkNotNull(location, "read.nullArgument"); return this; } @Override - public JsonParseException build() + public StreamReadException build() { - return new JsonParseException(parser, message, location); + return new StreamReadException(parser, message, location); } } } diff --git a/src/main/java/com/github/fge/jackson/JsonNumEquals.java b/src/main/java/com/github/fge/jackson/JsonNumEquals.java index 2bb4bc7..5d5d8f2 100644 --- a/src/main/java/com/github/fge/jackson/JsonNumEquals.java +++ b/src/main/java/com/github/fge/jackson/JsonNumEquals.java @@ -19,7 +19,7 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import javax.annotation.Nullable; import java.util.HashSet; import java.util.Iterator; @@ -84,7 +84,7 @@ protected boolean doEquivalent(final JsonNode a, final JsonNode b) /* * For all other primitive types than numbers, trust JsonNode */ - if (!a.isContainerNode()) + if (!a.isContainer()) return a.equals(b); /* @@ -122,7 +122,7 @@ protected int doHash(final JsonNode t) * If this is a primitive type (other than numbers, handled above), * delegate to JsonNode. */ - if (!t.isContainerNode()) + if (!t.isContainer()) return t.hashCode(); /* @@ -151,16 +151,12 @@ protected int doHash(final JsonNode t) /* * Not an array? An object. */ - final Iterator> iterator = t.fields(); - - Map.Entry entry; - - while (iterator.hasNext()) { - entry = iterator.next(); + for (Map.Entry property : t.properties()) { ret = 31 * ret - + (entry.getKey().hashCode() ^ hash(entry.getValue())); + + (property.getKey().hashCode() ^ hash(property.getValue())); + } - + return ret; } @@ -198,26 +194,24 @@ private boolean objectEquals(final JsonNode a, final JsonNode b) * Grab the key set from the first node */ final Set keys = new HashSet<>(); - Iterator iterator1 = a.fieldNames(); - while (iterator1.hasNext()) { - final String next = iterator1.next(); - if (next != null) { - keys.add(next); + + for (String propertyName : a.propertyNames()) { + if (propertyName != null) { + keys.add(propertyName); } else { throw new NullPointerException(); } } - + /* * Grab the key set from the second node, and see if both sets are the * same. If not, objects are not equal, no need to check for children. */ final Set set = new HashSet<>(); - Iterator iterator2 = b.fieldNames(); - while (iterator2.hasNext()) { - final String next = iterator2.next(); - if (next != null) { - set.add(next); + + for (String propertyName : b.propertyNames()) { + if (propertyName != null) { + set.add(propertyName); } else { throw new NullPointerException(); } diff --git a/src/main/java/com/github/fge/jackson/NodeType.java b/src/main/java/com/github/fge/jackson/NodeType.java index 67ddf86..ee79d99 100644 --- a/src/main/java/com/github/fge/jackson/NodeType.java +++ b/src/main/java/com/github/fge/jackson/NodeType.java @@ -19,9 +19,9 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.MissingNode; +import tools.jackson.core.JsonToken; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.MissingNode; import java.util.Collections; import java.util.EnumMap; diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java b/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java index c3c351a..574bfd0 100644 --- a/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java +++ b/src/main/java/com/github/fge/jackson/jsonpointer/JsonNodeResolver.java @@ -19,7 +19,7 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import javax.annotation.concurrent.Immutable; @@ -47,7 +47,7 @@ public JsonNodeResolver(final ReferenceToken token) @Override public JsonNode get(final JsonNode node) { - if (node == null || !node.isContainerNode()) + if (node == null || !node.isContainer()) return null; final String raw = token.getRaw(); return node.isObject() ? node.get(raw) : node.get(arrayIndexFor(raw)); diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java b/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java index 0aae6a5..3ec2629 100644 --- a/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java +++ b/src/main/java/com/github/fge/jackson/jsonpointer/JsonPointer.java @@ -19,9 +19,9 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.MissingNode; +import tools.jackson.core.TreeNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.MissingNode; import javax.annotation.concurrent.Immutable; import java.util.ArrayList; diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java b/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java index cbef821..16657da 100644 --- a/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java +++ b/src/main/java/com/github/fge/jackson/jsonpointer/TokenResolver.java @@ -19,8 +19,8 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.TreeNode; +import tools.jackson.databind.JsonNode; import javax.annotation.concurrent.ThreadSafe; diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java b/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java index 8d6daee..b509fe8 100644 --- a/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java +++ b/src/main/java/com/github/fge/jackson/jsonpointer/TreePointer.java @@ -19,11 +19,11 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.MissingNode; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import tools.jackson.core.TreeNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.node.MissingNode; +import tools.jackson.databind.ser.std.ToStringSerializer; import com.github.fge.msgsimple.bundle.MessageBundle; import com.github.fge.msgsimple.load.MessageBundles; diff --git a/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java b/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java index 80e2217..e9c5527 100644 --- a/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java +++ b/src/main/java/com/github/fge/jackson/jsonpointer/package-info.java @@ -23,7 +23,7 @@ *

This package, while primarily centered on {@link * com.github.fge.jackson.jsonpointer.JsonPointer}, is a generalization of JSON * Pointer to all implementations of Jackson's {@link - * com.fasterxml.jackson.core.TreeNode}.

+ * tools.jackson.core.TreeNode}.

* *

The fundamentals of JSON Pointer remain the same, however: a JSON pointer * is a set of reference tokens separated by the {@code /} character. One diff --git a/src/main/java/com/github/fge/jackson/package-info.java b/src/main/java/com/github/fge/jackson/package-info.java index 44641ad..661dcd6 100644 --- a/src/main/java/com/github/fge/jackson/package-info.java +++ b/src/main/java/com/github/fge/jackson/package-info.java @@ -21,28 +21,28 @@ * Jackson utility classes * *

{@link com.github.fge.jackson.JsonLoader} contains various methods to load - * JSON documents as {@link com.fasterxml.jackson.databind.JsonNode}s. It uses + * JSON documents as {@link tools.jackson.databind.JsonNode}s. It uses * a {@link com.github.fge.jackson.JsonNodeReader} (as such, parsing {@code []]} * will generate an error where Jackson normally does not).

* *

You will also want to use {@link com.github.fge.jackson.JacksonUtils} * to grab a node factory, reader and pretty printer for anything JSON. Compared - * to the basic Jackson's {@link com.fasterxml.jackson.databind.ObjectMapper}, + * to the basic Jackson's {@link tools.jackson.databind.ObjectMapper}, * the one provided by {@link com.github.fge.jackson.JacksonUtils} deserializes * all floating point numbers as {@link java.math.BigDecimal}s by default. This * is done using {@link - * com.fasterxml.jackson.databind.DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS}. + * tools.jackson.databind.DeserializationFeature#USE_BIG_DECIMAL_FOR_FLOATS}. *

* *

{@link com.github.fge.jackson.JsonNumEquals} is an {@code * com.google.common.base.Equivalence} over {@link - * com.fasterxml.jackson.databind.JsonNode} for recursive equivalence of JSON + * tools.jackson.databind.JsonNode} for recursive equivalence of JSON * number values.

* *

Finally, {@link com.github.fge.jackson.NodeType} is a utility enumeration * which distinguishes between all JSON node types defined by RFC 7159, plus * {@code integer} (used by JSON Schema). Note that since Jackson 2.2, there is - * also {@link com.fasterxml.jackson.databind.JsonNode#getNodeType()}, but it + * also {@link tools.jackson.databind.JsonNode#getNodeType()}, but it * does not make a difference between {@code number} and {@code integer}.

*/ package com.github.fge.jackson; diff --git a/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java b/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java index 7ebf6aa..c43b7c9 100644 --- a/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java +++ b/src/test/java/com/github/fge/jackson/JacksonUtilsTest.java @@ -19,8 +19,8 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java b/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java index 2965822..79b7315 100644 --- a/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java +++ b/src/test/java/com/github/fge/jackson/JsonNodeReaderTest.java @@ -19,9 +19,9 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import com.github.fge.msgsimple.bundle.MessageBundle; import com.github.fge.msgsimple.bundle.PropertiesBundle; import org.testng.annotations.DataProvider; @@ -93,7 +93,7 @@ public void malformedDataThrowsExpectedException(final String input, try { reader.fromInputStream(supplier.get()); fail("No exception thrown!!"); - } catch (JsonParseException e) { + } catch (StreamReadException e) { assertEquals(e.getOriginalMessage(), message); } } diff --git a/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java b/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java index af4d068..36ca8d4 100644 --- a/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java +++ b/src/test/java/com/github/fge/jackson/JsonNumEqualsTest.java @@ -19,10 +19,10 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; diff --git a/src/test/java/com/github/fge/jackson/SampleNodeProvider.java b/src/test/java/com/github/fge/jackson/SampleNodeProvider.java index 23817f7..54772de 100644 --- a/src/test/java/com/github/fge/jackson/SampleNodeProvider.java +++ b/src/test/java/com/github/fge/jackson/SampleNodeProvider.java @@ -19,8 +19,8 @@ package com.github.fge.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import java.math.BigDecimal; import java.util.*; diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java index 6f22fda..9c22abb 100644 --- a/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java +++ b/src/test/java/com/github/fge/jackson/jsonpointer/JsonNodeResolverTest.java @@ -19,10 +19,10 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.github.fge.jackson.JacksonUtils; import com.github.fge.jackson.NodeType; import com.github.fge.jackson.SampleNodeProvider; diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java index be19a61..dbbc133 100644 --- a/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java +++ b/src/test/java/com/github/fge/jackson/jsonpointer/JsonPointerTest.java @@ -19,7 +19,7 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.github.fge.jackson.JacksonUtils; import com.github.fge.jackson.JsonLoader; import com.github.fge.jackson.NodeType; diff --git a/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java b/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java index 2edc050..8629875 100644 --- a/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java +++ b/src/test/java/com/github/fge/jackson/jsonpointer/TreePointerTest.java @@ -19,7 +19,7 @@ package com.github.fge.jackson.jsonpointer; -import com.fasterxml.jackson.core.TreeNode; +import tools.jackson.core.TreeNode; import com.github.fge.msgsimple.bundle.MessageBundle; import com.github.fge.msgsimple.load.MessageBundles; import org.testng.annotations.Test; From 8785c1358d431987fad0af56ed32c02265697543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?= Date: Sun, 23 Nov 2025 00:58:11 +0100 Subject: [PATCH 2/5] Jackson 3 upgrade --- build.gradle | 2 +- src/main/java/com/github/fge/jackson/JacksonUtils.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ca44b53..4a5e7bb 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ plugins { } group = "com.github.java-json-tools" -version = "1.9-SNAPSHOT" +version = "2.0-SNAPSHOT" description = "Core utility classes for Jackson" java { diff --git a/src/main/java/com/github/fge/jackson/JacksonUtils.java b/src/main/java/com/github/fge/jackson/JacksonUtils.java index aa2dde8..3b19aaa 100644 --- a/src/main/java/com/github/fge/jackson/JacksonUtils.java +++ b/src/main/java/com/github/fge/jackson/JacksonUtils.java @@ -34,6 +34,8 @@ import java.io.StringWriter; import java.util.HashMap; import java.util.Map; +import tools.jackson.core.ObjectReadContext; +import tools.jackson.databind.DeserializationConfig; /** * Utility class for Jackson From cefea03870fdfe6cd3544b14459a78e255d948bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?= Date: Sun, 23 Nov 2025 09:59:04 +0100 Subject: [PATCH 3/5] Jackson 3 upgrade --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4a5e7bb..8eca9f4 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ plugins { } group = "com.github.java-json-tools" -version = "2.0-SNAPSHOT" +version = "2.1-SNAPSHOT" description = "Core utility classes for Jackson" java { From 880c801a9220a08753967120259345ac320fbf85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?= Date: Sun, 23 Nov 2025 13:46:02 +0100 Subject: [PATCH 4/5] Delete project.gradle --- project.gradle | 56 -------------------------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 project.gradle diff --git a/project.gradle b/project.gradle deleted file mode 100644 index a2b9ddd..0000000 --- a/project.gradle +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2014, Francis Galiegue (fgaliegue@gmail.com) - * - * This software is dual-licensed under: - * - * - the Lesser General Public License (LGPL) version 3.0 or, at your option, any - * later version; - * - the Apache Software License (ASL) version 2.0. - * - * The text of this file and of both licenses is available at the root of this - * project or, if you have the jar distribution, in directory META-INF/, under - * the names LGPL-3.0.txt and ASL-2.0.txt respectively. - * - * Direct link to the sources: - * - * - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt - * - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt - */ - -/* - * Project-specific settings. Unfortunately we cannot put the name in there! - */ -group = "com.github.java-json-tools"; -version = "2.0"; -sourceCompatibility = JavaVersion.VERSION_1_7; -targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibility - -/* - * List of dependencies - */ -dependencies { - implementation(group: "tools.jackson.core", name: "jackson-databind", version: "3.0.0"); -// implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0"); - implementation(group: "com.github.java-json-tools", name: "msg-simple", version: "1.2"); - implementation(group: "com.google.code.findbugs", name: "jsr305", version: "3.0.2"); - testImplementation(group: "org.testng", name: "testng", version: "7.1.0") { - exclude(group: "junit", module: "junit"); - exclude(group: "org.beanshell", module: "bsh"); - exclude(group: "org.yaml", module: "snakeyaml"); - }; - testImplementation(group: "org.mockito", name: "mockito-core", version: "2.28.2"); -} - -javadoc { - options { - def currentJavaVersion = org.gradle.api.JavaVersion.current() - // FIXME: https://github.com/gradle/gradle/issues/11182 - if (currentJavaVersion.compareTo(org.gradle.api.JavaVersion.VERSION_1_9) >= 0) { - addStringOption("-release", "7"); - } - links("https://docs.oracle.com/javase/7/docs/api/"); - links("https://www.javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/"); - links("https://fasterxml.github.io/jackson-databind/javadoc/2.11/"); - links("https://java-json-tools.github.io/msg-simple/"); - } -} From 33fd8eb2e8cbe1a2fa61794ae75b3271d6501c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20Zolt=C3=A1n?= Date: Sun, 23 Nov 2025 13:52:54 +0100 Subject: [PATCH 5/5] Update project files --- .travis.yml | 3 +-- CONTRIBUTORS.md | 4 ++++ README.md | 14 +++++++------- equivalence/project.gradle | 21 ++++++--------------- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0360f23..eb62683 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: java jdk: - - openjdk8 - - openjdk11 + - openjdk17 install: {} script: - ./gradlew assemble check diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ab634da..d6b6624 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,3 +1,7 @@ +## Kovács Zoltán (https://github.com/kz282) + +* Upgrade to Jackson 3.0 + ## Randy Watler * Added `.parent()` to `JsonPointer` (darn useful!). diff --git a/README.md b/README.md index 6fa8e99..de4565d 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ project for details. ## What this is -This package is meant to be used with Jackson 2.2.x. It provides the three following features: +This package is meant to be used with Jackson 3.0.x. It provides the three following features: * write/read JSON decimal numbers using `BigDecimal` (instead of `double`) for optimal numeric precision; @@ -30,8 +30,8 @@ This package is meant to be used with Jackson 2.2.x. It provides the three follo ## Versions -* `jackson-coreutils` is **2.0** -* `jackson-coreutils-equivalence` is **1.0** +* `jackson-coreutils` is **2.1** +* `jackson-coreutils-equivalence` is **1.1** Javadoc is [available online](https://java-json-tools.github.io/jackson-coreutils/index.html). @@ -44,8 +44,8 @@ With Gradle: ```groovy dependencies { - compile(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.0"); - compile(group: "com.github.java-json-tools", name: "jackson-coreutils-equivalence", version: "1.0"); + compile(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.1"); + compile(group: "com.github.java-json-tools", name: "jackson-coreutils-equivalence", version: "1.1"); } ``` @@ -55,12 +55,12 @@ With Maven: com.github.java-json-tools jackson-coreutils - 2.0 + 2.1 com.github.java-json-tools jackson-coreutils-equivalence - 1.0 + 1.1 ``` diff --git a/equivalence/project.gradle b/equivalence/project.gradle index e95017b..448832b 100644 --- a/equivalence/project.gradle +++ b/equivalence/project.gradle @@ -21,18 +21,16 @@ * Project-specific settings. Unfortunately we cannot put the name in there! */ group = "com.github.java-json-tools"; -version = "1.0"; -sourceCompatibility = JavaVersion.VERSION_1_7; -targetCompatibility = JavaVersion.VERSION_1_7; // defaults to sourceCompatibility +version = "1.1"; +sourceCompatibility = JavaVersion.VERSION_17; +targetCompatibility = JavaVersion.VERSION_17; // defaults to sourceCompatibility /* * List of dependencies */ dependencies { - implementation(group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.11.0"); - implementation(group: "com.google.guava", name: "guava", version: "28.2-android"); - implementation(group: "com.github.java-json-tools", name: "jackson-coreutils", version: "2.0"); - testImplementation(group: "org.testng", name: "testng", version: "7.1.0") { + api "com.github.java-json-tools:jackson-coreutils:2.1-SNAPSHOT" + testImplementation(group: "org.testng", name: "testng", version: "7.9.0") { exclude(group: "junit", module: "junit"); exclude(group: "org.beanshell", module: "bsh"); exclude(group: "org.yaml", module: "snakeyaml"); @@ -41,14 +39,7 @@ dependencies { javadoc { options { - def currentJavaVersion = org.gradle.api.JavaVersion.current() - // FIXME: https://github.com/gradle/gradle/issues/11182 - if (currentJavaVersion.compareTo(org.gradle.api.JavaVersion.VERSION_1_9) >= 0) { - addStringOption("-release", "7"); - } - links("https://docs.oracle.com/javase/7/docs/api/"); - links("https://fasterxml.github.io/jackson-databind/javadoc/2.11/"); - links("https://www.javadoc.io/doc/com.google.guava/guava/28.2-android/"); + links("https://docs.oracle.com/en/java/javase/17/docs/api/"); links("https://java-json-tools.github.io/jackson-coreutils/"); } }