From ba1b90b085faff65b4d60bfc6e12d42180e9d79a Mon Sep 17 00:00:00 2001 From: Nikita Skvortsov Date: Fri, 5 Oct 2018 18:14:47 +0300 Subject: [PATCH] make external annotations download optional for Gradle and Maven imports IDEA-199964 IDEA-132487 IDEA-200003 --- .../data/ExternalAnnotationsDataService.kt | 13 ++++++++ .../data/MavenRepositoriesDataService.kt | 14 +++++++++ .../resources/i18n/GradleBundle.properties | 1 + ...eaGradleProjectSettingsControlBuilder.java | 30 +++++++++++++++++++ .../settings/GradleProjectSettings.java | 10 +++++++ .../importing/ExternalAnnotationsImporter.kt | 18 +++++++---- .../maven/project/MavenImportingSettings.java | 12 ++++++++ .../project/MavenImportingSettingsForm.form | 14 +++++++-- .../project/MavenImportingSettingsForm.java | 3 ++ 9 files changed, 106 insertions(+), 9 deletions(-) diff --git a/plugins/gradle/java/src/service/project/data/ExternalAnnotationsDataService.kt b/plugins/gradle/java/src/service/project/data/ExternalAnnotationsDataService.kt index 2f24dcf00e89..7d0b83d18b72 100644 --- a/plugins/gradle/java/src/service/project/data/ExternalAnnotationsDataService.kt +++ b/plugins/gradle/java/src/service/project/data/ExternalAnnotationsDataService.kt @@ -16,6 +16,7 @@ import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.project.Project import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.util.registry.Registry +import org.jetbrains.plugins.gradle.settings.GradleSettings @Order(value = ExternalSystemConstants.UNORDERED) class ExternalAnnotationsDataService: AbstractProjectDataService() { @@ -29,6 +30,18 @@ class ExternalAnnotationsDataService: AbstractProjectDataService settings.externalProjectPath == linkedExternalProjectPath } + ?.let { + if (!it.isResolveExternalAnnotations) { + return@onSuccessImport + } + } + } + val resolver = ExternalAnnotationsArtifactsResolver.EP_NAME.extensionList.firstOrNull() ?: return val totalSize = imported.size.toDouble() diff --git a/plugins/gradle/java/src/service/project/data/MavenRepositoriesDataService.kt b/plugins/gradle/java/src/service/project/data/MavenRepositoriesDataService.kt index 016b0e187735..45f37da3a520 100644 --- a/plugins/gradle/java/src/service/project/data/MavenRepositoriesDataService.kt +++ b/plugins/gradle/java/src/service/project/data/MavenRepositoriesDataService.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.service.project.IdeModelsProvider import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService import com.intellij.openapi.project.Project +import org.jetbrains.plugins.gradle.settings.GradleSettings class MavenRepositoriesDataService: AbstractProjectDataService() { override fun getTargetDataKey(): Key = MavenRepositoryData.KEY @@ -19,6 +20,19 @@ class MavenRepositoriesDataService: AbstractProjectDataService settings.externalProjectPath == linkedExternalProjectPath } + ?.let { + if (!it.isResolveExternalAnnotations) { + return@onSuccessImport + } + } + } + + val repositoriesConfiguration = RemoteRepositoriesConfiguration.getInstance(project) val repositories = linkedSetOf().apply { diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index f703360736d4..031b1e9f7392 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -14,6 +14,7 @@ gradle.settings.text.jvm.path=Gradle JVM: gradle.settings.text.service.dir.path=Service directory path: gradle.settings.text.vm.options=Gradle VM options: gradle.settings.text.offline_work=Offline work +gradle.settings.text.resolve.external.annotations=Resolve external annotations gradle.settings.title.service.dir.path=Select gradle service directory to use gradle.generic.text.error.jar.not.found=Gradle JARs location is unknown diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java index 8d95598abc85..b2b587668ef8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java @@ -114,10 +114,15 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet @Nullable private JBRadioButton myUseBundledDistributionButton; private boolean dropUseBundledDistributionButton; + @Nullable private JBCheckBox myResolveModulePerSourceSetCheckBox; private boolean dropResolveModulePerSourceSetCheckBox; + @Nullable + private JBCheckBox myResolveExternalAnnotationsCheckBox; + private boolean dropResolveExternalAnnotationsCheckBox; + @Nullable private JBCheckBox myStoreExternallyCheckBox; private boolean dropStoreExternallyCheckBox; @@ -204,6 +209,11 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet return this; } + public IdeaGradleProjectSettingsControlBuilder dropResolveExternalAnnotationsCheckBox() { + dropResolveExternalAnnotationsCheckBox = true; + return this; + } + public IdeaGradleProjectSettingsControlBuilder dropStoreExternallyCheckBox() { dropStoreExternallyCheckBox = true; return this; @@ -257,6 +267,11 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet content.add(myResolveModulePerSourceSetCheckBox, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); } + if (!dropResolveExternalAnnotationsCheckBox) { + myResolveExternalAnnotationsCheckBox = new JBCheckBox(GradleBundle.message("gradle.settings.text.resolve.external.annotations")); + content.add(myResolveExternalAnnotationsCheckBox, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); + } + if (!dropStoreExternallyCheckBox && myInitialSettings.getStoreProjectFilesExternally() != ThreeState.UNSURE) { myStoreExternallyCheckBox = new JBCheckBox("Store generated project files externally"); content.add(myStoreExternallyCheckBox, ExternalSystemUiUtil.getFillLineConstraints(indentLevel)); @@ -416,6 +431,10 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet settings.setResolveModulePerSourceSet(myResolveModulePerSourceSetCheckBox.isSelected()); } + if (myResolveExternalAnnotationsCheckBox != null) { + settings.setResolveExternalAnnotations(myResolveExternalAnnotationsCheckBox.isSelected()); + } + if (myStoreExternallyCheckBox != null) { settings.setStoreProjectFilesExternally(ThreeState.fromBoolean(myStoreExternallyCheckBox.isSelected())); } @@ -460,6 +479,11 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet return true; } + if (myResolveExternalAnnotationsCheckBox != null && + (myResolveExternalAnnotationsCheckBox.isSelected() != myInitialSettings.isResolveExternalAnnotations())) { + return true; + } + if (myStoreExternallyCheckBox != null && ThreeState.fromBoolean(myStoreExternallyCheckBox.isSelected()) != myInitialSettings.getStoreProjectFilesExternally()) { return true; } @@ -496,6 +520,9 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet if (myResolveModulePerSourceSetCheckBox != null) { myResolveModulePerSourceSetCheckBox.setSelected(settings.isResolveModulePerSourceSet()); } + if (myResolveExternalAnnotationsCheckBox != null) { + myResolveExternalAnnotationsCheckBox.setSelected(settings.isResolveExternalAnnotations()); + } if (myStoreExternallyCheckBox != null) { myStoreExternallyCheckBox.setSelected(settings.getStoreProjectFilesExternally() == ThreeState.YES); } @@ -530,6 +557,9 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet if (myResolveModulePerSourceSetCheckBox != null) { myResolveModulePerSourceSetCheckBox.setSelected(settings.isResolveModulePerSourceSet()); } + if (myResolveExternalAnnotationsCheckBox != null) { + myResolveExternalAnnotationsCheckBox.setSelected(settings.isResolveExternalAnnotations()); + } } @Override diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java index d63336fee280..5a879ba9f693 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java @@ -27,6 +27,7 @@ public class GradleProjectSettings extends ExternalProjectSettings { @Nullable private DistributionType distributionType; private boolean disableWrapperSourceDistributionNotification; private boolean resolveModulePerSourceSet = ExternalSystemApiUtil.isJavaCompatibleIde(); + private boolean resolveExternalAnnotations; @Nullable private CompositeBuild myCompositeBuild; private ThreeState storeProjectFilesExternally = ThreeState.NO; @@ -74,6 +75,14 @@ public class GradleProjectSettings extends ExternalProjectSettings { this.resolveModulePerSourceSet = useIdeModulePerSourceSet; } + public boolean isResolveExternalAnnotations() { + return resolveExternalAnnotations; + } + + public void setResolveExternalAnnotations(boolean resolveExternalAnnotations) { + this.resolveExternalAnnotations = resolveExternalAnnotations; + } + @OptionTag(tag = "compositeConfiguration", nameAttribute = "") @Nullable public CompositeBuild getCompositeBuild() { @@ -94,6 +103,7 @@ public class GradleProjectSettings extends ExternalProjectSettings { result.distributionType = distributionType; result.disableWrapperSourceDistributionNotification = disableWrapperSourceDistributionNotification; result.resolveModulePerSourceSet = resolveModulePerSourceSet; + result.resolveExternalAnnotations = resolveExternalAnnotations; result.myCompositeBuild = myCompositeBuild != null ? myCompositeBuild.copy() : null; return result; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ExternalAnnotationsImporter.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ExternalAnnotationsImporter.kt index f254d7e3fb2d..8ab5d0319fe0 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ExternalAnnotationsImporter.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ExternalAnnotationsImporter.kt @@ -11,16 +11,15 @@ import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.util.registry.Registry import org.jetbrains.idea.maven.model.MavenArtifact -import org.jetbrains.idea.maven.project.MavenProject -import org.jetbrains.idea.maven.project.MavenProjectChanges -import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask -import org.jetbrains.idea.maven.project.MavenProjectsTree +import org.jetbrains.idea.maven.project.* class ExternalAnnotationsImporter : MavenImporter("org.apache.maven.plugins", "maven-compiler-plugin") { private val myProcessedLibraries = hashSetOf() - override fun isApplicable(mavenProject: MavenProject?): Boolean = super.isApplicable(mavenProject) && Registry.`is`("external.system.import.resolve.annotations") + override fun isApplicable(mavenProject: MavenProject?): Boolean { + return super.isApplicable(mavenProject) && Registry.`is`("external.system.import.resolve.annotations") + } override fun processChangedModulesOnly(): Boolean = false override fun process(modifiableModelsProvider: IdeModifiableModelsProvider?, @@ -38,9 +37,12 @@ class ExternalAnnotationsImporter : MavenImporter("org.apache.maven.plugins", "m mavenProject: MavenProject?, changes: MavenProjectChanges?, modifiableModelsProvider: IdeModifiableModelsProvider?) { - if (module == null || mavenProject == null) { + if (module == null + || mavenProject == null + || !MavenProjectsManager.getInstance(module.project).importingSettings.isDownloadAnnotationsAutomatically) { return } + val repoConfig = RemoteRepositoriesConfiguration.getInstance(module.project) val repositories: MutableCollection = hashSetOf().apply { addAll(repoConfig.repositories) } @@ -59,6 +61,10 @@ class ExternalAnnotationsImporter : MavenImporter("org.apache.maven.plugins", "m val project = module.project val librariesMap = mutableMapOf() + if (!MavenProjectsManager.getInstance(project).importingSettings.isDownloadAnnotationsAutomatically) { + return + } + mavenProject.dependencies.forEach { val library = modifiableModelsProvider.getLibraryByName(it.libraryName) if (library != null) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java index 1199d81ccd18..b20634d4e17b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java @@ -50,6 +50,7 @@ public class MavenImportingSettings implements Cloneable { private boolean downloadSourcesAutomatically = false; private boolean downloadDocsAutomatically = false; + private boolean downloadAnnotationsAutomatically = false; private GeneratedSourcesFolder generatedSourcesFolder = GeneratedSourcesFolder.AUTODETECT; @@ -187,6 +188,14 @@ public class MavenImportingSettings implements Cloneable { this.downloadDocsAutomatically = value; } + public boolean isDownloadAnnotationsAutomatically() { + return downloadAnnotationsAutomatically; + } + + public void setDownloadAnnotationsAutomatically(boolean value) { + this.downloadAnnotationsAutomatically = value; + } + @Property @NotNull public GeneratedSourcesFolder getGeneratedSourcesFolder() { @@ -212,6 +221,7 @@ public class MavenImportingSettings implements Cloneable { if (!dependencyTypes.equals(that.dependencyTypes)) return false; if (downloadDocsAutomatically != that.downloadDocsAutomatically) return false; if (downloadSourcesAutomatically != that.downloadSourcesAutomatically) return false; + if (downloadAnnotationsAutomatically != that.downloadAnnotationsAutomatically) return false; if (lookForNested != that.lookForNested) return false; if (keepSourceFolders != that.keepSourceFolders) return false; if (excludeTargetFolder != that.excludeTargetFolder) return false; @@ -247,6 +257,8 @@ public class MavenImportingSettings implements Cloneable { result <<= 1; if (downloadDocsAutomatically) result++; result <<= 1; + if (downloadAnnotationsAutomatically) result++; + result <<= 1; result = 31 * result + (updateFoldersOnImportPhase != null ? updateFoldersOnImportPhase.hashCode() : 0); result = 31 * result + dedicatedModuleDir.hashCode(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form index 055e65320353..c752d31da2da 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form @@ -3,7 +3,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -96,9 +96,17 @@ - + + + + + + + + + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java index f6b85303215d..afa7b2f63037 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java @@ -38,6 +38,7 @@ public class MavenImportingSettingsForm { private JCheckBox myUseMavenOutputCheckBox; private JCheckBox myDownloadSourcesCheckBox; private JCheckBox myDownloadDocsCheckBox; + private JCheckBox myDownloadAnnotationsCheckBox; private JPanel myAdditionalSettingsPanel; private JComboBox myGeneratedSourcesComboBox; @@ -114,6 +115,7 @@ public class MavenImportingSettingsForm { data.setDownloadSourcesAutomatically(myDownloadSourcesCheckBox.isSelected()); data.setDownloadDocsAutomatically(myDownloadDocsCheckBox.isSelected()); + data.setDownloadAnnotationsAutomatically(myDownloadAnnotationsCheckBox.isSelected()); data.setDependencyTypes(myDependencyTypes.getText()); } @@ -145,6 +147,7 @@ public class MavenImportingSettingsForm { myDownloadSourcesCheckBox.setSelected(data.isDownloadSourcesAutomatically()); myDownloadDocsCheckBox.setSelected(data.isDownloadDocsAutomatically()); + myDownloadAnnotationsCheckBox.setSelected(data.isDownloadAnnotationsAutomatically()); myDependencyTypes.setText(data.getDependencyTypes());