@@ -3,14 +3,15 @@ package io.klibs.app.indexing
33import io.klibs.app.util.ANDROIDX_OWNER_AND_GITHUB_REPOSITORY
44import io.klibs.app.util.isAndroidxProject
55import io.klibs.app.util.parseGitHubLink
6- import io.klibs.core.pckg.entity.PackageDependencyEntity
7- import io.klibs.core.pckg.entity.PackageDependencyKey
6+ import io.klibs.core.pckg.dto.MavenCoordinatesDTO
87import io.klibs.core.pckg.model.PackageDeveloper
98import io.klibs.core.pckg.model.PackageLicense
10- import io.klibs.core.pckg.repository.PackageDependencyRepository
9+ import io.klibs.core.pckg.repository.PackageRepository
10+ import io.klibs.core.pckg.service.MavenArtifactService
1111import io.klibs.integration.maven.MavenPom
1212import org.slf4j.LoggerFactory
1313import org.springframework.stereotype.Service
14+ import org.springframework.transaction.annotation.Transactional
1415
1516/* *
1617 * Owns everything derived from a package's POM during indexing: pure extractors for fields
@@ -23,7 +24,8 @@ import org.springframework.stereotype.Service
2324 */
2425@Service
2526class PomIndexingService (
26- private val packageDependencyRepository : PackageDependencyRepository ,
27+ private val packageRepository : PackageRepository ,
28+ private val mavenArtifactService : MavenArtifactService ,
2729) {
2830
2931 /* *
@@ -62,49 +64,43 @@ class PomIndexingService(
6264 }
6365 }
6466
67+ @Transactional
6568 fun indexDependencies (pom : MavenPom , packageId : Long , isReindex : Boolean ) {
6669 val dependencies = pom.extractDependencies()
6770
68- if (isReindex) {
69- packageDependencyRepository.deleteAllByIdPackageId(packageId)
71+ if (! isReindex && dependencies.isEmpty()) return
72+
73+ val packageEntity = requireNotNull(packageRepository.findById(packageId).orElse(null )) {
74+ " Package with id=$packageId not found while indexing dependencies"
7075 }
7176
72- if (dependencies.isEmpty()) return
77+ if (isReindex) {
78+ packageEntity.dependencies.clear()
79+ }
7380
74- val entities = dependencies.map { coords ->
75- PackageDependencyEntity (
76- id = PackageDependencyKey (
77- packageId = packageId,
78- depGroupId = coords.groupId,
79- depArtifactId = coords.artifactId,
80- depVersion = coords.version,
81- )
82- )
81+ if (dependencies.isNotEmpty()) {
82+ val artifactsByCoords = mavenArtifactService.resolveOrCreateAll(dependencies)
83+ packageEntity.dependencies.addAll(artifactsByCoords.values.map { it.toEntityRef() })
8384 }
84- packageDependencyRepository.saveAll(entities)
85- logger.debug(" Saved {} dependencies for package id={}" , entities.size, packageId)
85+
86+ packageRepository.save(packageEntity)
87+ logger.debug(" Saved {} dependencies for package id={}" , packageEntity.dependencies.size, packageId)
8688 }
8789
88- private fun MavenPom.extractDependencies (): Set <DependencyCoordinates > =
90+ private fun MavenPom.extractDependencies (): Set <MavenCoordinatesDTO > =
8991 dependencies
9092 ?.asSequence()
9193 ?.mapNotNull { dep ->
9294 val group = dep.groupId?.takeIf { it.isNotBlank() } ? : return @mapNotNull null
9395 val artifact = dep.artifactId?.takeIf { it.isNotBlank() } ? : return @mapNotNull null
9496 val version = dep.version?.takeIf { it.isNotBlank() && ! it.contains(" \$ {" ) }
9597 ? : return @mapNotNull null
96- DependencyCoordinates (groupId = group, artifactId = artifact, version = version)
98+ MavenCoordinatesDTO (groupId = group, artifactId = artifact, version = version)
9799 }
98100 ?.filterNot { coords -> groupId == coords.groupId && artifactId == coords.artifactId }
99101 ?.toSet()
100102 .orEmpty()
101103
102- private data class DependencyCoordinates (
103- val groupId : String ,
104- val artifactId : String ,
105- val version : String ,
106- )
107-
108104 private companion object {
109105 private val logger = LoggerFactory .getLogger(PomIndexingService ::class .java)
110106 }
0 commit comments