From 97877fd693e1fb4e18bfd181e018310fb6cbd2b0 Mon Sep 17 00:00:00 2001 From: Alexander Bubenchikov Date: Fri, 30 Aug 2019 16:56:04 +0300 Subject: [PATCH] IDEA-218044 - added import progress for source/javadoc resolving, fix for "waiting for maven import completion" GitOrigin-RevId: b2b3b0fe3189e46433729211762e9de894db0513 --- .../maven/server/Maven3XServerEmbedder.java | 1 + .../idea/maven/buildtool/MavenSyncConsole.kt | 36 ++++++++++++++++--- .../maven/project/MavenProjectsManager.java | 15 +++++++- .../project/MavenProjectsManagerWatcher.java | 9 +++++ 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java index 09b648cef677..536d5f7d5dc9 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java @@ -1223,6 +1223,7 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder { org.eclipse.aether.resolution.ArtifactResolutionException { final String mavenVersion = getMavenVersion(); + myImporterSpy.setIndicator(myCurrentIndicator); // org.eclipse.aether.RepositorySystem.newResolutionRepositories() method doesn't exist in aether-api-0.9.0.M2.jar used before maven 3.2.5 // see https://youtrack.jetbrains.com/issue/IDEA-140208 for details if (USE_MVN2_COMPATIBLE_DEPENDENCY_RESOLVING || VersionComparatorUtil.compare(mavenVersion, "3.2.5") < 0) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt index 8a02ba11ee6d..05a1092d34c1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt @@ -7,6 +7,7 @@ import com.intellij.build.DefaultBuildDescriptor import com.intellij.build.FilePosition import com.intellij.build.events.EventResult import com.intellij.build.events.MessageEvent +import com.intellij.build.events.MessageEventResult import com.intellij.build.events.impl.* import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType @@ -29,6 +30,8 @@ class MavenSyncConsole(private val myProject: Project) { private var started = false private var hasErrors = false + private val JAVADOC_AND_SOURCE_CLASSIFIERS = setOf("javadoc", "sources", "test-javadoc", "test-sources") + private var myStartedSet = LinkedHashSet>() @Synchronized @@ -172,14 +175,39 @@ class MavenSyncConsole(private val myProject: Project) { @Synchronized private fun downloadEventFailed(keyPrefix: String, dependency: String, error: String, stackTrace: String?) = doIfImportInProcess{ val downloadString = SyncBundle.message("${keyPrefix}.download") + val downloadArtifactString = SyncBundle.message("${keyPrefix}.artifact.download", dependency) - if (stackTrace != null && Registry.`is`("maven.spy.events.debug")) { - addText(downloadArtifactString, stackTrace, false) + if (isJavadocOrSource(dependency)) { + addText(downloadArtifactString, "$dependency not found", true) + completeTask(downloadString, downloadArtifactString, object : MessageEventResult { + override fun getKind(): MessageEvent.Kind { + return MessageEvent.Kind.WARNING + } + + override fun getDetails(): String? { + return "$dependency not found" + } + }) + } else { - addText(downloadArtifactString, error, true) + if (stackTrace != null && Registry.`is`("maven.spy.events.debug")) { + addText(downloadArtifactString, stackTrace, false) + } + else { + addText(downloadArtifactString, error, true) + } + completeTask(downloadString, downloadArtifactString, FailureResultImpl(error)) } - completeTask(downloadString, downloadArtifactString, FailureResultImpl(error)) + } + + private fun isJavadocOrSource(dependency: String): Boolean { + val split = dependency.split(':') + if (split.size < 4) { + return false + } + val classifier = split.get(2) + return JAVADOC_AND_SOURCE_CLASSIFIERS.contains(classifier) } private inline fun doIfImportInProcess(action: () -> Unit) { 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 6747f57fdb09..5e743424ba7f 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 @@ -117,6 +117,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent private MavenSyncConsole mySyncConsole; private final MavenMergingUpdateQueue mySaveQueue; private static final int SAVE_DELAY = 1000; + private volatile AsyncPromise> myRunningImportPromise; public static MavenProjectsManager getInstance(@NotNull Project project) { return project.getComponent(MavenProjectsManager.class); @@ -153,6 +154,10 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent public void dispose() { } + public AsyncPromise> getRunningImportPromise() { + return myRunningImportPromise; + } + public ModificationTracker getModificationTracker() { return myModificationTracker; } @@ -878,10 +883,17 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent } public Promise> scheduleImportAndResolve(boolean fromAutoImport) { + Promise> toCheck = myRunningImportPromise; + if(toCheck != null){ + return toCheck; + } getSyncConsole().startImport(mySyncViewManager, fromAutoImport); MavenSyncConsole console = getSyncConsole(); AsyncPromise> promise = scheduleResolve(); - promise.onProcessed(m -> completeMavenSyncOnImportCompletion(console)); + myRunningImportPromise = promise; + promise.onProcessed(m -> { + completeMavenSyncOnImportCompletion(console); + }); fireImportAndResolveScheduled(); return promise; } @@ -908,6 +920,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent myPostProcessor.waitForCompletion(); } console.finishImport(); + myRunningImportPromise = null; }); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java index 34ea7ff6fcac..c022ae97e82e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java @@ -269,6 +269,15 @@ public class MavenProjectsManagerWatcher { boolean force, final boolean forceImportAndResolve) { final AsyncPromise promise = new AsyncPromise<>(); + if (!forceImportAndResolve) { + AsyncPromise> runningPromise = myManager.getRunningImportPromise(); + if (runningPromise != null) { + runningPromise.onSuccess(ignore -> promise.setResult(null)).onError(e -> promise.setError(e)); + return promise; + } + } + + Runnable onCompletion = createScheduleImportAction(forceImportAndResolve, promise); if (LOG.isDebugEnabled()) {