Skip to content

Commit 08bc01a

Browse files
oheger-boschsschuberth
authored andcommittedFeb 25, 2025
refactor(Maven): Extract LocalProjectWorkspaceReader
Move this inner class from `Maven` into a separate file and allow customizing the lookup mechanism. This is a preparation for reusing this functionality from other classes as well. Signed-off-by: Oliver Heger <oliver.heger@bosch.io>
1 parent 9b9bb70 commit 08bc01a

File tree

2 files changed

+58
-20
lines changed

2 files changed

+58
-20
lines changed
 

‎plugins/package-managers/maven/src/main/kotlin/Maven.kt

+2-20
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ import java.io.File
2323

2424
import org.apache.maven.project.ProjectBuildingResult
2525

26-
import org.eclipse.aether.artifact.Artifact
2726
import org.eclipse.aether.graph.DependencyNode
28-
import org.eclipse.aether.repository.WorkspaceReader
29-
import org.eclipse.aether.repository.WorkspaceRepository
3027

3128
import org.ossreviewtoolkit.analyzer.AbstractPackageManagerFactory
3229
import org.ossreviewtoolkit.analyzer.PackageManager
@@ -41,10 +38,10 @@ import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
4138
import org.ossreviewtoolkit.model.config.RepositoryConfiguration
4239
import org.ossreviewtoolkit.model.createAndLogIssue
4340
import org.ossreviewtoolkit.model.utils.DependencyGraphBuilder
41+
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.LocalProjectWorkspaceReader
4442
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.MavenDependencyHandler
4543
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.MavenSupport
4644
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.getOriginalScm
47-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.identifier
4845
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseAuthors
4946
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseLicenses
5047
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseVcsInfo
@@ -77,22 +74,7 @@ class Maven(
7774
) = Maven(type, analysisRoot, analyzerConfig, repoConfig)
7875
}
7976

80-
private inner class LocalProjectWorkspaceReader : WorkspaceReader {
81-
private val workspaceRepository = WorkspaceRepository("maven/remote-artifacts")
82-
83-
override fun findArtifact(artifact: Artifact) =
84-
artifact.takeIf { it.extension == "pom" }?.let {
85-
localProjectBuildingResults[it.identifier()]?.pomFile?.absoluteFile
86-
}
87-
88-
override fun findVersions(artifact: Artifact) =
89-
// Avoid resolution of (SNAPSHOT) versions for local projects.
90-
localProjectBuildingResults[artifact.identifier()]?.let { listOf(artifact.version) }.orEmpty()
91-
92-
override fun getRepository() = workspaceRepository
93-
}
94-
95-
private val mavenSupport = MavenSupport(LocalProjectWorkspaceReader())
77+
private val mavenSupport = MavenSupport(LocalProjectWorkspaceReader { localProjectBuildingResults[it]?.pomFile })
9678

9779
private val localProjectBuildingResults = mutableMapOf<String, ProjectBuildingResult>()
9880

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright (C) 2017 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
* License-Filename: LICENSE
18+
*/
19+
20+
package org.ossreviewtoolkit.plugins.packagemanagers.maven.utils
21+
22+
import java.io.File
23+
24+
import kotlin.collections.orEmpty
25+
26+
import org.eclipse.aether.artifact.Artifact
27+
import org.eclipse.aether.repository.WorkspaceReader
28+
import org.eclipse.aether.repository.WorkspaceRepository
29+
30+
/**
31+
* A special implementation of the [WorkspaceReader] interface that is used by Maven package managers to resolve
32+
* project artifacts. Projects are typically detected and handled specifically in concrete package manager
33+
* implementations. Therefore, this class allows customizing the access to project definition files via a resolver
34+
* function.
35+
*/
36+
internal class LocalProjectWorkspaceReader(
37+
/**
38+
* A function that can resolve an artifact identifier to a definition file if the artifact represents a local
39+
* project. The function should return *null* for artifacts that are no local projects. This reader invokes
40+
* the function to find out whether an artifact is a project and needs special treatment.
41+
*/
42+
private val definitionFileResolveFun: (String) -> File?
43+
) : WorkspaceReader {
44+
private val workspaceRepository = WorkspaceRepository("maven/remote-artifacts")
45+
46+
override fun findArtifact(artifact: Artifact) =
47+
artifact.takeIf { it.extension == "pom" }?.let {
48+
definitionFileResolveFun(it.identifier())?.absoluteFile
49+
}
50+
51+
override fun findVersions(artifact: Artifact) =
52+
// Avoid resolution of (SNAPSHOT) versions for local projects.
53+
definitionFileResolveFun(artifact.identifier())?.let { listOf(artifact.version) }.orEmpty()
54+
55+
override fun getRepository() = workspaceRepository
56+
}

0 commit comments

Comments
 (0)
Please sign in to comment.