From 40b82f500ec5648525f9429969ec8bbdb8fd7828 Mon Sep 17 00:00:00 2001 From: Dmitry Kichinsky Date: Sun, 21 May 2023 18:48:35 +0200 Subject: [PATCH] [maven] IDEA-313767 refactoring: MavenProjectsManagerEx GitOrigin-RevId: 5079a02d3a497806baea7c23afd6515b23fe111e --- .../idea/maven/project/MavenFolderResolver.kt | 2 +- .../maven/project/MavenProjectsManager.java | 49 ++----- .../maven/project/MavenProjectsManagerEx.kt | 133 ++++++++++++++++++ .../project/MavenProjectsManagerImporter.kt | 99 ------------- .../maven/wizards/MavenProjectBuilder.java | 4 +- .../src/main/resources/META-INF/plugin.xml | 3 +- .../importing/DependenciesSubstitutionTest.kt | 2 +- .../maven/importing/MavenPerformanceTest.java | 6 +- .../maven/importing/MiscImportingTest.java | 2 +- .../indices/MavenMultiProjectImportTest.java | 2 +- .../maven/wizards/MavenImportWizardTest.java | 2 +- .../wizards/MavenNewProjectWizardTestCase.kt | 2 +- .../testFramework/MavenImportingTestCase.java | 2 +- 13 files changed, 161 insertions(+), 147 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerImporter.kt diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenFolderResolver.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenFolderResolver.kt index 3a8b98462876..3e136eb11ae5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenFolderResolver.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenFolderResolver.kt @@ -54,7 +54,7 @@ class MavenFolderResolver(private val project: Project) { } if (projectsManager.hasScheduledProjects()) { - projectsManager.importProjects() + projectsManager.importMavenProjectsSync() //myProjectsManager.fireProjectImportCompleted() } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index e2e6f5a651f3..1cb83d2e1353 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -13,8 +13,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.State; -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; -import com.intellij.openapi.externalSystem.service.project.ProjectDataManager; import com.intellij.openapi.externalSystem.service.project.autoimport.ExternalSystemProjectsWatcherImpl; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; @@ -83,8 +81,8 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; @State(name = "MavenProjectsManager") -public class MavenProjectsManager extends MavenSimpleProjectComponent - implements PersistentStateComponent, SettingsSavingComponentJavaAdapter, Disposable { +public abstract class MavenProjectsManager extends MavenSimpleProjectComponent + implements PersistentStateComponent, SettingsSavingComponentJavaAdapter, Disposable, MavenAsyncProjectsManager { private static final int IMPORT_DELAY = 1000; private final ReentrantLock initLock = new ReentrantLock(); @@ -105,11 +103,11 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent private MavenProjectsProcessor myArtifactsDownloadingProcessor; private MavenProjectsProcessor myPostProcessor; - private MavenMergingUpdateQueue myImportingQueue; - private final ConcurrentHashMap myProjectsToImport = new ConcurrentHashMap<>(); + protected MavenMergingUpdateQueue myImportingQueue; + protected final ConcurrentHashMap<@NotNull MavenProject, @NotNull MavenProjectChanges> myProjectsToImport = new ConcurrentHashMap<>(); private final Set myProjectsToResolve = ConcurrentHashMap.newKeySet(); - private final AtomicBoolean myImportModuleGroupsRequired = new AtomicBoolean(false); + protected final AtomicBoolean myImportModuleGroupsRequired = new AtomicBoolean(false); private final EventDispatcher myProjectsTreeDispatcher = EventDispatcher.create(MavenProjectsTree.Listener.class); @@ -122,7 +120,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent private final AtomicReference mySyncConsole = new AtomicReference<>(); private final MavenMergingUpdateQueue mySaveQueue; private static final int SAVE_DELAY = 1000; - private Module myPreviewModule; + protected Module myPreviewModule; private transient boolean forceUpdateSnapshots = false; public static MavenProjectsManager getInstance(@NotNull Project project) { @@ -1166,7 +1164,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent runWhenFullyOpen(() -> myImportingQueue.queue(new Update(this) { @Override public void run() { - result.setResult(importProjects()); + result.setResult(importMavenProjectsSync()); fireProjectImportCompleted(); } })); @@ -1182,7 +1180,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent project -> new Pair<>(project, MavenProjectChanges.ALL) ); myProjectsToImport.putAll(projectsToImport); - importProjects(); + importMavenProjectsSync(); fireProjectImportCompleted(); } })); @@ -1316,32 +1314,13 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent }); } + /** + * @deprecated Use {@link #importMavenProjectsSync()}} + */ + @Deprecated + // used in third-party plugins public List importProjects() { - return importProjects(ProjectDataManager.getInstance().createModifiableModelsProvider(myProject)); - } - - public List importProjects(IdeModifiableModelsProvider modelsProvider) { - Map projectsToImportWithChanges; - boolean importModuleGroupsRequired; - - projectsToImportWithChanges = Collections.unmodifiableMap(new LinkedHashMap<>(myProjectsToImport)); - projectsToImportWithChanges.forEach(myProjectsToImport::remove); - - importModuleGroupsRequired = myImportModuleGroupsRequired.getAndSet(false); - - return new MavenProjectsManagerImporter( - modelsProvider, - projectsToImportWithChanges, - importModuleGroupsRequired - ).importMavenProjectsBlocking(this); - } - - void restartImportingQueueTimer() { - myImportingQueue.restartTimer(); - } - - Module getPreviewModule() { - return myPreviewModule; + return importMavenProjectsSync(); } @ApiStatus.Internal 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 new file mode 100644 index 000000000000..42ac6e481b6d --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerEx.kt @@ -0,0 +1,133 @@ +// 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 + +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.writeAction +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider +import com.intellij.openapi.externalSystem.service.project.ProjectDataManager +import com.intellij.openapi.externalSystem.statistics.ProjectImportCollector +import com.intellij.openapi.externalSystem.statistics.importActivityStarted +import com.intellij.openapi.module.Module +import com.intellij.openapi.progress.impl.CoreProgressManager +import com.intellij.openapi.progress.withBackgroundProgress +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.util.concurrency.annotations.RequiresBackgroundThread +import com.intellij.util.concurrency.annotations.RequiresBlockingContext +import com.intellij.util.concurrency.annotations.RequiresEdt +import org.jetbrains.annotations.ApiStatus +import org.jetbrains.idea.maven.importing.MavenImportStats +import org.jetbrains.idea.maven.importing.MavenProjectImporter +import org.jetbrains.idea.maven.utils.MavenUtil +import org.jetbrains.idea.maven.utils.runBlockingCancellableUnderIndicator +import java.util.* + +@ApiStatus.Experimental +interface MavenAsyncProjectsManager { + suspend fun importMavenProjects(): List + fun importMavenProjectsSync(): List + fun importMavenProjectsSync(modelsProvider: IdeModifiableModelsProvider): List +} + +open class MavenProjectsManagerEx(project: Project) : MavenProjectsManager(project) { + override suspend fun importMavenProjects(): List { + TODO("Not yet implemented") + } + + override fun importMavenProjectsSync(): List { + return importMavenProjectsSync(ProjectDataManager.getInstance().createModifiableModelsProvider(myProject)) + } + + override fun importMavenProjectsSync(modelsProvider: IdeModifiableModelsProvider): List { + val projectsToImportWithChanges = Collections.unmodifiableMap(LinkedHashMap(myProjectsToImport)) + projectsToImportWithChanges.forEach { (key: MavenProject, value: MavenProjectChanges) -> + myProjectsToImport.remove(key, value) + } + val importModuleGroupsRequired = myImportModuleGroupsRequired.getAndSet(false) + return MavenProjectsManagerImporter( + modelsProvider, + projectsToImportWithChanges, + importModuleGroupsRequired + ).importMavenProjectsBlocking() + } + + private data class ImportResult(val createdModules: List, val postTasks: List) + + private inner class MavenProjectsManagerImporter(private val modelsProvider: IdeModifiableModelsProvider, + private val projectsToImportWithChanges: Map, + private val importModuleGroupsRequired: Boolean) { + private val title = MavenProjectBundle.message("maven.project.importing") + + @RequiresBlockingContext + fun importMavenProjectsBlocking(): List { + val importer = this + if (ApplicationManager.getApplication().isDispatchThread) { + return importer.importMavenProjectsEdt() + } + else { + return runBlockingCancellableUnderIndicator { importMavenProjects() } + } + } + + @RequiresEdt + fun importMavenProjectsEdt(): List { + val createdModules = this.doImport() + VirtualFileManager.getInstance().syncRefresh() + return createdModules + } + + @RequiresBackgroundThread + suspend fun importMavenProjects(): List { + return withBackgroundProgress(project, title, false) { + val createdModules = doImport() + val fm = VirtualFileManager.getInstance() + val noBackgroundMode = MavenUtil.isNoBackgroundMode() + val shouldKeepTasksAsynchronousInHeadlessMode = CoreProgressManager.shouldKeepTasksAsynchronousInHeadlessMode() + if (noBackgroundMode && !shouldKeepTasksAsynchronousInHeadlessMode) { + writeAction { + fm.syncRefresh() + } + } + else { + fm.asyncRefresh() + } + return@withBackgroundProgress createdModules + } + } + + private fun doImport(): List { + project.messageBus.syncPublisher(MavenImportListener.TOPIC).importStarted() + + val importResult = this.runImportActivity() + + schedulePostImportTasks(importResult.postTasks) + + // do not block user too often + myImportingQueue.restartTimer(); + + val createdModules = importResult.createdModules + + project.messageBus.syncPublisher(MavenImportListener.TOPIC).importFinished(projectsToImportWithChanges.keys, createdModules) + + return createdModules + } + + private fun runImportActivity(): ImportResult { + val activity = importActivityStarted(project, MavenUtil.SYSTEM_ID) { + listOf(ProjectImportCollector.TASK_CLASS.with(MavenImportStats.ImportingTaskOld::class.java)) + } + try { + val projectImporter = MavenProjectImporter.createImporter( + project, projectsTree, projectsToImportWithChanges, importModuleGroupsRequired, + modelsProvider, importingSettings, myPreviewModule, activity + ) + val postTasks = projectImporter.importProject() + return ImportResult(projectImporter.createdModules(), postTasks ?: emptyList()) + } + finally { + activity.finished() + } + } + } + +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerImporter.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerImporter.kt deleted file mode 100644 index ae4818c4e080..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerImporter.kt +++ /dev/null @@ -1,99 +0,0 @@ -// 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 - -import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.writeAction -import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider -import com.intellij.openapi.externalSystem.statistics.ProjectImportCollector -import com.intellij.openapi.externalSystem.statistics.importActivityStarted -import com.intellij.openapi.module.Module -import com.intellij.openapi.progress.impl.CoreProgressManager -import com.intellij.openapi.progress.withBackgroundProgress -import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.util.concurrency.annotations.RequiresBackgroundThread -import com.intellij.util.concurrency.annotations.RequiresBlockingContext -import com.intellij.util.concurrency.annotations.RequiresEdt -import org.jetbrains.idea.maven.importing.MavenImportStats.ImportingTaskOld -import org.jetbrains.idea.maven.importing.MavenProjectImporter.Companion.createImporter -import org.jetbrains.idea.maven.utils.MavenUtil -import org.jetbrains.idea.maven.utils.runBlockingCancellableUnderIndicator - -internal class MavenProjectsManagerImporter(private val modelsProvider: IdeModifiableModelsProvider, - private val projectsToImportWithChanges: Map, - private val importModuleGroupsRequired: Boolean) { - private val title = MavenProjectBundle.message("maven.project.importing") - - @RequiresBlockingContext - fun MavenProjectsManager.importMavenProjectsBlocking(): List { - val importer = this - if (ApplicationManager.getApplication().isDispatchThread) { - return importer.importMavenProjectsEdt() - } - else { - return runBlockingCancellableUnderIndicator { importer.importMavenProjects() } - } - } - - @RequiresEdt - fun MavenProjectsManager.importMavenProjectsEdt(): List { - val createdModules = this.doImport() - VirtualFileManager.getInstance().syncRefresh() - return createdModules - } - - @RequiresBackgroundThread - suspend fun MavenProjectsManager.importMavenProjects(): List { - val manager = this - return withBackgroundProgress(project, title, false) { - val createdModules = manager.doImport() - val fm = VirtualFileManager.getInstance() - val noBackgroundMode = MavenUtil.isNoBackgroundMode() - val shouldKeepTasksAsynchronousInHeadlessMode = CoreProgressManager.shouldKeepTasksAsynchronousInHeadlessMode() - if (noBackgroundMode && !shouldKeepTasksAsynchronousInHeadlessMode) { - writeAction { - fm.syncRefresh() - } - } - else { - fm.asyncRefresh() - } - return@withBackgroundProgress createdModules - } - } - - private fun MavenProjectsManager.doImport(): List { - project.messageBus.syncPublisher(MavenImportListener.TOPIC).importStarted() - - val importResult = this.runImportActivity() - - schedulePostImportTasks(importResult.postTasks) - - // do not block user too often - restartImportingQueueTimer() - - val createdModules = importResult.createdModules - - project.messageBus.syncPublisher(MavenImportListener.TOPIC).importFinished(projectsToImportWithChanges.keys, createdModules) - - return createdModules - } - - private data class ImportResult(val createdModules: List, val postTasks: List) - - private fun MavenProjectsManager.runImportActivity(): ImportResult { - val activity = importActivityStarted(project, MavenUtil.SYSTEM_ID) { - listOf(ProjectImportCollector.TASK_CLASS.with(ImportingTaskOld::class.java)) - } - try { - val projectImporter = createImporter( - project, projectsTree, projectsToImportWithChanges, importModuleGroupsRequired, - modelsProvider, importingSettings, previewModule, activity - ) - val postTasks = projectImporter.importProject() - return ImportResult(projectImporter.createdModules(), postTasks ?: emptyList()) - } - finally { - activity.finished() - } - } -} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java index 44d35342e873..82db55167e06 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java @@ -258,10 +258,10 @@ public final class MavenProjectBuilder extends ProjectImportBuilder createdModules; if (isFromUI) { var modelsProvider = new IdeUIModifiableModelsProvider(project, model, (ModulesConfigurator)modulesProvider, artifactModel); - createdModules = manager.importProjects(modelsProvider); + createdModules = manager.importMavenProjectsSync(modelsProvider); } else { - createdModules = manager.importProjects(); + createdModules = manager.importMavenProjectsSync(); } return createdModules; } diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index bd33610aef0f..d36509d461e2 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -100,7 +100,8 @@ - + diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesSubstitutionTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesSubstitutionTest.kt index 4bdba8e769aa..3c57ffb88eeb 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesSubstitutionTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesSubstitutionTest.kt @@ -74,7 +74,7 @@ open class DependenciesSubstitutionTest : MavenMultiVersionImportingTestCase() { ApplicationManager.getApplication().invokeAndWait { myProjectsManager.waitForResolvingCompletion() myProjectsManager.scheduleImportInTests(files) - myProjectsManager.importProjects() + myProjectsManager.importMavenProjectsSync() } } } \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPerformanceTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPerformanceTest.java index 14a3cb88018d..9d88018b62df 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPerformanceTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenPerformanceTest.java @@ -30,14 +30,14 @@ public abstract class MavenPerformanceTest extends MavenMultiVersionImportingTes @Test public void testImporting() { waitForReadingCompletion(); - measure(8, () -> myProjectsManager.importProjects()); + measure(8, () -> myProjectsManager.importMavenProjectsSync()); } @Test public void testReImporting() { waitForReadingCompletion(); - myProjectsManager.importProjects(); - measure(2, () -> myProjectsManager.importProjects()); + myProjectsManager.importMavenProjectsSync(); + measure(2, () -> myProjectsManager.importMavenProjectsSync()); } @Test diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java index 164af35970bf..ea42de28bb9e 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java @@ -484,7 +484,7 @@ public class MiscImportingTest extends MavenMultiVersionImportingTestCase { assertModules("project", "m1", "m2"); myProjectsManager.scheduleImportInTests(myProjectsManager.getProjectsFiles()); - myProjectsManager.importProjects(new IdeModifiableModelsProviderImpl(myProject) { + myProjectsManager.importMavenProjectsSync(new IdeModifiableModelsProviderImpl(myProject) { @Override public void commit() { ModifiableModuleModel model = ModuleManager.getInstance(myProject).getModifiableModel(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenMultiProjectImportTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenMultiProjectImportTest.java index e2fcae761712..e7d2e659fea7 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenMultiProjectImportTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenMultiProjectImportTest.java @@ -77,7 +77,7 @@ public class MavenMultiProjectImportTest extends ProjectWizardTestCase { manager.scheduleImportInTests(Collections.singletonList(file)); - manager.importProjects(); + manager.importMavenProjectsSync(); }); Promise promise = manager.waitForImportCompletion(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenImportWizardTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenImportWizardTest.java index be668b7ba8fb..9b105adbca87 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenImportWizardTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenImportWizardTest.java @@ -212,7 +212,7 @@ public class MavenImportWizardTest extends ProjectWizardTestCase { manager.scheduleImportInTests(Collections.singletonList(file)); - manager.importProjects(); + manager.importMavenProjectsSync(); }); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenNewProjectWizardTestCase.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenNewProjectWizardTestCase.kt index 647b2dccd0d9..e46a0568c7d2 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenNewProjectWizardTestCase.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenNewProjectWizardTestCase.kt @@ -80,7 +80,7 @@ abstract class MavenNewProjectWizardTestCase : NewProjectWizardTestCase() { manager.waitForImportCompletion() ApplicationManager.getApplication().invokeAndWait { manager.scheduleImportInTests(listOf(file)) - manager.importProjects() + manager.importMavenProjectsSync() } } val promise = manager.waitForImportCompletion() diff --git a/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.java b/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.java index 98d1af77e879..fdce232b8094 100644 --- a/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.java +++ b/plugins/maven/testFramework/src/com/intellij/maven/testFramework/MavenImportingTestCase.java @@ -520,7 +520,7 @@ public abstract class MavenImportingTestCase extends MavenTestCase { ApplicationManager.getApplication().invokeAndWait(() -> { myProjectsManager.scheduleImportInTests(files); }); - myProjectsManager.importProjects(); + myProjectsManager.importMavenProjectsSync(); Promise promise = myProjectsManager.waitForImportCompletion(); ApplicationManager.getApplication().invokeAndWait(() -> PlatformTestUtil.waitForPromise(promise));