Skip to content

Commit 944c377

Browse files
oheger-boschsschuberth
authored andcommittedFeb 25, 2025
refactor(Maven): Move creation of projects to an extension function
This functionality can be reused by the Tycho implementation. Signed-off-by: Oliver Heger <oliver.heger@bosch.io>
1 parent 25754e6 commit 944c377

File tree

2 files changed

+63
-39
lines changed

2 files changed

+63
-39
lines changed
 

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

+14-39
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ import org.eclipse.aether.graph.DependencyNode
2828
import org.ossreviewtoolkit.analyzer.AbstractPackageManagerFactory
2929
import org.ossreviewtoolkit.analyzer.PackageManager
3030
import org.ossreviewtoolkit.analyzer.PackageManagerResult
31-
import org.ossreviewtoolkit.downloader.VersionControlSystem
3231
import org.ossreviewtoolkit.model.DependencyGraph
33-
import org.ossreviewtoolkit.model.Identifier
34-
import org.ossreviewtoolkit.model.Project
3532
import org.ossreviewtoolkit.model.ProjectAnalyzerResult
3633
import org.ossreviewtoolkit.model.Severity
3734
import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
@@ -41,12 +38,9 @@ import org.ossreviewtoolkit.model.utils.DependencyGraphBuilder
4138
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.LocalProjectWorkspaceReader
4239
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.MavenDependencyHandler
4340
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.MavenSupport
44-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.getOriginalScm
41+
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.identifier
4542
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.isTychoProject
46-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseAuthors
47-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseLicenses
48-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.parseVcsInfo
49-
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.processDeclaredLicenses
43+
import org.ossreviewtoolkit.plugins.packagemanagers.maven.utils.toOrtProject
5044
import org.ossreviewtoolkit.utils.common.searchUpwardsForSubdirectory
5145

5246
/**
@@ -112,23 +106,7 @@ class Maven(
112106
val workingDir = definitionFile.parentFile
113107
val projectBuildingResult = mavenSupport.buildMavenProject(definitionFile)
114108
val mavenProject = projectBuildingResult.project
115-
val projectId = Identifier(
116-
type = projectType,
117-
namespace = mavenProject.groupId,
118-
name = mavenProject.artifactId,
119-
version = mavenProject.version
120-
)
121-
122-
projectBuildingResult.dependencies.filterNot {
123-
excludes.isScopeExcluded(it.dependency.scope)
124-
}.forEach { node ->
125-
graphBuilder.addDependency(DependencyGraph.qualifyScope(projectId, node.dependency.scope), node)
126-
}
127-
128-
val declaredLicenses = parseLicenses(mavenProject)
129-
val declaredLicensesProcessed = processDeclaredLicenses(declaredLicenses)
130-
131-
val vcsFromPackage = parseVcsInfo(mavenProject)
109+
val projectId = mavenProject.identifier(projectType)
132110

133111
// If running in SBT mode expect that POM files were generated in a "target" subdirectory and that the correct
134112
// project directory is the parent directory of this.
@@ -138,20 +116,17 @@ class Maven(
138116
workingDir
139117
}
140118

141-
val browsableScmUrl = getOriginalScm(mavenProject)?.url
142-
val homepageUrl = mavenProject.url
143-
val vcsFallbackUrls = listOfNotNull(browsableScmUrl, homepageUrl).toTypedArray()
144-
145-
val project = Project(
146-
id = projectId,
147-
definitionFilePath = VersionControlSystem.getPathInfo(definitionFile).path,
148-
authors = parseAuthors(mavenProject),
149-
declaredLicenses = declaredLicenses,
150-
declaredLicensesProcessed = declaredLicensesProcessed,
151-
vcs = vcsFromPackage,
152-
vcsProcessed = processProjectVcs(projectDir, vcsFromPackage, *vcsFallbackUrls),
153-
homepageUrl = homepageUrl.orEmpty(),
154-
scopeNames = graphBuilder.scopesFor(projectId)
119+
projectBuildingResult.dependencies.filterNot {
120+
excludes.isScopeExcluded(it.dependency.scope)
121+
}.forEach { node ->
122+
graphBuilder.addDependency(DependencyGraph.qualifyScope(projectId, node.dependency.scope), node)
123+
}
124+
125+
val project = mavenProject.toOrtProject(
126+
projectId,
127+
definitionFile,
128+
projectDir,
129+
graphBuilder.scopesFor(projectId)
155130
)
156131

157132
val issues = graphBuilder.packages().mapNotNull { pkg ->

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

+49
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,66 @@
1919

2020
package org.ossreviewtoolkit.plugins.packagemanagers.maven.utils
2121

22+
import java.io.File
23+
2224
import org.apache.maven.artifact.repository.Authentication
2325
import org.apache.maven.bridge.MavenRepositorySystem
26+
import org.apache.maven.project.MavenProject
2427
import org.apache.maven.repository.Proxy
2528

2629
import org.eclipse.aether.RepositorySystemSession
2730
import org.eclipse.aether.artifact.Artifact
2831
import org.eclipse.aether.repository.AuthenticationContext
2932
import org.eclipse.aether.repository.RemoteRepository
3033

34+
import org.ossreviewtoolkit.analyzer.PackageManager.Companion.processProjectVcs
35+
import org.ossreviewtoolkit.downloader.VersionControlSystem
36+
import org.ossreviewtoolkit.model.Identifier
37+
import org.ossreviewtoolkit.model.Project
38+
3139
fun Artifact.identifier() = "$groupId:$artifactId:$version"
3240

41+
/**
42+
* Return an [Identifier] for this [MavenProject] with the given [projectType].
43+
*/
44+
internal fun MavenProject.identifier(projectType: String): Identifier =
45+
Identifier(
46+
type = projectType,
47+
namespace = groupId,
48+
name = artifactId,
49+
version = version
50+
)
51+
52+
/**
53+
* Convert this [MavenProject] to an ORT [Project] using the given [identifier], the path to the [definitionFile],
54+
* the [projectDir], and the set of [scopeNames].
55+
*/
56+
internal fun MavenProject.toOrtProject(
57+
identifier: Identifier,
58+
definitionFile: File,
59+
projectDir: File,
60+
scopeNames: Set<String>
61+
): Project {
62+
val declaredLicenses = parseLicenses(this)
63+
val declaredLicensesProcessed = processDeclaredLicenses(declaredLicenses)
64+
65+
val vcsFromPackage = parseVcsInfo(this)
66+
val browsableScmUrl = getOriginalScm(this)?.url
67+
val vcsFallbackUrls = listOfNotNull(browsableScmUrl, this.url).toTypedArray()
68+
69+
return Project(
70+
id = identifier,
71+
definitionFilePath = VersionControlSystem.getPathInfo(definitionFile).path,
72+
authors = parseAuthors(this),
73+
declaredLicenses = declaredLicenses,
74+
declaredLicensesProcessed = declaredLicensesProcessed,
75+
vcs = vcsFromPackage,
76+
vcsProcessed = processProjectVcs(projectDir, vcsFromPackage, *vcsFallbackUrls),
77+
homepageUrl = url.orEmpty(),
78+
scopeNames = scopeNames
79+
)
80+
}
81+
3382
/**
3483
* Convert this [RemoteRepository] to a repository in the format used by the Maven Repository System.
3584
* Make sure that all relevant properties are set, especially the proxy and authentication.

0 commit comments

Comments
 (0)
Please sign in to comment.