Skip to content

Commit 3e01ede

Browse files
committed
refactor(model): Do not use SortedSet for dependencies
Only sort on serialization for human readability and reproducibility. Signed-off-by: Frank Viernau <[email protected]>
1 parent fd5c2de commit 3e01ede

File tree

5 files changed

+21
-12
lines changed

5 files changed

+21
-12
lines changed

model/src/main/kotlin/DependencyGraph.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ package org.ossreviewtoolkit.model
2121

2222
import com.fasterxml.jackson.annotation.JsonIgnore
2323
import com.fasterxml.jackson.annotation.JsonInclude
24+
import com.fasterxml.jackson.databind.annotation.JsonSerialize
2425

2526
import java.util.SortedSet
2627

28+
import org.ossreviewtoolkit.model.utils.DependencyReferenceSortedSetConverter
2729
import org.ossreviewtoolkit.model.utils.PackageLinkageValueFilter
2830

2931
/**
@@ -314,7 +316,8 @@ class DependencyReference(
314316
/**
315317
* A set with the references to the dependencies of this dependency. That way a tree-like structure is established.
316318
*/
317-
val dependencies: SortedSet<DependencyReference> = sortedSetOf(),
319+
@JsonSerialize(contentConverter = DependencyReferenceSortedSetConverter::class)
320+
val dependencies: Set<DependencyReference> = emptySet(),
318321

319322
/**
320323
* The type of linkage used for the referred package from its dependent package. As most of our supported

model/src/main/kotlin/utils/DependencyGraphBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ class DependencyGraphBuilder<D>(
370370
transitive: Boolean,
371371
processed: Set<D>
372372
): DependencyReference? {
373-
val transitiveDependencies = dependencyHandler.dependenciesFor(dependency).mapNotNull {
373+
val transitiveDependencies = dependencyHandler.dependenciesFor(dependency).mapNotNullTo(mutableSetOf()) {
374374
addDependencyToGraph(scopeName, it, transitive = true, processed)
375375
}
376376

@@ -387,7 +387,7 @@ class DependencyGraphBuilder<D>(
387387
val ref = DependencyReference(
388388
pkg = index.root,
389389
fragment = index.fragment,
390-
dependencies = transitiveDependencies.toSortedSet(),
390+
dependencies = transitiveDependencies,
391391
linkage = dependencyHandler.linkageFor(dependency),
392392
issues = issues
393393
)

model/src/main/kotlin/utils/SortedCollectionConverters.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import java.util.SortedSet
2727

2828
import org.ossreviewtoolkit.model.ArtifactProvenance
2929
import org.ossreviewtoolkit.model.CopyrightFinding
30+
import org.ossreviewtoolkit.model.DependencyReference
3031
import org.ossreviewtoolkit.model.FileList
3132
import org.ossreviewtoolkit.model.Identifier
3233
import org.ossreviewtoolkit.model.LicenseFinding
@@ -44,6 +45,11 @@ class CopyrightFindingSortedSetConverter : StdConverter<Set<CopyrightFinding>, S
4445
override fun convert(value: Set<CopyrightFinding>) = value.toSortedSet(CopyrightFinding.COMPARATOR)
4546
}
4647

48+
class DependencyReferenceSortedSetConverter : StdConverter<Set<DependencyReference>, SortedSet<DependencyReference>>() {
49+
override fun convert(value: Set<DependencyReference>) =
50+
value.toSortedSet(compareBy({ it.pkg.toString() }, { it.fragment }))
51+
}
52+
4753
/** Do not convert to SortedSet in order to not require a comparator consistent with equals */
4854
class FileListSortedSetConverter : StdConverter<Set<FileList>, Set<FileList>>() {
4955
override fun convert(value: Set<FileList>) = value.sortedBy { it.provenance.getSortKey() }.toSet()

model/src/test/kotlin/DependencyGraphTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ class DependencyGraphTest : WordSpec({
9393
)
9494
val refLang = DependencyReference(0)
9595
val refCollections = DependencyReference(1)
96-
val refConfig = DependencyReference(2, dependencies = sortedSetOf(refLang, refCollections))
97-
val refCsv = DependencyReference(3, dependencies = sortedSetOf(refConfig))
96+
val refConfig = DependencyReference(2, dependencies = setOf(refLang, refCollections))
97+
val refCsv = DependencyReference(3, dependencies = setOf(refConfig))
9898
val fragments = sortedSetOf(DependencyGraph.DEPENDENCY_REFERENCE_COMPARATOR, refCsv)
9999
val scopeMap = mapOf("s" to listOf(RootDependencyIndex(3)))
100100
val graph = DependencyGraph(ids, fragments, scopeMap)
@@ -113,10 +113,10 @@ class DependencyGraphTest : WordSpec({
113113
val refLogging = DependencyReference(3)
114114
val refLang = DependencyReference(0)
115115
val refCollections1 = DependencyReference(1)
116-
val refCollections2 = DependencyReference(1, fragment = 1, dependencies = sortedSetOf(refLogging))
117-
val refConfig1 = DependencyReference(2, dependencies = sortedSetOf(refLang, refCollections1))
116+
val refCollections2 = DependencyReference(1, fragment = 1, dependencies = setOf(refLogging))
117+
val refConfig1 = DependencyReference(2, dependencies = setOf(refLang, refCollections1))
118118
val refConfig2 =
119-
DependencyReference(2, fragment = 1, dependencies = sortedSetOf(refLang, refCollections2))
119+
DependencyReference(2, fragment = 1, dependencies = setOf(refLang, refCollections2))
120120
val fragments = sortedSetOf(refConfig1, refConfig2)
121121
val scopeMap = mapOf(
122122
"s1" to listOf(RootDependencyIndex(2)),
@@ -170,7 +170,7 @@ class DependencyGraphTest : WordSpec({
170170
)
171171
val issue = Issue(source = "analyzer", message = "Could not analyze :-(")
172172
val refLang = DependencyReference(0, linkage = PackageLinkage.PROJECT_DYNAMIC)
173-
val refCol = DependencyReference(1, issues = listOf(issue), dependencies = sortedSetOf(refLang))
173+
val refCol = DependencyReference(1, issues = listOf(issue), dependencies = setOf(refLang))
174174
val trees = sortedSetOf(refCol)
175175
val scopeMap = mapOf("s" to listOf(RootDependencyIndex(1)))
176176

model/src/test/kotlin/ProjectTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ private fun createDependencyGraph(qualified: Boolean = false): DependencyGraph {
5959
exampleId
6060
)
6161
val langRef = DependencyReference(0)
62-
val textRef = DependencyReference(1, dependencies = sortedSetOf(langRef))
62+
val textRef = DependencyReference(1, dependencies = setOf(langRef))
6363
val strutsRef = DependencyReference(2)
64-
val csvRef = DependencyReference(3, dependencies = sortedSetOf(langRef))
65-
val exampleRef = DependencyReference(4, dependencies = sortedSetOf(textRef, strutsRef))
64+
val csvRef = DependencyReference(3, dependencies = setOf(langRef))
65+
val exampleRef = DependencyReference(4, dependencies = setOf(textRef, strutsRef))
6666

6767
val plainScopeMapping = mapOf(
6868
"default" to listOf(RootDependencyIndex(4)),

0 commit comments

Comments
 (0)