Skip to content

Commit fecf57f

Browse files
committed
refactor(scanner)!: Use the configurable plugin API for scanner wrappers
Use the `TypedConfigurablePluginFactory` interface as base for the `ScannerWrapperFactory` to further align the plugin APIs. While at it, extract the logic to parse the scanner matcher properties to a central place to not have to repeat the properties in the configuration classes for all scanner wrappers. This also makes it possible to use `Unit` as configuration class for scanners that do not offer any configuration options. As this change makes the configuration classes of the scanner wrappers part of the public API, they must not be `internal` anymore. Scanners that provide secret configuration options will be migrated to read them from the `secrets` map instead of the `options` map in later commits. Signed-off-by: Martin Nonnenmacher <martin.nonnenmacher@bosch.io>
1 parent d61e509 commit fecf57f

File tree

24 files changed

+257
-103
lines changed

24 files changed

+257
-103
lines changed

plugins/commands/requirements/src/main/kotlin/RequirementsCommand.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
3333
import org.ossreviewtoolkit.model.config.RepositoryConfiguration
3434
import org.ossreviewtoolkit.plugins.commands.api.OrtCommand
3535
import org.ossreviewtoolkit.scanner.CommandLinePathScannerWrapper
36+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
3637
import org.ossreviewtoolkit.utils.common.CommandLineTool
3738
import org.ossreviewtoolkit.utils.spdx.scanCodeLicenseTextDir
3839

@@ -88,8 +89,8 @@ class RequirementsCommand : OrtCommand(
8889
logger.debug { "$it is a $category." }
8990
it.getDeclaredConstructor(
9091
String::class.java,
91-
Map::class.java
92-
).newInstance("", emptyMap<String, String>())
92+
ScannerMatcherConfig::class.java
93+
).newInstance("", ScannerMatcherConfig.EMPTY)
9394
}
9495

