From b91293060d649ee60c8b0b96fa4ae1e4d42995c6 Mon Sep 17 00:00:00 2001 From: Reinhold Degenfellner Date: Wed, 17 Apr 2024 12:48:58 +0200 Subject: [PATCH] Add problem collection to org.gradle.internal.enterprise.GradleEnterprisePluginEndOfBuildListener.BuildResult --- .../GradleEnterprisePluginEndOfBuildListener.java | 5 +++++ .../impl/DefaultGradleEnterprisePluginAdapter.java | 13 ++++++++++++- ...DefaultGradleEnterprisePluginAdapterFactory.java | 11 +++++++++-- .../build/DefaultBuildLifecycleController.java | 8 ++++---- .../DefaultBuildLifecycleControllerFactory.java | 2 +- .../DefaultBuildLifecycleControllerTest.groovy | 3 ++- 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java index a81394b02e02..c856a373f3cf 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/GradleEnterprisePluginEndOfBuildListener.java @@ -16,7 +16,10 @@ package org.gradle.internal.enterprise; +import org.gradle.api.problems.internal.Problem; + import javax.annotation.Nullable; +import java.util.Collection; /** * Used to signal the end of build to the plugin. @@ -31,6 +34,8 @@ public interface GradleEnterprisePluginEndOfBuildListener { interface BuildResult { @Nullable Throwable getFailure(); + + Collection getProblems(); } void buildFinished(BuildResult buildResult); diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java index e5b2fdf56252..d86c1f66c513 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapter.java @@ -16,6 +16,8 @@ package org.gradle.internal.enterprise.impl; +import com.google.common.collect.Multimap; +import org.gradle.api.problems.internal.Problem; import org.gradle.internal.enterprise.GradleEnterprisePluginBuildState; import org.gradle.internal.enterprise.GradleEnterprisePluginConfig; import org.gradle.internal.enterprise.GradleEnterprisePluginEndOfBuildListener; @@ -26,6 +28,7 @@ import org.gradle.internal.operations.notify.BuildOperationNotificationListenerRegistrar; import javax.annotation.Nullable; +import java.util.Collection; /** * Captures the state to recreate the {@link GradleEnterprisePluginService} instance. @@ -48,6 +51,7 @@ public class DefaultGradleEnterprisePluginAdapter implements GradleEnterprisePlu private final DefaultGradleEnterprisePluginServiceRef pluginServiceRef; private final BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar; + private final Multimap problemsMapping; private transient GradleEnterprisePluginService pluginService; @@ -57,7 +61,8 @@ public DefaultGradleEnterprisePluginAdapter( DefaultGradleEnterprisePluginRequiredServices requiredServices, GradleEnterprisePluginBuildState buildState, DefaultGradleEnterprisePluginServiceRef pluginServiceRef, - BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar + BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar, + Multimap problemsMapping ) { this.pluginServiceFactory = pluginServiceFactory; this.config = config; @@ -65,6 +70,7 @@ public DefaultGradleEnterprisePluginAdapter( this.buildState = buildState; this.pluginServiceRef = pluginServiceRef; this.buildOperationNotificationListenerRegistrar = buildOperationNotificationListenerRegistrar; + this.problemsMapping = problemsMapping; createPluginService(); } @@ -95,6 +101,11 @@ public void buildFinished(@Nullable Throwable buildFailure) { public Throwable getFailure() { return buildFailure; } + + @Override + public Collection getProblems() { + return problemsMapping.get(buildFailure); + } }); } } diff --git a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java index f1caa8f4c7eb..b844bcc7ea48 100644 --- a/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java +++ b/platforms/enterprise/enterprise/src/main/java/org/gradle/internal/enterprise/impl/DefaultGradleEnterprisePluginAdapterFactory.java @@ -16,6 +16,9 @@ package org.gradle.internal.enterprise.impl; +import com.google.common.collect.Multimap; +import org.gradle.api.problems.internal.InternalProblems; +import org.gradle.api.problems.internal.Problem; import org.gradle.internal.enterprise.GradleEnterprisePluginBuildState; import org.gradle.internal.enterprise.GradleEnterprisePluginConfig; import org.gradle.internal.enterprise.GradleEnterprisePluginServiceFactory; @@ -31,19 +34,22 @@ public class DefaultGradleEnterprisePluginAdapterFactory { private final GradleEnterprisePluginBuildState buildState; private final DefaultGradleEnterprisePluginServiceRef pluginServiceRef; private final BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar; + private final Multimap problemsMapping; public DefaultGradleEnterprisePluginAdapterFactory( GradleEnterprisePluginConfig config, DefaultGradleEnterprisePluginRequiredServices requiredServices, GradleEnterprisePluginBuildState buildState, DefaultGradleEnterprisePluginServiceRef pluginServiceRef, - BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar + BuildOperationNotificationListenerRegistrar buildOperationNotificationListenerRegistrar, + InternalProblems problems ) { this.config = config; this.requiredServices = requiredServices; this.buildState = buildState; this.pluginServiceRef = pluginServiceRef; this.buildOperationNotificationListenerRegistrar = buildOperationNotificationListenerRegistrar; + this.problemsMapping = problems.getProblems(); } public DefaultGradleEnterprisePluginAdapter create(GradleEnterprisePluginServiceFactory pluginServiceFactory) { @@ -53,7 +59,8 @@ public DefaultGradleEnterprisePluginAdapter create(GradleEnterprisePluginService requiredServices, buildState, pluginServiceRef, - buildOperationNotificationListenerRegistrar + buildOperationNotificationListenerRegistrar, + problemsMapping ); } } diff --git a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java index 61ccee09c69d..a11e156fda99 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java +++ b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleController.java @@ -16,6 +16,7 @@ package org.gradle.internal.build; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import org.gradle.BuildListener; import org.gradle.BuildResult; import org.gradle.api.NonNullApi; @@ -26,7 +27,6 @@ import org.gradle.api.internal.project.HoldsProjectState; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.internal.project.ProjectState; -import org.gradle.api.problems.internal.InternalProblems; import org.gradle.api.problems.internal.Problem; import org.gradle.api.specs.Spec; import org.gradle.execution.BuildWorkExecutor; @@ -79,7 +79,7 @@ private enum State implements StateTransitionController.State { private final BuildToolingModelControllerFactory toolingModelControllerFactory; private final BuildModelController modelController; private final StateTransitionController state; - private final InternalProblems problems; + private final Multimap problems; private final GradleInternal gradle; private boolean hasTasks; private boolean hasFiredBeforeModelDiscarded; @@ -94,7 +94,7 @@ public DefaultBuildLifecycleController( BuildWorkExecutor workExecutor, BuildToolingModelControllerFactory toolingModelControllerFactory, StateTransitionControllerFactory controllerFactory, - InternalProblems problems + Multimap problems ) { this.gradle = gradle; this.modelController = buildModelController; @@ -348,7 +348,7 @@ public ExecutionResult finishBuild(@Nullable Throwable failure) { if (reportableFailure == null && !stageFailures.getFailures().isEmpty()) { reportableFailure = exceptionAnalyser.transform(stageFailures.getFailures()); } - Collection problemCollection = problems.getProblems().get(failure); + Collection problemCollection = problems.get(failure); BuildResult buildResult = new BuildResult(hasTasks ? "Build" : "Configure", gradle, reportableFailure, problemCollection); return ExecutionResult.maybeFailing(() -> buildListener.buildFinished(buildResult)); }); diff --git a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java index 0ea0f0124c8d..dc0110e59d23 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java +++ b/subprojects/core/src/main/java/org/gradle/internal/build/DefaultBuildLifecycleControllerFactory.java @@ -76,7 +76,7 @@ public BuildLifecycleController newInstance(BuildDefinition buildDefinition, Bui gradle.getServices().get(BuildWorkExecutor.class), buildToolingModelControllerFactory, stateTransitionControllerFactory, - problems + problems.getProblems() ); } diff --git a/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy b/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy index 15db34d31b05..0e920a3d36cd 100644 --- a/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy +++ b/subprojects/core/src/test/groovy/org/gradle/internal/build/DefaultBuildLifecycleControllerTest.groovy @@ -16,6 +16,7 @@ package org.gradle.internal.build +import com.google.common.collect.HashMultimap import org.gradle.BuildListener import org.gradle.api.internal.GradleInternal import org.gradle.api.internal.SettingsInternal @@ -64,7 +65,7 @@ class DefaultBuildLifecycleControllerTest extends Specification { DefaultBuildLifecycleController controller() { return new DefaultBuildLifecycleController(gradleMock, buildModelController, exceptionAnalyser, buildListener, - buildModelLifecycleListener, workPreparer, workExecutor, toolingControllerFactory, TestUtil.stateTransitionControllerFactory(), problems) + buildModelLifecycleListener, workPreparer, workExecutor, toolingControllerFactory, TestUtil.stateTransitionControllerFactory(), HashMultimap.create()) } void testCanFinishBuildWhenNothingHasBeenDone() {