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 48c0088851fc..60db937c99e5 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"); + ANNOTATIONS("annotations", "zip"), AAR_ARTIFACT("", "aar"); private final String myClassifier; private final String myExtension; @@ -41,6 +41,15 @@ public enum ArtifactKind { return myExtension; } + public static ArtifactKind find(String classifier, String extension) { + for (ArtifactKind kind : ArtifactKind.values()) { + if (kind.getClassifier().equals(classifier) && kind.getExtension().equals(extension)) { + return kind; + } + } + return null; + } + @NotNull public static EnumSet kindsOf(boolean sources, boolean javadoc) { EnumSet result = EnumSet.noneOf(ArtifactKind.class); diff --git a/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java b/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java index b844e7760693..602254cbe5d9 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java +++ b/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java @@ -133,7 +133,14 @@ public class JarRepositoryManager { boolean includeTransitiveDependencies, String copyTo, Collection repositories) { - RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord, includeTransitiveDependencies); + String packaging = JpsMavenRepositoryLibraryDescriptor.DEFAULT_PACKAGING; + for (ArtifactKind kind : kinds) { + if (kind.getClassifier().isEmpty()) { + packaging = kind.getExtension(); // correct packaging according to the requested artifact kind + break; + } + } + RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord, packaging, includeTransitiveDependencies); final JpsMavenRepositoryLibraryDescriptor libDescriptor = props.getRepositoryLibraryDescriptor(); final Collection roots = ContainerUtil.newArrayList(); if (libDescriptor.getMavenId() != null) { @@ -155,8 +162,19 @@ public class JarRepositoryManager { boolean includeTransitiveDependencies, String copyTo, Collection repositories) { - return resolveAndDownload(project, coord, kindsOf(attachSources, attachJavaDoc), - includeTransitiveDependencies, copyTo, repositories); + return resolveAndDownload(project, coord, attachSources, attachJavaDoc, JpsMavenRepositoryLibraryDescriptor.DEFAULT_PACKAGING, includeTransitiveDependencies, copyTo, repositories); + } + + @Nullable + public static NewLibraryConfiguration resolveAndDownload(@NotNull Project project, + String coord, + boolean attachSources, + boolean attachJavaDoc, + String packaging, + boolean includeTransitiveDependencies, + String copyTo, + Collection repositories) { + return resolveAndDownload(project, coord, kindsOf(attachSources, attachJavaDoc, packaging), includeTransitiveDependencies, copyTo, repositories); } @NotNull @@ -212,7 +230,7 @@ public class JarRepositoryManager { @Nullable Collection repositories) { final JpsMavenRepositoryLibraryDescriptor libDescriptor = libraryProps.getRepositoryLibraryDescriptor(); if (libDescriptor.getMavenId() != null) { - EnumSet kinds = kindsOf(loadSources, loadJavadoc); + EnumSet kinds = kindsOf(loadSources, loadJavadoc, libraryProps.getPackaging()); return loadDependenciesModal(project, libDescriptor, kinds, repositories, copyTo); } return Collections.emptyList(); @@ -236,7 +254,7 @@ public class JarRepositoryManager { boolean loadJavadoc, @Nullable List repos, @Nullable String copyTo) { - EnumSet kinds = kindsOf(loadSources, loadJavadoc); + EnumSet kinds = kindsOf(loadSources, loadJavadoc, libraryProps.getPackaging()); return loadDependenciesAsync( project, libraryProps.getRepositoryLibraryDescriptor(), @@ -276,9 +294,19 @@ public class JarRepositoryManager { return repositories; } - protected static EnumSet kindsOf(boolean loadSources, boolean loadJavadoc) { + protected static EnumSet kindsOf(boolean loadSources, boolean loadJavadoc, String... artifactPackaging) { final EnumSet kinds = ArtifactKind.kindsOf(loadSources, loadJavadoc); - kinds.add(ArtifactKind.ARTIFACT); + if (artifactPackaging.length == 0) { + kinds.add(ArtifactKind.ARTIFACT); + } + else { + for (String packaging : artifactPackaging) { + final ArtifactKind artifact = ArtifactKind.find(ArtifactKind.ARTIFACT.getClassifier(), packaging); + if (artifact != null) { + kinds.add(artifact); + } + } + } return kinds; } @@ -323,15 +351,19 @@ public class JarRepositoryManager { } public static void searchArtifacts(final Project project, String coord, final Consumer>> resultProcessor) { + searchArtifacts(project, coord, JpsMavenRepositoryLibraryDescriptor.DEFAULT_PACKAGING, resultProcessor); + } + + public static void searchArtifacts(final Project project, String coord, String packaging, final Consumer>> resultProcessor) { if (coord == null || coord.length() == 0) { return; } final RepositoryArtifactDescription template; if (coord.indexOf(':') == -1 && Character.isUpperCase(coord.charAt(0))) { - template = new RepositoryArtifactDescription(null, null, null, "jar", null, coord, null); + template = new RepositoryArtifactDescription(null, null, null, packaging, null, coord, null); } else { - template = new RepositoryArtifactDescription(new RepositoryLibraryProperties(coord, true), "jar", null); + template = new RepositoryArtifactDescription(new RepositoryLibraryProperties(coord, packaging, true), null); } ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) { diff --git a/java/openapi/src/com/intellij/jarRepository/RepositoryArtifactDescription.java b/java/openapi/src/com/intellij/jarRepository/RepositoryArtifactDescription.java index 155da46e5772..168a475bdff4 100644 --- a/java/openapi/src/com/intellij/jarRepository/RepositoryArtifactDescription.java +++ b/java/openapi/src/com/intellij/jarRepository/RepositoryArtifactDescription.java @@ -29,8 +29,8 @@ public class RepositoryArtifactDescription { private final String myClassNames; private final String myRepositoryId; - public RepositoryArtifactDescription(RepositoryLibraryProperties libProperties, String packaging, String classifier) { - this(libProperties.getGroupId(), libProperties.getArtifactId(), libProperties.getVersion(), packaging, classifier); + public RepositoryArtifactDescription(RepositoryLibraryProperties libProperties, String classifier) { + this(libProperties.getGroupId(), libProperties.getArtifactId(), libProperties.getVersion(), libProperties.getPackaging(), classifier); } public RepositoryArtifactDescription(String groupId, diff --git a/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryProperties.java b/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryProperties.java index 2c6bf992dd6d..e30a1daeb2de 100644 --- a/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryProperties.java +++ b/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryProperties.java @@ -28,6 +28,10 @@ public class RepositoryLibraryProperties extends LibraryProperties method) { + private T call(Function method, final T defaultValue) { final JpsMavenRepositoryLibraryDescriptor descriptor = myDescriptor; - return descriptor != null ? method.apply(descriptor) : null; + return descriptor != null ? method.apply(descriptor) : defaultValue; } /** @@ -104,11 +118,11 @@ public class RepositoryLibraryProperties extends LibraryProperties getExcludedDependencies() { - return myDescriptor != null ? myDescriptor.getExcludedDependencies() : Collections.emptyList(); + return call(JpsMavenRepositoryLibraryDescriptor::getExcludedDependencies, Collections.emptyList()); } public void setExcludedDependencies(List dependencyMavenIds) { - myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getMavenId(), isIncludeTransitiveDependencies(), dependencyMavenIds); + myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getMavenId(), getPackaging(), isIncludeTransitiveDependencies(), dependencyMavenIds); } @SuppressWarnings("unused") //we need to have a separate method here because XmlSerializer fails if the returned list is unmodifiable diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsMavenRepositoryLibraryDescriptor.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsMavenRepositoryLibraryDescriptor.java index 1f38a11aff79..4f2a6d75ef86 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsMavenRepositoryLibraryDescriptor.java +++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsMavenRepositoryLibraryDescriptor.java @@ -26,10 +26,13 @@ import java.util.Objects; * @author Eugene Zhuravlev */ public class JpsMavenRepositoryLibraryDescriptor { + public static final String DEFAULT_PACKAGING = "jar"; + private final String myMavenId; private final String myGroupId; private final String myArtifactId; private final String myVersion; + private final String myPackaging; private final boolean myIncludeTransitiveDependencies; private final List myExcludedDependencies; @@ -39,9 +42,15 @@ public class JpsMavenRepositoryLibraryDescriptor { public JpsMavenRepositoryLibraryDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version, boolean includeTransitiveDependencies, @NotNull List excludedDependencies) { + this(groupId, artifactId, version, DEFAULT_PACKAGING, includeTransitiveDependencies, excludedDependencies); + } + + public JpsMavenRepositoryLibraryDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version, + @NotNull final String packaging, boolean includeTransitiveDependencies, @NotNull List excludedDependencies) { myGroupId = groupId; myArtifactId = artifactId; myVersion = version; + myPackaging = packaging; myIncludeTransitiveDependencies = includeTransitiveDependencies; myExcludedDependencies = excludedDependencies; myMavenId = groupId + ":" + artifactId + ":" + version; @@ -56,10 +65,15 @@ public class JpsMavenRepositoryLibraryDescriptor { this(groupId, artifactId, version, includeTransitiveDependencies, Collections.emptyList()); } - public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, - boolean includeTransitiveDependencies, List excludedDependencies) { + public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, boolean includeTransitiveDependencies, List excludedDependencies) { + this(mavenId, DEFAULT_PACKAGING, includeTransitiveDependencies, excludedDependencies); + } + + public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, @NotNull String packaging, boolean includeTransitiveDependencies, List excludedDependencies) { myMavenId = mavenId; myIncludeTransitiveDependencies = includeTransitiveDependencies; + myExcludedDependencies = excludedDependencies; + myPackaging = packaging; if (mavenId == null) { myGroupId = myArtifactId = myVersion = null; } @@ -69,10 +83,8 @@ public class JpsMavenRepositoryLibraryDescriptor { myArtifactId = parts.length > 1 ? parts[1] : null; myVersion = parts.length > 2 ? parts[2] : null; } - myExcludedDependencies = excludedDependencies; } - public String getMavenId() { return myMavenId; } @@ -100,19 +112,26 @@ public class JpsMavenRepositoryLibraryDescriptor { return myVersion; } - @Override + public String getPackaging() { + return myPackaging; + } + public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - JpsMavenRepositoryLibraryDescriptor that = (JpsMavenRepositoryLibraryDescriptor)o; - return Objects.equals(myMavenId, that.myMavenId) && myIncludeTransitiveDependencies == that.myIncludeTransitiveDependencies - && myExcludedDependencies.equals(that.myExcludedDependencies); + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final JpsMavenRepositoryLibraryDescriptor that = (JpsMavenRepositoryLibraryDescriptor)o; + return myIncludeTransitiveDependencies == that.myIncludeTransitiveDependencies && + myMavenId.equals(that.myMavenId) && + myPackaging.equals(that.myPackaging) && + myExcludedDependencies.equals(that.myExcludedDependencies); } - @Override public int hashCode() { - return myExcludedDependencies.hashCode() * 31 * 31 + Objects.hashCode(myMavenId) * 31 + (myIncludeTransitiveDependencies ? 1 : 0); + return Objects.hash(myMavenId, myPackaging, myIncludeTransitiveDependencies, myExcludedDependencies); } @Override