IDEA-218044 - added import progress for source/javadoc resolving, fix for "waiting for maven import completion"

GitOrigin-RevId: b2b3b0fe3189e46433729211762e9de894db0513
This commit is contained in:
Alexander Bubenchikov
2019-08-30 16:56:04 +03:00
committed by intellij-monorepo-bot
parent 39f405bc27
commit 97877fd693
4 changed files with 56 additions and 5 deletions

View File

@@ -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) {

View File

@@ -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<Pair<Any, String>>()
@Synchronized
@@ -172,7 +175,22 @@ 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 (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 {
if (stackTrace != null && Registry.`is`("maven.spy.events.debug")) {
addText(downloadArtifactString, stackTrace, false)
}
@@ -181,6 +199,16 @@ class MavenSyncConsole(private val myProject: Project) {
}
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) {
if (!started || finished) return

View File

@@ -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<List<Module>> 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<List<Module>> getRunningImportPromise() {
return myRunningImportPromise;
}
public ModificationTracker getModificationTracker() {
return myModificationTracker;
}
@@ -878,10 +883,17 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
}
public Promise<List<Module>> scheduleImportAndResolve(boolean fromAutoImport) {
Promise<List<Module>> toCheck = myRunningImportPromise;
if(toCheck != null){
return toCheck;
}
getSyncConsole().startImport(mySyncViewManager, fromAutoImport);
MavenSyncConsole console = getSyncConsole();
AsyncPromise<List<Module>> 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;
});
}

View File

@@ -269,6 +269,15 @@ public class MavenProjectsManagerWatcher {
boolean force,
final boolean forceImportAndResolve) {
final AsyncPromise<Void> promise = new AsyncPromise<>();
if (!forceImportAndResolve) {
AsyncPromise<List<Module>> 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()) {