From 7a7b2f2cacdccadc68907c6c23e4b07e0c18d2b2 Mon Sep 17 00:00:00 2001 From: Alexander Bubenchikov Date: Tue, 19 Dec 2023 11:55:07 +0100 Subject: [PATCH] [maven][IDEA-330932] fixes for dummy import GitOrigin-RevId: 627b1c8b288550a580047a9d4ece826c94a6959f --- .../maven/project/MavenProjectsManagerEx.kt | 15 +++++-- .../idea/maven/project/MavenProjectsTree.kt | 39 ++++++++++++++++++- .../maven/project/actions/ReimportAction.java | 9 +++-- .../preimport/MavenProjectPreImporter.kt | 14 +++---- .../project/preimport/PreimportResult.kt | 13 +++++++ .../maven/importing/MavenPreimportingTest.kt | 2 +- .../testFramework/MavenImportingTestCase.kt | 2 +- 7 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/PreimportResult.kt diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt index 7e3692d1f304..ae2c9911b1c0 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt @@ -310,14 +310,21 @@ open class MavenProjectsManagerEx(project: Project) : MavenProjectsManager(proje console.startImport(spec) if (MavenUtil.enablePreimport()) { val result = console.runTask(MavenProjectBundle.message("maven.project.preimporting")) { - return@runTask MavenProjectPreImporter.getInstance(myProject).preimport( - projectsTree.rootProjectsFiles, modelsProvider, importingSettings, generalSettings, syncActivity) + return@runTask MavenProjectPreImporter.getInstance(myProject) + .preimport( + projectsTree.existingManagedFiles, + modelsProvider, + importingSettings, + generalSettings, + !project.isTrusted(), + syncActivity) } - if (MavenUtil.enablePreimportOnly()) return result + if (MavenUtil.enablePreimportOnly()) return result.modules if (!project.isTrusted()) { + projectsTree.updater().copyFrom(result.projectTree) showUntrustedProjectNotification(myProject) - return result + return result.modules } } val readingResult = readMavenProjectsActivity(syncActivity) { read() } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt index 2493230e2947..021ef3b88af3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt @@ -375,7 +375,9 @@ class MavenProjectsTree(val project: Project) { } @ApiStatus.Internal - suspend fun updateAll(force: Boolean, generalSettings: MavenGeneralSettings, progressReporter: RawProgressReporter): MavenProjectsTreeUpdateResult { + suspend fun updateAll(force: Boolean, + generalSettings: MavenGeneralSettings, + progressReporter: RawProgressReporter): MavenProjectsTreeUpdateResult { val managedFiles = existingManagedFiles val explicitProfiles = explicitProfiles @@ -1069,6 +1071,41 @@ class MavenProjectsTree(val project: Project) { }) return this } + + fun copyFrom(projectTree: MavenProjectsTree): Updater { + + addFrom(projectTree) { it.myManagedFilesPaths } + addFrom(projectTree) { it.myRootProjects } + + addFromMap(projectTree) { it.myMavenIdToProjectMapping } + addFromMap(projectTree) { it.myVirtualFileToProjectMapping } + addFromMap(projectTree) { it.myAggregatorToModuleMapping } + addFromMap(projectTree) { it.myModuleToAggregatorMapping } + + return this + } + + private fun addFrom(projectTree: MavenProjectsTree, getter: (MavenProjectsTree) -> MutableCollection) { + val my = getter(this@MavenProjectsTree) + val theirs = getter(projectTree) + if (my.isEmpty()) { + my.addAll(theirs) + } + else { + val set = LinkedHashSet() + set.addAll(my) + set.addAll(theirs) + my.clear() + my.addAll(set.toList()) + } + } + + private fun addFromMap(projectTree: MavenProjectsTree, getter: (MavenProjectsTree) -> MutableMap) { + val my = getter(this@MavenProjectsTree) + val theirs = getter(projectTree) + my.putAll(theirs) + } + } companion object { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ReimportAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ReimportAction.java index d8ba88d8ab07..c3cf99ab8971 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ReimportAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ReimportAction.java @@ -2,6 +2,7 @@ package org.jetbrains.idea.maven.project.actions; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.externalSystem.service.project.trusted.ExternalSystemTrustedProjectDialog; import com.intellij.openapi.fileEditor.FileDocumentManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.project.MavenProjectsManager; @@ -14,11 +15,11 @@ public class ReimportAction extends MavenProjectsManagerAction { return MavenActionUtil.hasProject(e.getDataContext()); } + @SuppressWarnings("deprecation") @Override protected void perform(@NotNull MavenProjectsManager manager) { - if (MavenUtil.isProjectTrustedEnoughToImport(manager.getProject())) { - FileDocumentManager.getInstance().saveAllDocuments(); - manager.forceUpdateAllProjectsOrFindAllAvailablePomFiles(); - } + ExternalSystemTrustedProjectDialog.confirmLoadingUntrustedProject(manager.getProject(), MavenUtil.SYSTEM_ID); + FileDocumentManager.getInstance().saveAllDocuments(); + manager.forceUpdateAllProjectsOrFindAllAvailablePomFiles(); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectPreImporter.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectPreImporter.kt index af5ff480fbbe..899236d444b3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectPreImporter.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/MavenProjectPreImporter.kt @@ -8,7 +8,6 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr import com.intellij.openapi.externalSystem.service.project.ProjectDataManager import com.intellij.openapi.externalSystem.statistics.ProjectImportCollector import com.intellij.openapi.externalSystem.statistics.ProjectImportCollector.PREIMPORT_ACTIVITY -import com.intellij.openapi.module.Module import com.intellij.openapi.progress.blockingContext import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry @@ -45,7 +44,8 @@ class MavenProjectPreImporter(val project: Project, val coroutineScope: Coroutin optionalModelsProvider: IdeModifiableModelsProvider?, importingSettings: MavenImportingSettings, generalSettings: MavenGeneralSettings, - parentActivity: StructuredIdeActivity): List { + reimportExistingFiles: Boolean, + parentActivity: StructuredIdeActivity): PreimportResult { val activity = PREIMPORT_ACTIVITY.startedWithParent(project, parentActivity) @@ -56,7 +56,7 @@ class MavenProjectPreImporter(val project: Project, val coroutineScope: Coroutin val forest = rootProjectFiles.map { scope.preimport(it) }.awaitAll().filterNotNull() - if (forest.isEmpty()) return emptyList() + if (forest.isEmpty()) return PreimportResult.empty(project) val projectTree = MavenProjectsTree(project) @@ -71,7 +71,7 @@ class MavenProjectPreImporter(val project: Project, val coroutineScope: Coroutin allProjects.addAll(tree.projects()) tree.root?.let(roots::add) - if (existingTree == null) { + if (existingTree == null || reimportExistingFiles) { projectChanges.putAll(tree.projects().associateWith { MavenProjectChanges.ALL }) } else { @@ -89,7 +89,7 @@ class MavenProjectPreImporter(val project: Project, val coroutineScope: Coroutin val modelsProvider = optionalModelsProvider ?: ProjectDataManager.getInstance().createModifiableModelsProvider(project) // MavenProjectsManager.getInstance(project).projectsTree = projectTree - return withBackgroundProgress(project, MavenProjectBundle.message("maven.project.importing"), false) { + return PreimportResult(withBackgroundProgress(project, MavenProjectBundle.message("maven.project.importing"), false) { blockingContext { val importer = MavenProjectImporter.createImporter(project, projectTree, projectChanges, @@ -103,11 +103,11 @@ class MavenProjectPreImporter(val project: Project, val coroutineScope: Coroutin return@blockingContext importer.createdModules() } - } + }, projectTree) } catch (e: Throwable) { MavenLog.LOG.error(e) - return emptyList() + return PreimportResult.empty(project) } finally { activity.finished { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/PreimportResult.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/PreimportResult.kt new file mode 100644 index 000000000000..c4793a182e0f --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/preimport/PreimportResult.kt @@ -0,0 +1,13 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.idea.maven.project.preimport + +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project +import org.jetbrains.idea.maven.project.MavenProjectsTree + + +class PreimportResult(val modules: List, val projectTree: MavenProjectsTree) { + companion object { + fun empty(project: Project): PreimportResult = PreimportResult(emptyList(), MavenProjectsTree(project)) + } +} \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPreimportingTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPreimportingTest.kt index 6474a0691cd3..84954e23088c 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPreimportingTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPreimportingTest.kt @@ -522,7 +522,7 @@ class MavenPreimportingTest : MavenMultiVersionImportingTestCase() { val activity = ProjectImportCollector.IMPORT_ACTIVITY.started(myProject) try { MavenProjectPreImporter.getInstance(myProject) - .preimport(files, null, mavenImporterSettings, mavenGeneralSettings, activity) + .preimport(files, null, mavenImporterSettings, mavenGeneralSettings,true, activity) } finally { activity.finished() diff --git a/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.kt b/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.kt index a52d729ec73a..a6c35b304d5b 100644 --- a/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.kt +++ b/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.kt @@ -392,7 +392,7 @@ abstract class MavenImportingTestCase : MavenTestCase() { val activity = ProjectImportCollector.IMPORT_ACTIVITY.started(myProject) try { MavenProjectPreImporter.getInstance(myProject) - .preimport(files, null, mavenImporterSettings, mavenGeneralSettings, activity) + .preimport(files, null, mavenImporterSettings, mavenGeneralSettings, true, activity) } finally { activity.finished()