Skip to content

Commit fdd755b

Browse files
mnonnenmachersschuberth
authored andcommitted
refactor: Add a createAndLogIssue function for use in plugins
The function avoids the need to manually set the issue source which should always be the display name of the plugin. While at it, also fix some places where the plugin ID was used instead of the display name. Signed-off-by: Martin Nonnenmacher <[email protected]>
1 parent f29c6bc commit fdd755b

File tree

18 files changed

+64
-123
lines changed

18 files changed

+64
-123
lines changed

Diff for: analyzer/src/main/kotlin/PackageManager.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,8 @@ abstract class PackageManager(val projectType: String) : Plugin {
312312

313313
val issues = listOf(
314314
createAndLogIssue(
315-
source = descriptor.displayName,
316-
message = "${descriptor.displayName} failed to resolve dependencies for path " +
317-
"'$relativePath': ${it.collectMessages()}"
315+
"${descriptor.displayName} failed to resolve dependencies for path '$relativePath': " +
316+
it.collectMessages()
318317
)
319318
)
320319

Diff for: model/src/main/kotlin/Issue.kt

+12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import java.time.Instant
2929

3030
import org.apache.logging.log4j.kotlin.logger
3131

32+
import org.ossreviewtoolkit.plugins.api.Plugin
33+
import org.ossreviewtoolkit.plugins.api.PluginDescriptor
3234
import org.ossreviewtoolkit.utils.common.normalizeLineBreaks
3335

3436
/**
@@ -88,3 +90,13 @@ inline fun <reified T : Any> T.createAndLogIssue(
8890
logger.log(issue.severity.toLog4jLevel()) { message }
8991
return issue
9092
}
93+
94+
/**
95+
* Create an [Issue] and log the message. The log level is aligned with the [severity]. The [source][Issue.source] is
96+
* set to the [display name][PluginDescriptor.displayName] of the plugin.
97+
*/
98+
inline fun <reified T : Plugin> T.createAndLogIssue(
99+
message: String,
100+
severity: Severity? = null,
101+
affectedPath: String? = null
102+
) = createAndLogIssue(descriptor.displayName, message, severity, affectedPath)

Diff for: plugins/advisors/black-duck/src/main/kotlin/BlackDuck.kt

+8-19
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ class BlackDuck(
120120
pkg.blackDuckOriginId?.let { BlackDuckOriginId.parse(it).toExternalId() }
121121
}.getOrElse {
122122
issues += createAndLogIssue(
123-
source = descriptor.displayName,
124-
message = "Could not parse origin-id '${pkg.blackDuckOriginId}' for '${pkg.id.toCoordinates()}: " +
123+
"Could not parse origin-id '${pkg.blackDuckOriginId}' for '${pkg.id.toCoordinates()}: " +
125124
it.collectMessages()
126125
)
127126
return emptyList()
@@ -132,19 +131,15 @@ class BlackDuck(
132131
blackDuckApi.searchKbComponentsByExternalId(externalId)
133132
}.getOrElse {
134133
issues += createAndLogIssue(
135-
source = descriptor.displayName,
136-
message = "Requesting origins for externalId '$externalId' failed: ${it.collectMessages()}"
134+
"Requesting origins for externalId '$externalId' failed: ${it.collectMessages()}"
137135
)
138136
return emptyList()
139137
}
140138
} else {
141139
runCatching {
142140
blackDuckApi.searchKbComponentsByPurl(pkg.purl)
143141
}.getOrElse {
144-
issues += createAndLogIssue(
145-
source = descriptor.displayName,
146-
message = "Requesting origins for purl ${pkg.purl} failed: ${it.collectMessages()}"
147-
)
142+
issues += createAndLogIssue("Requesting origins for purl ${pkg.purl} failed: ${it.collectMessages()}")
148143
return emptyList()
149144
}
150145
}
@@ -153,10 +148,7 @@ class BlackDuck(
153148
runCatching {
154149
blackDuckApi.getOriginView(searchResult)
155150
}.onFailure {
156-
issues += createAndLogIssue(
157-
source = descriptor.displayName,
158-
message = "Requesting origin details failed: ${it.collectMessages()}"
159-
)
151+
issues += createAndLogIssue("Requesting origin details failed: ${it.collectMessages()}")
160152
}.getOrNull()
161153
}
162154

@@ -171,10 +163,9 @@ class BlackDuck(
171163

172164
if (externalId != null && origins.isEmpty()) {
173165
issues += createAndLogIssue(
174-
source = descriptor.displayName,
175-
message = "The origin-id '${pkg.blackDuckOriginId} of package ${pkg.id.toCoordinates()} does not " +
176-
"match any origin.",
177-
severity = Severity.WARNING
166+
"The origin-id '${pkg.blackDuckOriginId} of package ${pkg.id.toCoordinates()} does not match any " +
167+
"origin.",
168+
Severity.WARNING
178169
)
179170
}
180171

@@ -192,9 +183,7 @@ class BlackDuck(
192183
logger.info { "Found ${it.size} vulnerabilities for origin ${origin.identifier}." }
193184
}.onFailure {
194185
issues += createAndLogIssue(
195-
source = descriptor.displayName,
196-
message = "Requesting vulnerabilities for origin ${origin.identifier} failed: " +
197-
it.collectMessages()
186+
"Requesting vulnerabilities for origin ${origin.identifier} failed: ${it.collectMessages()}"
198187
)
199188
}.getOrDefault(emptyList())
200189
}

Diff for: plugins/advisors/vulnerable-code/src/main/kotlin/VulnerableCode.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,7 @@ class VulnerableCode(
154154
VulnerabilityReference(sourceUri, it.scoringSystem, severity, score, vector)
155155
}
156156
}.onFailure {
157-
issues += createAndLogIssue(
158-
descriptor.displayName,
159-
"Failed to map $this to ORT model due to $it.",
160-
Severity.HINT
161-
)
157+
issues += createAndLogIssue("Failed to map $this to ORT model due to $it.", Severity.HINT)
162158
}.getOrElse { emptyList() }
163159

