repository libraries: add option to exclude transitive dependencies (IDEA-178557)

This commit is contained in:
nik
2017-09-07 12:28:59 +02:00
parent 75e52e4513
commit 1db28ad354
22 changed files with 201 additions and 54 deletions
@@ -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<RemoteRepositoryDescription> repositories) {
RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord);
RepositoryLibraryProperties props = new RepositoryLibraryProperties(coord, includeTransitiveDependencies);
final Collection<OrderRoot> roots = loadDependenciesModal(
project, props, attachSources, attachJavaDoc, copyTo, repositories
);
@@ -188,7 +190,7 @@ public class JarRepositoryManager {
boolean loadJavadoc,
@Nullable String copyTo,
@Nullable Collection<RemoteRepositoryDescription> 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<Artifact> 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);
@@ -70,7 +70,7 @@ public class RepositoryAddLibraryAction extends IntentionAndQuickFixAction {
module.getProject(),
model,
libraryDescription,
false);
false, true);
if (!dialog.showAndGet()) {
return;
}
@@ -71,7 +71,7 @@
<text value=""/>
</properties>
</component>
<grid id="8a0e6" layout-manager="GridLayoutManager" row-count="1" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="8a0e6" layout-manager="GridLayoutManager" row-count="1" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -81,7 +81,7 @@
<children>
<component id="e800f" class="javax.swing.JCheckBox" binding="mySourcesCheckBox">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="&amp;Sources"/>
@@ -89,7 +89,7 @@
</component>
<component id="63ac5" class="javax.swing.JCheckBox" binding="myJavaDocCheckBox">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Java&amp;Docs"/>
@@ -100,6 +100,15 @@
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="dcc0d" class="com.intellij.ui.components.JBCheckBox" binding="myIncludeTransitiveDepsCheckBox">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<selected value="true"/>
<text value="&amp;Transitive depedencies"/>
</properties>
</component>
</children>
</grid>
<component id="65473" class="com.intellij.ui.components.JBCheckBox" binding="myDownloadToCheckBox">
@@ -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;
@@ -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);
}
@@ -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));
}
@@ -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()));
@@ -120,7 +120,7 @@
<grid row="2" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<grid id="1bd32" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="1bd32" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -151,6 +151,14 @@
<text value="Download &amp;JavaDocs"/>
</properties>
</component>
<component id="75440" class="com.intellij.ui.components.JBCheckBox" binding="myIncludeTransitiveDepsCheckBox">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Include &amp;transitive dependencies"/>
</properties>
</component>
</children>
</grid>
</children>
@@ -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);
}
});
}
@@ -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);
@@ -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;
}