9596
VersionControlSystem::class.java.isAssignableFrom(it) -> {

plugins/commands/scanner/src/main/kotlin/ScannerCommand.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,10 @@ class ScannerCommand : OrtCommand(
177177
): OrtResult {
178178
val packageScannerWrappers = scannerWrapperFactories
179179
.takeIf { PackageType.PACKAGE in packageTypes }.orEmpty()
180-
.map { it.create(ortConfig.scanner.options?.get(it.type).orEmpty()) }
180+
.map { it.create(ortConfig.scanner.options?.get(it.type).orEmpty(), emptyMap()) }
181181
val projectScannerWrappers = projectScannerWrapperFactories
182182
.takeIf { PackageType.PROJECT in packageTypes }.orEmpty()
183-
.map { it.create(ortConfig.scanner.options?.get(it.type).orEmpty()) }
183+
.map { it.create(ortConfig.scanner.options?.get(it.type).orEmpty(), emptyMap()) }
184184

185185
if (projectScannerWrappers.isNotEmpty()) {
186186
echo("Scanning projects with:")

plugins/scanners/askalono/src/funTest/kotlin/AskalonoFunTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ package org.ossreviewtoolkit.plugins.scanners.askalono
2121

2222
import org.ossreviewtoolkit.model.LicenseFinding
2323
import org.ossreviewtoolkit.model.TextLocation
24+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
2425
import org.ossreviewtoolkit.scanner.scanners.AbstractPathScannerWrapperFunTest
2526

2627
class AskalonoFunTest : AbstractPathScannerWrapperFunTest() {
27-
override val scanner = Askalono("Askalono", emptyMap())
28+
override val scanner = Askalono("Askalono", ScannerMatcherConfig.EMPTY)
2829

2930
override val expectedFileLicenses = listOf(
3031
LicenseFinding("Apache-2.0", TextLocation("LICENSE", TextLocation.UNKNOWN_LINE), 1.0f)

plugins/scanners/askalono/src/main/kotlin/Askalono.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import org.ossreviewtoolkit.scanner.CommandLinePathScannerWrapper
3636
import org.ossreviewtoolkit.scanner.ScanContext
3737
import org.ossreviewtoolkit.scanner.ScanException
3838
import org.ossreviewtoolkit.scanner.ScannerMatcher
39+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
3940
import org.ossreviewtoolkit.scanner.ScannerWrapperFactory
4041
import org.ossreviewtoolkit.utils.common.Options
4142
import org.ossreviewtoolkit.utils.common.Os
@@ -44,14 +45,17 @@ private const val CONFIDENCE_NOTICE = "Confidence threshold not high enough for
4445

4546
private val JSON = Json { ignoreUnknownKeys = true }
4647

47-
class Askalono internal constructor(name: String, private val options: Options) : CommandLinePathScannerWrapper(name) {
48-
class Factory : ScannerWrapperFactory<Askalono>("Askalono") {
49-
override fun create(options: Options) = Askalono(type, options)
48+
class Askalono internal constructor(name: String, private val matcherConfig: ScannerMatcherConfig) :
49+
CommandLinePathScannerWrapper(name) {
50+
class Factory : ScannerWrapperFactory<Unit>("Askalono") {
51+
override fun create(config: Unit, matcherConfig: ScannerMatcherConfig) = Askalono(type, matcherConfig)
52+
53+
override fun parseConfig(options: Options, secrets: Options) = Unit
5054
}
5155

5256
override val configuration = ""
5357

54-
override val matcher by lazy { ScannerMatcher.create(details, options) }
58+
override val matcher by lazy { ScannerMatcher.create(details, matcherConfig) }
5559

5660
override fun command(workingDir: File?) =
5761
listOfNotNull(workingDir, if (Os.isWindows) "askalono.exe" else "askalono").joinToString(File.separator)

plugins/scanners/boyterlc/src/funTest/kotlin/BoyterLcFunTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ package org.ossreviewtoolkit.plugins.scanners.boyterlc
2121

2222
import org.ossreviewtoolkit.model.LicenseFinding
2323
import org.ossreviewtoolkit.model.TextLocation
24+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
2425
import org.ossreviewtoolkit.scanner.scanners.AbstractPathScannerWrapperFunTest
2526

2627
class BoyterLcFunTest : AbstractPathScannerWrapperFunTest() {
27-
override val scanner = BoyterLc("BoyterLc", emptyMap())
28+
override val scanner = BoyterLc("BoyterLc", ScannerMatcherConfig.EMPTY)
2829

2930
override val expectedFileLicenses = listOf(
3031
LicenseFinding("Apache-2.0", TextLocation("LICENSE", TextLocation.UNKNOWN_LINE), 0.98388565f),

plugins/scanners/boyterlc/src/main/kotlin/BoyterLc.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import org.ossreviewtoolkit.scanner.CommandLinePathScannerWrapper
3535
import org.ossreviewtoolkit.scanner.ScanContext
3636
import org.ossreviewtoolkit.scanner.ScanException
3737
import org.ossreviewtoolkit.scanner.ScannerMatcher
38+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
3839
import org.ossreviewtoolkit.scanner.ScannerWrapperFactory
3940
import org.ossreviewtoolkit.utils.common.Options
4041
import org.ossreviewtoolkit.utils.common.Os
@@ -43,21 +44,24 @@ import org.ossreviewtoolkit.utils.ort.createOrtTempDir
4344

4445
private val JSON = Json { ignoreUnknownKeys = true }
4546

46-
class BoyterLc internal constructor(name: String, private val options: Options) : CommandLinePathScannerWrapper(name) {
47+
class BoyterLc internal constructor(name: String, private val matcherConfig: ScannerMatcherConfig) :
48+
CommandLinePathScannerWrapper(name) {
4749
companion object {
4850
val CONFIGURATION_OPTIONS = listOf(
4951
"--confidence", "0.95", // Cut-off value to only get most relevant matches.
5052
"--format", "json"
5153
)
5254
}
5355

54-
class Factory : ScannerWrapperFactory<BoyterLc>("BoyterLc") {
55-
override fun create(options: Options) = BoyterLc(type, options)
56+
class Factory : ScannerWrapperFactory<Unit>("BoyterLc") {
57+
override fun create(config: Unit, matcherConfig: ScannerMatcherConfig) = BoyterLc(type, matcherConfig)
58+
59+
override fun parseConfig(options: Options, secrets: Options) = Unit
5660
}
5761

5862
override val configuration = CONFIGURATION_OPTIONS.joinToString(" ")
5963

60-
override val matcher by lazy { ScannerMatcher.create(details, options) }
64+
override val matcher by lazy { ScannerMatcher.create(details, matcherConfig) }
6165

6266
override fun command(workingDir: File?) =
6367
listOfNotNull(workingDir, if (Os.isWindows) "lc.exe" else "lc").joinToString(File.separator)

plugins/scanners/fossid/src/main/kotlin/FossId.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import org.ossreviewtoolkit.scanner.PackageScannerWrapper
7878
import org.ossreviewtoolkit.scanner.ProvenanceScannerWrapper
7979
import org.ossreviewtoolkit.scanner.ScanContext
8080
import org.ossreviewtoolkit.scanner.ScannerMatcher
81+
import org.ossreviewtoolkit.scanner.ScannerMatcherConfig
8182
import org.ossreviewtoolkit.scanner.ScannerWrapperFactory
8283
import org.ossreviewtoolkit.utils.common.Options
8384
import org.ossreviewtoolkit.utils.common.enumSetOf
@@ -168,14 +169,16 @@ class FossId internal constructor(
168169
)
169170
}
170171

171-
class Factory : ScannerWrapperFactory<FossId>("FossId") {
172-
override fun create(options: Options) = FossId(type, FossIdConfig.create(options))
172+
class Factory : ScannerWrapperFactory<FossIdConfig>("FossId") {
173+
override fun create(config: FossIdConfig, matcherConfig: ScannerMatcherConfig) = FossId(type, config)
174+
175+
override fun parseConfig(options: Options, secrets: Options) = FossIdConfig.create(options)
173176
}
174177

175178
/**
176179
* The qualifier of a scan when delta scans are enabled.
177180
*/
178-
internal enum class DeltaTag {
181+
enum class DeltaTag {
179182
/**
180183
* Qualifier used when there is no scan and the first one is created.
181184
*/

plugins/scanners/fossid/src/main/kotlin/FossIdConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ import org.ossreviewtoolkit.utils.common.Options
7373
*
7474
* every repository URL would be added credentials. Mappings are applied in the order they are defined.
7575
*/
76-
internal data class FossIdConfig(
76+
data class FossIdConfig(
7777
/** The URL where the FossID service is running. */
7878
val serverUrl: String,
7979

plugins/scanners/fossid/src/main/kotlin/FossIdNamingProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import org.apache.logging.log4j.kotlin.logger
3838
* * **deltaTag** (scan code only): If delta scans is enabled, this qualifies the scan as an *origin* scan or a *delta*
3939
* scan.
4040
*/
41-
internal class FossIdNamingProvider(
41+
class FossIdNamingProvider(
4242
private val namingProjectPattern: String?,
4343
private val namingScanPattern: String?,
4444
private val namingConventionVariables: Map<String, String>

plugins/scanners/fossid/src/main/kotlin/FossIdUrlProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import org.ossreviewtoolkit.utils.ort.requestPasswordAuthentication
3535
* The URLs used by FossId can sometimes be different from the normal package URLs. For instance, credentials may need
3636
* to be added, or a different protocol may be used. This class takes care of such mappings.
3737
*/
38-
internal class FossIdUrlProvider private constructor(
38+
class FossIdUrlProvider private constructor(
3939
/**
4040
* The URL mapping. URLs matched by a key [Regex] are replaced by the URL in the value. The replacement string can
4141
* refer to matched groups of the [Regex]. It can also contain the variables [VAR_USERNAME] and [VAR_PASSWORD] to

0 commit comments

Comments
 (0)