Don't ignore exceptions that occur after models are fetched.

This change fixes an issue where exceptions that occured after the
models have been fetched (during task running) were not handed back to
the GradleProjectResolverExtensions.

In this change we pass all GradleConnectionExceptions that occurs during
the Gradle build to the resolvers via the buildFinished(Exception)
callback. This will be a super set of the exceptions that can be thrown
during fetching the modesl (as exceptions from tasks are not included
there).

Note: For Gradle versions <1.8 we don't pass the exception to the
buildFinished callback, since there it is not possible to run tasks via
the tooling API in these versions this is safe.

Signed-off-by: Nikita Skvortsov <nikita.skvortsov@jetbrains.com>

GitOrigin-RevId: ae7c6db0a985e438093ac860bd32b8c3c546e3e8
This commit is contained in:
Bradley Smith
2019-07-02 06:52:16 +03:00
committed by intellij-monorepo-bot
parent 9e8247c682
commit e6f7fcff8f
4 changed files with 15 additions and 13 deletions
@@ -1,11 +1,7 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.service.project
import org.gradle.tooling.BuildActionExecuter
import org.gradle.tooling.GradleConnectionException
import org.gradle.tooling.IntermediateResultHandler
import org.gradle.tooling.ResultHandler
import org.gradle.tooling.UnsupportedVersionException
import org.gradle.tooling.*
import org.gradle.tooling.model.idea.BasicIdeaProject
import org.gradle.tooling.model.idea.IdeaProject
import org.jetbrains.plugins.gradle.model.ProjectImportAction
@@ -14,6 +10,7 @@ import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
import java.util.concurrent.ArrayBlockingQueue
import java.util.concurrent.TimeUnit
import java.util.function.Consumer
/**
* This class handles setting up and running the [BuildActionExecuter] it deals with calling the correct APIs based on the version of
@@ -63,7 +60,7 @@ class BuildActionRunner(
* [settings].
*/
fun fetchModels(
buildFinishedCallBack: Runnable
buildFinishedCallBack: Consumer<GradleConnectionException?>
): AllModels {
// First try with the phased build executor
createPhasedExecuter().run(BuildActionResultHandler(buildFinishedCallBack))
@@ -99,7 +96,7 @@ class BuildActionRunner(
resolverCtx.connection,
resolverCtx.listener)
buildFinishedCallBack.run()
buildFinishedCallBack.accept(null)
return ProjectImportAction.AllModels(modelBuilder.get())
}
@@ -138,10 +135,11 @@ class BuildActionRunner(
resolverCtx.listener, resolverCtx.connection)
private inner class BuildActionResultHandler(
val buildFinishedCallBack: Runnable
val buildFinishedCallBack: Consumer<GradleConnectionException?>
): ResultHandler<Any> {
override fun onFailure(connectionException: GradleConnectionException?) {
resultQueue.add(connectionException)
buildFinishedCallBack.accept(connectionException)
}
/**
@@ -153,7 +151,7 @@ class BuildActionRunner(
if (allModels != null) {
resultQueue.add(allModels)
}
buildFinishedCallBack.run()
buildFinishedCallBack.accept(null)
}
}
}
@@ -260,9 +260,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad
final long startTime = System.currentTimeMillis();
ProjectImportAction.AllModels allModels;
try {
allModels = buildActionRunner.fetchModels(() -> {
allModels = buildActionRunner.fetchModels((exception) -> {
for (GradleProjectResolverExtension resolver = tracedResolverChain; resolver != null; resolver = resolver.getNext()) {
resolver.buildFinished();
resolver.buildFinished(exception);
}
});
performanceTrace.addTrace(allModels.getPerformanceTrace());
@@ -25,6 +25,7 @@ import com.intellij.openapi.externalSystem.model.task.TaskData;
import com.intellij.openapi.externalSystem.service.ParametersEnhancer;
import com.intellij.openapi.util.Pair;
import com.intellij.util.Consumer;
import org.gradle.tooling.GradleConnectionException;
import org.gradle.tooling.model.build.BuildEnvironment;
import org.gradle.tooling.model.idea.IdeaModule;
import org.gradle.tooling.model.idea.IdeaProject;
@@ -150,10 +151,12 @@ public interface GradleProjectResolverExtension extends ParametersEnhancer {
* Called once Gradle has finished executing everything, including any tasks that might need to be run. The models are obtained
* separately and in some cases before this method is called.
*
* @param exception the exception thrown by Gradle, if everything completes successfully then this will be null.
*
* Note: This method is called from a Gradle connection thread, within the {@link org.gradle.tooling.ResultHandler} passed to the
* tooling api.
*/
default void buildFinished() { }
default void buildFinished(@Nullable GradleConnectionException exception) { }
/**
* Allows extension to contribute to init script
@@ -4,6 +4,7 @@ package org.jetbrains.plugins.gradle.importing
import com.intellij.openapi.extensions.Extensions
import org.assertj.core.api.Assertions.assertThat
import org.gradle.tooling.BuildController
import org.gradle.tooling.GradleConnectionException
import org.gradle.tooling.model.idea.IdeaModule
import org.gradle.tooling.model.idea.IdeaProject
import org.jetbrains.plugins.gradle.model.ProjectImportExtraModelProvider
@@ -102,7 +103,7 @@ class TestProjectResolverExtension : AbstractProjectResolverExtension() {
}
override fun buildFinished() {
override fun buildFinished(exception: GradleConnectionException?) {
lastBuildFinished.complete(true)
}