general support custom artifact extensions; used for 'aar' artifact packaging

This commit is contained in:
Eugene Zhuravlev
2018-10-19 13:14:49 +02:00
parent 7658805324
commit fc21ba46da
5 changed files with 111 additions and 37 deletions
@@ -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<ArtifactKind> kindsOf(boolean sources, boolean javadoc) {
EnumSet<ArtifactKind> result = EnumSet.noneOf(ArtifactKind.class);
@@ -133,7 +133,14 @@ public class JarRepositoryManager {
boolean includeTransitiveDependencies,
String copyTo,
Collection<RemoteRepositoryDescription> 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<OrderRoot> roots = ContainerUtil.newArrayList();
if (libDescriptor.getMavenId() != null) {
@@ -155,8 +162,19 @@ public class JarRepositoryManager {
boolean includeTransitiveDependencies,
String copyTo,
Collection<RemoteRepositoryDescription> 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<RemoteRepositoryDescription> repositories) {
return resolveAndDownload(project, coord, kindsOf(attachSources, attachJavaDoc, packaging), includeTransitiveDependencies, copyTo, repositories);
}
@NotNull
@@ -212,7 +230,7 @@ public class JarRepositoryManager {
@Nullable Collection<RemoteRepositoryDescription> repositories) {
final JpsMavenRepositoryLibraryDescriptor libDescriptor = libraryProps.getRepositoryLibraryDescriptor();
if (libDescriptor.getMavenId() != null) {
EnumSet<ArtifactKind> kinds = kindsOf(loadSources, loadJavadoc);
EnumSet<ArtifactKind> 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<RemoteRepositoryDescription> repos,
@Nullable String copyTo) {
EnumSet<ArtifactKind> kinds = kindsOf(loadSources, loadJavadoc);
EnumSet<ArtifactKind> kinds = kindsOf(loadSources, loadJavadoc, libraryProps.getPackaging());
return loadDependenciesAsync(
project,
libraryProps.getRepositoryLibraryDescriptor(),
@@ -276,9 +294,19 @@ public class JarRepositoryManager {
return repositories;
}
protected static EnumSet<ArtifactKind> kindsOf(boolean loadSources, boolean loadJavadoc) {
protected static EnumSet<ArtifactKind> kindsOf(boolean loadSources, boolean loadJavadoc, String... artifactPackaging) {
final EnumSet<ArtifactKind> 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<? super Collection<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>>> resultProcessor) {
searchArtifacts(project, coord, JpsMavenRepositoryLibraryDescriptor.DEFAULT_PACKAGING, resultProcessor);
}
public static void searchArtifacts(final Project project, String coord, String packaging, final Consumer<? super Collection<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>>> 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) {
@@ -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,
@@ -28,6 +28,10 @@ public class RepositoryLibraryProperties extends LibraryProperties<RepositoryLib
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(mavenId, includeTransitiveDependencies, Collections.emptyList());
}
public RepositoryLibraryProperties(String mavenId, String packaging, final boolean includeTransitiveDependencies) {
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(mavenId, packaging, includeTransitiveDependencies, Collections.emptyList());
}
public RepositoryLibraryProperties(@NotNull String groupId, @NotNull String artifactId, @NotNull String version) {
this(groupId, artifactId, version, true, ContainerUtil.emptyList());
}
@@ -62,41 +66,51 @@ public class RepositoryLibraryProperties extends LibraryProperties<RepositoryLib
@Attribute("maven-id")
public String getMavenId() {
return call(JpsMavenRepositoryLibraryDescriptor::getMavenId);
return call(JpsMavenRepositoryLibraryDescriptor::getMavenId, null);
}
@Attribute("packaging")
public String getPackaging() {
return call(JpsMavenRepositoryLibraryDescriptor::getPackaging, JpsMavenRepositoryLibraryDescriptor.DEFAULT_PACKAGING);
}
public void setMavenId(String mavenId) {
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(mavenId, isIncludeTransitiveDependencies(), getExcludedDependencies());
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(mavenId, getPackaging(), isIncludeTransitiveDependencies(), getExcludedDependencies());
}
public void setPackaging(String packaging) {
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getMavenId(), packaging, isIncludeTransitiveDependencies(), getExcludedDependencies());
}
@Attribute("include-transitive-deps")
public boolean isIncludeTransitiveDependencies() {
return myDescriptor == null || myDescriptor.isIncludeTransitiveDependencies();
return call(JpsMavenRepositoryLibraryDescriptor::isIncludeTransitiveDependencies, Boolean.TRUE);
}
public void setIncludeTransitiveDependencies(boolean value) {
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getMavenId(), value, getExcludedDependencies());
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getMavenId(), getPackaging(), value, getExcludedDependencies());
}
public String getGroupId() {
return call(JpsMavenRepositoryLibraryDescriptor::getGroupId);
return call(JpsMavenRepositoryLibraryDescriptor::getGroupId, null);
}
public String getArtifactId() {
return call(JpsMavenRepositoryLibraryDescriptor::getArtifactId);
return call(JpsMavenRepositoryLibraryDescriptor::getArtifactId, null);
}
public String getVersion() {
return call(JpsMavenRepositoryLibraryDescriptor::getVersion);
return call(JpsMavenRepositoryLibraryDescriptor::getVersion, null);
}
public void changeVersion(String version) {
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getGroupId(), getArtifactId(), version, myDescriptor.isIncludeTransitiveDependencies(), myDescriptor.getExcludedDependencies());
myDescriptor = new JpsMavenRepositoryLibraryDescriptor(getGroupId(), getArtifactId(), version, getPackaging(), isIncludeTransitiveDependencies(), getExcludedDependencies());
}
private String call(Function<? super JpsMavenRepositoryLibraryDescriptor, String> method) {
private <T> T call(Function<? super JpsMavenRepositoryLibraryDescriptor, T> 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<RepositoryLib
*/
@Transient
public List<String> getExcludedDependencies() {
return myDescriptor != null ? myDescriptor.getExcludedDependencies() : Collections.emptyList();
return call(JpsMavenRepositoryLibraryDescriptor::getExcludedDependencies, Collections.emptyList());
}
public void setExcludedDependencies(List<String> 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
@@ -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<String> myExcludedDependencies;
@@ -39,9 +42,15 @@ public class JpsMavenRepositoryLibraryDescriptor {
public JpsMavenRepositoryLibraryDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version,
boolean includeTransitiveDependencies, @NotNull List<String> 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<String> 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<String> excludedDependencies) {
public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, boolean includeTransitiveDependencies, List<String> excludedDependencies) {
this(mavenId, DEFAULT_PACKAGING, includeTransitiveDependencies, excludedDependencies);
}
public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, @NotNull String packaging, boolean includeTransitiveDependencies, List<String> 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