diff --git a/.github/workflows/tests-code.yml b/.github/workflows/tests-code.yml index f3da550b0b4..cd2e130de80 100644 --- a/.github/workflows/tests-code.yml +++ b/.github/workflows/tests-code.yml @@ -576,6 +576,7 @@ jobs: echo "//SOURCES ../../$f" >> "${{ matrix.script }}" fi done + - run: cat ${{ matrix.script }} - run: jbang build "${{ matrix.script }}" shell: bash - run: jbang "${{ matrix.script }}" --help diff --git a/.jbang/JabKitLauncher.java b/.jbang/JabKitLauncher.java index a3313e0d344..2418e689221 100755 --- a/.jbang/JabKitLauncher.java +++ b/.jbang/JabKitLauncher.java @@ -30,6 +30,10 @@ //DEPS io.github.darvil82:terminal-text-formatter:2.3.0c //DEPS info.picocli:picocli:4.7.7 //DEPS com.github.ben-manes.caffeine:caffeine:3.2.3 +//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20 +//DEPS tools.jackson.core:jackson-core:3.0.2 +//DEPS tools.jackson.core:jackson-databind:3.0.2 +//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2 /// This class is required for [jbang](https://www.jbang.dev/) public class JabKitLauncher { diff --git a/.jbang/JabLsLauncher.java b/.jbang/JabLsLauncher.java index 0ee1cac48b1..a932c78f973 100755 --- a/.jbang/JabLsLauncher.java +++ b/.jbang/JabLsLauncher.java @@ -36,7 +36,10 @@ //DEPS org.jspecify:jspecify:1.0.0 // from jabls -//DEPS com.fasterxml.jackson.core:jackson-databind:2.20.1 +//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20 +//DEPS tools.jackson.core:jackson-core:3.0.2 +//DEPS tools.jackson.core:jackson-databind:3.0.2 +//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2 //DEPS info.picocli:picocli:4.7.7 //DEPS org.apache.logging.log4j:log4j-to-slf4j:2.25.2 //DEPS org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0 diff --git a/.jbang/JabSrvLauncher.java b/.jbang/JabSrvLauncher.java index f00ed51a273..081696065ba 100755 --- a/.jbang/JabSrvLauncher.java +++ b/.jbang/JabSrvLauncher.java @@ -80,6 +80,9 @@ //DEPS net.harawata:appdirs:1.5.0 //DEPS de.undercouch:citeproc-java:3.4.0 //DEPS com.github.ben-manes.caffeine:caffeine:3.2.3 +//DEPS tools.jackson.core:jackson-core:3.0.2 +//DEPS tools.jackson.core:jackson-databind:3.0.2 +//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2 //DEPS org.apache.commons:commons-lang3:3.19.0 /// This class is required for [jbang](https://www.jbang.dev/) diff --git a/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java b/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java index 71a0d45f932..3e5493c07e9 100644 --- a/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java +++ b/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java @@ -18,6 +18,10 @@ //DEPS org.jabref:jablib:6.0-SNAPSHOT // JabRef relies on PR https://github.com/unicode-org/icu/pull/2127; for experiments the release version is OK. //DEPS com.ibm.icu:icu4j:78.1 +//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20 +//DEPS tools.jackson.core:jackson-core:3.0.2 +//DEPS tools.jackson.core:jackson-databind:3.0.2 +//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2 void main() throws Exception { var preferences = JabRefCliPreferences.getInstance(); diff --git a/jablib/build.gradle.kts b/jablib/build.gradle.kts index 7b6e2ebb643..7c239a8bb45 100644 --- a/jablib/build.gradle.kts +++ b/jablib/build.gradle.kts @@ -103,8 +103,8 @@ dependencies { implementation("org.eclipse.jgit:org.eclipse.jgit") - implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("tools.jackson.dataformat:jackson-dataformat-yaml") + implementation("tools.jackson.core:jackson-databind") // TODO: Somwewhere we get a warning: unknown enum constant Id.CLASS reason: class file for com.fasterxml.jackson.annotation.JsonTypeInfo$Id not found // implementation("com.fasterxml.jackson.core:jackson-annotations:2.19.1") diff --git a/jablib/src/main/java/module-info.java b/jablib/src/main/java/module-info.java index f6b15121e93..8553c370c77 100644 --- a/jablib/src/main/java/module-info.java +++ b/jablib/src/main/java/module-info.java @@ -155,9 +155,9 @@ // region: data mapping requires jdk.xml.dom; requires com.google.gson; - requires com.fasterxml.jackson.databind; - requires com.fasterxml.jackson.dataformat.yaml; - requires com.fasterxml.jackson.datatype.jsr310; + requires tools.jackson.databind; + requires tools.jackson.dataformat.yaml; + requires tools.jackson.core; // endregion // region HTTP clients diff --git a/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java b/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java index ad033541604..c40b075e43c 100644 --- a/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java +++ b/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java @@ -9,12 +9,12 @@ import org.jabref.logic.openoffice.OpenOfficePreferences; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; /** * Manages the loading of CitationStyles from both internal resources and external files. diff --git a/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java b/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java index b3906d9815b..fa496c77a39 100644 --- a/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java +++ b/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java @@ -7,9 +7,10 @@ import org.jabref.model.study.Study; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; /** * Example use: new StudyYamlParser().parseStudyYamlFile(studyDefinitionFile); @@ -30,8 +31,10 @@ public Study parseStudyYamlFile(Path studyYamlFile) throws IOException { * Writes the given study instance into a yaml file to the given path */ public void writeStudyYamlFile(Study study, Path studyYamlFile) throws IOException { - ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER) - .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)); + + ObjectMapper yamlMapper = new YAMLMapper(YAMLFactory.builder() + .disable(YAMLWriteFeature.WRITE_DOC_START_MARKER) + .enable(YAMLWriteFeature.MINIMIZE_QUOTES).build()); yamlMapper.writeValue(studyYamlFile.toFile(), study); } } diff --git a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java index f5597769384..442e91b0737 100644 --- a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java +++ b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java @@ -26,10 +26,12 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.common.collect.HashBiMap; import org.jspecify.annotations.NonNull; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.dataformat.yaml.YAMLMapper; public class CffImporter extends Importer { @@ -171,7 +173,7 @@ private void setValues(String key, String value) { @Override public ParserResult importDatabase(@NonNull BufferedReader reader) throws IOException { - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + ObjectMapper mapper = new YAMLMapper(new YAMLFactory()); CffFormat citation = mapper.readValue(reader, CffFormat.class); List entriesList = new ArrayList<>(); @@ -263,14 +265,13 @@ public ParserResult importDatabase(@NonNull BufferedReader reader) throws IOExce @Override public boolean isRecognizedFormat(@NonNull BufferedReader reader) throws IOException { - - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + ObjectMapper mapper = new YAMLMapper(new YAMLFactory()); CffFormat citation; try { citation = mapper.readValue(reader, CffFormat.class); return (citation != null) && (citation.values.get("title") != null); - } catch (IOException e) { + } catch (JacksonException e) { return false; } } diff --git a/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java b/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java index eb44743d653..a26636bdbe9 100644 --- a/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java +++ b/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java @@ -7,14 +7,15 @@ import org.jabref.logic.shared.exception.MscCodeLoadingException; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.HashBiMap; import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; public class MscCodeUtils { private static final Logger LOGGER = LoggerFactory.getLogger(MscCodeUtils.class); @@ -29,10 +30,10 @@ public class MscCodeUtils { @NonNull public static Optional> loadMscCodesFromJson(URL resourceUrl) throws MscCodeLoadingException { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new JsonMapper(); try { Map mapping = - mapper.readValue(resourceUrl, new TypeReference<>() { + mapper.readValue(resourceUrl.openStream(), new TypeReference<>() { }); HashBiMap result = HashBiMap.create(mapping); @@ -41,7 +42,7 @@ public static Optional> loadMscCodesFromJson(URL resou } return Optional.of(result); - } catch (JsonParseException | JsonMappingException e) { + } catch (StreamReadException | DatabindException e) { LOGGER.error("Error parsing MSC codes from JSON", e); throw new MscCodeLoadingException("Failed to parse MSC codes from JSON", e); } catch (IOException e) { diff --git a/jabls/src/main/java/module-info.java b/jabls/src/main/java/module-info.java index c77e579b0a8..8c85dcfae0d 100644 --- a/jabls/src/main/java/module-info.java +++ b/jabls/src/main/java/module-info.java @@ -6,7 +6,7 @@ requires org.jabref.jablib; - requires com.fasterxml.jackson.databind; + requires tools.jackson.databind; requires com.google.common; requires com.google.gson; diff --git a/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java b/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java index d03c068d7ab..0bdab1922e8 100644 --- a/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java +++ b/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java @@ -1,10 +1,11 @@ package org.jabref.languageserver; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonObject; import org.slf4j.Logger; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; public class ExtensionSettings { @@ -29,7 +30,7 @@ public static ExtensionSettings getDefaultSettings() { } public void copyFromJsonObject(JsonObject object) { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new JsonMapper(); try { JsonNode node = mapper.readTree(object.toString()); this.consistencyCheck = node.at("/jabref/consistencyCheck/enabled").asBoolean(this.consistencyCheck); @@ -37,7 +38,7 @@ public void copyFromJsonObject(JsonObject object) { this.consistencyCheckOptional = node.at("/jabref/consistencyCheck/optional").asBoolean(this.consistencyCheckOptional); this.consistencyCheckUnknown = node.at("/jabref/consistencyCheck/unknown").asBoolean(this.consistencyCheckUnknown); this.integrityCheck = node.at("/jabref/integrityCheck/enabled").asBoolean(this.integrityCheck); - } catch (JsonProcessingException processingException) { + } catch (JacksonException processingException) { LOGGER.error("Error parsing settings from JSON", processingException); } } diff --git a/jabsrv/src/main/java/module-info.java b/jabsrv/src/main/java/module-info.java index b94c17b39c8..dbd50de52fc 100644 --- a/jabsrv/src/main/java/module-info.java +++ b/jabsrv/src/main/java/module-info.java @@ -10,7 +10,7 @@ exports org.jabref.http.server.command to jersey.server; opens org.jabref.http.server.cayw to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities; opens org.jabref.http.dto to com.google.gson; - opens org.jabref.http.server.command to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities, com.fasterxml.jackson.databind; + opens org.jabref.http.server.command to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities, tools.jackson.databind; exports org.jabref.http.server.services; exports org.jabref.http; opens org.jabref.http.server.resources to org.glassfish.hk2.locator, org.glassfish.hk2.utilities; @@ -58,6 +58,5 @@ requires java.logging; requires jersey.container.grizzly2.http; requires jersey.server; - requires com.fasterxml.jackson.annotation; - requires com.fasterxml.jackson.databind; + requires tools.jackson.databind; } diff --git a/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java b/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java index 410cb328292..7dfb074e224 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java +++ b/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java @@ -1,7 +1,5 @@ package org.jabref.http.server.command; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; @@ -10,6 +8,9 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.glassfish.hk2.api.ServiceLocator; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @Path("commands") public class CommandResource { @@ -21,13 +22,13 @@ public class CommandResource { @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) public Response dispatchCommand(String jsonCommand) { - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = new JsonMapper(); try { Command command = objectMapper.readValue(jsonCommand, Command.class); command.setServiceLocator(serviceLocator); return command.execute(); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return Response.serverError().entity(e.getMessage()).build(); } } diff --git a/versions/build.gradle.kts b/versions/build.gradle.kts index f4977a27d50..06655e1d3db 100644 --- a/versions/build.gradle.kts +++ b/versions/build.gradle.kts @@ -32,6 +32,10 @@ dependencies { api("org.junit.jupiter:junit-jupiter") api("org.junit.platform:junit-platform-launcher") + api(platform("tools.jackson:jackson-bom:3.0.2")) + api("tools.jackson.core:jackson-core") + api("tools.jackson.core:jackson-databind") + api("tools.jackson.dataformat:jackson-dataformat-yaml") } dependencies.constraints { @@ -47,8 +51,6 @@ dependencies.constraints { api("com.dlsc.gemsfx:gemsfx:3.6.2") api("com.dlsc.pdfviewfx:pdfviewfx:3.3.2") api("com.ibm.icu:icu4j:72.0.1!!") - api("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.20.1") - api("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.1") api("com.fasterxml:aalto-xml:1.3.4") api("org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0") api("org.eclipse.lsp4j:org.eclipse.lsp4j.websocket:0.24.0")