diff --git a/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactKind.java b/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactKind.java index 60db937c99e5..f0066f39ae96 100644 --- a/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactKind.java +++ b/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactKind.java @@ -21,7 +21,7 @@ import java.util.EnumSet; public enum ArtifactKind { ARTIFACT("", "jar"), SOURCES("sources", "jar"), JAVADOC("javadoc", "jar"), - ANNOTATIONS("annotations", "zip"), AAR_ARTIFACT("", "aar"); + ANNOTATIONS("", "zip"), AAR_ARTIFACT("", "aar"); private final String myClassifier; private final String myExtension; diff --git a/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java b/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java index 6ea1ae06c3c9..c2760d59ae4b 100644 --- a/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java +++ b/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java @@ -220,8 +220,9 @@ public class ArtifactRepositoryManager { Artifact newArtifact = artifact.setVersion(result.getHighestVersion().toString()); requests.add(new ArtifactRequest(newArtifact, Collections.unmodifiableList(myRemoteRepositories), null)); } + } else { + requests.add(new ArtifactRequest(artifact, Collections.unmodifiableList(myRemoteRepositories), null)); } - requests.add(new ArtifactRequest(artifact, Collections.unmodifiableList(myRemoteRepositories), null)); } } diff --git a/java/idea-ui/src/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolver.kt b/java/idea-ui/src/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolver.kt index 879bd1396f0b..8b040960278a 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolver.kt +++ b/java/idea-ui/src/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolver.kt @@ -81,10 +81,18 @@ class ExternalAnnotationsRepositoryResolver : ExternalAnnotationsArtifactsResolv private fun extractDescriptor(mavenId: String?, library: Library): JpsMavenRepositoryLibraryDescriptor? = when { - mavenId != null -> JpsMavenRepositoryLibraryDescriptor(mavenId, false, emptyList()) + mavenId != null -> JpsMavenRepositoryLibraryDescriptor(patchArtifactId(mavenId), false, emptyList()) library is LibraryEx -> (library.properties as? RepositoryLibraryProperties) - ?.run { JpsMavenRepositoryLibraryDescriptor(groupId, artifactId, version) } + ?.run { JpsMavenRepositoryLibraryDescriptor(groupId, "$artifactId-annotations", version) } else -> null } + private fun patchArtifactId(mavenId: String): String { + val components = mavenId.split(':', limit = 3) + if (components.size < 3) { + return mavenId + } + return "${components[0]}:${components[1]}-annotations:${components[2]}" + } + } diff --git a/java/idea-ui/testSrc/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolverTest.kt b/java/idea-ui/testSrc/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolverTest.kt index e3d6eead0235..f51bb4d52070 100644 --- a/java/idea-ui/testSrc/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolverTest.kt +++ b/java/idea-ui/testSrc/com/intellij/jarRepository/ExternalAnnotationsRepositoryResolverTest.kt @@ -91,6 +91,27 @@ class ExternalAnnotationsRepositoryResolverTest: UsefulTestCase() { assertTrue(library.getFiles(AnnotationOrderRootType.getInstance()).isNotEmpty()) } + + @Test fun `test select annotations artifact when newer library artifacts are available`() { + val resolver = ExternalAnnotationsRepositoryResolver() + val libraryTable = LibraryTablesRegistrar.getInstance().libraryTable + val library = WriteAction.compute { libraryTable.createLibrary("NewLibrary") } + + RemoteRepositoriesConfiguration.getInstance(myProject).repositories = listOf(myTestRepo) + + MavenRepoFixture(myMavenRepo).apply { + addLibraryArtifact(version = "1.0") + addAnnotationsArtifact(version = "1.0") + addAnnotationsArtifact(version = "1.0-an1") + addLibraryArtifact(version = "1.1") + generateMavenMetadata("myGroup", "myArtifact") + } + + resolver.resolve(myProject, library, "myGroup:myArtifact:1.1") + assertTrue("Annotations root is not attached to library", library.getFiles(AnnotationOrderRootType.getInstance()).isNotEmpty()) + } + + @Test fun `test annotations resolution overrides existing roots`() { val resolver = ExternalAnnotationsRepositoryResolver() val libraryTable = LibraryTablesRegistrar.getInstance().libraryTable @@ -109,7 +130,7 @@ class ExternalAnnotationsRepositoryResolverTest: UsefulTestCase() { } resolver.resolve(myProject, library, "myGroup:myArtifact:1.0") - assertTrue(library.getUrls(AnnotationOrderRootType.getInstance()).single().endsWith("myGroup/myArtifact/1.0-an1/myArtifact-1.0-an1-annotations.zip!/")) + assertTrue(library.getUrls(AnnotationOrderRootType.getInstance()).single().endsWith("myGroup/myArtifact-annotations/1.0-an1/myArtifact-annotations-1.0-an1.zip!/")) } private fun getResult(promise: Promise): T? { diff --git a/java/idea-ui/testSrc/com/intellij/jarRepository/JarRepositoryManagerTest.kt b/java/idea-ui/testSrc/com/intellij/jarRepository/JarRepositoryManagerTest.kt index 7aa341dc7eb9..6930b85c6ecb 100644 --- a/java/idea-ui/testSrc/com/intellij/jarRepository/JarRepositoryManagerTest.kt +++ b/java/idea-ui/testSrc/com/intellij/jarRepository/JarRepositoryManagerTest.kt @@ -62,7 +62,7 @@ class JarRepositoryManagerTest : UsefulTestCase() { generateMavenMetadata("myGroup", "myArtifact") } - val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact", "1.0") + val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact-annotations", "1.0") val promise: Promise> = JarRepositoryManager.loadDependenciesAsync(myProject, description, setOf(ArtifactKind.ANNOTATIONS), listOf(myTestRepo), null) val result: List? = getResultingRoots(promise) @@ -79,7 +79,7 @@ class JarRepositoryManagerTest : UsefulTestCase() { generateMavenMetadata("myGroup", "myArtifact") } - val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact", "1.0", + val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact-annotations", "1.0", false, emptyList()) val promise: Promise> = JarRepositoryManager.loadDependenciesAsync(myProject, description, setOf(ArtifactKind.ANNOTATIONS), listOf(myTestRepo), null) @@ -99,7 +99,7 @@ class JarRepositoryManagerTest : UsefulTestCase() { } - val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact", "1.0") + val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact-annotations", "1.0") val promise: Promise> = JarRepositoryManager.loadDependenciesAsync(myProject, description, setOf(ArtifactKind.ANNOTATIONS), listOf(myTestRepo), null) val result: List? = getResultingRoots(promise) @@ -121,7 +121,7 @@ class JarRepositoryManagerTest : UsefulTestCase() { name } - val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact", "2.5") + val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact-annotations", "2.5") val promise: Promise> = JarRepositoryManager.loadDependenciesAsync(myProject, description, setOf(ArtifactKind.ANNOTATIONS), listOf(myTestRepo), null) val result: List? = getResultingRoots(promise) @@ -145,7 +145,7 @@ class JarRepositoryManagerTest : UsefulTestCase() { name } - val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact", "[2.0, 2.1)") + val description = JpsMavenRepositoryLibraryDescriptor("myGroup", "myArtifact-annotations", "[2.0, 2.1)") val promise: Promise> = JarRepositoryManager.loadDependenciesAsync(myProject, description, setOf(ArtifactKind.ANNOTATIONS), listOf(myTestRepo), null) val result: List? = getResultingRoots(promise) diff --git a/java/idea-ui/testSrc/com/intellij/jarRepository/MavenRepoFixture.kt b/java/idea-ui/testSrc/com/intellij/jarRepository/MavenRepoFixture.kt index cdcd4e97f02d..5138602ea917 100644 --- a/java/idea-ui/testSrc/com/intellij/jarRepository/MavenRepoFixture.kt +++ b/java/idea-ui/testSrc/com/intellij/jarRepository/MavenRepoFixture.kt @@ -5,31 +5,43 @@ import java.io.File class MavenRepoFixture(private val myMavenRepo: File) { -public fun addAnnotationsArtifact(group: String = "myGroup", - artifact: String = "myArtifact", - version: String) - : String = File(myMavenRepo, "$group/$artifact/$version/$artifact-$version-annotations.zip") - .apply { - parentFile.mkdirs() - writeText("Fake annotations artifact") - }.name - -public fun generateMavenMetadata(group: String, artifact: String) { - val metadata = File(myMavenRepo, "$group/$artifact/maven-metadata.xml") + public fun addLibraryArtifact(group: String = "myGroup", + artifact: String = "myArtifact", + version: String) + : String = File(myMavenRepo, "$group/$artifact/$version/$artifact-$version.jar") .apply { parentFile.mkdirs() - } + writeText("Fake library artifact") + }.name - val versionsList = metadata.parentFile - .listFiles() - .asSequence() - .filter { it.isDirectory } - .map { it.name } - .toList() + public fun addAnnotationsArtifact(group: String = "myGroup", + artifact: String = "myArtifact", + version: String) + : String = File(myMavenRepo, "$group/$artifact-annotations/$version/$artifact-annotations-$version.zip") + .apply { + parentFile.mkdirs() + writeText("Fake annotations artifact") + }.name - val releaseVersion = versionsList.last() + public fun generateMavenMetadata(group: String, artifact: String) { + val files = listOf(File(myMavenRepo, "$group/$artifact/maven-metadata.xml"), + File(myMavenRepo, "$group/$artifact-annotations/maven-metadata.xml")) + for (metadata in files) { + metadata.parentFile.mkdirs() + val versionsList = metadata.parentFile + .listFiles() + .asSequence() + .filter { it.isDirectory } + .map { it.name } + .toList() - metadata.writeText(""" + if (versionsList.isEmpty()) { + continue + } + + val releaseVersion = versionsList.last() + + metadata.writeText(""" | | | $group @@ -39,12 +51,13 @@ public fun generateMavenMetadata(group: String, artifact: String) { | $releaseVersion | $releaseVersion | - | ${versionsList.joinToString(separator = "\n") { "$it" } } + | ${versionsList.joinToString(separator = "\n") { "$it" }} | | 20180809190315 | | """.trimMargin()) -} - } \ No newline at end of file + } + } +} \ No newline at end of file