From 1db28ad354c7b36e47c5136a9ea2a7ad00608fda Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 7 Sep 2017 12:10:44 +0200 Subject: [PATCH] repository libraries: add option to exclude transitive dependencies (IDEA-178557) --- .../aether-dependency-resolver.iml | 2 + .../aether/ArtifactRepositoryManager.java | 42 +++++++++-------- .../aether/ArtifactRepositoryManagerTest.java | 47 +++++++++++++++++++ .../jarRepository/JarRepositoryManager.java | 18 ++++--- .../RepositoryAddLibraryAction.java | 2 +- .../jarRepository/RepositoryAttachDialog.form | 15 ++++-- .../jarRepository/RepositoryAttachDialog.java | 5 ++ ...oryLibrarySupportInModuleConfigurable.java | 2 +- ...epositoryLibraryWithDescriptionEditor.java | 5 +- .../RepositoryLibraryPropertiesDialog.java | 4 +- .../RepositoryLibraryPropertiesEditor.form | 10 +++- .../RepositoryLibraryPropertiesEditor.java | 13 ++++- .../library/RepositoryLibrarySupport.java | 3 +- .../RepositoryLibraryPropertiesModel.java | 19 +++++++- .../library/RepositoryLibraryDescription.java | 2 +- .../library/RepositoryLibraryProperties.java | 26 ++++++++-- .../DependencyResolvingBuilder.java | 3 +- .../JpsMavenRepositoryLibraryDescriptor.java | 25 ++++++++-- .../java/JpsJavaModelSerializerExtension.java | 4 +- .../testSrc/tests/testGroups.properties | 1 + .../junit4/JUnitAbstractIntegrationTest.java | 3 +- .../library/RepositoryAttachHandler.java | 4 +- 22 files changed, 201 insertions(+), 54 deletions(-) create mode 100644 aether-dependency-resolver/testSrc/org/jetbrains/idea/maven/aether/ArtifactRepositoryManagerTest.java diff --git a/aether-dependency-resolver/aether-dependency-resolver.iml b/aether-dependency-resolver/aether-dependency-resolver.iml index 5a94b5515a56..fa0e95e03449 100644 --- a/aether-dependency-resolver/aether-dependency-resolver.iml +++ b/aether-dependency-resolver/aether-dependency-resolver.iml @@ -4,6 +4,7 @@ + @@ -30,5 +31,6 @@ + \ No newline at end of file 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 888fef229a8f..c5f97ed75d53 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 @@ -124,35 +124,39 @@ public class ArtifactRepositoryManager { myRemoteRepositories.add(createRemoteRepository(id, url)); } - public Collection resolveDependency(String groupId, String artifactId, String version) throws Exception { + public Collection resolveDependency(String groupId, String artifactId, String version, boolean includeTransitiveDependencies) throws Exception { final List files = new ArrayList<>(); - for (Artifact artifact : resolveDependencyAsArtifact(groupId, artifactId, version, EnumSet.of(ArtifactKind.ARTIFACT))) { + for (Artifact artifact : resolveDependencyAsArtifact(groupId, artifactId, version, EnumSet.of(ArtifactKind.ARTIFACT), includeTransitiveDependencies)) { files.add(artifact.getFile()); } return files; } @NotNull - public Collection resolveDependencyAsArtifact(String groupId, - String artifactId, - String versionConstraint, - final Set artifactKinds) throws Exception { - - final List artifacts = new ArrayList<>(); + public Collection resolveDependencyAsArtifact(String groupId, String artifactId, String versionConstraint, Set artifactKinds, boolean includeTransitiveDependencies) throws Exception {final List artifacts = new ArrayList<>(); final Set constraints = Collections.singleton(asVersionConstraint(versionConstraint)); for (ArtifactKind kind : artifactKinds) { //RepositorySystem.resolveDependencies() ignores classifiers, so we need to collect dependencies for the default classifier, and then // resolve artifacts with specified classifiers for each found dependency try { - final CollectResult collectResult = ourSystem.collectDependencies( - mySession, createCollectRequest(groupId, artifactId, constraints, EnumSet.of(kind)) - ); - final ArtifactRequestBuilder builder = new ArtifactRequestBuilder(kind); - collectResult.getRoot().accept(new TreeDependencyVisitor( - new FilteringDependencyVisitor(builder, DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE)) - )); - - final List requests = builder.getRequests(); + final List requests; + if (includeTransitiveDependencies) { + final CollectResult collectResult = ourSystem.collectDependencies( + mySession, createCollectRequest(groupId, artifactId, constraints, EnumSet.of(kind)) + ); + final ArtifactRequestBuilder builder = new ArtifactRequestBuilder(kind); + collectResult.getRoot().accept(new TreeDependencyVisitor( + new FilteringDependencyVisitor(builder, DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE)) + )); + requests = builder.getRequests(); + } + else { + requests = new ArrayList<>(); + for (Artifact artifact : toArtifacts(groupId, artifactId, constraints, artifactKinds)) { + requests.add(new ArtifactRequest(artifact, Collections.unmodifiableList(myRemoteRepositories), null)); + } + } + if (!requests.isEmpty()) { try { for (ArtifactResult result : ourSystem.resolveArtifacts(mySession, requests)) { @@ -276,8 +280,8 @@ public class ArtifactRepositoryManager { final Dependency dep = node.getDependency(); if (dep != null) { myRequests.add(new ArtifactRequest( - new ArtifactWithChangedClassifier(node.getDependency().getArtifact(), myKind.getClassifier()), - node.getRepositories(), + new ArtifactWithChangedClassifier(node.getDependency().getArtifact(), myKind.getClassifier()), + node.getRepositories(), node.getRequestContext() )); } diff --git a/aether-dependency-resolver/testSrc/org/jetbrains/idea/maven/aether/ArtifactRepositoryManagerTest.java b/aether-dependency-resolver/testSrc/org/jetbrains/idea/maven/aether/ArtifactRepositoryManagerTest.java new file mode 100644 index 000000000000..9cca3c7faf90 --- /dev/null +++ b/aether-dependency-resolver/testSrc/org/jetbrains/idea/maven/aether/ArtifactRepositoryManagerTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.aether; + +import com.intellij.testFramework.UsefulTestCase; +import com.intellij.util.SystemProperties; +import com.intellij.util.containers.ContainerUtil; + +import java.io.File; +import java.util.Collection; + +/** + * @author nik + */ +public class ArtifactRepositoryManagerTest extends UsefulTestCase { + private ArtifactRepositoryManager myRepositoryManager; + + @Override + public void setUp() throws Exception { + super.setUp(); + final File localRepo = new File(SystemProperties.getUserHome(), ".m2/repository"); + myRepositoryManager = new ArtifactRepositoryManager(localRepo); + } + + public void testResolveTransitively() throws Exception { + Collection files = myRepositoryManager.resolveDependency("junit", "junit", "4.12", true); + assertSameElements(ContainerUtil.map(files, File::getName), "junit-4.12.jar", "hamcrest-core-1.3.jar"); + } + + public void testResolveNonTransitively() throws Exception { + Collection files = myRepositoryManager.resolveDependency("junit", "junit", "4.12", false); + assertSameElements(ContainerUtil.map(files, File::getName), "junit-4.12.jar"); + } +} diff --git a/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java b/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java index d6d9e23c0a61..8b2d826cbbb5 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java +++ b/java/idea-ui/src/com/intellij/jarRepository/JarRepositoryManager.java @@ -98,10 +98,11 @@ public class JarRepositoryManager { final String coord = dialog.getCoordinateText(); final boolean attachSources = dialog.getAttachSources(); final boolean attachJavaDoc = dialog.getAttachJavaDoc(); + boolean includeTransitiveDependencies = dialog.getIncludeTransitiveDependencies(); final String copyTo = dialog.getDirectoryPath(); final NewLibraryConfiguration config = resolveAndDownload( - project, coord, attachSources, attachJavaDoc, copyTo, RemoteRepositoriesConfiguration.getInstance(project).getRepositories() + project, coord, attachSources, attachJavaDoc, includeTransitiveDependencies, copyTo, RemoteRepositoriesConfiguration.getInstance(project).getRepositories() ); if (config == null) { Messages.showErrorDialog(parentComponent, "No files were downloaded for " + coord, CommonBundle.getErrorTitle()); @@ -114,9 +115,10 @@ public class JarRepositoryManager { String coord, boolean attachSources, boolean attachJavaDoc, + boolean includeTransitiveDependencies, String copyTo, Collection repositories) { - RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord); + RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord, includeTransitiveDependencies); final Collection roots = loadDependenciesModal( project, props, attachSources, attachJavaDoc, copyTo, repositories ); @@ -188,7 +190,7 @@ public class JarRepositoryManager { boolean loadJavadoc, @Nullable String copyTo, @Nullable Collection repositories, boolean modal) { - final JpsMavenRepositoryLibraryDescriptor libDescriptor = new JpsMavenRepositoryLibraryDescriptor(libraryProps.getGroupId(), libraryProps.getArtifactId(), libraryProps.getVersion()); + final JpsMavenRepositoryLibraryDescriptor libDescriptor = libraryProps.getRepositoryLibraryDescriptor(); if (libDescriptor.getMavenId() != null) { if (repositories == null || repositories.isEmpty()) { repositories = RemoteRepositoriesConfiguration.getInstance(project).getRepositories(); @@ -235,7 +237,7 @@ public class JarRepositoryManager { } loadDependenciesAsync( project, - new JpsMavenRepositoryLibraryDescriptor(libraryProps.getGroupId(), libraryProps.getArtifactId(), libraryProps.getVersion()), + libraryProps.getRepositoryLibraryDescriptor(), kinds, repos, copyTo, resultProcessor ); } @@ -292,7 +294,7 @@ public class JarRepositoryManager { template = new RepositoryArtifactDescription(null, null, null, "jar", null, coord, null); } else { - template = new RepositoryArtifactDescription(new RepositoryLibraryProperties(coord), "jar", null); + template = new RepositoryArtifactDescription(new RepositoryLibraryProperties(coord, true), "jar", null); } ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) { @@ -539,7 +541,8 @@ public class JarRepositoryManager { protected Collection perform(ProgressIndicator progress, ArtifactRepositoryManager manager) throws Exception { final String version = myDesc.getVersion(); try { - return manager.resolveDependencyAsArtifact(myDesc.getGroupId(), myDesc.getArtifactId(), version, myKinds); + return manager.resolveDependencyAsArtifact(myDesc.getGroupId(), myDesc.getArtifactId(), version, myKinds, + myDesc.isIncludeTransitiveDependencies()); } catch (TransferCancelledException e) { throw new ProcessCanceledException(e); @@ -553,7 +556,8 @@ public class JarRepositoryManager { throw e; } try { - return manager.resolveDependencyAsArtifact(myDesc.getGroupId(), myDesc.getArtifactId(), resolvedVersion, myKinds); + return manager.resolveDependencyAsArtifact(myDesc.getGroupId(), myDesc.getArtifactId(), resolvedVersion, myKinds, + myDesc.isIncludeTransitiveDependencies()); } catch (TransferCancelledException e1) { throw new ProcessCanceledException(e1); diff --git a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAddLibraryAction.java b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAddLibraryAction.java index 49a33579308e..a7e0647bef00 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAddLibraryAction.java +++ b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAddLibraryAction.java @@ -70,7 +70,7 @@ public class RepositoryAddLibraryAction extends IntentionAndQuickFixAction { module.getProject(), model, libraryDescription, - false); + false, true); if (!dialog.showAndGet()) { return; } diff --git a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.form b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.form index 4c449aeef6ec..09d2db2d61a4 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.form +++ b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.form @@ -71,7 +71,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -100,6 +100,15 @@ + + + + + + + + + diff --git a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.java b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.java index 8545b6cc9e5a..1af64d8b75d2 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.java +++ b/java/idea-ui/src/com/intellij/jarRepository/RepositoryAttachDialog.java @@ -90,6 +90,7 @@ public class RepositoryAttachDialog extends DialogWrapper { private JBCheckBox myDownloadToCheckBox; private JBLabel myCaptionLabel; private JPanel myDownloadOptionsPanel; + private JBCheckBox myIncludeTransitiveDepsCheckBox; private final JComboBox myCombobox; @@ -217,6 +218,10 @@ public class RepositoryAttachDialog extends DialogWrapper { return mySourcesCheckBox.isSelected(); } + public boolean getIncludeTransitiveDependencies() { + return myIncludeTransitiveDepsCheckBox.isSelected(); + } + @Nullable public String getDirectoryPath() { return myDownloadToCheckBox.isSelected()? myDirectoryField.getText() : null; diff --git a/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibrarySupportInModuleConfigurable.java b/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibrarySupportInModuleConfigurable.java index b4a66448c248..50f21b70b7a8 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibrarySupportInModuleConfigurable.java +++ b/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibrarySupportInModuleConfigurable.java @@ -38,7 +38,7 @@ public class RepositoryLibrarySupportInModuleConfigurable extends FrameworkSuppo public RepositoryLibrarySupportInModuleConfigurable(@Nullable Project project, @NotNull RepositoryLibraryDescription libraryDescription) { this.libraryDescription = libraryDescription; RepositoryLibraryProperties defaultProperties = libraryDescription.createDefaultProperties(); - this.model = new RepositoryLibraryPropertiesModel(defaultProperties.getVersion(), false, false); + this.model = new RepositoryLibraryPropertiesModel(defaultProperties.getVersion(), false, false, defaultProperties.isIncludeTransitiveDependencies()); editor = new RepositoryLibraryPropertiesEditor(project, model, libraryDescription); } diff --git a/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibraryWithDescriptionEditor.java b/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibraryWithDescriptionEditor.java index 1589068e888d..02bcd029d7a0 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibraryWithDescriptionEditor.java +++ b/java/idea-ui/src/com/intellij/jarRepository/RepositoryLibraryWithDescriptionEditor.java @@ -50,7 +50,7 @@ public class RepositoryLibraryWithDescriptionEditor RepositoryLibraryPropertiesModel model = new RepositoryLibraryPropertiesModel( properties.getVersion(), RepositoryUtils.libraryHasSources(myEditorComponent.getLibraryEditor()), - RepositoryUtils.libraryHasJavaDocs(myEditorComponent.getLibraryEditor())); + RepositoryUtils.libraryHasJavaDocs(myEditorComponent.getLibraryEditor()), properties.isIncludeTransitiveDependencies()); final Project project = myEditorComponent.getProject(); assert project != null : "EditorComponent's project must not be null in order to be used with RepositoryLibraryWithDescriptionEditor"; @@ -59,11 +59,12 @@ public class RepositoryLibraryWithDescriptionEditor project, model, RepositoryLibraryDescription.findDescription(properties), - true); + true, true); if (!dialog.showAndGet()) { return; } myEditorComponent.getProperties().changeVersion(model.getVersion()); + myEditorComponent.getProperties().setIncludeTransitiveDependencies(model.isIncludeTransitiveDependencies()); if (wasGeneratedName) { myEditorComponent.renameLibrary(RepositoryLibraryType.getInstance().getDescription(properties)); } diff --git a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesDialog.java b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesDialog.java index 601024874e7f..93aa9b5e7c61 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesDialog.java +++ b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesDialog.java @@ -30,11 +30,11 @@ public class RepositoryLibraryPropertiesDialog extends DialogWrapper { public RepositoryLibraryPropertiesDialog(@Nullable Project project, RepositoryLibraryPropertiesModel model, RepositoryLibraryDescription description, - final boolean changesRequired) { + final boolean changesRequired, final boolean allowExcludingTransitiveDependencies) { super(project); this.model = model; propertiesEditor = - new RepositoryLibraryPropertiesEditor(project, model, description, new RepositoryLibraryPropertiesEditor.ModelChangeListener() { + new RepositoryLibraryPropertiesEditor(project, model, description, allowExcludingTransitiveDependencies, new RepositoryLibraryPropertiesEditor.ModelChangeListener() { @Override public void onChange(RepositoryLibraryPropertiesEditor editor) { setOKActionEnabled(editor.isValid() && (!changesRequired || editor.hasChanges())); diff --git a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.form b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.form index cb1f7a895be3..ffcf1fb93e5c 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.form +++ b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.form @@ -120,7 +120,7 @@ - + @@ -151,6 +151,14 @@ + + + + + + + + diff --git a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.java b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.java index d4765db18b1f..1845a13ab3ba 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.java +++ b/java/idea-ui/src/com/intellij/jarRepository/settings/RepositoryLibraryPropertiesEditor.java @@ -61,6 +61,7 @@ public class RepositoryLibraryPropertiesEditor { private JBCheckBox downloadSourcesCheckBox; private JBCheckBox downloadJavaDocsCheckBox; private JBLabel mavenCoordinates; + private JBCheckBox myIncludeTransitiveDepsCheckBox; @NotNull private ModelChangeListener onChangeListener; @@ -71,7 +72,7 @@ public class RepositoryLibraryPropertiesEditor { public RepositoryLibraryPropertiesEditor(@Nullable Project project, RepositoryLibraryPropertiesModel model, RepositoryLibraryDescription description) { - this(project, model, description, new ModelChangeListener() { + this(project, model, description, true, new ModelChangeListener() { @Override public void onChange(RepositoryLibraryPropertiesEditor editor) { @@ -83,12 +84,14 @@ public class RepositoryLibraryPropertiesEditor { public RepositoryLibraryPropertiesEditor(@Nullable Project project, final RepositoryLibraryPropertiesModel model, RepositoryLibraryDescription description, + boolean allowExcludingTransitiveDependencies, @NotNull final ModelChangeListener onChangeListener) { this.initialModel = model.clone(); this.model = model; this.project = project == null ? ProjectManager.getInstance().getDefaultProject() : project; repositoryLibraryDescription = description; mavenCoordinates.setCopyable(true); + myIncludeTransitiveDepsCheckBox.setVisible(allowExcludingTransitiveDependencies); myReloadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -243,6 +246,14 @@ public class RepositoryLibraryPropertiesEditor { onChangeListener.onChange(RepositoryLibraryPropertiesEditor.this); } }); + myIncludeTransitiveDepsCheckBox.setSelected(model.isIncludeTransitiveDependencies()); + myIncludeTransitiveDepsCheckBox.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + model.setIncludeTransitiveDependencies(myIncludeTransitiveDepsCheckBox.isSelected()); + onChangeListener.onChange(RepositoryLibraryPropertiesEditor.this); + } + }); } diff --git a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySupport.java b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySupport.java index 85b19ed43f1a..9c9602569ada 100644 --- a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySupport.java +++ b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySupport.java @@ -73,7 +73,8 @@ public class RepositoryLibrarySupport { RepositoryLibraryProperties libraryProperties = new RepositoryLibraryProperties( libraryDescription.getGroupId(), libraryDescription.getArtifactId(), - model.getVersion()); + model.getVersion(), + model.isIncludeTransitiveDependencies()); final LibraryEx library = (LibraryEx)modifiableModel.createLibrary( LibraryEditingUtil.suggestNewLibraryName(modifiableModel, RepositoryLibraryType.getInstance().getDescription(libraryProperties)), RepositoryLibraryType.REPOSITORY_LIBRARY_KIND); diff --git a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/propertiesEditor/RepositoryLibraryPropertiesModel.java b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/propertiesEditor/RepositoryLibraryPropertiesModel.java index bfd51600d905..3f71806702a5 100644 --- a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/propertiesEditor/RepositoryLibraryPropertiesModel.java +++ b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/propertiesEditor/RepositoryLibraryPropertiesModel.java @@ -21,21 +21,36 @@ public class RepositoryLibraryPropertiesModel { private String version; private boolean downloadSources; private boolean downloadJavaDocs; + private boolean includeTransitiveDependencies; public RepositoryLibraryPropertiesModel(String version, boolean downloadSources, boolean downloadJavaDocs) { + this(version, downloadSources, downloadJavaDocs, true); + } + + public RepositoryLibraryPropertiesModel(String version, boolean downloadSources, boolean downloadJavaDocs, + boolean includeTransitiveDependencies) { this.version = version; this.downloadSources = downloadSources; this.downloadJavaDocs = downloadJavaDocs; + this.includeTransitiveDependencies = includeTransitiveDependencies; } public RepositoryLibraryPropertiesModel clone() { - return new RepositoryLibraryPropertiesModel(version, downloadSources, downloadJavaDocs); + return new RepositoryLibraryPropertiesModel(version, downloadSources, downloadJavaDocs, includeTransitiveDependencies); } public boolean isValid() { return !Strings.isNullOrEmpty(version); } + public boolean isIncludeTransitiveDependencies() { + return includeTransitiveDependencies; + } + + public void setIncludeTransitiveDependencies(boolean includeTransitiveDependencies) { + this.includeTransitiveDependencies = includeTransitiveDependencies; + } + public boolean isDownloadSources() { return downloadSources; } @@ -69,6 +84,7 @@ public class RepositoryLibraryPropertiesModel { if (downloadSources != model.downloadSources) return false; if (downloadJavaDocs != model.downloadJavaDocs) return false; + if (includeTransitiveDependencies != model.includeTransitiveDependencies) return false; if (version != null ? !version.equals(model.version) : model.version != null) return false; return true; @@ -78,6 +94,7 @@ public class RepositoryLibraryPropertiesModel { public int hashCode() { int result = (downloadSources ? 1 : 0); result = 31 * result + (downloadJavaDocs ? 1 : 0); + result = 31 * result + (includeTransitiveDependencies ? 1 : 0); result = 31 * result + (version != null ? version.hashCode() : 0); return result; } diff --git a/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryDescription.java b/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryDescription.java index 8cbe3dd40523..5d40d01b04e0 100644 --- a/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryDescription.java +++ b/java/openapi/src/org/jetbrains/idea/maven/utils/library/RepositoryLibraryDescription.java @@ -112,7 +112,7 @@ public class RepositoryLibraryDescription { } public RepositoryLibraryProperties createDefaultProperties() { - return new RepositoryLibraryProperties(getGroupId(), getArtifactId(), ReleaseVersionId); + return new RepositoryLibraryProperties(getGroupId(), getArtifactId(), ReleaseVersionId, true); } public String getDisplayName(String version) { 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 811afc45e744..1eb6548e8808 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 @@ -32,11 +32,15 @@ public class RepositoryLibraryProperties extends LibraryProperties method) { final JpsMavenRepositoryLibraryDescriptor descriptor = myDescriptor; return descriptor != null ? method.apply(descriptor) : null; } + + @NotNull + public JpsMavenRepositoryLibraryDescriptor getRepositoryLibraryDescriptor() { + return myDescriptor != null ? myDescriptor : new JpsMavenRepositoryLibraryDescriptor(null, true); + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/dependencies/DependencyResolvingBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/dependencies/DependencyResolvingBuilder.java index 321b784b01ae..ce63c18d5767 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/dependencies/DependencyResolvingBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/dependencies/DependencyResolvingBuilder.java @@ -147,7 +147,8 @@ public class DependencyResolvingBuilder extends ModuleLevelBuilder{ if (!required.isEmpty()) { context.processMessage(new ProgressMessage("Resolving '" + lib.getName() + "' library...")); LOG.debug("Downloading missing files for " + lib.getName() + " library: " + required); - final Collection resolved = repoManager.resolveDependency(descriptor.getGroupId(), descriptor.getArtifactId(), descriptor.getVersion()); + final Collection resolved = repoManager.resolveDependency(descriptor.getGroupId(), descriptor.getArtifactId(), + descriptor.getVersion(), descriptor.isIncludeTransitiveDependencies()); if (!resolved.isEmpty()) { syncPaths(required, resolved); } 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 6f926e660442..f43afb006e77 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 @@ -18,6 +18,8 @@ package org.jetbrains.jps.model.library; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + /** * @author Eugene Zhuravlev * Date: 13-Jun-16 @@ -27,16 +29,28 @@ public class JpsMavenRepositoryLibraryDescriptor { private final String myGroupId; private final String myArtifactId; private final String myVersion; + private final boolean myIncludeTransitiveDependencies; public JpsMavenRepositoryLibraryDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version) { + this(groupId, artifactId, version, true); + } + + public JpsMavenRepositoryLibraryDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version, + boolean includeTransitiveDependencies) { myGroupId = groupId; myArtifactId = artifactId; myVersion = version; + myIncludeTransitiveDependencies = includeTransitiveDependencies; myMavenId = groupId + ":" + artifactId + ":" + version; } public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId) { + this(mavenId, true); + } + + public JpsMavenRepositoryLibraryDescriptor(@Nullable String mavenId, boolean includeTransitiveDependencies) { myMavenId = mavenId; + myIncludeTransitiveDependencies = includeTransitiveDependencies; if (mavenId == null) { myGroupId = myArtifactId = myVersion = null; } @@ -61,6 +75,10 @@ public class JpsMavenRepositoryLibraryDescriptor { return myArtifactId; } + public boolean isIncludeTransitiveDependencies() { + return myIncludeTransitiveDependencies; + } + public String getVersion() { return myVersion; } @@ -71,15 +89,12 @@ public class JpsMavenRepositoryLibraryDescriptor { if (o == null || getClass() != o.getClass()) return false; JpsMavenRepositoryLibraryDescriptor that = (JpsMavenRepositoryLibraryDescriptor)o; - - if (myMavenId != null ? !myMavenId.equals(that.myMavenId) : that.myMavenId != null) return false; - - return true; + return Objects.equals(myMavenId, that.myMavenId) && myIncludeTransitiveDependencies == that.myIncludeTransitiveDependencies; } @Override public int hashCode() { - return myMavenId != null ? myMavenId.hashCode() : 0; + return Objects.hashCode(myMavenId) * 31 + (myIncludeTransitiveDependencies ? 1 : 0); } @Override diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java index b482d2c6d1b1..21d394635a0d 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java @@ -386,6 +386,7 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension private static class JpsRepositoryLibraryPropertiesSerializer extends JpsLibraryPropertiesSerializer> { private static final String MAVEN_ID_ATTRIBUTE = "maven-id"; + private static final String INCLUDE_TRANSITIVE_DEPS_ATTRIBUTE = "include-transitive-deps"; public JpsRepositoryLibraryPropertiesSerializer() { super(JpsRepositoryLibraryType.INSTANCE, JpsRepositoryLibraryType.INSTANCE.getTypeId()); @@ -394,7 +395,8 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension @Override public JpsSimpleElement loadProperties(@Nullable Element elem) { return JpsElementFactory.getInstance().createSimpleElement(new JpsMavenRepositoryLibraryDescriptor( - elem != null? elem.getAttributeValue(MAVEN_ID_ATTRIBUTE, (String)null) : null + elem != null ? elem.getAttributeValue(MAVEN_ID_ATTRIBUTE, (String)null) : null, + elem == null || Boolean.parseBoolean(elem.getAttributeValue(INCLUDE_TRANSITIVE_DEPS_ATTRIBUTE, "true")) )); } diff --git a/platform/testFramework/testSrc/tests/testGroups.properties b/platform/testFramework/testSrc/tests/testGroups.properties index 54f0b6e207a2..66a69a372881 100644 --- a/platform/testFramework/testSrc/tests/testGroups.properties +++ b/platform/testFramework/testSrc/tests/testGroups.properties @@ -50,6 +50,7 @@ org.jetbrains.idea.maven.embedder.* org.jetbrains.idea.maven.execution.* org.jetbrains.idea.maven.intentions.* org.jetbrains.idea.maven.navigator.* +org.jetbrains.idea.maven.aether.* [TASKS_INTEGRATION_TESTS] com.intellij.tasks.integration.* diff --git a/plugins/junit5_rt_tests/test/com/intellij/junit4/JUnitAbstractIntegrationTest.java b/plugins/junit5_rt_tests/test/com/intellij/junit4/JUnitAbstractIntegrationTest.java index b1ba96003451..61302037feee 100644 --- a/plugins/junit5_rt_tests/test/com/intellij/junit4/JUnitAbstractIntegrationTest.java +++ b/plugins/junit5_rt_tests/test/com/intellij/junit4/JUnitAbstractIntegrationTest.java @@ -128,7 +128,8 @@ public abstract class JUnitAbstractIntegrationTest extends BaseConfigurationTest JpsMavenRepositoryLibraryDescriptor descriptor, ArtifactRepositoryManager repoManager) throws Exception { - Collection files = repoManager.resolveDependency(descriptor.getGroupId(), descriptor.getArtifactId(), descriptor.getVersion()); + Collection files = repoManager.resolveDependency(descriptor.getGroupId(), descriptor.getArtifactId(), descriptor.getVersion(), + descriptor.isIncludeTransitiveDependencies()); for (File artifact : files) { VirtualFile libJarLocal = LocalFileSystem.getInstance().findFileByIoFile(artifact); assertNotNull(libJarLocal); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java index 3b7d8cd8974c..0ab270d99d64 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryAttachHandler.java @@ -59,7 +59,7 @@ public class RepositoryAttachHandler { List repositories) { final ArrayList repos = repositories.stream().map(info -> toRemoteRepositoryDescription(info)).collect(Collectors.toCollection(ArrayList::new)); - return JarRepositoryManager.resolveAndDownload(project, coord, attachSources, attachJavaDoc, copyTo, repos); + return JarRepositoryManager.resolveAndDownload(project, coord, attachSources, attachJavaDoc, true, copyTo, repos); } @NotNull @@ -73,7 +73,7 @@ public class RepositoryAttachHandler { final ArrayList repos = repositories.stream().map(info -> toRemoteRepositoryDescription(info)).collect(Collectors.toCollection(ArrayList::new)); return new ArrayList<>(JarRepositoryManager.loadDependencies( - project, new RepositoryLibraryProperties(coord), attachSources, attachJavaDoc, copyTo, repos + project, new RepositoryLibraryProperties(coord, true), attachSources, attachJavaDoc, copyTo, repos )); }