diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java index 1225be4b127b..eb20864270a0 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java @@ -1243,6 +1243,69 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase { assertModuleLibDepScope("project2_test", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.COMPILE); } + @TargetVersions("2.0+") + @Test + public void testJavadocAndSourcesForDependencyWithMultipleArtifacts() throws Exception { + createProjectSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/ivy-1.0-SNAPSHOT.xml", + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"); + VirtualFile classesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT.jar"); + VirtualFile javadocJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-javadoc.jar"); + VirtualFile sourcesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-sources.jar"); + createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT.jar"); + createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-javadoc.jar"); + createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-sources.jar"); + + importProject( + "apply plugin: 'java'\n" + + "\n" + + "repositories {\n" + + " ivy { url file('repo') }\n" + + "}\n" + + "\n" + + "dependencies {\n" + + " compile 'depGroup:depArtifact:1.0-SNAPSHOT'\n" + + "}\n" + + "apply plugin: 'idea'\n" + + "idea.module.downloadJavadoc true" + ); + + assertModules("project", "project_main", "project_test"); + + assertModuleModuleDepScope("project_test", "project_main", DependencyScope.COMPILE); + + final String depName = "Gradle: depGroup:depArtifact:1.0-SNAPSHOT"; + assertModuleLibDep("project_main", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl()); + assertModuleLibDepScope("project_main", depName, DependencyScope.COMPILE); + assertModuleLibDep("project_test", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl()); + assertModuleLibDepScope("project_test", depName, DependencyScope.COMPILE); + + importProjectUsingSingeModulePerGradleProject(); + assertModules("project"); + + // Gradle built-in models has been fixed since 2.3 version, https://issues.gradle.org/browse/GRADLE-3170 + if(GradleVersion.version(gradleVersion).compareTo(GradleVersion.version("2.3")) >= 0) { + assertModuleLibDep("project", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl()); + } + assertMergedModuleCompileLibDepScope("project", depName); + } + private void assertMergedModuleCompileLibDepScope(String moduleName, String depName) { if (isGradleOlderThen_3_4()) { assertModuleLibDepScope(moduleName, depName, DependencyScope.COMPILE); diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java index 4397a8e72415..aa54d8a336ba 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java @@ -19,11 +19,11 @@ package org.jetbrains.plugins.gradle.tooling.util; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import com.google.common.io.Files; import groovy.lang.MetaMethod; import groovy.lang.MetaProperty; import org.codehaus.groovy.runtime.DefaultGroovyMethods; @@ -65,7 +65,6 @@ import java.util.regex.Pattern; import static com.google.common.base.Predicates.isNull; import static com.google.common.base.Predicates.not; import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.find; import static org.codehaus.groovy.runtime.StringGroovyMethods.capitalize; /** @@ -1181,21 +1180,14 @@ public class DependencyResolverImpl implements DependencyResolver { ComponentArtifactsResult artifactsResult = componentResultsMap.get(componentIdentifier); if (artifactsResult != null) { - final Set sourceArtifacts = artifactsResult.getArtifacts(SourcesArtifact.class); - ResolvedArtifactResult sourcesResult = sourceArtifacts != null && !sourceArtifacts.isEmpty() - ? (ResolvedArtifactResult)find(sourceArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class)) - : null; - if (sourcesResult != null) { - ((DefaultExternalLibraryDependency)dependency).setSource(sourcesResult.getFile()); + ArtifactResult sourcesResult = findMatchingArtifact(artifact, artifactsResult, SourcesArtifact.class); + if (sourcesResult instanceof ResolvedArtifactResult) { + ((DefaultExternalLibraryDependency)dependency).setSource(((ResolvedArtifactResult)sourcesResult).getFile()); } - - final Set javadocArtifacts = artifactsResult.getArtifacts(JavadocArtifact.class); - ResolvedArtifactResult javadocResult = javadocArtifacts != null && !javadocArtifacts.isEmpty() - ? (ResolvedArtifactResult)find(javadocArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class)) - : null; - if (javadocResult != null) { - ((DefaultExternalLibraryDependency)dependency).setJavadoc(javadocResult.getFile()); + ArtifactResult javadocResult = findMatchingArtifact(artifact, artifactsResult, JavadocArtifact.class); + if (javadocResult instanceof ResolvedArtifactResult) { + ((DefaultExternalLibraryDependency)dependency).setJavadoc(((ResolvedArtifactResult)javadocResult).getFile()); } } } @@ -1235,6 +1227,24 @@ public class DependencyResolverImpl implements DependencyResolver { } } + private static ArtifactResult findMatchingArtifact(ResolvedArtifact artifact, + ComponentArtifactsResult componentArtifacts, + Class artifactType) { + String baseName = Files.getNameWithoutExtension(artifact.getFile().getName()); + Set artifactResults = componentArtifacts.getArtifacts(artifactType); + + if (artifactResults.size() == 1) { + return artifactResults.iterator().next(); + } + + for (ArtifactResult result : artifactResults) { + if (result instanceof ResolvedArtifactResult && ((ResolvedArtifactResult)result).getFile().getName().startsWith(baseName)) { + return result; + } + } + return null; + } + private static boolean isProjectDependencyArtifact(ResolvedArtifact artifact) { return isDependencySubstitutionsSupported && artifact.getId().getComponentIdentifier() instanceof ProjectComponentIdentifier; }