Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.model.config.CopyrightGarbage
import org.ossreviewtoolkit.model.config.orEmpty
import org.ossreviewtoolkit.model.readValue
import org.ossreviewtoolkit.model.utils.setPackageConfigurations
import org.ossreviewtoolkit.plugins.packageconfigurationproviders.dir.DirPackageConfigurationProvider
import org.ossreviewtoolkit.utils.common.expandTilde

Expand Down Expand Up @@ -77,13 +78,11 @@ internal class ListCopyrightsCommand : CliktCommand(

override fun run() {
val ortResult = readOrtResult(ortFile)
.setPackageConfigurations(DirPackageConfigurationProvider(packageConfigurationsDir))
val copyrightGarbage = copyrightGarbageFile?.readValue<CopyrightGarbage>().orEmpty()
val packageConfigurationProvider = DirPackageConfigurationProvider(packageConfigurationsDir)

val copyrightStatements = ortResult.processAllCopyrightStatements(
copyrightGarbage = copyrightGarbage.items,
packageConfigurationProvider = packageConfigurationProvider
).filter { packageId == null || it.packageId == packageId }
val copyrightStatements = ortResult.processAllCopyrightStatements(copyrightGarbage = copyrightGarbage.items)
.filter { packageId == null || it.packageId == packageId }
.filter { licenseId == null || it.license.toString() == licenseId }
.groupBy({ it.statement }, { it.rawStatements })
.mapValues { it.value.flatten().toSortedSet() }
Expand Down
4 changes: 1 addition & 3 deletions helper-cli/src/main/kotlin/utils/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,11 @@ internal fun OrtResult.downloadSources(id: Identifier, sourceCodeOrigin: SourceC
internal fun OrtResult.processAllCopyrightStatements(
omitExcluded: Boolean = true,
copyrightGarbage: Set<String> = emptySet(),
addAuthorsToCopyrights: Boolean = false,
packageConfigurationProvider: PackageConfigurationProvider = PackageConfigurationProvider.EMPTY
addAuthorsToCopyrights: Boolean = false
): List<ProcessedCopyrightStatement> {
val result = mutableListOf<ProcessedCopyrightStatement>()

val licenseInfoResolver = createLicenseInfoResolver(
packageConfigurationProvider = packageConfigurationProvider,
copyrightGarbage = CopyrightGarbage(copyrightGarbage.toSortedSet()),
addAuthorsToCopyrights = addAuthorsToCopyrights
)
Expand Down
14 changes: 13 additions & 1 deletion model/src/main/kotlin/OrtResult.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ import org.ossreviewtoolkit.model.ResolvedPackageCurations.Companion.REPOSITORY_
import org.ossreviewtoolkit.model.config.Excludes
import org.ossreviewtoolkit.model.config.IssueResolution
import org.ossreviewtoolkit.model.config.LicenseFindingCuration
import org.ossreviewtoolkit.model.config.PackageConfiguration
import org.ossreviewtoolkit.model.config.RepositoryConfiguration
import org.ossreviewtoolkit.model.config.Resolutions
import org.ossreviewtoolkit.model.config.RuleViolationResolution
import org.ossreviewtoolkit.model.config.VulnerabilityResolution
import org.ossreviewtoolkit.model.config.orEmpty
import org.ossreviewtoolkit.model.utils.PackageConfigurationProvider
import org.ossreviewtoolkit.model.utils.ResolutionProvider
import org.ossreviewtoolkit.model.vulnerabilities.Vulnerability
import org.ossreviewtoolkit.utils.common.zipWithCollections
Expand Down Expand Up @@ -87,7 +89,7 @@ data class OrtResult(
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
val labels: Map<String, String> = emptyMap()
) : ResolutionProvider {
) : ResolutionProvider, PackageConfigurationProvider {
companion object {
/**
* A constant for an [OrtResult] with an empty repository and all other properties `null`.
Expand Down Expand Up @@ -147,6 +149,10 @@ data class OrtResult(
}
}

private val packageConfigurationsById: Map<Identifier, List<PackageConfiguration>> by lazy {
resolvedConfiguration.packageConfigurations.orEmpty().groupBy { it.id }
}

/**
* A map of projects and their excluded state. Calculating this map once brings massive performance improvements
* when querying projects in large analyzer results.
Expand Down Expand Up @@ -279,6 +285,12 @@ data class OrtResult(
issue.severity >= minSeverity && getResolutions().issues.none { it.matches(issue) }
}

/**
* Return a list of [PackageConfiguration]s for the given [packageId] and [provenance].
*/
override fun getPackageConfigurations(packageId: Identifier, provenance: Provenance): List<PackageConfiguration> =
packageConfigurationsById[packageId].orEmpty().filter { it.matches(packageId, provenance) }

/**
* Return all projects and packages that are likely to belong to one of the organizations of the given [names]. If
* [omitExcluded] is set to true, excluded projects / packages are omitted from the result. Projects are converted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,13 @@ import org.ossreviewtoolkit.model.OrtResult
import org.ossreviewtoolkit.model.Provenance
import org.ossreviewtoolkit.model.config.LicenseFindingCuration
import org.ossreviewtoolkit.model.config.PathExclude
import org.ossreviewtoolkit.model.utils.PackageConfigurationProvider
import org.ossreviewtoolkit.model.utils.filterByVcsPath
import org.ossreviewtoolkit.utils.ort.ProcessedDeclaredLicense

/**
* The default [LicenseInfoProvider] that collects license information from an [ortResult].
*/
class DefaultLicenseInfoProvider(
val ortResult: OrtResult,
private val packageConfigurationProvider: PackageConfigurationProvider
) : LicenseInfoProvider {
class DefaultLicenseInfoProvider(val ortResult: OrtResult) : LicenseInfoProvider {
private val licenseInfo: ConcurrentMap<Identifier, LicenseInfo> = ConcurrentHashMap()

override fun get(id: Identifier) = licenseInfo.getOrPut(id) { createLicenseInfo(id) }
Expand Down Expand Up @@ -112,7 +108,7 @@ class DefaultLicenseInfoProvider(
ortResult.repository.config.excludes.paths,
ortResult.repository.getRelativePath(project.vcsProcessed).orEmpty()
)
} ?: packageConfigurationProvider.getPackageConfigurations(id, provenance).let { packageConfigurations ->
} ?: ortResult.getPackageConfigurations(id, provenance).let { packageConfigurations ->
Configuration(
packageConfigurations.flatMap { it.licenseFindingCurations },
packageConfigurations.flatMap { it.pathExcludes },
Expand Down
3 changes: 1 addition & 2 deletions model/src/main/kotlin/utils/OrtResultExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,11 @@ fun OrtResult.setResolutions(resolutionProvider: ResolutionProvider): OrtResult
* instead of calling this function multiple times for better performance.
*/
fun OrtResult.createLicenseInfoResolver(
packageConfigurationProvider: PackageConfigurationProvider = PackageConfigurationProvider.EMPTY,
copyrightGarbage: CopyrightGarbage = CopyrightGarbage(),
addAuthorsToCopyrights: Boolean = false,
archiver: FileArchiver? = null
) = LicenseInfoResolver(
DefaultLicenseInfoProvider(this, packageConfigurationProvider),
DefaultLicenseInfoProvider(this),
copyrightGarbage,
addAuthorsToCopyrights,
archiver,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ package org.ossreviewtoolkit.model.licenses
import io.kotest.core.spec.style.WordSpec
import io.kotest.matchers.shouldBe

import org.ossreviewtoolkit.model.utils.PackageConfigurationProvider

class DefaultLicenseInfoProviderTest : WordSpec({
val defaultLicenseInfoProvider = DefaultLicenseInfoProvider(ortResult, PackageConfigurationProvider.EMPTY)
val defaultLicenseInfoProvider = DefaultLicenseInfoProvider(ortResult)

"declaredLicenseInfo" should {
"contain author information for package" {
Expand Down
3 changes: 1 addition & 2 deletions model/src/test/kotlin/licenses/LicenseViewTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,13 @@ import org.ossreviewtoolkit.model.LicenseSource
import org.ossreviewtoolkit.model.Package
import org.ossreviewtoolkit.model.config.CopyrightGarbage
import org.ossreviewtoolkit.model.utils.FileArchiver
import org.ossreviewtoolkit.model.utils.PackageConfigurationProvider
import org.ossreviewtoolkit.utils.spdx.SpdxSingleLicenseExpression
import org.ossreviewtoolkit.utils.test.createDefault
import org.ossreviewtoolkit.utils.test.transformingCollectionMatcher

class LicenseViewTest : WordSpec() {
private val licenseInfoResolver = LicenseInfoResolver(
provider = DefaultLicenseInfoProvider(ortResult, PackageConfigurationProvider.EMPTY),
provider = DefaultLicenseInfoProvider(ortResult),
copyrightGarbage = CopyrightGarbage(),
addAuthorsToCopyrights = false,
archiver = FileArchiver.createDefault()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,10 +297,12 @@ class EvaluatorCommand : OrtCommand(
val packageConfigurationProvider =
CompositePackageConfigurationProvider(*enabledPackageConfigurationProviders.toTypedArray())

ortResultInput = ortResultInput.setPackageConfigurations(packageConfigurationProvider)

val copyrightGarbage = copyrightGarbageFile.takeIf { it.isFile }?.readValue<CopyrightGarbage>().orEmpty()

val licenseInfoResolver = LicenseInfoResolver(
provider = DefaultLicenseInfoProvider(ortResultInput, packageConfigurationProvider),
provider = DefaultLicenseInfoProvider(ortResultInput),
copyrightGarbage = copyrightGarbage,
addAuthorsToCopyrights = ortConfig.addAuthorsToCopyrights,
archiver = ortConfig.scanner.archive.createFileArchiver(),
Expand All @@ -325,7 +327,6 @@ class EvaluatorCommand : OrtCommand(
// Note: This overwrites any existing EvaluatorRun from the input file.
val ortResultOutput = ortResultInput.copy(evaluator = evaluatorRun)
.mergeLabels(labels)
.setPackageConfigurations(packageConfigurationProvider)
.setResolutions(resolutionProvider)

outputDir?.let { absoluteOutputDir ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import org.ossreviewtoolkit.model.readValue
import org.ossreviewtoolkit.model.readValueOrDefault
import org.ossreviewtoolkit.model.utils.CompositePackageConfigurationProvider
import org.ossreviewtoolkit.model.utils.DefaultResolutionProvider
import org.ossreviewtoolkit.model.utils.setPackageConfigurations
import org.ossreviewtoolkit.model.utils.setResolutions
import org.ossreviewtoolkit.plugins.commands.api.OrtCommand
import org.ossreviewtoolkit.plugins.commands.api.utils.configurationGroup
Expand Down Expand Up @@ -234,10 +235,12 @@ class ReporterCommand : OrtCommand(
}
}

ortResult = ortResult.setPackageConfigurations(packageConfigurationProvider)

val copyrightGarbage = copyrightGarbageFile.takeIf { it.isFile }?.readValue<CopyrightGarbage>().orEmpty()

val licenseInfoResolver = LicenseInfoResolver(
provider = DefaultLicenseInfoProvider(ortResult, packageConfigurationProvider),
provider = DefaultLicenseInfoProvider(ortResult),
copyrightGarbage = copyrightGarbage,
addAuthorsToCopyrights = ortConfig.addAuthorsToCopyrights,
archiver = ortConfig.scanner.archive.createFileArchiver(),
Expand All @@ -256,7 +259,6 @@ class ReporterCommand : OrtCommand(
val input = ReporterInput(
ortResult,
ortConfig,
packageConfigurationProvider,
DefaultLicenseTextProvider(licenseTextDirectories),
copyrightGarbage,
licenseInfoResolver,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,15 +222,15 @@ internal class EvaluatedModelMapper(private val input: ReporterInput) {
if (input.ortResult.isProject(id)) {
input.ortResult.repository.config.curations.licenseFindings
} else {
input.packageConfigurationProvider.getPackageConfigurations(id, provenance)
input.ortResult.getPackageConfigurations(id, provenance)
.flatMap { it.licenseFindingCurations }
}

private fun getPathExcludes(id: Identifier, provenance: Provenance): List<PathExclude> =
if (input.ortResult.isProject(id)) {
input.ortResult.getExcludes().paths
} else {
input.packageConfigurationProvider.getPackageConfigurations(id, provenance)
input.ortResult.getPackageConfigurations(id, provenance)
.flatMap { it.pathExcludes }
}

Expand Down
9 changes: 1 addition & 8 deletions reporter/src/main/kotlin/ReporterInput.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@ import org.ossreviewtoolkit.model.Issue
import org.ossreviewtoolkit.model.OrtResult
import org.ossreviewtoolkit.model.config.CopyrightGarbage
import org.ossreviewtoolkit.model.config.OrtConfiguration
import org.ossreviewtoolkit.model.config.PackageConfiguration
import org.ossreviewtoolkit.model.config.createFileArchiver
import org.ossreviewtoolkit.model.licenses.DefaultLicenseInfoProvider
import org.ossreviewtoolkit.model.licenses.LicenseClassifications
import org.ossreviewtoolkit.model.licenses.LicenseInfoResolver
import org.ossreviewtoolkit.model.utils.PackageConfigurationProvider
import org.ossreviewtoolkit.reporter.StatisticsCalculator.getStatistics

/**
Expand All @@ -45,11 +43,6 @@ data class ReporterInput(
*/
val ortConfig: OrtConfiguration = OrtConfiguration(),

/**
* A [PackageConfigurationProvider], can be used to obtain [PackageConfiguration]s for packages.
*/
val packageConfigurationProvider: PackageConfigurationProvider = PackageConfigurationProvider.EMPTY,

/**
* A [LicenseTextProvider], can be used to integrate licenses texts into reports.
*/
Expand All @@ -64,7 +57,7 @@ data class ReporterInput(
* A resolver for license information for the projects and packages contained in [ortResult].
*/
val licenseInfoResolver: LicenseInfoResolver = LicenseInfoResolver(
provider = DefaultLicenseInfoProvider(ortResult, packageConfigurationProvider),
provider = DefaultLicenseInfoProvider(ortResult),
copyrightGarbage = copyrightGarbage,
addAuthorsToCopyrights = ortConfig.addAuthorsToCopyrights,
archiver = ortConfig.scanner.archive.createFileArchiver(),
Expand Down