From 907e81e2dceabb9b045df5d1262353ba68a411d1 Mon Sep 17 00:00:00 2001 From: Sebastian Schuberth Date: Tue, 14 Oct 2025 08:11:13 +0200 Subject: [PATCH] refactor: Migrate to Jackson 3 See [1] and [2]. Note that - `jackson-annotations` is still at version 2 in the `com.fasterxml` namespace. - `jackson-datatype-jsr310` is now built into `jackson-databind` directly and does not need to be registered. [1]: https://github.com/FasterXML/jackson/wiki/Jackson-Release-3.0 [2]: https://github.com/FasterXML/jackson/blob/main/jackson3/MIGRATING_TO_JACKSON_3.md Signed-off-by: Sebastian Schuberth --- .../src/main/kotlin/PackageManagerResult.kt | 4 +- ...ateAnalyzerResultFromPackageListCommand.kt | 6 +- .../commands/ImportCopyrightGarbageCommand.kt | 6 +- .../commands/classifications/ImportCommand.kt | 4 +- .../commands/classifications/MergeCommand.kt | 4 +- .../commands/dev/RewriteTestAssetsCommand.kt | 6 +- .../src/main/kotlin/utils/Extensions.kt | 6 +- .../src/main/kotlin/FossIdRestService.kt | 17 ++-- .../src/main/kotlin/LoggingInterceptor.kt | 10 +-- .../kotlin/PolymorphicDataDeserializer.kt | 21 +++-- .../main/kotlin/PolymorphicIntDeserializer.kt | 10 +-- .../kotlin/PolymorphicListDeserializer.kt | 21 +++-- .../kotlin/model/IntBooleanDeserializer.kt | 6 +- .../src/main/kotlin/model/Project.kt | 2 +- .../src/main/kotlin/model/Scan.kt | 2 +- .../model/identification/common/Component.kt | 4 +- .../identification/identifiedFiles/File.kt | 4 +- .../markedAsIdentified/LicenseFile.kt | 4 +- gradle/libs.versions.toml | 4 +- model/build.gradle.kts | 1 - model/src/main/kotlin/AnalyzerResult.kt | 3 +- model/src/main/kotlin/DependencyGraph.kt | 3 +- model/src/main/kotlin/FileFormat.kt | 10 +-- model/src/main/kotlin/FileList.kt | 4 +- model/src/main/kotlin/Hash.kt | 6 +- model/src/main/kotlin/Issue.kt | 11 +-- model/src/main/kotlin/Mappers.kt | 80 ++++++++++--------- model/src/main/kotlin/Package.kt | 3 +- model/src/main/kotlin/PackageReference.kt | 3 +- model/src/main/kotlin/Project.kt | 3 +- .../src/main/kotlin/ProjectAnalyzerResult.kt | 3 +- model/src/main/kotlin/Provenance.kt | 16 ++-- model/src/main/kotlin/ScanSummary.kt | 7 +- model/src/main/kotlin/ScannerRun.kt | 3 +- model/src/main/kotlin/Scope.kt | 4 +- .../config/HttpFileStorageConfiguration.kt | 5 +- .../kotlin/config/LicenseFindingCuration.kt | 7 +- .../utils/SortedCollectionConverters.kt | 4 +- model/src/test/kotlin/FileFormatTest.kt | 6 +- .../config/RepositoryConfigurationTest.kt | 4 +- .../compare/src/main/kotlin/CompareCommand.kt | 14 ++-- .../config/src/main/kotlin/ConfigCommand.kt | 5 +- .../migrate/src/main/kotlin/MigrateCommand.kt | 4 +- .../src/main/kotlin/NodePackageManagerType.kt | 4 +- .../src/main/kotlin/EvaluatedModel.kt | 15 ++-- .../src/main/kotlin/IntIdModule.kt | 16 ++-- .../src/main/kotlin/SpdxDocumentReporter.kt | 4 +- reporter/src/main/kotlin/Statistics.kt | 3 +- scanner/src/main/kotlin/FileList.kt | 6 +- .../FileBasedNestedProvenanceStorage.kt | 4 +- .../FileBasedPackageProvenanceStorage.kt | 3 +- .../kotlin/storages/ClearlyDefinedStorage.kt | 4 +- .../storages/PackageBasedFileStorage.kt | 4 +- .../storages/PackageBasedPostgresStorage.kt | 6 +- .../storages/ProvenanceBasedFileStorage.kt | 4 +- .../kotlin/storages/utils/JsonbSupport.kt | 4 +- .../src/main/kotlin/utils/FileListResolver.kt | 4 +- .../kotlin/CopyrightStatementsProcessor.kt | 3 +- .../main/kotlin/DeclaredLicenseProcessor.kt | 3 +- .../kotlin/SpdxExpressionSortedConverter.kt | 4 +- .../main/kotlin/StringSortedSetConverter.kt | 4 +- utils/spdx-document/build.gradle.kts | 1 - .../src/main/kotlin/SpdxModelMapper.kt | 29 ++++--- .../src/main/kotlin/model/Converters.kt | 4 +- .../src/main/kotlin/model/SpdxDocument.kt | 3 +- .../kotlin/model/SpdxExternalReference.kt | 15 ++-- .../src/test/kotlin/model/SpdxDocumentTest.kt | 4 +- utils/spdx/build.gradle.kts | 2 +- .../main/kotlin/SpdxDeclaredLicenseMapping.kt | 6 +- utils/spdx/src/main/kotlin/SpdxExpression.kt | 5 +- .../src/main/kotlin/SpdxLicenseException.kt | 7 +- .../main/kotlin/SpdxSimpleLicenseMapping.kt | 10 +-- utils/spdx/src/main/kotlin/Utils.kt | 10 ++- utils/test/src/main/kotlin/Extensions.kt | 6 +- 74 files changed, 286 insertions(+), 261 deletions(-) diff --git a/analyzer/src/main/kotlin/PackageManagerResult.kt b/analyzer/src/main/kotlin/PackageManagerResult.kt index 0c87e39bfbb50..2d57c23fb0985 100644 --- a/analyzer/src/main/kotlin/PackageManagerResult.kt +++ b/analyzer/src/main/kotlin/PackageManagerResult.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.analyzer -import com.fasterxml.jackson.databind.annotation.JsonSerialize - import java.io.File import org.ossreviewtoolkit.model.DependencyGraph @@ -28,6 +26,8 @@ import org.ossreviewtoolkit.model.Package import org.ossreviewtoolkit.model.ProjectAnalyzerResult import org.ossreviewtoolkit.model.utils.PackageSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * A data class representing the result of the execution of a [PackageManager]. An instance contains the single * results produced for the definition files the package manager supports. If there are global results (i.e. data that diff --git a/cli-helper/src/main/kotlin/commands/CreateAnalyzerResultFromPackageListCommand.kt b/cli-helper/src/main/kotlin/commands/CreateAnalyzerResultFromPackageListCommand.kt index c0bb0f6c1d8ea..c9e398edd2aa4 100644 --- a/cli-helper/src/main/kotlin/commands/CreateAnalyzerResultFromPackageListCommand.kt +++ b/cli-helper/src/main/kotlin/commands/CreateAnalyzerResultFromPackageListCommand.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.helper.commands -import com.fasterxml.jackson.databind.PropertyNamingStrategies -import com.fasterxml.jackson.module.kotlin.readValue - import com.github.ajalt.clikt.parameters.options.convert import com.github.ajalt.clikt.parameters.options.default import com.github.ajalt.clikt.parameters.options.option @@ -61,6 +58,9 @@ import org.ossreviewtoolkit.utils.ort.ORT_CONFIG_FILENAME import org.ossreviewtoolkit.utils.ort.ortConfigDirectory import org.ossreviewtoolkit.utils.spdx.SpdxExpression +import tools.jackson.databind.PropertyNamingStrategies +import tools.jackson.module.kotlin.readValue + internal class CreateAnalyzerResultFromPackageListCommand : OrtHelperCommand( help = "A command which turns a package list file into an analyzer result." ) { diff --git a/cli-helper/src/main/kotlin/commands/ImportCopyrightGarbageCommand.kt b/cli-helper/src/main/kotlin/commands/ImportCopyrightGarbageCommand.kt index 3deee2dea76a2..6f156bed3a77d 100644 --- a/cli-helper/src/main/kotlin/commands/ImportCopyrightGarbageCommand.kt +++ b/cli-helper/src/main/kotlin/commands/ImportCopyrightGarbageCommand.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.helper.commands -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator - import com.github.ajalt.clikt.parameters.options.convert import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.options.required @@ -36,6 +33,9 @@ import org.ossreviewtoolkit.model.readValue import org.ossreviewtoolkit.model.yamlMapper import org.ossreviewtoolkit.utils.common.expandTilde +import tools.jackson.databind.ObjectMapper +import tools.jackson.dataformat.yaml.YAMLGenerator + internal class ImportCopyrightGarbageCommand : OrtHelperCommand( help = "Import copyright garbage from a plain text file containing one copyright statement per line into the " + "given copyright garbage file." diff --git a/cli-helper/src/main/kotlin/commands/classifications/ImportCommand.kt b/cli-helper/src/main/kotlin/commands/classifications/ImportCommand.kt index ba4557b9d703b..79bdd6ed4f87e 100644 --- a/cli-helper/src/main/kotlin/commands/classifications/ImportCommand.kt +++ b/cli-helper/src/main/kotlin/commands/classifications/ImportCommand.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.helper.commands.classifications -import com.fasterxml.jackson.module.kotlin.readValue - import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.options.convert import com.github.ajalt.clikt.parameters.options.option @@ -42,6 +40,8 @@ import org.ossreviewtoolkit.model.yamlMapper import org.ossreviewtoolkit.utils.common.expandTilde import org.ossreviewtoolkit.utils.spdx.SpdxSingleLicenseExpression +import tools.jackson.module.kotlin.readValue + internal class ImportCommand : OrtHelperCommand( help = "Import license classifications from supported providers to ORT format." ) { diff --git a/cli-helper/src/main/kotlin/commands/classifications/MergeCommand.kt b/cli-helper/src/main/kotlin/commands/classifications/MergeCommand.kt index 4be00d508b6d7..e48d1f5d7f882 100644 --- a/cli-helper/src/main/kotlin/commands/classifications/MergeCommand.kt +++ b/cli-helper/src/main/kotlin/commands/classifications/MergeCommand.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.helper.commands.classifications -import com.fasterxml.jackson.module.kotlin.readValue - import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.arguments.check import com.github.ajalt.clikt.parameters.arguments.convert @@ -35,6 +33,8 @@ import org.ossreviewtoolkit.model.toYaml import org.ossreviewtoolkit.model.yamlMapper import org.ossreviewtoolkit.utils.common.expandTilde +import tools.jackson.module.kotlin.readValue + internal class MergeCommand : OrtHelperCommand( help = "Merge multiple files with license classifications into one." ) { diff --git a/cli-helper/src/main/kotlin/commands/dev/RewriteTestAssetsCommand.kt b/cli-helper/src/main/kotlin/commands/dev/RewriteTestAssetsCommand.kt index 072b9c98bbd50..e4f7b49802fb1 100644 --- a/cli-helper/src/main/kotlin/commands/dev/RewriteTestAssetsCommand.kt +++ b/cli-helper/src/main/kotlin/commands/dev/RewriteTestAssetsCommand.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.helper.commands.dev -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.node.ObjectNode - import com.github.ajalt.clikt.parameters.options.convert import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.options.required @@ -43,6 +40,9 @@ import org.ossreviewtoolkit.model.ScanResult import org.ossreviewtoolkit.model.ScannerRun import org.ossreviewtoolkit.utils.common.expandTilde +import tools.jackson.databind.JsonNode +import tools.jackson.databind.node.ObjectNode + internal class RewriteTestAssetsCommand : OrtHelperCommand( help = "Searches all test assets directories in the given ORT sources directory for recognized serialized files " + "and tries to de-serialize and serialize the file. The command can be used to update the test assets " + diff --git a/cli-helper/src/main/kotlin/utils/Extensions.kt b/cli-helper/src/main/kotlin/utils/Extensions.kt index f4ad7af80d544..b340317fa486d 100644 --- a/cli-helper/src/main/kotlin/utils/Extensions.kt +++ b/cli-helper/src/main/kotlin/utils/Extensions.kt @@ -21,9 +21,6 @@ package org.ossreviewtoolkit.helper.utils -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator - import java.io.File import java.nio.file.Paths @@ -73,6 +70,9 @@ import org.ossreviewtoolkit.utils.ort.CopyrightStatementsProcessor import org.ossreviewtoolkit.utils.spdx.SpdxExpression import org.ossreviewtoolkit.utils.spdx.SpdxSingleLicenseExpression +import tools.jackson.databind.ObjectMapper +import tools.jackson.dataformat.yaml.YAMLGenerator + /** * Return an approximated minimal sublist of [this] so that the result still matches the exact same entries of the given * [projectScopes]. diff --git a/clients/fossid-webapp/src/main/kotlin/FossIdRestService.kt b/clients/fossid-webapp/src/main/kotlin/FossIdRestService.kt index 51004ad0cf7c7..1376a49df2952 100644 --- a/clients/fossid-webapp/src/main/kotlin/FossIdRestService.kt +++ b/clients/fossid-webapp/src/main/kotlin/FossIdRestService.kt @@ -21,13 +21,6 @@ package org.ossreviewtoolkit.clients.fossid -import com.fasterxml.jackson.databind.DeserializationFeature -import com.fasterxml.jackson.databind.MapperFeature -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategies -import com.fasterxml.jackson.module.kotlin.jsonMapper -import com.fasterxml.jackson.module.kotlin.kotlinModule - import java.util.concurrent.TimeUnit import okhttp3.Interceptor @@ -61,6 +54,13 @@ import retrofit2.http.Header import retrofit2.http.Headers import retrofit2.http.POST +import tools.jackson.databind.DeserializationFeature +import tools.jackson.databind.MapperFeature +import tools.jackson.databind.ObjectMapper +import tools.jackson.databind.PropertyNamingStrategies +import tools.jackson.module.kotlin.jsonMapper +import tools.jackson.module.kotlin.kotlinModule + private const val READ_TIMEOUT_HEADER = "READ_TIMEOUT" interface FossIdRestService { @@ -75,7 +75,8 @@ interface FossIdRestService { enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS) configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) addModule( - kotlinModule().addDeserializer(PolymorphicList::class.java, PolymorphicListDeserializer()) + kotlinModule() + .addDeserializer(PolymorphicList::class.java, PolymorphicListDeserializer()) .addDeserializer(PolymorphicInt::class.java, PolymorphicIntDeserializer()) .addDeserializer(PolymorphicData::class.java, PolymorphicDataDeserializer()) ) diff --git a/clients/fossid-webapp/src/main/kotlin/LoggingInterceptor.kt b/clients/fossid-webapp/src/main/kotlin/LoggingInterceptor.kt index 887f37008a7df..a04cc9bc689d8 100644 --- a/clients/fossid-webapp/src/main/kotlin/LoggingInterceptor.kt +++ b/clients/fossid-webapp/src/main/kotlin/LoggingInterceptor.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.clients.fossid -import com.fasterxml.jackson.databind.node.ObjectNode -import com.fasterxml.jackson.databind.node.TextNode - import java.nio.charset.StandardCharsets import okhttp3.Interceptor @@ -33,6 +30,9 @@ import okio.GzipSource import org.apache.logging.log4j.kotlin.logger +import tools.jackson.databind.node.ObjectNode +import tools.jackson.databind.node.StringNode + /** * An interceptor that logs the body of FossID requests, but takes care that the credentials are not logged. * This function implementation is partly taken from the OkHttp Logging Interceptor at @@ -138,9 +138,9 @@ private fun String.sanitizeForLogging(): String { // Replace the credentials in the Git repository URL. The function [replaceCredentialsInUri] // from utils.common is not used to avoid a dependency in the FossID client. - if (urlWithCredentials != null && urlWithCredentials is TextNode) { + if (urlWithCredentials != null && urlWithCredentials is StringNode) { val url = urlWithCredentials.toString().replace("//[\\w:]+@".toRegex(), "//") - dataObject.set("git_repo_url", TextNode(url)) + dataObject.set("git_repo_url", StringNode(url)) } } diff --git a/clients/fossid-webapp/src/main/kotlin/PolymorphicDataDeserializer.kt b/clients/fossid-webapp/src/main/kotlin/PolymorphicDataDeserializer.kt index 08d5d59ebffd9..f82e13f10068c 100644 --- a/clients/fossid-webapp/src/main/kotlin/PolymorphicDataDeserializer.kt +++ b/clients/fossid-webapp/src/main/kotlin/PolymorphicDataDeserializer.kt @@ -19,14 +19,13 @@ package org.ossreviewtoolkit.clients.fossid -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.core.JsonToken -import com.fasterxml.jackson.databind.BeanProperty -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JavaType -import com.fasterxml.jackson.databind.JsonDeserializer -import com.fasterxml.jackson.databind.deser.ContextualDeserializer -import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import tools.jackson.core.JsonParser +import tools.jackson.core.JsonToken +import tools.jackson.databind.BeanProperty +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.JavaType +import tools.jackson.databind.ValueDeserializer +import tools.jackson.databind.deser.std.StdDeserializer /** * A custom JSON deserializer implementation to deal with inconsistencies in error responses sent by FossID @@ -34,13 +33,13 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer * empty array for the value, which cannot be handled by the default deserialization. */ internal class PolymorphicDataDeserializer(val boundType: JavaType? = null) : - StdDeserializer>(PolymorphicData::class.java), ContextualDeserializer { + StdDeserializer>(PolymorphicData::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): PolymorphicData { requireNotNull(boundType) { "The PolymorphicDataDeserializer needs a type to deserialize values!" } - return when (p.currentToken) { + return when (p.currentToken()) { JsonToken.START_ARRAY -> { val arrayType = ctxt.typeFactory.constructArrayType(boundType) val array = ctxt.readValue>(p, arrayType) @@ -59,7 +58,7 @@ internal class PolymorphicDataDeserializer(val boundType: JavaType? = null) : } } - override fun createContextual(ctxt: DeserializationContext?, property: BeanProperty?): JsonDeserializer<*> { + override fun createContextual(ctxt: DeserializationContext?, property: BeanProperty?): ValueDeserializer<*> { val type = property?.member?.type?.bindings?.getBoundType(0) return PolymorphicDataDeserializer(type) } diff --git a/clients/fossid-webapp/src/main/kotlin/PolymorphicIntDeserializer.kt b/clients/fossid-webapp/src/main/kotlin/PolymorphicIntDeserializer.kt index 1c3739cf9da26..33e8699d22ded 100644 --- a/clients/fossid-webapp/src/main/kotlin/PolymorphicIntDeserializer.kt +++ b/clients/fossid-webapp/src/main/kotlin/PolymorphicIntDeserializer.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.clients.fossid -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.core.JsonToken -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import tools.jackson.core.JsonParser +import tools.jackson.core.JsonToken +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.deser.std.StdDeserializer /** * A class to modify the standard Jackson deserialization to deal with inconsistencies in responses @@ -39,7 +39,7 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer internal class PolymorphicIntDeserializer : StdDeserializer(PolymorphicInt::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): PolymorphicInt = - when (p.currentToken) { + when (p.currentToken()) { JsonToken.VALUE_STRING -> { val value = ctxt.readValue(p, String::class.java) PolymorphicInt(value.toInt()) diff --git a/clients/fossid-webapp/src/main/kotlin/PolymorphicListDeserializer.kt b/clients/fossid-webapp/src/main/kotlin/PolymorphicListDeserializer.kt index b137f0b4dfb4f..13ba4833e6471 100644 --- a/clients/fossid-webapp/src/main/kotlin/PolymorphicListDeserializer.kt +++ b/clients/fossid-webapp/src/main/kotlin/PolymorphicListDeserializer.kt @@ -19,14 +19,13 @@ package org.ossreviewtoolkit.clients.fossid -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.core.JsonToken -import com.fasterxml.jackson.databind.BeanProperty -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JavaType -import com.fasterxml.jackson.databind.JsonDeserializer -import com.fasterxml.jackson.databind.deser.ContextualDeserializer -import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import tools.jackson.core.JsonParser +import tools.jackson.core.JsonToken +import tools.jackson.databind.BeanProperty +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.JavaType +import tools.jackson.databind.ValueDeserializer +import tools.jackson.databind.deser.std.StdDeserializer /** * A class to modify the standard Jackson deserialization to deal with inconsistencies in responses @@ -38,13 +37,13 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer * - to address a FossID bug in get_all_scans operation, arrays are converted to list. */ internal class PolymorphicListDeserializer(val boundType: JavaType? = null) : - StdDeserializer>(PolymorphicList::class.java), ContextualDeserializer { + StdDeserializer>(PolymorphicList::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): PolymorphicList { requireNotNull(boundType) { "The PolymorphicListDeserializer needs a type to deserialize values!" } - return when (p.currentToken) { + return when (p.currentToken()) { JsonToken.VALUE_FALSE -> PolymorphicList() JsonToken.START_ARRAY -> { @@ -71,7 +70,7 @@ internal class PolymorphicListDeserializer(val boundType: JavaType? = null) : } } - override fun createContextual(ctxt: DeserializationContext?, property: BeanProperty?): JsonDeserializer<*> { + override fun createContextual(ctxt: DeserializationContext?, property: BeanProperty?): ValueDeserializer<*> { // Extract the type from the property, i.e. the T in PolymorphicList.data val type = property?.member?.type?.bindings?.getBoundType(0) return PolymorphicListDeserializer(type) diff --git a/clients/fossid-webapp/src/main/kotlin/model/IntBooleanDeserializer.kt b/clients/fossid-webapp/src/main/kotlin/model/IntBooleanDeserializer.kt index f9da2a9b1f06c..c0256a0f7b65a 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/IntBooleanDeserializer.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/IntBooleanDeserializer.kt @@ -19,9 +19,9 @@ package org.ossreviewtoolkit.clients.fossid.model -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import tools.jackson.core.JsonParser +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.deser.std.StdDeserializer /** * This class deserializes a String containing 0/1 to boolean. diff --git a/clients/fossid-webapp/src/main/kotlin/model/Project.kt b/clients/fossid-webapp/src/main/kotlin/model/Project.kt index a56c33ad5ccc6..087a98d26a7cb 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/Project.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/Project.kt @@ -19,7 +19,7 @@ package org.ossreviewtoolkit.clients.fossid.model -import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.annotation.JsonDeserialize data class Project( val id: Int, diff --git a/clients/fossid-webapp/src/main/kotlin/model/Scan.kt b/clients/fossid-webapp/src/main/kotlin/model/Scan.kt index 2c5cbb7b0d7de..4d7eacc0d3b28 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/Scan.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/Scan.kt @@ -19,7 +19,7 @@ package org.ossreviewtoolkit.clients.fossid.model -import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.annotation.JsonDeserialize data class Scan( val id: Int, diff --git a/clients/fossid-webapp/src/main/kotlin/model/identification/common/Component.kt b/clients/fossid-webapp/src/main/kotlin/model/identification/common/Component.kt index 9d4a95664f419..9447a6f044653 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/identification/common/Component.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/identification/common/Component.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.clients.fossid.model.identification.common -import com.fasterxml.jackson.databind.annotation.JsonDeserialize - import org.ossreviewtoolkit.clients.fossid.model.IntBooleanDeserializer +import tools.jackson.databind.annotation.JsonDeserialize + data class Component( val copyright: String?, val cpe: String?, diff --git a/clients/fossid-webapp/src/main/kotlin/model/identification/identifiedFiles/File.kt b/clients/fossid-webapp/src/main/kotlin/model/identification/identifiedFiles/File.kt index 6da3717a10a1c..5404d1e623f93 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/identification/identifiedFiles/File.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/identification/identifiedFiles/File.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.clients.fossid.model.identification.identifiedFiles -import com.fasterxml.jackson.databind.annotation.JsonDeserialize - import org.ossreviewtoolkit.clients.fossid.model.IntBooleanDeserializer +import tools.jackson.databind.annotation.JsonDeserialize + data class File( val id: String?, diff --git a/clients/fossid-webapp/src/main/kotlin/model/identification/markedAsIdentified/LicenseFile.kt b/clients/fossid-webapp/src/main/kotlin/model/identification/markedAsIdentified/LicenseFile.kt index dd8e528de8c96..24b584e771163 100644 --- a/clients/fossid-webapp/src/main/kotlin/model/identification/markedAsIdentified/LicenseFile.kt +++ b/clients/fossid-webapp/src/main/kotlin/model/identification/markedAsIdentified/LicenseFile.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.clients.fossid.model.identification.markedAsIdentified -import com.fasterxml.jackson.databind.annotation.JsonDeserialize - import org.ossreviewtoolkit.clients.fossid.model.IntBooleanDeserializer +import tools.jackson.databind.annotation.JsonDeserialize + data class LicenseFile( val licenseIdentifier: String?, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0873702ce1b10..0188fb782134a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,7 @@ greenmail = "2.1.8" gson = "2.14.0" hikari = "7.0.2" hoplite = "2.9.0" -jackson = "2.21.3" +jackson = "3.1.3" jakartaMail = "2.0.2" jerseyCommon = "4.0.2" jgit = "7.6.0.202603022253-r" @@ -121,7 +121,7 @@ gson = { module = "com.google.code.gson:gson", version.ref = "gson" } hikari = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } hoplite-core = { module = "com.sksamuel.hoplite:hoplite-core", version.ref = "hoplite" } hoplite-yaml = { module = "com.sksamuel.hoplite:hoplite-yaml", version.ref = "hoplite" } -jackson-bom = { module = "com.fasterxml.jackson:jackson-bom", version.ref = "jackson" } +jackson-bom = { module = "tools.jackson:jackson-bom", version.ref = "jackson" } jakartaMail = { module = "com.sun.mail:jakarta.mail", version.ref = "jakartaMail" } jerseyCommon = { module = "org.glassfish.jersey.core:jersey-common", version.ref = "jerseyCommon" } jgit = { module = "org.eclipse.jgit:org.eclipse.jgit", version.ref = "jgit" } diff --git a/model/build.gradle.kts b/model/build.gradle.kts index d11e14e80b369..b8282002981b3 100644 --- a/model/build.gradle.kts +++ b/model/build.gradle.kts @@ -36,7 +36,6 @@ dependencies { api(libs.log4j.api) api(libs.packageurl) - implementation(jacksonLibs.jacksonDatatypeJsr310) implementation(jacksonLibs.jacksonModuleKotlin) implementation(libs.bundles.exposed) implementation(libs.bundles.hoplite) diff --git a/model/src/main/kotlin/AnalyzerResult.kt b/model/src/main/kotlin/AnalyzerResult.kt index d6e79f2a94fa2..405b76e46ab9d 100644 --- a/model/src/main/kotlin/AnalyzerResult.kt +++ b/model/src/main/kotlin/AnalyzerResult.kt @@ -22,11 +22,12 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.model.utils.PackageSortedSetConverter import org.ossreviewtoolkit.model.utils.ProjectSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * A class that merges all information from individual [ProjectAnalyzerResult]s created for each found definition file. */ diff --git a/model/src/main/kotlin/DependencyGraph.kt b/model/src/main/kotlin/DependencyGraph.kt index 0373fd529960d..c95c1f88c6fdf 100644 --- a/model/src/main/kotlin/DependencyGraph.kt +++ b/model/src/main/kotlin/DependencyGraph.kt @@ -21,7 +21,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.annotation.JsonSerialize import java.util.SortedSet @@ -29,6 +28,8 @@ import org.ossreviewtoolkit.model.utils.DependencyGraphEdgeSortedSetConverter import org.ossreviewtoolkit.model.utils.DependencyReferenceSortedSetConverter import org.ossreviewtoolkit.model.utils.PackageLinkageValueFilter +import tools.jackson.databind.annotation.JsonSerialize + /** * Type alias for a [Map] that associates a [DependencyGraphNode] with the nodes representing its dependencies. */ diff --git a/model/src/main/kotlin/FileFormat.kt b/model/src/main/kotlin/FileFormat.kt index a2e43d2b04e4e..964f77223a3a5 100644 --- a/model/src/main/kotlin/FileFormat.kt +++ b/model/src/main/kotlin/FileFormat.kt @@ -19,15 +19,15 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.readValues - import java.io.File import java.io.IOException import org.ossreviewtoolkit.utils.common.safeMkdirs +import tools.jackson.databind.JsonNode +import tools.jackson.databind.ObjectMapper +import tools.jackson.module.kotlin.readValues + /** * An enumeration of supported file formats for (de-)serialization, their primary [fileExtension] and optional aliases * (not including the dot). @@ -103,7 +103,7 @@ inline fun File.readValue(): T = inline fun File.readValueOrNull(): T? { val mapper = mapper() - val values = mapper.factory.createParser(this).use { parser -> + val values = mapper.createParser(this).use { parser -> mapper.readValues(parser).readAll().also { if (it.isEmpty()) return null if (it.size > 1) throw IOException("Multiple top-level objects found in file '$this'.") diff --git a/model/src/main/kotlin/FileList.kt b/model/src/main/kotlin/FileList.kt index b1baeff7e7b6e..bc24539371b9a 100644 --- a/model/src/main/kotlin/FileList.kt +++ b/model/src/main/kotlin/FileList.kt @@ -19,11 +19,11 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.databind.annotation.JsonSerialize - import org.ossreviewtoolkit.model.utils.FileListEntrySortedSetConverter import org.ossreviewtoolkit.utils.common.getDuplicates +import tools.jackson.databind.annotation.JsonSerialize + /** * The file info for files contained in [provenance]. */ diff --git a/model/src/main/kotlin/Hash.kt b/model/src/main/kotlin/Hash.kt index a495c1943cedb..6fbeae37d1e74 100644 --- a/model/src/main/kotlin/Hash.kt +++ b/model/src/main/kotlin/Hash.kt @@ -19,13 +19,13 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.util.StdConverter - import java.io.File import kotlin.io.encoding.Base64 +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.util.StdConverter + /** * A class that bundles a hash algorithm with its hash value. */ diff --git a/model/src/main/kotlin/Issue.kt b/model/src/main/kotlin/Issue.kt index e635025eae971..4edfcd95a7865 100644 --- a/model/src/main/kotlin/Issue.kt +++ b/model/src/main/kotlin/Issue.kt @@ -20,10 +20,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.StdSerializer import java.time.Instant @@ -33,6 +29,11 @@ import org.ossreviewtoolkit.plugins.api.Plugin import org.ossreviewtoolkit.plugins.api.PluginDescriptor import org.ossreviewtoolkit.utils.common.normalizeLineBreaks +import tools.jackson.core.JsonGenerator +import tools.jackson.databind.SerializationContext +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.ser.std.StdSerializer + /** * An issue that occurred while executing ORT. */ @@ -71,7 +72,7 @@ data class Issue( } class NormalizeLineBreaksSerializer : StdSerializer(String::class.java) { - override fun serialize(value: String, gen: JsonGenerator, provider: SerializerProvider) { + override fun serialize(value: String, gen: JsonGenerator, provider: SerializationContext) { gen.writeString(value.normalizeLineBreaks()) } } diff --git a/model/src/main/kotlin/Mappers.kt b/model/src/main/kotlin/Mappers.kt index 84eb8b22d4785..792c8a9fdbd44 100644 --- a/model/src/main/kotlin/Mappers.kt +++ b/model/src/main/kotlin/Mappers.kt @@ -19,52 +19,54 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategies.SNAKE_CASE -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.readValue -import com.fasterxml.jackson.module.kotlin.registerKotlinModule +import org.snakeyaml.engine.v2.api.LoadSettings -import org.yaml.snakeyaml.LoaderOptions +import tools.jackson.databind.PropertyNamingStrategies.SNAKE_CASE +import tools.jackson.databind.cfg.DateTimeFeature +import tools.jackson.databind.cfg.MapperBuilder +import tools.jackson.databind.json.JsonMapper +import tools.jackson.dataformat.yaml.YAMLFactory +import tools.jackson.dataformat.yaml.YAMLMapper +import tools.jackson.dataformat.yaml.YAMLWriteFeature +import tools.jackson.module.kotlin.kotlinModule +import tools.jackson.module.kotlin.readValue /** - * A lambda expression that can be [applied][apply] to all [ObjectMapper]s to configure them the same way. + * A lambda expression that can be [applied][apply] to all [MapperBuilder]s to build them the same way. */ -val mapperConfig: ObjectMapper.() -> Unit = { - registerKotlinModule() - - registerModule(JavaTimeModule()) - disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) +val mapperConfig: MapperBuilder<*, *>.() -> Unit = { + addModule(kotlinModule()) + disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + propertyNamingStrategy(SNAKE_CASE) +} - propertyNamingStrategy = SNAKE_CASE +val jsonMapper: JsonMapper by lazy { + JsonMapper.builder() + .apply(mapperConfig) + .build() } -val jsonMapper = JsonMapper().apply(mapperConfig) +val yamlMapper: YAMLMapper by lazy { + val loadSettings = LoadSettings.builder() + // Set the code point limit to the maximum possible value which is approximately 2GB, required since + // SnakeYAML 1.32. Also see: + // + // https://github.com/FasterXML/jackson-dataformats-text/tree/2.15/yaml#maximum-input-yaml-document-size-3-mb + // https://github.com/FasterXML/jackson-dataformats-text/issues/337 + // + // TODO: Consider making this configurable. + .setCodePointLimit(Int.MAX_VALUE) + .build() -val yamlMapper: YAMLMapper = YAMLMapper( - YAMLFactory.builder() - .loaderOptions( - LoaderOptions().apply { - // Set the code point limit to the maximum possible value which is approximately 2GB, required since - // SnakeYAML 1.32. Also see: - // - // https://github.com/FasterXML/jackson-dataformats-text/tree/2.15/yaml#maximum-input-yaml-document-size-3-mb - // https://github.com/FasterXML/jackson-dataformats-text/issues/337 - // - // TODO: Consider making this configurable. - codePointLimit = Int.MAX_VALUE - } - ).build() -).apply(mapperConfig).enable(YAMLGenerator.Feature.ALLOW_LONG_KEYS) + val yamlFactory = YAMLFactory.builder() + .loadSettings(loadSettings) + .build() -inline fun String.fromYaml(): T = yamlMapper.readValue(this) - -fun Any?.toYaml(): String = yamlMapper.writeValueAsString(this) + YAMLMapper.builder(yamlFactory) + .apply(mapperConfig) + .enable(YAMLWriteFeature.ALLOW_LONG_KEYS) + .build() +} inline fun String.fromJson(): T = jsonMapper.readValue(this) @@ -77,3 +79,7 @@ fun Any?.toJson(prettyPrint: Boolean = true): String { return writer.writeValueAsString(this) } + +inline fun String.fromYaml(): T = yamlMapper.readValue(this) + +fun Any?.toYaml(): String = yamlMapper.writeValueAsString(this) diff --git a/model/src/main/kotlin/Package.kt b/model/src/main/kotlin/Package.kt index 7df7f6ab9d338..2f7a05e929608 100644 --- a/model/src/main/kotlin/Package.kt +++ b/model/src/main/kotlin/Package.kt @@ -21,7 +21,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.model.utils.requireNoDuplicates import org.ossreviewtoolkit.model.utils.toPurl @@ -32,6 +31,8 @@ import org.ossreviewtoolkit.utils.ort.StringSortedSetConverter import org.ossreviewtoolkit.utils.spdx.SpdxExpression import org.ossreviewtoolkit.utils.spdx.SpdxOperator +import tools.jackson.databind.annotation.JsonSerialize + /** * A generic descriptor for a software package. It contains all relevant metadata about a package like the name, * version, and how to retrieve the package and its source code. It does not contain information about the package's diff --git a/model/src/main/kotlin/PackageReference.kt b/model/src/main/kotlin/PackageReference.kt index 1d28b3441062f..a9305d8774ed0 100644 --- a/model/src/main/kotlin/PackageReference.kt +++ b/model/src/main/kotlin/PackageReference.kt @@ -20,7 +20,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.annotation.JsonSerialize import java.util.Deque import java.util.LinkedList @@ -28,6 +27,8 @@ import java.util.LinkedList import org.ossreviewtoolkit.model.utils.PackageLinkageValueFilter import org.ossreviewtoolkit.model.utils.PackageReferenceSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * A human-readable reference to a software [Package]. Each package reference itself refers to other package * references that are dependencies of the package. diff --git a/model/src/main/kotlin/Project.kt b/model/src/main/kotlin/Project.kt index cca5650f6f025..ff8181ec2767a 100644 --- a/model/src/main/kotlin/Project.kt +++ b/model/src/main/kotlin/Project.kt @@ -22,7 +22,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.model.utils.ScopeSortedSetConverter import org.ossreviewtoolkit.utils.ort.DeclaredLicenseProcessor @@ -31,6 +30,8 @@ import org.ossreviewtoolkit.utils.ort.StringSortedSetConverter import org.ossreviewtoolkit.utils.spdx.SpdxExpression import org.ossreviewtoolkit.utils.spdx.SpdxOperator +import tools.jackson.databind.annotation.JsonSerialize + /** * A class describing a software project. A [Project] is very similar to a [Package] but contains some additional * metadata like e.g. the [homepageUrl]. Most importantly, it defines the dependency scopes that refer to the actual diff --git a/model/src/main/kotlin/ProjectAnalyzerResult.kt b/model/src/main/kotlin/ProjectAnalyzerResult.kt index a8b2eb753e272..05f6970747862 100644 --- a/model/src/main/kotlin/ProjectAnalyzerResult.kt +++ b/model/src/main/kotlin/ProjectAnalyzerResult.kt @@ -20,10 +20,11 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.model.utils.PackageSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * A class that bundles all information generated during an analysis. */ diff --git a/model/src/main/kotlin/Provenance.kt b/model/src/main/kotlin/Provenance.kt index 1430fa1b28bc3..fccdb852a56e0 100644 --- a/model/src/main/kotlin/Provenance.kt +++ b/model/src/main/kotlin/Provenance.kt @@ -19,12 +19,12 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.deser.std.StdDeserializer -import com.fasterxml.jackson.module.kotlin.treeToValue +import tools.jackson.core.JsonParser +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.JsonNode +import tools.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.deser.std.StdDeserializer +import tools.jackson.module.kotlin.treeToValue /** * Provenance information about the origin of source code. @@ -88,7 +88,7 @@ data class RepositoryProvenance( */ private class ProvenanceDeserializer : StdDeserializer(Provenance::class.java) { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Provenance { - val node = p.codec.readTree(p) + val node = p.readValueAsTree() return when { node.has("source_artifact") -> { val sourceArtifact = jsonMapper.treeToValue(node["source_artifact"]) @@ -98,7 +98,7 @@ private class ProvenanceDeserializer : StdDeserializer(Provenance::c node.has("vcs_info") -> { val vcsInfo = jsonMapper.treeToValue(node["vcs_info"]) // For backward compatibility, if there is no resolved_revision use the revision from vcsInfo. - val resolvedRevision = node["resolved_revision"]?.textValue() ?: vcsInfo.revision + val resolvedRevision = node["resolved_revision"]?.asString() ?: vcsInfo.revision RepositoryProvenance(vcsInfo, resolvedRevision) } diff --git a/model/src/main/kotlin/ScanSummary.kt b/model/src/main/kotlin/ScanSummary.kt index ca8baed2d2276..9b77aa8ff7e9a 100644 --- a/model/src/main/kotlin/ScanSummary.kt +++ b/model/src/main/kotlin/ScanSummary.kt @@ -23,9 +23,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.util.StdConverter import java.time.Instant @@ -37,6 +34,10 @@ import org.ossreviewtoolkit.model.utils.SnippetFindingSortedSetConverter import org.ossreviewtoolkit.utils.common.FileMatcher import org.ossreviewtoolkit.utils.spdx.SpdxExpression +import tools.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.util.StdConverter + /** * A short summary of the scan results. */ diff --git a/model/src/main/kotlin/ScannerRun.kt b/model/src/main/kotlin/ScannerRun.kt index 4e36e59e5c493..096d34fd16892 100644 --- a/model/src/main/kotlin/ScannerRun.kt +++ b/model/src/main/kotlin/ScannerRun.kt @@ -22,7 +22,6 @@ package org.ossreviewtoolkit.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import java.io.File import java.time.Instant @@ -44,6 +43,8 @@ import org.ossreviewtoolkit.utils.common.getDuplicates import org.ossreviewtoolkit.utils.common.zipWithSets import org.ossreviewtoolkit.utils.ort.Environment +import tools.jackson.databind.annotation.JsonSerialize + /** * The summary of a single run of the scanner. */ diff --git a/model/src/main/kotlin/Scope.kt b/model/src/main/kotlin/Scope.kt index b98037bc7bb55..0ac9b666a393e 100644 --- a/model/src/main/kotlin/Scope.kt +++ b/model/src/main/kotlin/Scope.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.databind.annotation.JsonSerialize - import org.ossreviewtoolkit.model.utils.PackageReferenceSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * The scope class puts package dependencies into context. */ diff --git a/model/src/main/kotlin/config/HttpFileStorageConfiguration.kt b/model/src/main/kotlin/config/HttpFileStorageConfiguration.kt index ffd2a507d1e56..2ab425301378a 100644 --- a/model/src/main/kotlin/config/HttpFileStorageConfiguration.kt +++ b/model/src/main/kotlin/config/HttpFileStorageConfiguration.kt @@ -20,8 +20,9 @@ package org.ossreviewtoolkit.model.config import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.util.StdConverter + +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.util.StdConverter @JsonInclude(JsonInclude.Include.NON_EMPTY) data class HttpFileStorageConfiguration( diff --git a/model/src/main/kotlin/config/LicenseFindingCuration.kt b/model/src/main/kotlin/config/LicenseFindingCuration.kt index 5e4e360e41c7a..fd62ea7e40fc5 100644 --- a/model/src/main/kotlin/config/LicenseFindingCuration.kt +++ b/model/src/main/kotlin/config/LicenseFindingCuration.kt @@ -20,13 +20,14 @@ package org.ossreviewtoolkit.model.config import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.util.StdConverter import org.ossreviewtoolkit.utils.ort.SpdxExpressionSortedConverter import org.ossreviewtoolkit.utils.spdx.SpdxExpression +import tools.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.util.StdConverter + /** * A curation for a license finding. Use it to correct a license finding or to add a license that was not previously * detected. diff --git a/model/src/main/kotlin/utils/SortedCollectionConverters.kt b/model/src/main/kotlin/utils/SortedCollectionConverters.kt index 454029ce1109f..cf2c5e0e33113 100644 --- a/model/src/main/kotlin/utils/SortedCollectionConverters.kt +++ b/model/src/main/kotlin/utils/SortedCollectionConverters.kt @@ -21,8 +21,6 @@ package org.ossreviewtoolkit.model.utils -import com.fasterxml.jackson.databind.util.StdConverter - import java.util.SortedSet import org.ossreviewtoolkit.model.ArtifactProvenance @@ -42,6 +40,8 @@ import org.ossreviewtoolkit.model.ScanResult import org.ossreviewtoolkit.model.Scope import org.ossreviewtoolkit.model.SnippetFinding +import tools.jackson.databind.util.StdConverter + class CopyrightFindingSortedSetConverter : StdConverter, SortedSet>() { override fun convert(value: Set) = value.toSortedSet(CopyrightFinding.COMPARATOR) } diff --git a/model/src/test/kotlin/FileFormatTest.kt b/model/src/test/kotlin/FileFormatTest.kt index 971b0cec4b3e3..223b6d1d7680c 100644 --- a/model/src/test/kotlin/FileFormatTest.kt +++ b/model/src/test/kotlin/FileFormatTest.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.model -import com.fasterxml.jackson.core.JsonParseException -import com.fasterxml.jackson.databind.node.MissingNode - import io.kotest.assertions.throwables.shouldThrow import io.kotest.assertions.throwables.shouldThrowWithMessage import io.kotest.core.spec.style.WordSpec @@ -35,6 +32,9 @@ import io.kotest.matchers.shouldBe import java.io.IOException +import tools.jackson.core.JsonParseException +import tools.jackson.databind.node.MissingNode + class FileFormatTest : WordSpec({ "File.readTree()" should { "return and empty node for zero size files" { diff --git a/model/src/test/kotlin/config/RepositoryConfigurationTest.kt b/model/src/test/kotlin/config/RepositoryConfigurationTest.kt index 4a676e0c367c8..6a0f21bc20768 100644 --- a/model/src/test/kotlin/config/RepositoryConfigurationTest.kt +++ b/model/src/test/kotlin/config/RepositoryConfigurationTest.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.model.config -import com.fasterxml.jackson.databind.exc.ValueInstantiationException - import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.WordSpec import io.kotest.matchers.collections.haveSize @@ -37,6 +35,8 @@ import org.ossreviewtoolkit.model.config.snippet.SnippetChoiceReason import org.ossreviewtoolkit.model.fromYaml import org.ossreviewtoolkit.utils.spdx.toSpdx +import tools.jackson.databind.exc.ValueInstantiationException + class RepositoryConfigurationTest : WordSpec({ "RepositoryConfiguration" should { "deserialize to a path regex working with double star" { diff --git a/plugins/commands/compare/src/main/kotlin/CompareCommand.kt b/plugins/commands/compare/src/main/kotlin/CompareCommand.kt index 297d12ed01b44..3ceeb1155069d 100644 --- a/plugins/commands/compare/src/main/kotlin/CompareCommand.kt +++ b/plugins/commands/compare/src/main/kotlin/CompareCommand.kt @@ -19,13 +19,6 @@ package org.ossreviewtoolkit.plugins.commands.compare -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.deser.std.StdDeserializer -import com.fasterxml.jackson.databind.module.SimpleModule -import com.fasterxml.jackson.module.kotlin.readValue - import com.github.ajalt.clikt.core.ProgramResult import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.arguments.convert @@ -52,6 +45,13 @@ import org.ossreviewtoolkit.utils.common.expandTilde import org.ossreviewtoolkit.utils.common.getCommonParentFile import org.ossreviewtoolkit.utils.ort.Environment +import tools.jackson.core.JsonParser +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.JsonNode +import tools.jackson.databind.deser.std.StdDeserializer +import tools.jackson.databind.module.SimpleModule +import tools.jackson.module.kotlin.readValue + @OrtPlugin( displayName = "Compare", description = "Compare two ORT results with various methods.", diff --git a/plugins/commands/config/src/main/kotlin/ConfigCommand.kt b/plugins/commands/config/src/main/kotlin/ConfigCommand.kt index dfa7913f0e916..e54a2ad67e915 100644 --- a/plugins/commands/config/src/main/kotlin/ConfigCommand.kt +++ b/plugins/commands/config/src/main/kotlin/ConfigCommand.kt @@ -20,8 +20,6 @@ package org.ossreviewtoolkit.plugins.commands.config import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper -import com.fasterxml.jackson.module.kotlin.registerKotlinModule import com.github.ajalt.clikt.core.ProgramResult import com.github.ajalt.clikt.parameters.options.convert @@ -41,6 +39,9 @@ import org.ossreviewtoolkit.utils.common.collectMessages import org.ossreviewtoolkit.utils.common.expandTilde import org.ossreviewtoolkit.utils.ort.ORT_REFERENCE_CONFIG_FILENAME +import tools.jackson.dataformat.yaml.YAMLMapper +import tools.jackson.module.kotlin.registerKotlinModule + @OrtPlugin( displayName = "Config", description = "Show different ORT configurations.", diff --git a/plugins/commands/migrate/src/main/kotlin/MigrateCommand.kt b/plugins/commands/migrate/src/main/kotlin/MigrateCommand.kt index ba6d37a480156..4e65af274dddb 100644 --- a/plugins/commands/migrate/src/main/kotlin/MigrateCommand.kt +++ b/plugins/commands/migrate/src/main/kotlin/MigrateCommand.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.plugins.commands.migrate -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator - import com.github.ajalt.clikt.parameters.options.convert import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.types.file @@ -44,6 +42,8 @@ import org.ossreviewtoolkit.utils.common.expandTilde import org.ossreviewtoolkit.utils.common.getCommonParentFile import org.ossreviewtoolkit.utils.common.safeMkdirs +import tools.jackson.dataformat.yaml.YAMLGenerator + @OrtPlugin( displayName = "Migrate", description = "Assist with migrating ORT configuration to newer ORT versions.", diff --git a/plugins/package-managers/node/src/main/kotlin/NodePackageManagerType.kt b/plugins/package-managers/node/src/main/kotlin/NodePackageManagerType.kt index 7d00904c378fe..99033fa2224ec 100644 --- a/plugins/package-managers/node/src/main/kotlin/NodePackageManagerType.kt +++ b/plugins/package-managers/node/src/main/kotlin/NodePackageManagerType.kt @@ -63,7 +63,7 @@ enum class NodePackageManagerType( logger.error { "Failed to parse '$workspaceFile': ${it.collectMessages()}" } }.getOrNull() ?: return null - return packages.map { "${workspaceFile.parentFile.invariantSeparatorsPath}/${it.textValue()}" } + return packages.map { "${workspaceFile.parentFile.invariantSeparatorsPath}/${it.asString()}" } } }, @@ -158,7 +158,7 @@ enum class NodePackageManagerType( } return packages.map { - val pattern = "${workspaceFile.parentFile.invariantSeparatorsPath}/${it.textValue()}" + val pattern = "${workspaceFile.parentFile.invariantSeparatorsPath}/${it.asString()}" // NPM and Yarn treat "*" as an alias for "**", so replace any single "*" with "**". pattern.replace(WORKSPACES_SINGLE_ASTERISK_REGEX, "**") diff --git a/plugins/reporters/evaluated-model/src/main/kotlin/EvaluatedModel.kt b/plugins/reporters/evaluated-model/src/main/kotlin/EvaluatedModel.kt index 2df108cbf2fdb..b1c318d8afdde 100644 --- a/plugins/reporters/evaluated-model/src/main/kotlin/EvaluatedModel.kt +++ b/plugins/reporters/evaluated-model/src/main/kotlin/EvaluatedModel.kt @@ -21,13 +21,6 @@ package org.ossreviewtoolkit.plugins.reporters.evaluatedmodel import com.fasterxml.jackson.annotation.JsonIdentityInfo import com.fasterxml.jackson.annotation.JsonIdentityReference -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.introspect.ObjectIdInfo -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.databind.node.ArrayNode -import com.fasterxml.jackson.databind.node.ObjectNode -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper import java.io.Writer @@ -50,6 +43,14 @@ import org.ossreviewtoolkit.reporter.Reporter import org.ossreviewtoolkit.reporter.ReporterInput import org.ossreviewtoolkit.reporter.Statistics +import tools.jackson.core.JsonGenerator +import tools.jackson.databind.JsonNode +import tools.jackson.databind.introspect.ObjectIdInfo +import tools.jackson.databind.json.JsonMapper +import tools.jackson.databind.node.ArrayNode +import tools.jackson.databind.node.ObjectNode +import tools.jackson.dataformat.yaml.YAMLMapper + /** * The [EvaluatedModel] represents the outcome of the evaluation of a [ReporterInput]. This means that all additional * information contained in the [ReporterInput] is applied to the [OrtResult]: diff --git a/plugins/reporters/evaluated-model/src/main/kotlin/IntIdModule.kt b/plugins/reporters/evaluated-model/src/main/kotlin/IntIdModule.kt index 2287fc495cb81..de0db6ee35ee8 100644 --- a/plugins/reporters/evaluated-model/src/main/kotlin/IntIdModule.kt +++ b/plugins/reporters/evaluated-model/src/main/kotlin/IntIdModule.kt @@ -19,12 +19,12 @@ package org.ossreviewtoolkit.plugins.reporters.evaluatedmodel -import com.fasterxml.jackson.databind.Module -import com.fasterxml.jackson.databind.PropertyName -import com.fasterxml.jackson.databind.introspect.Annotated -import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector -import com.fasterxml.jackson.databind.introspect.ObjectIdInfo -import com.fasterxml.jackson.databind.module.SimpleModule +import tools.jackson.databind.PropertyName +import tools.jackson.databind.cfg.MapperConfig +import tools.jackson.databind.introspect.Annotated +import tools.jackson.databind.introspect.JacksonAnnotationIntrospector +import tools.jackson.databind.introspect.ObjectIdInfo +import tools.jackson.databind.module.SimpleModule /** * A Jackson [Module] that configures the [ObjectIdInfo] for the provided [types]. The configuration applied to these @@ -43,7 +43,7 @@ class IntIdModule(private val types: List>) : SimpleModule() { super.setupModule(context) context.appendAnnotationIntrospector(object : JacksonAnnotationIntrospector() { - override fun findObjectIdInfo(ann: Annotated): ObjectIdInfo? { + override fun findObjectIdInfo(config: MapperConfig<*>, ann: Annotated): ObjectIdInfo? { if (ann.rawType in types) { return ObjectIdInfo( PropertyName("_id"), @@ -53,7 +53,7 @@ class IntIdModule(private val types: List>) : SimpleModule() { ) } - return super.findObjectIdInfo(ann) + return super.findObjectIdInfo(config, ann) } }) } diff --git a/plugins/reporters/spdx/src/main/kotlin/SpdxDocumentReporter.kt b/plugins/reporters/spdx/src/main/kotlin/SpdxDocumentReporter.kt index 6fa98781c7d7d..1d4c1d37b4cb9 100644 --- a/plugins/reporters/spdx/src/main/kotlin/SpdxDocumentReporter.kt +++ b/plugins/reporters/spdx/src/main/kotlin/SpdxDocumentReporter.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.plugins.reporters.spdx -import com.fasterxml.jackson.databind.node.ObjectNode - import java.io.File import org.apache.logging.log4j.kotlin.logger @@ -40,6 +38,8 @@ import org.ossreviewtoolkit.utils.spdxdocument.SpdxModelMapper.FileFormat import org.ossreviewtoolkit.utils.spdxdocument.model.SPDX_VERSION_2_2 import org.ossreviewtoolkit.utils.spdxdocument.model.SpdxDocument +import tools.jackson.databind.node.ObjectNode + @Suppress("EnumEntryNameCase", "EnumNaming") enum class SpdxVersion { @OrtPluginEnumEntry(alternativeName = "SPDX-2.2") diff --git a/reporter/src/main/kotlin/Statistics.kt b/reporter/src/main/kotlin/Statistics.kt index db6bc3376cb3a..ccf2b5a102da4 100644 --- a/reporter/src/main/kotlin/Statistics.kt +++ b/reporter/src/main/kotlin/Statistics.kt @@ -20,7 +20,6 @@ package org.ossreviewtoolkit.reporter import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.model.Issue import org.ossreviewtoolkit.model.OrtResult @@ -39,6 +38,8 @@ import org.ossreviewtoolkit.model.config.VulnerabilityResolution import org.ossreviewtoolkit.model.vulnerabilities.Vulnerability import org.ossreviewtoolkit.utils.ort.StringSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize + /** * A class containing statistics for an [OrtResult]. */ diff --git a/scanner/src/main/kotlin/FileList.kt b/scanner/src/main/kotlin/FileList.kt index 7d3a7f9b93e4a..11d23104e8b68 100644 --- a/scanner/src/main/kotlin/FileList.kt +++ b/scanner/src/main/kotlin/FileList.kt @@ -19,15 +19,15 @@ package org.ossreviewtoolkit.scanner -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.util.StdConverter - import java.util.SortedSet import org.ossreviewtoolkit.scanner.FileList.FileEntry import org.ossreviewtoolkit.utils.common.getDuplicates import org.ossreviewtoolkit.utils.ort.StringSortedSetConverter +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.util.StdConverter + /** * The model to store a file list for a resolved provenance. */ diff --git a/scanner/src/main/kotlin/provenance/FileBasedNestedProvenanceStorage.kt b/scanner/src/main/kotlin/provenance/FileBasedNestedProvenanceStorage.kt index 040e931dd7a8b..04ce0b68310ba 100644 --- a/scanner/src/main/kotlin/provenance/FileBasedNestedProvenanceStorage.kt +++ b/scanner/src/main/kotlin/provenance/FileBasedNestedProvenanceStorage.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.provenance -import com.fasterxml.jackson.module.kotlin.readValue - import java.io.ByteArrayInputStream import java.io.FileNotFoundException import java.io.IOException @@ -34,6 +32,8 @@ import org.ossreviewtoolkit.utils.common.fileSystemEncode import org.ossreviewtoolkit.utils.ort.showStackTrace import org.ossreviewtoolkit.utils.ort.storage.FileStorage +import tools.jackson.module.kotlin.readValue + class FileBasedNestedProvenanceStorage(private val backend: FileStorage) : NestedProvenanceStorage { override fun readNestedProvenance(root: RepositoryProvenance): NestedProvenanceResolutionResult? = readResults(root).find { it.nestedProvenance.root == root } diff --git a/scanner/src/main/kotlin/provenance/FileBasedPackageProvenanceStorage.kt b/scanner/src/main/kotlin/provenance/FileBasedPackageProvenanceStorage.kt index 5d53adf63bdde..95417725f5399 100644 --- a/scanner/src/main/kotlin/provenance/FileBasedPackageProvenanceStorage.kt +++ b/scanner/src/main/kotlin/provenance/FileBasedPackageProvenanceStorage.kt @@ -20,7 +20,6 @@ package org.ossreviewtoolkit.scanner.provenance import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.module.kotlin.readValue import java.io.ByteArrayInputStream import java.io.FileNotFoundException @@ -36,6 +35,8 @@ import org.ossreviewtoolkit.utils.common.collectMessages import org.ossreviewtoolkit.utils.ort.showStackTrace import org.ossreviewtoolkit.utils.ort.storage.FileStorage +import tools.jackson.module.kotlin.readValue + class FileBasedPackageProvenanceStorage(val backend: FileStorage) : PackageProvenanceStorage { override fun readProvenance(id: Identifier, sourceArtifact: RemoteArtifact): PackageProvenanceResolutionResult? = readResults(id).find { it.sourceArtifact == sourceArtifact }?.result diff --git a/scanner/src/main/kotlin/storages/ClearlyDefinedStorage.kt b/scanner/src/main/kotlin/storages/ClearlyDefinedStorage.kt index 0597011f6f0d0..8eac85b5feeaa 100644 --- a/scanner/src/main/kotlin/storages/ClearlyDefinedStorage.kt +++ b/scanner/src/main/kotlin/storages/ClearlyDefinedStorage.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.storages -import com.fasterxml.jackson.databind.JsonNode - import java.time.Instant import kotlin.coroutines.cancellation.CancellationException @@ -64,6 +62,8 @@ import org.ossreviewtoolkit.utils.ort.runBlocking import retrofit2.HttpException +import tools.jackson.databind.JsonNode + /** * A storage implementation that tries to download ScanCode results from ClearlyDefined. * diff --git a/scanner/src/main/kotlin/storages/PackageBasedFileStorage.kt b/scanner/src/main/kotlin/storages/PackageBasedFileStorage.kt index 2f92860a8a4c2..2b9d46c35ca91 100644 --- a/scanner/src/main/kotlin/storages/PackageBasedFileStorage.kt +++ b/scanner/src/main/kotlin/storages/PackageBasedFileStorage.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.storages -import com.fasterxml.jackson.module.kotlin.readValue - import java.io.ByteArrayInputStream import java.io.FileNotFoundException import java.io.IOException @@ -38,6 +36,8 @@ import org.ossreviewtoolkit.utils.common.collectMessages import org.ossreviewtoolkit.utils.ort.showStackTrace import org.ossreviewtoolkit.utils.ort.storage.FileStorage +import tools.jackson.module.kotlin.readValue + const val SCAN_RESULTS_FILE_NAME = "scan-results.yml" /** diff --git a/scanner/src/main/kotlin/storages/PackageBasedPostgresStorage.kt b/scanner/src/main/kotlin/storages/PackageBasedPostgresStorage.kt index 1356e98560284..15f9ed0b8eabe 100644 --- a/scanner/src/main/kotlin/storages/PackageBasedPostgresStorage.kt +++ b/scanner/src/main/kotlin/storages/PackageBasedPostgresStorage.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.storages -import com.fasterxml.jackson.core.JsonProcessingException - import java.sql.SQLException import javax.sql.DataSource @@ -53,6 +51,8 @@ import org.ossreviewtoolkit.scanner.storages.utils.ScanResults import org.ossreviewtoolkit.utils.common.collectMessages import org.ossreviewtoolkit.utils.ort.showStackTrace +import tools.jackson.core.JacksonException + private val TABLE_NAME = ScanResults.tableName /** @@ -151,7 +151,7 @@ class PackageBasedPostgresStorage( .filter { it.provenance.matches(pkg) } } }.onFailure { - if (it is JsonProcessingException || it is SQLException) { + if (it is JacksonException || it is SQLException) { it.showStackTrace() val message = "Could not read scan results for '${pkg.id.toCoordinates()}' with " + diff --git a/scanner/src/main/kotlin/storages/ProvenanceBasedFileStorage.kt b/scanner/src/main/kotlin/storages/ProvenanceBasedFileStorage.kt index 5bcbd3e95309f..ac4924d1e7eec 100644 --- a/scanner/src/main/kotlin/storages/ProvenanceBasedFileStorage.kt +++ b/scanner/src/main/kotlin/storages/ProvenanceBasedFileStorage.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.storages -import com.fasterxml.jackson.module.kotlin.readValue - import java.io.ByteArrayInputStream import java.io.FileNotFoundException import java.io.IOException @@ -41,6 +39,8 @@ import org.ossreviewtoolkit.utils.common.fileSystemEncode import org.ossreviewtoolkit.utils.ort.showStackTrace import org.ossreviewtoolkit.utils.ort.storage.FileStorage +import tools.jackson.module.kotlin.readValue + class ProvenanceBasedFileStorage(private val backend: FileStorage) : ProvenanceBasedScanStorage { override fun read(provenance: KnownProvenance, scannerMatcher: ScannerMatcher?): List { requireEmptyVcsPath(provenance) diff --git a/scanner/src/main/kotlin/storages/utils/JsonbSupport.kt b/scanner/src/main/kotlin/storages/utils/JsonbSupport.kt index b50452fbcd52c..be473a0dacb74 100644 --- a/scanner/src/main/kotlin/storages/utils/JsonbSupport.kt +++ b/scanner/src/main/kotlin/storages/utils/JsonbSupport.kt @@ -19,14 +19,14 @@ package org.ossreviewtoolkit.scanner.storages.utils -import com.fasterxml.jackson.module.kotlin.readValue - import org.jetbrains.exposed.v1.core.Column import org.jetbrains.exposed.v1.core.Table import org.jetbrains.exposed.v1.json.jsonb import org.ossreviewtoolkit.model.jsonMapper +import tools.jackson.module.kotlin.readValue + /** * Create a JSONB column using [jsonMapper] for serialization and deserialization. As the null character "\u0000" is not * allowed in PostgreSQL JSONB columns it is handled using [escapeNull] and [unescapeNull]. diff --git a/scanner/src/main/kotlin/utils/FileListResolver.kt b/scanner/src/main/kotlin/utils/FileListResolver.kt index fa46b4a89e646..88a277bd6eff8 100644 --- a/scanner/src/main/kotlin/utils/FileListResolver.kt +++ b/scanner/src/main/kotlin/utils/FileListResolver.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.scanner.utils -import com.fasterxml.jackson.module.kotlin.readValue - import java.io.ByteArrayInputStream import java.io.File @@ -37,6 +35,8 @@ import org.ossreviewtoolkit.utils.common.VCS_DIRECTORIES import org.ossreviewtoolkit.utils.common.isSymbolicLink import org.ossreviewtoolkit.utils.common.safeDeleteRecursively +import tools.jackson.module.kotlin.readValue + /** * A resolver for [FileList]s that are associated with [KnownProvenance]s. */ diff --git a/utils/ort/src/main/kotlin/CopyrightStatementsProcessor.kt b/utils/ort/src/main/kotlin/CopyrightStatementsProcessor.kt index a923fa9966fdd..62eafdddef7b7 100644 --- a/utils/ort/src/main/kotlin/CopyrightStatementsProcessor.kt +++ b/utils/ort/src/main/kotlin/CopyrightStatementsProcessor.kt @@ -21,12 +21,13 @@ package org.ossreviewtoolkit.utils.ort import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.utils.common.collapseToRanges import org.ossreviewtoolkit.utils.common.collapseWhitespace import org.ossreviewtoolkit.utils.common.prettyPrintRanges +import tools.jackson.databind.annotation.JsonSerialize + private val INVALID_OWNER_START_CHARS = charArrayOf(' ', ';', '.', ',', '-', '+', '~', '&') private val INVALID_OWNER_KEY_CHARS = charArrayOf('<', '>', '(', ')', '[', ']') + INVALID_OWNER_START_CHARS diff --git a/utils/ort/src/main/kotlin/DeclaredLicenseProcessor.kt b/utils/ort/src/main/kotlin/DeclaredLicenseProcessor.kt index 3b8ec5eac9cce..0a9e8a55e7eeb 100644 --- a/utils/ort/src/main/kotlin/DeclaredLicenseProcessor.kt +++ b/utils/ort/src/main/kotlin/DeclaredLicenseProcessor.kt @@ -22,7 +22,6 @@ package org.ossreviewtoolkit.utils.ort import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonPropertyOrder -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.utils.common.unquote import org.ossreviewtoolkit.utils.spdx.SpdxCompoundExpression @@ -32,6 +31,8 @@ import org.ossreviewtoolkit.utils.spdx.SpdxExpression import org.ossreviewtoolkit.utils.spdx.SpdxOperator import org.ossreviewtoolkit.utils.spdx.toSpdxOrNull +import tools.jackson.databind.annotation.JsonSerialize + object DeclaredLicenseProcessor { private val urlPrefixesToRemove = listOf( "choosealicense.com/licenses/", diff --git a/utils/ort/src/main/kotlin/SpdxExpressionSortedConverter.kt b/utils/ort/src/main/kotlin/SpdxExpressionSortedConverter.kt index fb2186e9bcd58..8a86ad1648bb1 100644 --- a/utils/ort/src/main/kotlin/SpdxExpressionSortedConverter.kt +++ b/utils/ort/src/main/kotlin/SpdxExpressionSortedConverter.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.utils.ort -import com.fasterxml.jackson.databind.util.StdConverter - import org.ossreviewtoolkit.utils.spdx.SpdxExpression +import tools.jackson.databind.util.StdConverter + class SpdxExpressionSortedConverter : StdConverter() { override fun convert(value: SpdxExpression) = value.sorted() } diff --git a/utils/ort/src/main/kotlin/StringSortedSetConverter.kt b/utils/ort/src/main/kotlin/StringSortedSetConverter.kt index d2a3dcbc30e18..5bf84d94ba878 100644 --- a/utils/ort/src/main/kotlin/StringSortedSetConverter.kt +++ b/utils/ort/src/main/kotlin/StringSortedSetConverter.kt @@ -19,10 +19,10 @@ package org.ossreviewtoolkit.utils.ort -import com.fasterxml.jackson.databind.util.StdConverter - import java.util.SortedSet +import tools.jackson.databind.util.StdConverter + class StringSortedSetConverter : StdConverter, SortedSet>() { override fun convert(value: Set) = value.toSortedSet() } diff --git a/utils/spdx-document/build.gradle.kts b/utils/spdx-document/build.gradle.kts index 8e53c8608e543..9216be4008fec 100644 --- a/utils/spdx-document/build.gradle.kts +++ b/utils/spdx-document/build.gradle.kts @@ -31,7 +31,6 @@ dependencies { implementation(jacksonLibs.jacksonCore) implementation(jacksonLibs.jacksonDataformatYaml) - implementation(jacksonLibs.jacksonDatatypeJsr310) implementation(jacksonLibs.jacksonModuleKotlin) testImplementation(projects.utils.testUtils) diff --git a/utils/spdx-document/src/main/kotlin/SpdxModelMapper.kt b/utils/spdx-document/src/main/kotlin/SpdxModelMapper.kt index 0e25aab721408..91b7ccb9b11b3 100644 --- a/utils/spdx-document/src/main/kotlin/SpdxModelMapper.kt +++ b/utils/spdx-document/src/main/kotlin/SpdxModelMapper.kt @@ -19,16 +19,17 @@ package org.ossreviewtoolkit.utils.spdxdocument -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.module.kotlin.readValue -import com.fasterxml.jackson.module.kotlin.registerKotlinModule - import java.io.File +import tools.jackson.databind.ObjectMapper +import tools.jackson.databind.SerializationFeature +import tools.jackson.databind.cfg.DateTimeFeature +import tools.jackson.databind.cfg.MapperBuilder +import tools.jackson.databind.json.JsonMapper +import tools.jackson.dataformat.yaml.YAMLMapper +import tools.jackson.module.kotlin.kotlinModule +import tools.jackson.module.kotlin.readValue + object SpdxModelMapper { /** * An enumeration of supported file formats for (de-)serialization, their primary [fileExtension] and optional @@ -79,7 +80,7 @@ object SpdxModelMapper { */ @PublishedApi - internal val jsonMapper: ObjectMapper = JsonMapper().apply(mapperConfig) + internal val jsonMapper: JsonMapper = JsonMapper.builder().apply(mapperConfig).build() inline fun fromJson(json: String): T = jsonMapper.readValue(json) @@ -90,17 +91,15 @@ object SpdxModelMapper { */ @PublishedApi - internal val yamlMapper: ObjectMapper = YAMLMapper().apply(mapperConfig) + internal val yamlMapper: YAMLMapper = YAMLMapper.builder().apply(mapperConfig).build() inline fun fromYaml(yaml: String): T = yamlMapper.readValue(yaml) fun toYaml(value: Any): String = yamlMapper.writeValueAsString(value) } -private val mapperConfig: ObjectMapper.() -> Unit = { - registerKotlinModule() - - registerModule(JavaTimeModule()) - disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) +val mapperConfig: MapperBuilder<*, *>.() -> Unit = { + addModule(kotlinModule()) + disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) enable(SerializationFeature.INDENT_OUTPUT) } diff --git a/utils/spdx-document/src/main/kotlin/model/Converters.kt b/utils/spdx-document/src/main/kotlin/model/Converters.kt index 9fd72fd92beeb..3361493457084 100644 --- a/utils/spdx-document/src/main/kotlin/model/Converters.kt +++ b/utils/spdx-document/src/main/kotlin/model/Converters.kt @@ -21,10 +21,10 @@ package org.ossreviewtoolkit.utils.spdxdocument.model -import com.fasterxml.jackson.databind.util.StdConverter - import java.util.SortedSet +import tools.jackson.databind.util.StdConverter + internal class SpdxRelationshipSortedSetConverter : StdConverter, SortedSet>() { override fun convert(value: List) = diff --git a/utils/spdx-document/src/main/kotlin/model/SpdxDocument.kt b/utils/spdx-document/src/main/kotlin/model/SpdxDocument.kt index 1b950ace9d870..ed968334b5e2f 100644 --- a/utils/spdx-document/src/main/kotlin/model/SpdxDocument.kt +++ b/utils/spdx-document/src/main/kotlin/model/SpdxDocument.kt @@ -21,12 +21,13 @@ package org.ossreviewtoolkit.utils.spdxdocument.model import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.annotation.JsonSerialize import org.ossreviewtoolkit.utils.common.getDuplicates import org.ossreviewtoolkit.utils.spdx.SpdxConstants.REF_PREFIX import org.ossreviewtoolkit.utils.spdx.SpdxLicense +import tools.jackson.databind.annotation.JsonSerialize + const val SPDX_VERSION_2_2 = "SPDX-2.2" const val SPDX_VERSION_2_3 = "SPDX-2.3" diff --git a/utils/spdx-document/src/main/kotlin/model/SpdxExternalReference.kt b/utils/spdx-document/src/main/kotlin/model/SpdxExternalReference.kt index 98a53b112362f..880d524bb36fa 100644 --- a/utils/spdx-document/src/main/kotlin/model/SpdxExternalReference.kt +++ b/utils/spdx-document/src/main/kotlin/model/SpdxExternalReference.kt @@ -23,11 +23,12 @@ import com.fasterxml.jackson.annotation.JsonAlias import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonValue -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.deser.std.StdDeserializer + +import tools.jackson.core.JsonParser +import tools.jackson.databind.DeserializationContext +import tools.jackson.databind.JsonNode +import tools.jackson.databind.annotation.JsonDeserialize +import tools.jackson.databind.deser.std.StdDeserializer /** * A reference to an external source of additional information for an [SpdxPackage]. @@ -127,8 +128,8 @@ private class ReferenceTypeDeserializer : StdDeserializer(p) - val typeName = node.textValue() + val node = p.readValueAsTree() + val typeName = node.asString() val type = SpdxExternalReference.Type::class.sealedSubclasses.mapNotNull { it.objectInstance } .find { it.name == typeName } return type ?: SpdxExternalReference.Type.Other(typeName) diff --git a/utils/spdx-document/src/test/kotlin/model/SpdxDocumentTest.kt b/utils/spdx-document/src/test/kotlin/model/SpdxDocumentTest.kt index 8d98bc775d8e4..836e8529dcb5b 100644 --- a/utils/spdx-document/src/test/kotlin/model/SpdxDocumentTest.kt +++ b/utils/spdx-document/src/test/kotlin/model/SpdxDocumentTest.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.utils.spdxdocument.model -import com.fasterxml.jackson.databind.exc.ValueInstantiationException - import io.kotest.assertions.json.ArrayOrder import io.kotest.assertions.json.shouldEqualJson import io.kotest.assertions.throwables.shouldThrow @@ -30,6 +28,8 @@ import io.kotest.matchers.string.shouldContain import org.ossreviewtoolkit.utils.spdxdocument.SpdxModelMapper import org.ossreviewtoolkit.utils.test.readResource +import tools.jackson.databind.exc.ValueInstantiationException + /** * This test uses the following test assets copied from the SPDX 2.2.2 specification examples. * diff --git a/utils/spdx/build.gradle.kts b/utils/spdx/build.gradle.kts index f2be2e6bf6764..5d89e2daf4dbd 100644 --- a/utils/spdx/build.gradle.kts +++ b/utils/spdx/build.gradle.kts @@ -198,7 +198,7 @@ fun Task.generateEnumClass( if (description == "license exception") { enumFile.appendText( """ - |import com.fasterxml.jackson.module.kotlin.readValue + |import tools.jackson.module.kotlin.readValue | """.trimMargin() ) diff --git a/utils/spdx/src/main/kotlin/SpdxDeclaredLicenseMapping.kt b/utils/spdx/src/main/kotlin/SpdxDeclaredLicenseMapping.kt index 63812b1561511..4572eb4d9f6a1 100644 --- a/utils/spdx/src/main/kotlin/SpdxDeclaredLicenseMapping.kt +++ b/utils/spdx/src/main/kotlin/SpdxDeclaredLicenseMapping.kt @@ -19,7 +19,7 @@ package org.ossreviewtoolkit.utils.spdx -import com.fasterxml.jackson.module.kotlin.readValue +import tools.jackson.module.kotlin.readValue /** * A mapping from license strings collected from the declared licenses of Open Source packages to SPDX expressions. This @@ -31,8 +31,8 @@ object SpdxDeclaredLicenseMapping { * The raw map which associates collected license strings with their corresponding SPDX expression. */ internal val rawMapping by lazy { - val resource = checkNotNull(javaClass.getResource("/declared-license-mapping.yml")) - yamlMapper.readValue>(resource) + val resource = checkNotNull(javaClass.getResourceAsStream("/declared-license-mapping.yml")) + resource.use { yamlMapper.readValue>(it) } } /** diff --git a/utils/spdx/src/main/kotlin/SpdxExpression.kt b/utils/spdx/src/main/kotlin/SpdxExpression.kt index 2f013a6b93932..ef88332e1ee14 100644 --- a/utils/spdx/src/main/kotlin/SpdxExpression.kt +++ b/utils/spdx/src/main/kotlin/SpdxExpression.kt @@ -20,13 +20,14 @@ package org.ossreviewtoolkit.utils.spdx import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer import org.ossreviewtoolkit.utils.spdx.SpdxConstants.DOCUMENT_REF_PREFIX import org.ossreviewtoolkit.utils.spdx.SpdxConstants.LICENSE_REF_PREFIX import org.ossreviewtoolkit.utils.spdx.parser.SpdxExpressionParser +import tools.jackson.databind.annotation.JsonSerialize +import tools.jackson.databind.ser.std.ToStringSerializer + /** * An SPDX expression as defined by version 2.2 of the [SPDX specification, annex D][1]. * diff --git a/utils/spdx/src/main/kotlin/SpdxLicenseException.kt b/utils/spdx/src/main/kotlin/SpdxLicenseException.kt index a7321249abf96..6650534391db5 100644 --- a/utils/spdx/src/main/kotlin/SpdxLicenseException.kt +++ b/utils/spdx/src/main/kotlin/SpdxLicenseException.kt @@ -22,7 +22,8 @@ package org.ossreviewtoolkit.utils.spdx import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.module.kotlin.readValue + +import tools.jackson.module.kotlin.readValue /** * An enum containing all SPDX license exception IDs. This class is generated by the Gradle task @@ -135,8 +136,8 @@ enum class SpdxLicenseException( * The map which associates SPDX exceptions with their applicable SPDX licenses. */ val association by lazy { - val resource = checkNotNull(SpdxLicenseException::class.java.getResource("/exception-association.yml")) - yamlMapper.readValue>>(resource) + val resource = checkNotNull(this::class.java.getResourceAsStream("/exception-association.yml")) + resource.use { yamlMapper.readValue>>(it) } } /** diff --git a/utils/spdx/src/main/kotlin/SpdxSimpleLicenseMapping.kt b/utils/spdx/src/main/kotlin/SpdxSimpleLicenseMapping.kt index dd60596a81d42..9abd5efd795d8 100644 --- a/utils/spdx/src/main/kotlin/SpdxSimpleLicenseMapping.kt +++ b/utils/spdx/src/main/kotlin/SpdxSimpleLicenseMapping.kt @@ -19,7 +19,7 @@ package org.ossreviewtoolkit.utils.spdx -import com.fasterxml.jackson.module.kotlin.readValue +import tools.jackson.module.kotlin.readValue /** * A mapping from simple license names to valid SPDX license IDs. This mapping only contains license strings which *can* @@ -31,8 +31,8 @@ object SpdxSimpleLicenseMapping { * The map of simple license names associated with their corresponding [SPDX license][SpdxLicense]. */ internal val simpleLicenseMapping: Map by lazy { - val resource = checkNotNull(javaClass.getResource("/simple-license-mapping.yml")) - yamlMapper.readValue(resource) + val resource = checkNotNull(javaClass.getResourceAsStream("/simple-license-mapping.yml")) + resource.use { yamlMapper.readValue(it) } } /** @@ -47,8 +47,8 @@ object SpdxSimpleLicenseMapping { * [SpdxSingleLicenseExpression]. */ val deprecatedExpressionMapping: Map by lazy { - val resource = checkNotNull(javaClass.getResource("/deprecated-license-mapping.yml")) - val mapping = yamlMapper.readValue>(resource) + val resource = checkNotNull(javaClass.getResourceAsStream("/deprecated-license-mapping.yml")) + val mapping = resource.use { yamlMapper.readValue>(it) } mapping.toSortedMap(String.CASE_INSENSITIVE_ORDER) } diff --git a/utils/spdx/src/main/kotlin/Utils.kt b/utils/spdx/src/main/kotlin/Utils.kt index ca28bdeb4bc89..3931469c82ae6 100644 --- a/utils/spdx/src/main/kotlin/Utils.kt +++ b/utils/spdx/src/main/kotlin/Utils.kt @@ -19,9 +19,6 @@ package org.ossreviewtoolkit.utils.spdx -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper -import com.fasterxml.jackson.module.kotlin.registerKotlinModule - import java.io.File import java.security.MessageDigest @@ -30,10 +27,15 @@ import org.ossreviewtoolkit.utils.common.VCS_DIRECTORIES import org.ossreviewtoolkit.utils.common.calculateHash import org.ossreviewtoolkit.utils.common.isSymbolicLink +import tools.jackson.dataformat.yaml.YAMLMapper +import tools.jackson.module.kotlin.kotlinModule + /** * A mapper to read license mapping from YAML resource files. */ -internal val yamlMapper = YAMLMapper().registerKotlinModule() +internal val yamlMapper = YAMLMapper.builder() + .addModule(kotlinModule()) + .build() /** * Calculate the [SPDX package verification code][1] for a list of [known SHA1s][sha1sums] of files and [excludes]. diff --git a/utils/test/src/main/kotlin/Extensions.kt b/utils/test/src/main/kotlin/Extensions.kt index d6d148c234204..c189cd874697c 100644 --- a/utils/test/src/main/kotlin/Extensions.kt +++ b/utils/test/src/main/kotlin/Extensions.kt @@ -19,8 +19,6 @@ package org.ossreviewtoolkit.utils.test -import com.fasterxml.jackson.module.kotlin.readValue - import io.kotest.core.TestConfiguration import io.kotest.engine.spec.tempfile @@ -29,6 +27,8 @@ import java.io.File import org.ossreviewtoolkit.model.FileFormat import org.ossreviewtoolkit.model.OrtResult +import tools.jackson.module.kotlin.readValue + fun TestConfiguration.extractResource(name: String) = tempfile(name.substringAfterLast('/')).apply { writeText(readResource(name)) } @@ -41,7 +41,7 @@ fun TestConfiguration.readOrtResult(name: String) = .readValue(patchExpectedResult(readResource(name))) inline fun TestConfiguration.readResourceValue(name: String): T = - FileFormat.forExtension(name.substringAfterLast('.')).mapper.readValue(getResource(name)) + FileFormat.forExtension(name.substringAfterLast('.')).mapper.readValue(getResource(name).readText()) /** * Return the corresponding [File] location in the source tree. The function is for development only, and can help