Skip to content

Commit

Permalink
refactor(analyzer): Split package manager dependency classes across f…
Browse files Browse the repository at this point in the history
…iles

Increase the overview.

Signed-off-by: Sebastian Schuberth <sebastian@doubleopen.org>
  • Loading branch information
sschuberth committed Sep 5, 2024
1 parent 89467d9 commit fdd90ca
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 69 deletions.
3 changes: 3 additions & 0 deletions analyzer/src/main/kotlin/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import org.apache.logging.log4j.kotlin.logger
import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
import org.ossreviewtoolkit.utils.common.alsoIfNull

internal fun String.encodeColon() = replace(':', '\u0000')
internal fun String.decodeColon() = replace('\u0000', ':')

/**
* Return the list of enabled [PackageManager]s based on the [AnalyzerConfiguration.enabledPackageManagers] and
* [AnalyzerConfiguration.disabledPackageManagers] configuration properties and the
Expand Down
71 changes: 71 additions & 0 deletions analyzer/src/main/kotlin/PackageManagerDependency.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright (C) 2022 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.analyzer

import kotlin.contracts.contract

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

import org.ossreviewtoolkit.model.AnalyzerResult
import org.ossreviewtoolkit.model.PackageLinkage
import org.ossreviewtoolkit.model.Project

internal data class PackageManagerDependency(
val packageManager: String,
val definitionFile: String,
val scope: String,
val linkage: PackageLinkage
) {
fun findProjects(analyzerResult: AnalyzerResult): List<Project> =
analyzerResult.projects.filter { it.definitionFilePath == definitionFile }.also { projects ->
if (projects.isEmpty()) {
logger.warn { "Could not find any project for definition file '$definitionFile'." }
}

projects.forEach { verify(it) }
}

fun verify(project: Project?) {
contract {
returns() implies (project != null)
}

requireNotNull(project) {
"Could not find a project for the definition file '$definitionFile'."
}

require(project.id.type == packageManager) {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' uses the wrong " +
"package manager '${project.id.type}', expected is '$packageManager'."
}

requireNotNull(project.scopeNames) {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' does not use a " +
"dependency graph."
}

if (scope !in project.scopeNames.orEmpty()) {
logger.warn {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' does not contain " +
"the requested scope '$scope'."
}
}
}
}
69 changes: 0 additions & 69 deletions analyzer/src/main/kotlin/PackageManagerDependencyHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@

package org.ossreviewtoolkit.analyzer

import kotlin.contracts.contract

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

import org.ossreviewtoolkit.model.AnalyzerResult
import org.ossreviewtoolkit.model.DependencyGraphNavigator
import org.ossreviewtoolkit.model.DependencyNode
Expand All @@ -31,7 +27,6 @@ import org.ossreviewtoolkit.model.Issue
import org.ossreviewtoolkit.model.Package
import org.ossreviewtoolkit.model.PackageLinkage
import org.ossreviewtoolkit.model.PackageReference
import org.ossreviewtoolkit.model.Project
import org.ossreviewtoolkit.model.utils.DependencyHandler

private const val TYPE = "PackageManagerDependency"
Expand Down Expand Up @@ -107,67 +102,3 @@ class PackageManagerDependencyHandler(
}
} ?: listOf(DependencyNodeDelegate(dependency.getStableReference()))
}

private data class PackageManagerDependency(
val packageManager: String,
val definitionFile: String,
val scope: String,
val linkage: PackageLinkage
) {
fun findProjects(analyzerResult: AnalyzerResult): List<Project> =
analyzerResult.projects.filter { it.definitionFilePath == definitionFile }.also { projects ->
if (projects.isEmpty()) {
logger.warn { "Could not find any project for definition file '$definitionFile'." }
}

projects.forEach { verify(it) }
}

fun verify(project: Project?) {
contract {
returns() implies (project != null)
}

requireNotNull(project) {
"Could not find a project for the definition file '$definitionFile'."
}

require(project.id.type == packageManager) {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' uses the wrong " +
"package manager '${project.id.type}', expected is '$packageManager'."
}

requireNotNull(project.scopeNames) {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' does not use a " +
"dependency graph."
}

if (scope !in project.scopeNames.orEmpty()) {
logger.warn {
"The project '${project.id.toCoordinates()}' from definition file '$definitionFile' does not contain " +
"the requested scope '$scope'."
}
}
}
}

sealed class ResolvableDependencyNode : DependencyNode

class ProjectScopeDependencyNode(
override val id: Identifier,
override val linkage: PackageLinkage,
override val issues: List<Issue>,
private val dependencies: Sequence<DependencyNode>
) : ResolvableDependencyNode() {
override fun <T> visitDependencies(block: (Sequence<DependencyNode>) -> T): T = block(dependencies)
}

class DependencyNodeDelegate(private val node: DependencyNode) : ResolvableDependencyNode() {
override val id: Identifier = node.id
override val linkage = node.linkage
override val issues = node.issues
override fun <T> visitDependencies(block: (Sequence<DependencyNode>) -> T): T = node.visitDependencies(block)
}

private fun String.encodeColon() = replace(':', '\u0000')
private fun String.decodeColon() = replace('\u0000', ':')
43 changes: 43 additions & 0 deletions analyzer/src/main/kotlin/ResolvableDependencyNode.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright (C) 2022 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.analyzer

import org.ossreviewtoolkit.model.DependencyNode
import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.model.Issue
import org.ossreviewtoolkit.model.PackageLinkage

sealed class ResolvableDependencyNode : DependencyNode

class ProjectScopeDependencyNode(
override val id: Identifier,
override val linkage: PackageLinkage,
override val issues: List<Issue>,
private val dependencies: Sequence<DependencyNode>
) : ResolvableDependencyNode() {
override fun <T> visitDependencies(block: (Sequence<DependencyNode>) -> T): T = block(dependencies)
}

class DependencyNodeDelegate(private val node: DependencyNode) : ResolvableDependencyNode() {
override val id: Identifier = node.id
override val linkage = node.linkage
override val issues = node.issues
override fun <T> visitDependencies(block: (Sequence<DependencyNode>) -> T): T = node.visitDependencies(block)
}

0 comments on commit fdd90ca

Please sign in to comment.