-
Notifications
You must be signed in to change notification settings - Fork 315
/
Copy pathNuGet.kt
96 lines (83 loc) · 3.57 KB
/
NuGet.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* Copyright (C) 2017-2019 HERE Europe B.V.
* Copyright (C) 2019 Bosch Software Innovations GmbH
*
* 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
*
* http://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.managers
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
import com.fasterxml.jackson.module.kotlin.readValue
import java.io.File
import org.ossreviewtoolkit.analyzer.AbstractPackageManagerFactory
import org.ossreviewtoolkit.analyzer.PackageManager
import org.ossreviewtoolkit.analyzer.managers.utils.NuGetSupport
import org.ossreviewtoolkit.analyzer.managers.utils.XmlPackageFileReader
import org.ossreviewtoolkit.analyzer.managers.utils.resolveNuGetDependencies
import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.model.ProjectAnalyzerResult
import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
import org.ossreviewtoolkit.model.config.RepositoryConfiguration
/**
* The [NuGet](https://www.nuget.org/) package manager for .NET.
*/
class NuGet(
name: String,
analysisRoot: File,
analyzerConfig: AnalyzerConfiguration,
repoConfig: RepositoryConfiguration
) : PackageManager(name, analysisRoot, analyzerConfig, repoConfig) {
class Factory : AbstractPackageManagerFactory<NuGet>("NuGet") {
override val globsForDefinitionFiles = listOf("packages.config")
override fun create(
analysisRoot: File,
analyzerConfig: AnalyzerConfiguration,
repoConfig: RepositoryConfiguration
) = NuGet(managerName, analysisRoot, analyzerConfig, repoConfig)
}
private val reader = NuGetPackageFileReader()
override fun resolveDependencies(definitionFile: File): List<ProjectAnalyzerResult> =
listOf(resolveNuGetDependencies(definitionFile, reader, NuGetSupport.create(definitionFile)))
}
/**
* A reader for XML-based NuGet package configuration files, see
* https://docs.microsoft.com/en-us/nuget/reference/packages-config.
*/
class NuGetPackageFileReader : XmlPackageFileReader {
@JsonIgnoreProperties(ignoreUnknown = true)
private data class PackagesConfig(
@JsonProperty(value = "package")
@JacksonXmlElementWrapper(useWrapping = false)
val packages: List<Package>
)
@JsonIgnoreProperties(ignoreUnknown = true)
private data class Package(
@JacksonXmlProperty(isAttribute = true)
val id: String,
@JacksonXmlProperty(isAttribute = true)
val version: String
)
override fun getPackageReferences(definitionFile: File): Set<Identifier> {
val ids = mutableSetOf<Identifier>()
val packagesConfig = NuGetSupport.XML_MAPPER.readValue<PackagesConfig>(definitionFile)
packagesConfig.packages.forEach {
ids += Identifier(type = "NuGet", namespace = "", name = it.id, version = it.version)
}
return ids
}
}