forked from oss-review-toolkit/ort
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLicenseView.kt
106 lines (92 loc) · 3.83 KB
/
LicenseView.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
97
98
99
100
101
102
103
104
105
106
/*
* Copyright (C) 2017-2019 HERE Europe B.V.
*
* 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 com.here.ort.evaluator
import com.here.ort.model.LicenseSource
import com.here.ort.model.Package
/**
* A [LicenseView] provides a custom view on the licenses that belong to a [Package]. It can be used to filter the
* licenses relevant to a [Rule] whereas the [licenseSources] is the filter criteria. Only the entry with the lowest
* index in the given [licenseSources] which yields a non-empty result is used as filter criteria.
*/
class LicenseView(vararg licenseSources: List<LicenseSource>) {
companion object {
/**
* Return all licenses.
*/
val ALL = LicenseView(listOf(LicenseSource.DECLARED, LicenseSource.DETECTED, LicenseSource.CONCLUDED))
/**
* Return only the concluded licenses if they exist, otherwise return declared and detected licenses.
*/
val CONCLUDED_OR_REST = LicenseView(
listOf(LicenseSource.CONCLUDED),
listOf(LicenseSource.DECLARED, LicenseSource.DETECTED)
)
/**
* Return only the concluded licenses if they exist, or return only the declared licenses if they exist, or
* return the detected licenses.
*/
val CONCLUDED_OR_DECLARED_OR_DETECTED = LicenseView(
listOf(LicenseSource.CONCLUDED),
listOf(LicenseSource.DECLARED),
listOf(LicenseSource.DETECTED)
)
/**
* Return only the concluded licenses if they exist, otherwise return detected licenses.
*/
val CONCLUDED_OR_DETECTED = LicenseView(
listOf(LicenseSource.CONCLUDED),
listOf(LicenseSource.DETECTED)
)
/**
* Return only the concluded licenses.
*/
val ONLY_CONCLUDED = LicenseView(listOf(LicenseSource.CONCLUDED))
/**
* Return only the declared licenses.
*/
val ONLY_DECLARED = LicenseView(listOf(LicenseSource.DECLARED))
/**
* Return only the detected licenses.
*/
val ONLY_DETECTED = LicenseView(listOf(LicenseSource.DETECTED))
}
private val licenseSources = licenseSources.toList()
fun licenses(pkg: Package, detectedLicenses: List<String>): List<Pair<String, LicenseSource>> {
val declaredLicenses = pkg.declaredLicensesProcessed.spdxExpression?.decompose().orEmpty().map { it.toString() }
val concludedLicenses = pkg.concludedLicense?.decompose().orEmpty().map { it.toString() }
fun getLicenseForSources(
sources: Collection<LicenseSource>
): List<Pair<String, LicenseSource>> =
sources.flatMap { source ->
when (source) {
LicenseSource.DECLARED -> declaredLicenses
LicenseSource.DETECTED -> detectedLicenses
LicenseSource.CONCLUDED -> concludedLicenses
else -> throw NotImplementedError()
}.map { license -> Pair(license, source) }.distinct()
}
licenseSources.forEach { sources ->
val licenses = getLicenseForSources(sources)
if (licenses.isNotEmpty()) {
return licenses
}
}
return emptyList()
}
}