diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/target/TargetBuildExecutor.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/target/TargetBuildExecutor.kt index 500b83867484..498c09661fb0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/target/TargetBuildExecutor.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/target/TargetBuildExecutor.kt @@ -4,9 +4,9 @@ package org.jetbrains.plugins.gradle.execution.target import org.gradle.tooling.BuildAction import org.gradle.tooling.BuildActionExecuter import org.gradle.tooling.ResultHandler +import org.gradle.tooling.StreamedValueListener import org.gradle.tooling.internal.consumer.PhasedBuildAction -import org.jetbrains.plugins.gradle.tooling.proxy.TargetBuildParameters.BuildActionParametersBuilder -import org.jetbrains.plugins.gradle.tooling.proxy.TargetBuildParameters.PhasedBuildActionParametersBuilder +import org.jetbrains.plugins.gradle.tooling.proxy.TargetBuildParameters.* internal abstract class TargetBuildExecutor( connection: TargetProjectConnection, @@ -14,6 +14,8 @@ internal abstract class TargetBuildExecutor( ) : AbstractTargetBuildOperation, R>(connection, entryPoint), BuildActionExecuter { + abstract override val targetBuildParametersBuilder: StreamedValueAwareBuilder<*> + override fun run(): R { return runAndGetResult() } @@ -33,6 +35,10 @@ internal abstract class TargetBuildExecutor( return this } + override fun setStreamedValueListener(listener: StreamedValueListener) { + targetBuildParametersBuilder.setStreamedValueListener(listener) + } + companion object { fun createDefaultExecutor( diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultBuildController.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultBuildController.java index 6647fe709611..dc3c8af87a82 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultBuildController.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultBuildController.java @@ -129,6 +129,11 @@ public class DefaultBuildController implements BuildController { return GradleVersionUtil.isGradleAtLeast(gradleVersion, "7.4.2"); } + @Override + public void send(T value) { + myDelegate.send(value); + } + @Override public List run(Collection> collection) { if (isParallelModelFetchSupported()) { diff --git a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/IntermediateResult.kt b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/IntermediateResult.kt index 3c97f1635d12..28a06bf9ebd6 100644 --- a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/IntermediateResult.kt +++ b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/IntermediateResult.kt @@ -9,5 +9,5 @@ class IntermediateResult( ) : org.gradle.launcher.daemon.protocol.Message(), Serializable enum class IntermediateResultType { - PROJECT_LOADED, BUILD_FINISHED + PROJECT_LOADED, BUILD_FINISHED, STREAMED_VALUE } diff --git a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/Main.kt b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/Main.kt index 335573579b44..800f1a0ce5e3 100644 --- a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/Main.kt +++ b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/Main.kt @@ -89,6 +89,13 @@ object Main { .apply { targetBuildParameters.tasks.nullize()?.run { forTasks(*toTypedArray()) } } is BuildActionParameters<*> -> connection.action(targetBuildParameters.buildAction) .apply { targetBuildParameters.tasks.nullize()?.run { forTasks(*toTypedArray()) } } + .apply { + setStreamedValueListener { result -> + LOG.debug("Streamed value received for the build action: $result") + val convertedResult = convertAndSerializeData(result) + incomingConnectionHandler.dispatch(IntermediateResult(IntermediateResultType.STREAMED_VALUE, convertedResult)) + } + } is PhasedBuildActionParameters -> connection.action() .projectsLoaded(targetBuildParameters.projectsLoadedAction, IntermediateResultHandler { result -> LOG.debug("Project loading intermediate result: $result") @@ -102,6 +109,13 @@ object Main { }) .build() .apply { targetBuildParameters.tasks.nullize()?.run { forTasks(*toTypedArray()) } } + .apply { + setStreamedValueListener { result -> + LOG.debug("Streamed value received for the phased build action: $result") + val convertedResult = convertAndSerializeData(result) + incomingConnectionHandler.dispatch(IntermediateResult(IntermediateResultType.STREAMED_VALUE, convertedResult)) + } + } } val progressEventConverter = ProgressEventConverter() operation.apply { diff --git a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/TargetBuildParameters.kt b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/TargetBuildParameters.kt index bc354c26bc2b..1a47b05d1b20 100644 --- a/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/TargetBuildParameters.kt +++ b/plugins/gradle/tooling-proxy/src/org/jetbrains/plugins/gradle/tooling/proxy/TargetBuildParameters.kt @@ -2,6 +2,7 @@ package org.jetbrains.plugins.gradle.tooling.proxy import org.gradle.tooling.BuildAction +import org.gradle.tooling.StreamedValueListener import org.gradle.tooling.events.OperationType import org.gradle.tooling.internal.consumer.PhasedBuildAction.BuildActionWrapper import java.io.Serializable @@ -127,9 +128,34 @@ sealed class TargetBuildParameters : Serializable { } } + abstract class StreamedValueAwareBuilder> : TaskAwareBuilder() { + + private var streamedValueListener: StreamedValueListener? = null + + fun setStreamedValueListener(streamedValueListener: StreamedValueListener) { + this.streamedValueListener = streamedValueListener + } + + override fun buildIntermediateResultHandler(): TargetIntermediateResultHandler { + return super.buildIntermediateResultHandler() + .then(StreamedIntermediateResultHandler(streamedValueListener)) + } + + private class StreamedIntermediateResultHandler( + private val streamedValueListener: StreamedValueListener? + ) : TargetIntermediateResultHandler { + + override fun onResult(type: IntermediateResultType, result: Any?) { + if (type == IntermediateResultType.STREAMED_VALUE) { + streamedValueListener!!.onValue(result!!) + } + } + } + } + class BuildActionParametersBuilder( private val action: BuildAction - ) : TaskAwareBuilder>() { + ) : StreamedValueAwareBuilder>() { override fun getThis(): BuildActionParametersBuilder = this @@ -144,7 +170,7 @@ sealed class TargetBuildParameters : Serializable { class PhasedBuildActionParametersBuilder( private val projectsLoadedAction: BuildActionWrapper?, private val buildFinishedAction: BuildActionWrapper? - ) : TaskAwareBuilder() { + ) : StreamedValueAwareBuilder() { override fun getThis(): PhasedBuildActionParametersBuilder = this