diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/controller/ToolController.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/controller/ToolController.kt index 806527c88bd5bccff9fe8fe0e6575f42987c62ae..593e82d0d29f8f387ee021e8f9d6b2d12b5e837a 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/controller/ToolController.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/controller/ToolController.kt @@ -1,7 +1,7 @@ package de.fraunhofer.iem.dataprovider.tool.controller import de.fraunhofer.iem.dataprovider.configuration.ApiPaths -import de.fraunhofer.iem.dataprovider.tool.dto.ToolEntityResponseDto +import de.fraunhofer.iem.dataprovider.tool.dto.ToolDto import de.fraunhofer.iem.dataprovider.tool.repository.ToolRepository import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController class ToolController(val toolRepository: ToolRepository) { @GetMapping(ApiPaths.GET_ALL_TOOLS) - fun getAllTools(): List<ToolEntityResponseDto> { + fun getAllTools(): List<ToolDto> { return toolRepository.findAll().map { it.toDto() } } } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolDto.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolDto.kt new file mode 100644 index 0000000000000000000000000000000000000000..6409abf72cfdcd265c9f5b139fa25ef5cc0764aa --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolDto.kt @@ -0,0 +1,11 @@ +package de.fraunhofer.iem.dataprovider.tool.dto + +import de.fraunhofer.iem.dataprovider.tool.enumeration.ToolType + +data class ToolDto( + val name: String, + val description: String, + val relevantKpis: List<String>, + val findings: MutableList<FindingDto> = mutableListOf(), + val toolType: ToolType +) diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolEntityResponseDto.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolEntityResponseDto.kt deleted file mode 100644 index 4d9e4d1430716839d526c0da7ddcf95689e32880..0000000000000000000000000000000000000000 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolEntityResponseDto.kt +++ /dev/null @@ -1,5 +0,0 @@ -package de.fraunhofer.iem.dataprovider.tool.dto - -import java.util.* - -data class ToolEntityResponseDto(val id: UUID, val name: String, val toolType: String) diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolResponseDto.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolResponseDto.kt deleted file mode 100644 index 26d2c757ec73252369f2fcda2de7a00c750f27f2..0000000000000000000000000000000000000000 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/dto/ToolResponseDto.kt +++ /dev/null @@ -1,8 +0,0 @@ -package de.fraunhofer.iem.dataprovider.tool.dto - -data class ToolResponseDto( - val name: String, - val description: String, - val relevantKpis: List<String>, - val findings: List<FindingDto> = emptyList() -) diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/entity/ToolEntity.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/entity/ToolEntity.kt index ac6008cdd77a7d999db2fa168705353fc3211f74..a9af058a32ecaa06813f7d8c200c2238e67467fe 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/entity/ToolEntity.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/entity/ToolEntity.kt @@ -1,6 +1,6 @@ package de.fraunhofer.iem.dataprovider.tool.entity -import de.fraunhofer.iem.dataprovider.tool.dto.ToolEntityResponseDto +import de.fraunhofer.iem.dataprovider.tool.dto.ToolDto import de.fraunhofer.iem.dataprovider.tool.enumeration.ToolType import jakarta.persistence.* import org.hibernate.Hibernate @@ -21,8 +21,8 @@ class ToolEntity( var toolType: ToolType, ) { - fun toDto(): ToolEntityResponseDto { - return ToolEntityResponseDto(this.id!!, this.name, this.toolType.getName()) + fun toDto(): ToolDto { + return toolType.toViewModel() } override fun equals(other: Any?): Boolean { diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/enumeration/ToolType.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/enumeration/ToolType.kt index c8ddc8a91ea8baa18658b5cacf7f0d07944c5450..32fd953302b4f1c09ad06f6177aa5391ead3463b 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/enumeration/ToolType.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/tool/enumeration/ToolType.kt @@ -1,22 +1,21 @@ package de.fraunhofer.iem.dataprovider.tool.enumeration import de.fraunhofer.iem.dataprovider.kpi.enumeration.KpiKind -import de.fraunhofer.iem.dataprovider.tool.dto.FindingDto -import de.fraunhofer.iem.dataprovider.tool.dto.ToolResponseDto +import de.fraunhofer.iem.dataprovider.tool.dto.ToolDto enum class ToolType { ORT { - override fun toViewModel(findings: List<FindingDto>): ToolResponseDto { - return ToolResponseDto( + override fun toViewModel(): ToolDto { + return ToolDto( name = this.getName(), - findings = findings, relevantKpis = listOf( KpiKind.MAXIMAL_VULNERABILITY.getName(), KpiKind.VULNERABILITY_SCORE.getName(), KpiKind.SECURITY.getName() ), description = "The OSS Review Toolkit (ORT) provides information about dependencies." + - "For more information see https://github.com/oss-review-toolkit/ort." + "For more information see https://github.com/oss-review-toolkit/ort.", + toolType = ORT ) } @@ -25,10 +24,9 @@ enum class ToolType { } }, OCCMD { - override fun toViewModel(findings: List<FindingDto>): ToolResponseDto { - return ToolResponseDto( + override fun toViewModel(): ToolDto { + return ToolDto( name = this.getName(), - findings = findings, relevantKpis = listOf( KpiKind.SECURITY.getName(), KpiKind.PROCESS_TRANSPARENCY.getName(), @@ -40,7 +38,9 @@ enum class ToolType { KpiKind.CHECKED_IN_BINARIES.getName() ), description = "The OCCMD provides various information about the analyzed project." + - "For more information see https://gitlab.opencode.de/opencode-analyzer/occmd-public." + "For more information see https://gitlab.opencode.de/opencode-analyzer/occmd-public.", + toolType = OCCMD + ) } @@ -49,10 +49,9 @@ enum class ToolType { } }, Gitlab { - override fun toViewModel(findings: List<FindingDto>): ToolResponseDto { - return ToolResponseDto( + override fun toViewModel(): ToolDto { + return ToolDto( name = this.getName(), - findings = findings, relevantKpis = listOf( KpiKind.PROCESS_TRANSPARENCY.getName(), KpiKind.PROCESS_COMPLIANCE.getName(), @@ -61,7 +60,8 @@ enum class ToolType { KpiKind.DOCUMENTATION.getName(), ), description = "The Gitlab API is used to derive information about, e.g., the project's compliance" + - "to OpenCoDE's platform rules." + "to OpenCoDE's platform rules.", + toolType = Gitlab ) } @@ -70,6 +70,6 @@ enum class ToolType { } }; - abstract fun toViewModel(findings: List<FindingDto> = emptyList()): ToolResponseDto + abstract fun toViewModel(): ToolDto abstract fun getName(): String } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/dto/ToolRunDto.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/dto/ToolRunDto.kt index 3d05df712e0805ce5c327fecbe4c3ab5fab3088d..ef1e7b61b6e78309d01ed311a049b87d5ca632a2 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/dto/ToolRunDto.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/dto/ToolRunDto.kt @@ -1,6 +1,6 @@ package de.fraunhofer.iem.dataprovider.toolRun.dto -import de.fraunhofer.iem.dataprovider.tool.dto.ToolResponseDto +import de.fraunhofer.iem.dataprovider.tool.dto.ToolDto import de.fraunhofer.iem.dataprovider.toolRun.entity.ToolRunEntity import java.util.* @@ -8,17 +8,17 @@ data class ToolRunDto( val id: UUID, val createdAt: String, val projectId: Long, - val tools: List<ToolResponseDto>, + val tools: List<ToolDto>, val languages: Set<LanguageDto> = emptySet() ) { companion object { - fun getDtoFromEntityWithToolFindings(toolRunEntity: ToolRunEntity, tools: List<ToolResponseDto>): ToolRunDto { + fun getDtoFromEntity(toolRunEntity: ToolRunEntity): ToolRunDto { if (toolRunEntity.id != null) { return ToolRunDto( id = toolRunEntity.id!!, createdAt = toolRunEntity.createdAt.toString(), projectId = toolRunEntity.repository.projectId, - tools = tools, + tools = toolRunEntity.toolEntities.map { it.toDto() }, languages = toolRunEntity.languageEntities.map { LanguageDto(name = it.name, percentage = it.percentage) }.toSet() diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunDbService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunDbService.kt index da26308d4854087f841b3965fe4a374efe920efe..f1461731cd00fd4b13cf38808b72794b9e68d54c 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunDbService.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunDbService.kt @@ -5,6 +5,7 @@ import de.fraunhofer.iem.dataprovider.repository.dto.RepositoryCreateDto import de.fraunhofer.iem.dataprovider.repository.service.RepositoryService import de.fraunhofer.iem.dataprovider.tool.dto.CreateToolDto import de.fraunhofer.iem.dataprovider.tool.service.ToolService +import de.fraunhofer.iem.dataprovider.toolRun.dto.ToolRunDto import de.fraunhofer.iem.dataprovider.toolRun.entity.LanguageEntity import de.fraunhofer.iem.dataprovider.toolRun.entity.ToolRunEntity import de.fraunhofer.iem.dataprovider.toolRun.repository.ToolRunRepository @@ -18,7 +19,6 @@ class ToolRunDbService( private val toolService: ToolService ) { - @Transactional fun createToolRun( repoDto: RepositoryCreateDto, @@ -56,7 +56,9 @@ class ToolRunDbService( //TODO: this should return a create tool run dto @Transactional(readOnly = true) - fun getToolRunByProjectId(projectId: Long): ToolRunEntity { - return toolRunRepository.findFirstByRepository_ProjectIdOrderByCreatedAtDesc(projectId) + fun getToolRunByProjectId(projectId: Long): ToolRunDto { + return ToolRunDto.getDtoFromEntity( + toolRunRepository.findFirstByRepository_ProjectIdOrderByCreatedAtDesc(projectId) + ) } } diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunService.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunService.kt index 1734266b769f6341bc96146c9e91c0ceb851ae2d..a343e4b5effe28a1e7d85c619ecbcde84b9f7b51 100644 --- a/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunService.kt +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/toolRun/service/ToolRunService.kt @@ -3,7 +3,6 @@ package de.fraunhofer.iem.dataprovider.toolRun.service import de.fraunhofer.iem.dataprovider.kpi.service.KPIService import de.fraunhofer.iem.dataprovider.logger.getLogger import de.fraunhofer.iem.dataprovider.repository.service.RepositoryService -import de.fraunhofer.iem.dataprovider.tool.dto.ToolResponseDto import de.fraunhofer.iem.dataprovider.tool.enumeration.ToolType import de.fraunhofer.iem.dataprovider.toolRun.dto.ToolRunDto import de.fraunhofer.iem.dataprovider.tools.gitlab.service.RepositoryDetailsService @@ -124,51 +123,40 @@ class ToolRunService( dispatcher: CoroutineDispatcher = Dispatchers.IO, includeFindings: Boolean = false ): ToolRunDto { - val toolRunEntity = toolRunDbService.getToolRunByProjectId(projectId = projectId) + val toolRun = withContext(dispatcher) { + toolRunDbService.getToolRunByProjectId(projectId = projectId) + } - val apiJobs: MutableList<Deferred<ToolResponseDto>> = mutableListOf() + val apiJobs: MutableList<Job> = mutableListOf() if (includeFindings) { - toolRunEntity.toolEntities.forEach { tool -> + toolRun.tools.forEach { tool -> when (tool.toolType) { ToolType.ORT -> { apiJobs.add( - defaultScope.async { + defaultScope.launch { val rawOrtResult = ortService.getOrtResults(projectId = projectId) val findings = ortService.getFindings(rawOrtResult) - tool.toolType.toViewModel(findings = findings) + tool.findings.addAll(findings) } ) } else -> { - apiJobs.add( - defaultScope.async { - tool.toolType.toViewModel() - } - ) + logger.info("No findings to retrieve for tool ${tool.toolType}") } } } - } else { - toolRunEntity.toolEntities.forEach { tool -> - apiJobs.add( - defaultScope.async { - tool.toolType.toViewModel() - } - ) - } } - val tools = apiJobs.mapNotNull { + apiJobs.forEach { try { - it.await() + it.join() } catch (exception: Exception) { logger.error("API job failed with error $exception") - null } } - return ToolRunDto.getDtoFromEntityWithToolFindings(toolRunEntity, tools) + return toolRun } }