@@ -23,6 +23,7 @@ import org.eclipse.apoapsis.ortserver.dao.blockingQuery
2323import org.eclipse.apoapsis.ortserver.dao.entityQuery
2424import org.eclipse.apoapsis.ortserver.dao.mapAndDeduplicate
2525import org.eclipse.apoapsis.ortserver.dao.repositories.ortrun.OrtRunDao
26+ import org.eclipse.apoapsis.ortserver.dao.tables.VulnerabilityResolutionDefinitionsTable
2627import org.eclipse.apoapsis.ortserver.dao.tables.shared.IdentifierDao
2728import org.eclipse.apoapsis.ortserver.model.repositories.RepositoryConfigurationRepository
2829import org.eclipse.apoapsis.ortserver.model.runs.repository.Curations
@@ -36,8 +37,12 @@ import org.eclipse.apoapsis.ortserver.model.runs.repository.ProvenanceSnippetCho
3637import org.eclipse.apoapsis.ortserver.model.runs.repository.RepositoryAnalyzerConfiguration
3738import org.eclipse.apoapsis.ortserver.model.runs.repository.RepositoryConfiguration
3839import org.eclipse.apoapsis.ortserver.model.runs.repository.Resolutions
40+ import org.eclipse.apoapsis.ortserver.model.runs.repository.VulnerabilityResolution
3941
4042import org.jetbrains.exposed.sql.Database
43+ import org.jetbrains.exposed.sql.SizedCollection
44+ import org.jetbrains.exposed.sql.SizedIterable
45+ import org.jetbrains.exposed.sql.and
4146
4247/* *
4348 * An implementation of [RepositoryConfigurationRepository] that stores repository configurations in
@@ -55,7 +60,38 @@ class DaoRepositoryConfigurationRepository(private val db: Database) : Repositor
5560 licenseChoices : LicenseChoices ,
5661 provenanceSnippetChoices : List <ProvenanceSnippetChoices >
5762 ): RepositoryConfiguration = db.blockingQuery {
58- RepositoryConfigurationDao .new {
63+ val ortRun = OrtRunDao [ortRunId].mapToModel()
64+ val vulnerabilityResolutions = mapAndDeduplicate(
65+ resolutions.vulnerabilities,
66+ VulnerabilityResolutionDao ::getOrPut
67+ )
68+
69+ val idToVulnerabilityResolutionDaos = VulnerabilityResolutionDefinitionsTable
70+ .select(VulnerabilityResolutionDefinitionsTable .columns)
71+ .where {
72+ (VulnerabilityResolutionDefinitionsTable .repositoryId eq ortRun.repositoryId) and
73+ (VulnerabilityResolutionDefinitionsTable .archived eq false )
74+ }
75+ .associateBy({ row -> row[VulnerabilityResolutionDefinitionsTable .id].value }, { row ->
76+ row[VulnerabilityResolutionDefinitionsTable .idMatchers].map { idMatcher ->
77+ VulnerabilityResolutionDao .getOrPut(
78+ VulnerabilityResolution (
79+ idMatcher,
80+ row[VulnerabilityResolutionDefinitionsTable .reason],
81+ row[VulnerabilityResolutionDefinitionsTable .comment]
82+ )
83+ )
84+ }
85+ })
86+
87+ val combinedVulnerabilityResolutions: SizedIterable <VulnerabilityResolutionDao > = SizedCollection (
88+ buildList {
89+ addAll(vulnerabilityResolutions.toList())
90+ addAll(idToVulnerabilityResolutionDaos.values.flatten())
91+ }.distinctBy { it.id.value }
92+ )
93+
94+ val repositoryConfiguration = RepositoryConfigurationDao .new {
5995 this .ortRun = OrtRunDao [ortRunId]
6096 this .repositoryAnalyzerConfiguration = analyzerConfig?.let {
6197 RepositoryAnalyzerConfigurationDao .getOrPut(it)
@@ -66,8 +102,7 @@ class DaoRepositoryConfigurationRepository(private val db: Database) : Repositor
66102 this .issueResolutions = mapAndDeduplicate(resolutions.issues, IssueResolutionDao ::getOrPut)
67103 this .ruleViolationResolutions =
68104 mapAndDeduplicate(resolutions.ruleViolations, RuleViolationResolutionDao ::getOrPut)
69- this .vulnerabilityResolutions =
70- mapAndDeduplicate(resolutions.vulnerabilities, VulnerabilityResolutionDao ::getOrPut)
105+ this .vulnerabilityResolutions = combinedVulnerabilityResolutions
71106 this .curations = mapAndDeduplicate(curations.packages, ::createPackageCuration)
72107 this .licenseFindingCurations =
73108 mapAndDeduplicate(curations.licenseFindings, LicenseFindingCurationDao ::getOrPut)
@@ -78,6 +113,19 @@ class DaoRepositoryConfigurationRepository(private val db: Database) : Repositor
78113 mapAndDeduplicate(licenseChoices.packageLicenseChoices, ::createPackageLicenseChoice)
79114 this .provenanceSnippetChoices = mapAndDeduplicate(provenanceSnippetChoices, SnippetChoicesDao ::getOrPut)
80115 }.mapToModel()
116+
117+ idToVulnerabilityResolutionDaos.forEach {
118+ (vulnerabilityResolutionDefinitionId, vulnerabilityResolutionDaoList) ->
119+ vulnerabilityResolutionDaoList.forEach {
120+ RepositoryConfigurationsVulnerabilityResolutionsTable .addDefinitionId(
121+ repositoryConfiguration.id,
122+ it.id.value,
123+ vulnerabilityResolutionDefinitionId
124+ )
125+ }
126+ }
127+
128+ repositoryConfiguration
81129 }
82130
83131 override fun get (id : Long ): RepositoryConfiguration ? = db.entityQuery {
0 commit comments