164160
/**

Diff for: plugins/package-managers/bazel/src/main/kotlin/Bazel.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,7 @@ class Bazel(override val descriptor: PluginDescriptor = BazelFactory.descriptor)
152152

153153
getPackages(scopes, registry, localPathOverrides, archiveOverrides, projectVcs)
154154
} else {
155-
issues += createAndLogIssue(
156-
descriptor.displayName,
157-
"Bazel registry URL cannot be determined from the lockfile."
158-
)
155+
issues += createAndLogIssue("Bazel registry URL cannot be determined from the lockfile.")
159156
emptySet()
160157
}
161158

Diff for: plugins/package-managers/bundler/src/main/kotlin/Bundler.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,8 @@ class Bundler(
299299
it.showStackTrace()
300300

301301
issues += createAndLogIssue(
302-
source = descriptor.displayName,
303-
message = "Failed to parse dependency '$gemName' of project '${projectId.toCoordinates()}' in " +
304-
"'$workingDir': ${it.collectMessages()}"
302+
"Failed to parse dependency '$gemName' of project '${projectId.toCoordinates()}' in '$workingDir': " +
303+
it.collectMessages()
305304
)
306305
}
307306
}

Diff for: plugins/package-managers/cocoapods/src/main/kotlin/CocoaPods.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,9 @@ class CocoaPods(override val descriptor: PluginDescriptor = CocoaPodsFactory.des
137137
graphBuilder.addDependencies(projectId, SCOPE_NAME, dependencies)
138138
} else {
139139
issues += createAndLogIssue(
140-
source = descriptor.displayName,
141-
message = "Missing lockfile '${lockfile.relativeTo(analysisRoot).invariantSeparatorsPath}' for " +
142-
"definition file '${definitionFile.relativeTo(analysisRoot).invariantSeparatorsPath}'. The " +
143-
"analysis of a Podfile without a lockfile is not supported."
140+
"Missing lockfile '${lockfile.relativeTo(analysisRoot).invariantSeparatorsPath}' for definition file " +
141+
"'${definitionFile.relativeTo(analysisRoot).invariantSeparatorsPath}'. The analysis of a Podfile " +
142+
"without a lockfile is not supported."
144143
)
145144
}
146145

Diff for: plugins/package-managers/composer/src/main/kotlin/Composer.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,7 @@ class Composer(override val descriptor: PluginDescriptor = ComposerFactory.descr
213213

214214
packageInfo.toReference(
215215
issues = listOf(
216-
createAndLogIssue(
217-
source = descriptor.displayName,
218-
message = "Could not resolve dependencies of '$packageName': ${e.collectMessages()}"
219-
)
216+
createAndLogIssue("Could not resolve dependencies of '$packageName': ${e.collectMessages()}")
220217
)
221218
)
222219
}

Diff for: plugins/package-managers/gradle-inspector/src/main/kotlin/GradleInspector.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class GradleInspector(
177177
?.takeUnless { JavaBootstrapper.isRunningOnJdk(it) }
178178
?.let {
179179
JavaBootstrapper.installJdk("TEMURIN", it).onFailure { e ->
180-
issues += createAndLogIssue(descriptor.displayName, e.collectMessages())
180+
issues += createAndLogIssue(e.collectMessages())
181181
}.getOrNull()
182182
} ?: config.javaHome?.let { File(it) }
183183

@@ -234,11 +234,11 @@ class GradleInspector(
234234
val dependencyTreeModel = gradleConnector.getOrtDependencyTreeModel(projectDir, issues)
235235

236236
dependencyTreeModel.errors.distinct().mapTo(issues) {
237-
createAndLogIssue(source = descriptor.displayName, message = it, severity = Severity.ERROR)
237+
createAndLogIssue(it, Severity.ERROR)
238238
}
239239

240240
dependencyTreeModel.warnings.distinct().mapTo(issues) {
241-
createAndLogIssue(source = descriptor.displayName, message = it, severity = Severity.WARNING)
241+
createAndLogIssue(it, Severity.WARNING)
242242
}
243243

244244
val projectId = Identifier(

Diff for: plugins/package-managers/gradle/src/main/kotlin/Gradle.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ class Gradle(
245245
?.takeUnless { JavaBootstrapper.isRunningOnJdk(it) }
246246
?.let {
247247
JavaBootstrapper.installJdk("TEMURIN", it).onFailure { e ->
248-
issues += createAndLogIssue(descriptor.displayName, e.collectMessages())
248+
issues += createAndLogIssue(e.collectMessages())
249249
}.getOrNull()
250250
} ?: config.javaHome?.let { File(it) }
251251

@@ -313,11 +313,11 @@ class Gradle(
313313
)
314314

315315
dependencyTreeModel.errors.mapTo(issues) {
316-
createAndLogIssue(source = descriptor.displayName, message = it, severity = Severity.ERROR)
316+
createAndLogIssue(it, Severity.ERROR)
317317
}
318318

319319
dependencyTreeModel.warnings.mapTo(issues) {
320-
createAndLogIssue(source = descriptor.displayName, message = it, severity = Severity.WARNING)
320+
createAndLogIssue(it, Severity.WARNING)
321321
}
322322

323323
listOf(ProjectAnalyzerResult(project, emptySet(), issues))

Diff for: plugins/package-managers/maven/src/main/kotlin/Tycho.kt

+2-7
Original file line numberDiff line numberDiff line change
@@ -261,20 +261,15 @@ class Tycho(override val descriptor: PluginDescriptor = TychoFactory.descriptor)
261261
): MutableList<Issue> {
262262
val rootIssues = mutableListOf<Issue>()
263263
if (exitCode != 0) {
264-
rootIssues += createAndLogIssue(
265-
descriptor.displayName,
266-
"Maven build failed with non-zero exit code $exitCode."
267-
)
264+
rootIssues += createAndLogIssue("Maven build failed with non-zero exit code $exitCode.")
268265
}
269266

270267
val missingProjects = collector.mavenProjects.keys - resolvedProjects.mapTo(mutableSetOf()) { it.internalId }
271268

272269
missingProjects.forEach { projectId ->
273270
val coordinates = collector.mavenProjects.getValue(projectId).identifier(projectType).toCoordinates()
274271
rootIssues += createAndLogIssue(
275-
descriptor.displayName,
276-
"No dependency information found for project '$coordinates'. " +
277-
"This may be caused by a build failure."
272+
"No dependency information found for project '$coordinates'. This may be caused by a build failure."
278273
)
279274
}
280275

Diff for: plugins/package-managers/node/src/main/kotlin/yarn/Yarn.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,7 @@ open class Yarn(override val descriptor: PluginDescriptor = YarnFactory.descript
187187
val packageJsonFile = projectDir.resolve(NodePackageManagerType.DEFINITION_FILE)
188188
parseProject(packageJsonFile, analysisRoot)
189189
}.getOrElse {
190-
issues += createAndLogIssue(
191-
source = descriptor.displayName,
192-
message = "Failed to parse project information: ${it.collectMessages()}"
193-
)
190+
issues += createAndLogIssue("Failed to parse project information: ${it.collectMessages()}")
194191

195192
Project.EMPTY
196193
}

Diff for: plugins/package-managers/node/src/main/kotlin/yarn2/Yarn2.kt

+3-17
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,7 @@ class Yarn2(override val descriptor: PluginDescriptor = Yarn2Factory.descriptor,
228228
val value = info.value
229229
val nameMatcher = EXTRACT_FROM_LOCATOR_PATTERN.matchEntire(value)
230230
if (nameMatcher == null) {
231-
issues += createAndLogIssue(
232-
descriptor.displayName,
233-
"Name of package $value cannot be parsed.",
234-
Severity.ERROR
235-
)
231+
issues += createAndLogIssue("Name of package $value cannot be parsed.", Severity.ERROR)
236232
null
237233
} else {
238234
val rawName = nameMatcher.groupValues[1]
@@ -376,11 +372,7 @@ class Yarn2(override val descriptor: PluginDescriptor = Yarn2Factory.descriptor,
376372
val value = packageInfo.value
377373
val header = packagesHeaders[value]
378374
if (header == null) {
379-
issues += createAndLogIssue(
380-
descriptor.displayName,
381-
"No package header found for '$value'.",
382-
Severity.ERROR
383-
)
375+
issues += createAndLogIssue("No package header found for '$value'.", Severity.ERROR)
384376
return emptyMap()
385377
}
386378

@@ -416,7 +408,6 @@ class Yarn2(override val descriptor: PluginDescriptor = Yarn2Factory.descriptor,
416408

417409
if (details == null) {
418410
issues += createAndLogIssue(
419-
descriptor.displayName,
420411
"No package details found for '${header.rawName}' at version '$version'.",
421412
Severity.ERROR
422413
)
@@ -551,11 +542,7 @@ class Yarn2(override val descriptor: PluginDescriptor = Yarn2Factory.descriptor,
551542
val locator = dependency.locator
552543
val locatorMatcher = EXTRACT_FROM_LOCATOR_PATTERN.matchEntire(locator)
553544
if (locatorMatcher == null) {
554-
issues += createAndLogIssue(
555-
descriptor.displayName,
556-
"Locator '$locator' cannot be parsed.",
557-
Severity.ERROR
558-
)
545+
issues += createAndLogIssue("Locator '$locator' cannot be parsed.", Severity.ERROR)
559546
return@mapNotNull null
560547
}
561548

@@ -578,7 +565,6 @@ class Yarn2(override val descriptor: PluginDescriptor = Yarn2Factory.descriptor,
578565
}.onFailure {
579566
it.showStackTrace()
580567
issues += createAndLogIssue(
581-
descriptor.displayName,
582568
"Cannot build identifier for dependency '$locator.'",
583569
Severity.ERROR
584570
)

Diff for: plugins/package-managers/pub/src/main/kotlin/Pub.kt

+9-19
Original file line numberDiff line numberDiff line change
@@ -366,10 +366,9 @@ class Pub(override val descriptor: PluginDescriptor = PubFactory.descriptor, pri
366366
}
367367
} else {
368368
createAndLogIssue(
369-
source = descriptor.displayName,
370-
message = "The Gradle package manager plugin was not found in the runtime classpath of " +
371-
"ORT. Gradle project analysis will be disabled.",
372-
severity = Severity.WARNING
369+
"The Gradle package manager plugin was not found in the runtime classpath of ORT. Gradle " +
370+
"project analysis will be disabled.",
371+
Severity.WARNING
373372
)
374373
}
375374
}
@@ -496,11 +495,7 @@ class Pub(override val descriptor: PluginDescriptor = PubFactory.descriptor, pri
496495

497496
packageReferences += packageInfo.toReference(
498497
issues = listOf(
499-
createAndLogIssue(
500-
source = descriptor.displayName,
501-
message = "Could not resolve dependencies of '$packageName': " +
502-
e.collectMessages()
503-
)
498+
createAndLogIssue("Could not resolve dependencies of '$packageName': ${e.collectMessages()}")
504499
)
505500
)
506501
}
@@ -563,10 +558,8 @@ class Pub(override val descriptor: PluginDescriptor = PubFactory.descriptor, pri
563558
if (!definitionFile.isFile) return null
564559

565560
val issue = createAndLogIssue(
566-
source = descriptor.displayName,
567-
severity = Severity.WARNING,
568-
message = "Cannot get iOS dependencies for package '$packageName'. Support for CocoaPods is not yet " +
569-
"implemented."
561+
"Cannot get iOS dependencies for package '$packageName'. Support for CocoaPods is not yet implemented.",
562+
Severity.WARNING
570563
)
571564

572565
return ProjectAnalyzerResult(Project.EMPTY, emptySet(), listOf(issue))
@@ -726,9 +719,7 @@ class Pub(override val descriptor: PluginDescriptor = PubFactory.descriptor, pri
726719

727720
val packageVersion = packageInfo.version
728721
issues += createAndLogIssue(
729-
source = descriptor.displayName,
730-
message = "Failed to parse $PUBSPEC_YAML for package $packageName:$packageVersion: " +
731-
it.collectMessages()
722+
"Failed to parse $PUBSPEC_YAML for package $packageName:$packageVersion: ${it.collectMessages()}"
732723
)
733724
}
734725
}
@@ -765,9 +756,8 @@ class Pub(override val descriptor: PluginDescriptor = PubFactory.descriptor, pri
765756
val definitionFile = reader.findFile(packageInfo, workingDir, PUBSPEC_YAML)
766757
if (definitionFile == null) {
767758
createAndLogIssue(
768-
source = descriptor.displayName,
769-
message = "Could not find '$PUBSPEC_YAML' for '${packageInfo.description.name.orEmpty()}'.",
770-
severity = Severity.WARNING
759+
"Could not find '$PUBSPEC_YAML' for '${packageInfo.description.name.orEmpty()}'.",
760+
Severity.WARNING
771761
)
772762

773763
return null

Diff for: plugins/package-managers/spdx/src/main/kotlin/SpdxDocumentFile.kt

+2-8
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,7 @@ class SpdxDocumentFile(override val descriptor: PluginDescriptor = SpdxDocumentF
439439
// Dependencies can either be defined on the target...
440440
pkgId.equals(target, ignoreCase = true) && relation == dependencyOfRelation -> {
441441
if (pkgId != target) {
442-
issues += createAndLogIssue(
443-
source = descriptor.displayName,
444-
message = "Source '$pkgId' has to match target '$target' case-sensitively."
445-
)
442+
issues += createAndLogIssue("Source '$pkgId' has to match target '$target' case-sensitively.")
446443
}
447444

448445
getPackageManagerDependency(source, doc, analyzerConfig) ?: doc.getSpdxPackageForId(source, issues)
@@ -460,10 +457,7 @@ class SpdxDocumentFile(override val descriptor: PluginDescriptor = SpdxDocumentF
460457
// ...or on the source.
461458
pkgId.equals(source, ignoreCase = true) && isDependsOnRelation -> {
462459
if (pkgId != source) {
463-
issues += createAndLogIssue(
464-
source = descriptor.displayName,
465-
message = "Source '$source' has to match target '$pkgId' case-sensitively."
466-
)
460+
issues += createAndLogIssue("Source '$source' has to match target '$pkgId' case-sensitively.")
467461
}
468462

469463
val pkgRef = dependsOnCase(target)

0 commit comments

Comments
 (0)