Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plugins/license-fact-providers/api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ plugins {
}

dependencies {
api(projects.model)
api(projects.plugins.api)
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,42 @@

package org.ossreviewtoolkit.plugins.licensefactproviders.api

import org.ossreviewtoolkit.plugins.api.PluginDescriptor
import org.ossreviewtoolkit.model.Identifier

/**
* A [LicenseFactProvider] that aggregates multiple [LicenseFactProvider]s.
* A composition of multiple [LicenseFactProvider]s.
*/
class CompositeLicenseFactProvider(
/**
* A list of [LicenseFactProvider]s to aggregate. The order of the list determines the precedence of the
* providers: the first provider in the list that has a fact for a given license ID will be used.
*/
private val providers: List<LicenseFactProvider>
) : LicenseFactProvider() {
override val descriptor = PluginDescriptor(
id = "Composite",
displayName = "Composite License Fact Provider",
summary = "A license fact provider that aggregates multiple license fact providers."
)
) {
/** Return the [LicenseText] for the given [licenseId] and [id], or `null` if no valid text is available. */
fun getLicenseText(licenseId: String, id: Identifier? = null): LicenseText? {
val idSpecificLicenseText = if (id != null) {
providers.firstNotNullOfOrNull { it.getIdSpecificLicenseText(licenseId, id) }
} else {
null
}

override fun getLicenseText(licenseId: String) = providers.firstNotNullOfOrNull { it.getLicenseText(licenseId) }
return idSpecificLicenseText ?: providers.firstNotNullOfOrNull { it.getLicenseText(licenseId) }
}

override fun hasLicenseText(licenseId: String) = providers.any { it.hasLicenseText(licenseId) }
/** Return a non-blank license text for the given [licenseId] and [id], or `null` if no valid text is available. */
@Deprecated("Java-only API", level = DeprecationLevel.HIDDEN)
@JvmName("getLicenseText")
fun getNonBlankLicenseText(licenseId: String, id: Identifier? = null): String? = getLicenseText(licenseId, id)?.text

Check warning on line 48 in plugins/license-fact-providers/api/src/main/kotlin/CompositeLicenseFactProvider.kt

View workflow job for this annotation

GitHub Actions / qodana-scan

Unused symbol

Function "getNonBlankLicenseText" is never used

Check warning

Code scanning / QDJVM

Unused symbol Warning

Function "getNonBlankLicenseText" is never used

/** Return `true´ if this provider has a license text for the given [licenseId] and [id]. */
fun hasLicenseText(licenseId: String, id: Identifier? = null): Boolean {

Check warning on line 51 in plugins/license-fact-providers/api/src/main/kotlin/CompositeLicenseFactProvider.kt

View workflow job for this annotation

GitHub Actions / qodana-scan

Unused symbol

Function "hasLicenseText" is never used

Check warning

Code scanning / QDJVM

Unused symbol Warning

Function "hasLicenseText" is never used
val hasIdSpecificLicenseText = if (id != null) {
providers.any { it.hasIdSpecificLicenseText(licenseId, id) }
} else {
false
}

return hasIdSpecificLicenseText || providers.any { it.hasLicenseText(licenseId) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,24 @@

package org.ossreviewtoolkit.plugins.licensefactproviders.api

import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.plugins.api.Plugin

/** A provider for license facts. */
abstract class LicenseFactProvider : Plugin {
interface LicenseFactProvider : Plugin {
/** Return the [LicenseText] for the given [licenseId], or `null` if no valid text is available. */
abstract fun getLicenseText(licenseId: String): LicenseText?

/** Return a non-blank license text for the given [licenseId], or `null` if no valid text is available. */
@Deprecated("Java-only API", level = DeprecationLevel.HIDDEN)
@JvmName("getLicenseText")
fun getNonBlankLicenseText(licenseId: String): String? = getLicenseText(licenseId)?.text
fun getLicenseText(licenseId: String): LicenseText?

/** Return `true´ if this provider has a license text for the given [licenseId]. */
abstract fun hasLicenseText(licenseId: String): Boolean
fun hasLicenseText(licenseId: String): Boolean

/**
* Return the id-specific [LicenseText] for the given [licenseId] and [id], or `null` if no such text is
* available.
**/
fun getIdSpecificLicenseText(licenseId: String, id: Identifier): LicenseText? = null

/** Return `true´ if this provider has an id-specific license text for the given [licenseId] and [id]. */
fun hasIdSpecificLicenseText(licenseId: String, id: Identifier): Boolean =
getIdSpecificLicenseText(licenseId, id) != null
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class DefaultDirLicenseFactProvider(descriptor: PluginDescriptor = DefaultDirLic
open class DirLicenseFactProvider(
override val descriptor: PluginDescriptor = DirLicenseFactProviderFactory.descriptor,
config: DirLicenseFactProviderConfig
) : LicenseFactProvider() {
) : LicenseFactProvider {
private val licenseTextDir = File(config.licenseTextDir).also {
if (!it.isDirectory) {
logger.warn { "The license text directory '${it.absolutePath}' does not exist or is not a directory." }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ data class ScanCodeLicenseFactProviderConfig(
class ScanCodeLicenseFactProvider(
override val descriptor: PluginDescriptor = ScanCodeLicenseFactProviderFactory.descriptor,
private val config: ScanCodeLicenseFactProviderConfig
) : LicenseFactProvider() {
) : LicenseFactProvider {
/**
* The directory that contains the ScanCode license texts. This is located using a heuristic based on the path of
* the ScanCode binary.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import org.ossreviewtoolkit.plugins.licensefactproviders.api.LicenseText
)
class SpdxLicenseFactProvider(
override val descriptor: PluginDescriptor = SpdxLicenseFactProviderFactory.descriptor
) : LicenseFactProvider() {
) : LicenseFactProvider {
override fun getLicenseText(licenseId: String) =
getLicenseTextResource(licenseId)?.readText()?.let {
// It can be safely assumed that the license text is not blank as all SPDX license texts are non-blank.
Expand Down
1 change: 0 additions & 1 deletion plugins/reporters/aosd/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ dependencies {

funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(libs.kotest.assertions.json)
funTestImplementation(projects.plugins.licenseFactProviders.spdxLicenseFactProvider)
funTestImplementation(projects.utils.testUtils)

ksp(projects.reporter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import io.kotest.matchers.result.shouldBeSuccess
import io.kotest.matchers.should
import io.kotest.matchers.shouldBe

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.test.getResource
Expand Down Expand Up @@ -62,7 +62,7 @@ class Aosd21ReporterFunTest : WordSpec({
val reportFiles = Aosd21Reporter().generateReport(
ReporterInput(
ORT_RESULT,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
),
tempdir()
)
Expand Down
1 change: 0 additions & 1 deletion plugins/reporters/asciidoc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ dependencies {
implementation(projects.utils.ortUtils)

funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(projects.plugins.licenseFactProviders.spdxLicenseFactProvider)
funTestImplementation(projects.utils.testUtils)

runtimeOnly(libs.asciidoctorj.pdf)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import io.kotest.matchers.shouldBe

import java.time.LocalDate

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.test.patchExpectedResult
Expand All @@ -38,7 +38,7 @@ class DocBookTemplateReporterFunTest : StringSpec({
val reportContent = DocBookTemplateReporterFactory.create().generateReport(
ReporterInput(
ORT_RESULT,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
),
tempdir()
).single().getOrThrow().readText()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import io.kotest.core.spec.style.StringSpec
import io.kotest.engine.spec.tempdir
import io.kotest.matchers.shouldBe

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.test.patchExpectedResult
Expand All @@ -37,7 +37,7 @@ class HtmlTemplateReporterFunTest : StringSpec({
val reportContent = reporter.generateReport(
ReporterInput(
ORT_RESULT,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
),
tempdir()
).single().getOrThrow().readText()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import io.kotest.matchers.shouldBe

import java.time.LocalDate

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.test.patchExpectedResult
Expand All @@ -39,7 +39,7 @@ class ManPageTemplateReporterFunTest : StringSpec({
val reportContent = reporter.generateReport(
ReporterInput(
ORT_RESULT,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
),
tempdir()
).single().getOrThrow().readText()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import io.kotest.matchers.result.shouldBeSuccess
import io.kotest.matchers.should
import io.kotest.matchers.shouldBe

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ORT_RESULT_WITH_VULNERABILITIES
import org.ossreviewtoolkit.reporter.ReporterInput
Expand All @@ -40,7 +40,7 @@ class PdfTemplateReporterFunTest : StringSpec({
val reportFileResults = PdfTemplateReporterFactory.create().generateReport(
ReporterInput(
ORT_RESULT,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
),
tempdir()
)
Expand Down
2 changes: 1 addition & 1 deletion plugins/reporters/cyclonedx/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ dependencies {
implementation(projects.utils.ortUtils)
implementation(projects.utils.spdxUtils)

funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(libs.kotest.assertions.json)
funTestImplementation(projects.plugins.licenseFactProviders.spdxLicenseFactProvider)
funTestImplementation(projects.utils.commonUtils)
funTestImplementation(projects.utils.testUtils)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ import org.ossreviewtoolkit.model.Project
import org.ossreviewtoolkit.model.VcsInfo
import org.ossreviewtoolkit.model.VcsType
import org.ossreviewtoolkit.plugins.licensefactproviders.api.CompositeLicenseFactProvider
import org.ossreviewtoolkit.plugins.licensefactproviders.api.LicenseFactProvider
import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.plugins.reporters.cyclonedx.CycloneDxReporter.Companion.REPORT_BASE_FILENAME
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_EMPTY
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.common.normalizeLineBreaks
import org.ossreviewtoolkit.utils.test.matchJsonSchema
Expand All @@ -60,7 +60,7 @@ class CycloneDxReporterFunTest : WordSpec({
val bom = generateSingleBomReport(
ortResult = ORT_RESULT_WITH_VULNERABILITIES,
format = Format.XML,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom should matchCycloneDxXmlSchema(DEFAULT_SCHEMA_VERSION_NAME)
Expand All @@ -82,7 +82,7 @@ class CycloneDxReporterFunTest : WordSpec({
val bom = generateSingleBomReport(
ortResult = ORT_RESULT_WITH_VULNERABILITIES,
format = Format.JSON,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom should matchJsonSchema(schemaJson)
Expand All @@ -109,7 +109,7 @@ class CycloneDxReporterFunTest : WordSpec({
val bom = generateSingleBomReport(
ortResult = createResultWithAdditionalProject(otherProject),
format = Format.JSON,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom.patchCycloneDxResult() shouldEqualJson expectedBom
Expand All @@ -135,7 +135,7 @@ class CycloneDxReporterFunTest : WordSpec({
val bom = generateSingleBomReport(
ortResult = createResultWithAdditionalProject(otherProject),
format = Format.JSON,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom.patchCycloneDxResult() shouldEqualJson expectedBom
Expand All @@ -148,7 +148,7 @@ class CycloneDxReporterFunTest : WordSpec({
ortResult = ORT_RESULT_WITH_VULNERABILITIES,
format = Format.JSON,
singleBomComponentType = Component.Type.LIBRARY,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom.patchCycloneDxResult() shouldEqualJson expectedBom
Expand All @@ -175,7 +175,7 @@ class CycloneDxReporterFunTest : WordSpec({
ortResult = createResultWithAdditionalProject(topLevelProject),
format = Format.JSON,
singleBomComponentName = "eric",
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

bom.patchCycloneDxResult() shouldEqualJson expectedBom
Expand All @@ -199,7 +199,7 @@ class CycloneDxReporterFunTest : WordSpec({
val (bomWithFindings, bomWithoutFindings) = generateMultiBomReport(
ortResult = ORT_RESULT_WITH_VULNERABILITIES,
format = Format.JSON,
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
).also {
it shouldHaveSize 2
it.forAll { bom ->
Expand Down Expand Up @@ -259,7 +259,7 @@ private fun TestConfiguration.generateSingleBomReport(
format: Format,
singleBomComponentName: String = "",
singleBomComponentType: Component.Type = Component.Type.APPLICATION,
licenseFactProvider: LicenseFactProvider = CompositeLicenseFactProvider(emptyList())
licenseFactProvider: CompositeLicenseFactProvider = LICENSE_FACT_PROVIDER_EMPTY
): String {
val reporter = CycloneDxReporterFactory.create(
schemaVersion = SchemaVersion.entries.single { it.version.versionString == DEFAULT_SCHEMA_VERSION_NAME },
Expand All @@ -279,7 +279,7 @@ private fun TestConfiguration.generateSingleBomReport(
private fun TestConfiguration.generateMultiBomReport(
ortResult: OrtResult,
format: Format,
licenseFactProvider: LicenseFactProvider = CompositeLicenseFactProvider(emptyList())
licenseFactProvider: CompositeLicenseFactProvider = LICENSE_FACT_PROVIDER_EMPTY
): List<String> {
val reporter = CycloneDxReporterFactory.create(
schemaVersion = SchemaVersion.entries.single { it.version.versionString == DEFAULT_SCHEMA_VERSION_NAME },
Expand Down
1 change: 0 additions & 1 deletion plugins/reporters/freemarker/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ dependencies {
implementation(projects.utils.spdxUtils)

funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(projects.plugins.licenseFactProviders.spdxLicenseFactProvider)
funTestImplementation(projects.utils.testUtils)

testImplementation(libs.mockk)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import org.ossreviewtoolkit.model.config.ScannerConfiguration
import org.ossreviewtoolkit.model.licenses.LicenseCategorization
import org.ossreviewtoolkit.model.licenses.LicenseCategory
import org.ossreviewtoolkit.model.licenses.LicenseClassifications
import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ORT_RESULT
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.common.div
Expand Down Expand Up @@ -98,7 +98,7 @@ private fun TestConfiguration.generateReport(
ortResult,
ortConfig,
licenseClassifications = createLicenseClassifications(),
licenseFactProvider = SpdxLicenseFactProviderFactory.create()
licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX
)

val outputDir = tempdir()
Expand Down
2 changes: 1 addition & 1 deletion plugins/reporters/opossum/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ dependencies {
implementation(projects.utils.ortUtils)
implementation(projects.utils.spdxUtils)

funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(libs.kotest.assertions.json)
funTestImplementation(projects.plugins.licenseFactProviders.spdxLicenseFactProvider)
funTestImplementation(projects.utils.testUtils)

testImplementation(projects.utils.testUtils)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import io.kotest.engine.spec.tempdir

import java.time.LocalDateTime

import org.ossreviewtoolkit.plugins.licensefactproviders.spdx.SpdxLicenseFactProviderFactory
import org.ossreviewtoolkit.reporter.LICENSE_FACT_PROVIDER_SPDX
import org.ossreviewtoolkit.reporter.ReporterInput
import org.ossreviewtoolkit.utils.common.unpackZip
import org.ossreviewtoolkit.utils.test.patchActualResult
Expand All @@ -42,7 +42,7 @@ class OpossumReporterFunTest : WordSpec({
"The generated report" should {
"match the expected result" {
val ortResult = readOrtResult("/reporter-test-input.yml")
val input = ReporterInput(ortResult, licenseFactProvider = SpdxLicenseFactProviderFactory.create())
val input = ReporterInput(ortResult, licenseFactProvider = LICENSE_FACT_PROVIDER_SPDX)
val outputDir = tempdir()
val expectedResult = readResource("/reporter-test-output.json")

Expand Down
2 changes: 1 addition & 1 deletion plugins/reporters/spdx/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies {
implementation(projects.utils.spdxUtils)

funTestImplementation(testFixtures(projects.plugins.reporters.spdxReporter))
funTestImplementation(projects.plugins.licenseFactProviders.scancodeLicenseFactProvider)
funTestImplementation(testFixtures(projects.reporter))
funTestImplementation(projects.utils.testUtils)

testFixturesImplementation(projects.utils.testUtils)
Expand Down
Loading
Loading