Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose the CompositeAdapter when using responseBased codegenModels #5585

Closed
leinardi opened this issue Jan 30, 2024 · 24 comments
Closed

Expose the CompositeAdapter when using responseBased codegenModels #5585

leinardi opened this issue Jan 30, 2024 · 24 comments

Comments

@leinardi
Copy link

leinardi commented Jan 30, 2024

Use case

We are migrating from the codegenModels experimental_operationBasedWithInterfaces to the responseBased and we just realized that, differently from our old codegenModels, with responseBased the generated CompositeAdapters for data classes are private and we cannot invoke them.

We are using the adapters because we would like to manually (de)serialize some inner classes of Query.Data for internal use.

For example something like this:

    private val initialCountrySelected: UserQuery.Data.User.Country? =
        EditCountryBottomSheetDestination.Arguments.getCountry(savedStateHandle)?.run {
            UserQuery_ResponseAdapter.Data.User.Country.obj().fromJson(
                Buffer().writeUtf8(this).jsonReader(),
                CustomScalarAdapters.Empty,
            )
        }

But the issue is that User and Country are now private:
image
image

With the experimental_operationBasedWithInterfaces the adapter for Country was publicly available:

    private val initialCountrySelected: UserQuery.Country? =
        EditCountryBottomSheetDestination.Arguments.getCountry(savedStateHandle)?.run {
            UserQuery_ResponseAdapter.Country.obj().fromJson(
                Buffer().writeUtf8(this).jsonReader(),
                CustomScalarAdapters.Empty,
            )
        }

Describe the solution you'd like

I would like to expose the CompositeAdapters for the inner class, since this will allow to take advantages of this adapters when we need to manually (de)serialize these objects to, for example, send them as parameters to the Jatpack Navigation library.

EDIT
Forgot to say that we are using Apollo Kotlin v4.0.0-beta.2

@martinbonnin
Copy link
Contributor

Hi 👋 thanks for opening this!

Is this something you could do with CompilerHooks. It's experimental so there's not much doc but there are examples in the Changelog as well as integration tests.

It gives you a list of KotlinPoet FileSpec that you can modify before they are written to the disk. Sounds like this is something that could work?
Being able to serialize/deserialize nested models would be a nice feature but it'll require designing an better API for this so it might take a bit more time.

@leinardi
Copy link
Author

Hey @martinbonnin thanks a lot for the tip! I'm trying the approach with the compiler hooks but, as soon as I switch the Gradle plugin from alias(libs.plugins.apollo) to alias(libs.plugins.apollo.external) the task generateLinkApolloSchema fails immediately:

4.0.0-beta.4

> Task :modules:library-network-link-api:generateLinkApolloSchema FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:library-network-link-api:generateLinkApolloSchema'.
> 'kotlin.enums.EnumEntries kotlinx.serialization.json.internal.WriteMode.getEntries()'
Caused by: java.lang.NoSuchMethodError: 'kotlin.enums.EnumEntries kotlinx.serialization.json.internal.WriteMode.getEntries()'
        at kotlinx.serialization.json.internal.JsonStreamsKt.encodeByWriter(JsonStreams.kt:29)
        at kotlinx.serialization.json.okio.OkioStreamsKt.encodeToBufferedSink(OkioStreams.kt:30)
        at com.apollographql.apollo3.compiler.CodegenSchemaKt.writeTo(CodegenSchema.kt:44)
        at com.apollographql.apollo3.gradle.internal.ApolloGenerateSchemaTask.taskAction(ApolloGenerateSchemaTask.kt:107)

4.0.0-beta.2

> Task :modules:library-network-link-api:generateLinkApolloSchema FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:library-network-link-api:generateLinkApolloSchema'.
> 'void kotlinx.serialization.json.internal.StreamingJsonEncoder.<init>(kotlinx.serialization.json.internal.JsonWriter, kotlinx.serialization.json.Json, kotlinx.serialization.json.internal.WriteMode, kotlinx.serialization.json.JsonEncoder[])'
Caused by: java.lang.NoSuchMethodError: 'void kotlinx.serialization.json.internal.StreamingJsonEncoder.<init>(kotlinx.serialization.json.internal.JsonWriter, kotlinx.serialization.json.Json, kotlinx.serialization.json.internal.WriteMode, kotlinx.serialization.json.JsonEncoder[])'
        at kotlinx.serialization.json.internal.JsonStreamsKt.encodeByWriter(JsonStreams.kt:23)
        at kotlinx.serialization.json.okio.OkioStreamsKt.encodeToBufferedSink(OkioStreams.kt:32)
        at com.apollographql.apollo3.compiler.CodegenSchemaKt.writeTo(CodegenSchema.kt:44)
        at com.apollographql.apollo3.gradle.internal.ApolloGenerateSchemaTask.taskAction(ApolloGenerateSchemaTask.kt:107)

am I missing something with the configuration?

@martinbonnin
Copy link
Contributor

martinbonnin commented Jan 30, 2024

Damn, that's a Gradle <-> Kotlin interrop thing. You'll need a Gradle compatible with Kotlin 1.9, which is apparently not available yet :/.

Might be worth trying updating Gradle to 8.6-rc-3, see if anything changed in there. If not, we're working on classloader isolation that could help with those kind of issues.

@martinbonnin
Copy link
Contributor

Wait, I read the compatibility table wrong, Gradle 8.3 is already compatible with 1.9 so that part is good. Could it be that you're running an older Gradle?

@leinardi
Copy link
Author

Nope, Gradle 8.4, but I just added implementation(libs.kotlinx.serialization) to my build-convention module and it seems to work. I guess you guys did something similar here:

implementation(libs.kotlinx.serialization.json)

I'll play a little to see if I can change the visibility of the adapters 🙂

@leinardi
Copy link
Author

Uff, it seems quite difficult to modify it so that all the TypeSpec members that extend com.apollographql.apollo3.api.Adapter are public, recursively as well, due to inner classes 😅

@leinardi
Copy link
Author

OK I think I managed. I'm not super fluent with KotlinPoet, @martinbonnin do you think this code is ok?

/**
 * Change the Adapters visibility from private to public.
 *
 * https://github.com/apollographql/apollo-kotlin/issues/5585
 */
class ChangeAdaptersModifierToPublicHooks : DefaultApolloCompilerKotlinHooks() {
    override val version = "ChangeAdaptersModifierToPublicHooks.0"

    override fun postProcessFiles(files: Collection<FileInfo>): Collection<FileInfo> = files.map {
        it.copy(
            fileSpec = it.fileSpec
                .toBuilder()
                .apply {
                    members.replaceAll { member ->
                        if (member is TypeSpec) {
                            member.changeAdaptersModifierToPublic()
                        } else {
                            member
                        }
                    }
                }
                .build(),
        )
    }

    private fun TypeSpec.changeAdaptersModifierToPublic(): TypeSpec = toBuilder()
        .apply {
            if (superinterfaces
                    .keys
                    .filterIsInstance<ParameterizedTypeName>()
                    .any { it.rawType == ClassName("com.apollographql.apollo3.api", "Adapter") }
            ) {
                modifiers.removeIf { it == KModifier.PRIVATE }
                addModifiers(KModifier.PUBLIC)
            }

            // Recurse on nested types
            typeSpecs.replaceAll { typeSpec ->
                typeSpec.changeAdaptersModifierToPublic()
            }
        }
        .build()
}

@martinbonnin
Copy link
Contributor

Yup, exactly what I had in mind 👍
Beware DefaultApolloCompilerKotlinHooks is probably going to change in the mid term (see #5415) but it should still keep a list of FileSpec as input/output so the change should be quite straightfoward.

@martinbonnin
Copy link
Contributor

martinbonnin commented Feb 8, 2024

@leinardi I opened #5585 #5612 as a follow up to this issue for nested models. Is it OK to close this one? Did you manage to get it work with CompilerHooks for the time being?

@leinardi
Copy link
Author

leinardi commented Feb 8, 2024

Did you mean #5612? Yeah sure, we can close this! And the CompilerHooks solution works fine for now 👍

@leinardi leinardi closed this as completed Feb 8, 2024
@martinbonnin
Copy link
Contributor

Did you mean #5612?

Yup, exactly 👍 Sorry for the bad copy/paste and thanks for the update 🙏

@leinardi
Copy link
Author

Hi @martinbonnin, after changing the artifact version from 4.0.0-beta.4 to 4.0.0-beta.5, my CompilerHooks solution fails to build with this error:

> Task :build-conventions:compileKotlin FAILED
9 actionable tasks: 2 executed, 3 from cache, 4 up-to-date
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:3:43 Unresolved reference: hooks
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:4:43 Unresolved reference: hooks
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:15:45 Unresolved reference: DefaultApolloCompilerKotlinHooks
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:16:5 'version' overrides nothing
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:18:5 'postProcessFiles' overrides nothing
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:18:53 Unresolved reference: FileInfo
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:18:76 Unresolved reference: FileInfo
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:22:26 Unresolved reference: members
e: file:///home/rleinardi/Workspace/Veeva/link2-android/build-conventions/src/main/kotlin/com/veeva/apollo/ChangeAdaptersModifierToPublicHooks.kt:22:47 Cannot infer a type for this parameter. Please specify it explicitly.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':build-conventions:compileKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
   > Compilation error. See log for more details

I'm not sure how should I migrate it to make it work with this new version.

@leinardi leinardi reopened this Mar 19, 2024
@martinbonnin
Copy link
Contributor

Right, beta.5 now has a proper Plugin API that doesn't need to live in the same classpath as your Gradle build scripts.

Documentation is here and you'll want to implement the kotlinOutputTransform API.

There is an example here.

In your case, it would look like so (wildly untested but it seems to compile):

class MyPlugin: Plugin {
  override fun kotlinOutputTransform(): Transform<KotlinOutput> {
    return object : Transform<KotlinOutput> {
      override fun transform(input: KotlinOutput): KotlinOutput {
        return KotlinOutput(
            fileSpecs = input.fileSpecs.map {
              it.toBuilder()
                  .apply {
                    members.replaceAll { member ->
                      if (member is TypeSpec) {
                        member.changeAdaptersModifierToPublic()
                      } else {
                        member
                      }
                    }
                  }
                  .build()
            },
            codegenMetadata = input.codegenMetadata
        )
      }

      private fun TypeSpec.changeAdaptersModifierToPublic(): TypeSpec = toBuilder()
          .apply {
            if (superinterfaces
                    .keys
                    .filterIsInstance<ParameterizedTypeName>()
                    .any { it.rawType == ClassName("com.apollographql.apollo3.api", "Adapter") }
            ) {
              modifiers.removeIf { it == KModifier.PRIVATE }
              addModifiers(KModifier.PUBLIC)
            }

            // Recurse on nested types
            typeSpecs.replaceAll { typeSpec ->
              typeSpec.changeAdaptersModifierToPublic()
            }
          }
          .build()
    }
  }
}

The setup is really similar to a KSP processor, using the ServiceLoader API.

@leinardi
Copy link
Author

Oh nice! I'll test and report back, thank you!

@leinardi
Copy link
Author

leinardi commented Mar 20, 2024

Hey awesome it works!

I'll write here some instructions in case someone else needs to migrate:

  1. Get rid of the old ChangeAdaptersModifierToPublicHooks
  2. Create a new Kotlin module in the root of your project (more info here: https://www.apollographql.com/docs/kotlin/v4/advanced/compiler-plugins/#implementing-a-compiler-plugin)
  3. Add the resources/META-INF/services/com.apollographql.apollo3.compiler.Plugin file as explained in the previous point link
    image
  4. Replace the instances of compilerKotlinHooks.set(listOf(com.veeva.apollo.ChangeAdaptersModifierToPublicHooks())) with the new plugin: plugin(projects.apolloCompilerPlugins.adapterModifier) (see here: https://www.apollographql.com/docs/kotlin/v4/advanced/compiler-plugins/#adding-a-plugin-to-the-apollo-compiler-classpath)

@martinbonnin I take this chance to ask you another question: after we switched from a single schema to multiple schemas, the IDEA plugin stopped showing shortcuts to from the Kotlin code to the Graphql Queries/Mutations and the other way around. Do you know if this is something that is not supported yet (due to the multi schema) or is this a bug that I should report here? Or it could also be a misconfiguration on my side?

image

apollo {
    service("lama") {
        srcDir("src/main/graphql/lama")
        packageName.set("com.veeva.link.library.network.api.graphql.lama")
        plugin(projects.apolloCompilerPlugins.adapterModifier)
        generateApolloMetadata.set(true)
        generateFragmentImplementations.set(true)
        codegenModels.set("responseBased")
        decapitalizeFields.set(true)
        generateDataBuilders.set(true)
        introspection {
            endpointUrl.set("")
            schemaFile.set(file("src/main/graphql/lama/schema.graphqls"))
            headers.set(mapOf("Authorization" to "JWT ${project.extra.getOrNull<String>("lamaJwtToken")}"))
        }
    }
}

After moving to more than 1 schema all the [navigation shortcuts](https://www.apollographql.com/blog/announcing-the-apollo-kotlin-plugin-for-android-studio-and-intellij-idea#navigation) are gone:

image

Copy link
Contributor

Do you have any feedback for the maintainers? Please tell us by taking a one-minute survey. Your responses will help us understand Apollo Kotlin usage and allow us to serve you better.

@leinardi
Copy link
Author

Mmm, CI failed and, after running locally ./gradlew clean :modules:library-network-auth-api:generateAuthApolloSources --rerun-tasks I now get this error:

> Task :modules:library-network-auth-api:generateAuthApolloSources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:library-network-auth-api:generateAuthApolloSources'.
> A failure occurred while executing com.apollographql.apollo3.gradle.internal.GenerateSourcesFromIr
   > com.apollographql.apollo3.compiler.Plugin: Provider hooks.ChangeAdaptersModifierToPublicPlugin not found

I'll investigate and report back.

@BoD
Copy link
Contributor

BoD commented Mar 20, 2024

Hey @leinardi thanks for reporting the issue about the IDE plugin!

From your latest message, I understand that your modules are not at the top level, but inside another module (named modules) - is that right?

That is the reason of this issue - the Apollo projects are not detected. This is already fixed but hasn't been published yet. The fix will be available in the next release, and you can also get it in the next Weekly Snapshot (those are published on Sundays), by following the instructions here.

@leinardi
Copy link
Author

This is already fixed

Oh awesome! I'll report back in case I still experience the issue after upgrading.

Regarding the Provider hooks.ChangeAdaptersModifierToPublicPlugin not found, I'm a little clueless of what could be the issue. Do you think I'm missing something looking at the steps I posted here?

@martinbonnin
Copy link
Contributor

Provider hooks.ChangeAdaptersModifierToPublicPlugin not found

Can you share the full stacktrace with ./gradlew :modules:library-network-auth-api:generateAuthApolloSources --stacktrace?

@leinardi
Copy link
Author

Sure, here:

> Task :modules:library-network-auth-api:generateAuthApolloSources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':modules:library-network-auth-api:generateAuthApolloSources'.
> A failure occurred while executing com.apollographql.apollo3.gradle.internal.GenerateSourcesFromIr
   > com.apollographql.apollo3.compiler.Plugin: Provider hooks.ChangeAdaptersModifierToPublicPlugin not found

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':modules:library-network-auth-api:generateAuthApolloSources'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:134)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.apollographql.apollo3.gradle.internal.GenerateSourcesFromIr
        at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:283)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130)
        at org.gradle.internal.Factories$1.create(Factories.java:31)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:336)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:319)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:324)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:255)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:232)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:215)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:198)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:165)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
        at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
        at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:64)
        at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:42)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeAndStoreInCache(BuildCacheStep.java:145)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$4(BuildCacheStep.java:101)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$5(BuildCacheStep.java:101)
        at org.gradle.internal.Try$Success.map(Try.java:164)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithCache(BuildCacheStep.java:85)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$0(BuildCacheStep.java:74)
        at org.gradle.internal.Either$Left.fold(Either.java:115)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:76)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:54)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:76)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:37)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:55)
        at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
        at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
        at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
        at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56)
        at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
        at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
        at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
        at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:292)
        at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
        at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
        at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
        at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:38)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:36)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:26)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:145)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:134)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: java.util.ServiceConfigurationError: com.apollographql.apollo3.compiler.Plugin: Provider hooks.ChangeAdaptersModifierToPublicPlugin not found
        at com.apollographql.apollo3.relocated.kotlin.collections.CollectionsKt.toCollection(SourceFile:1)
        at com.apollographql.apollo3.relocated.kotlin.collections.CollectionsKt.toMutableList(SourceFile:4)
        at com.apollographql.apollo3.relocated.kotlin.collections.CollectionsKt.toList(SourceFile:10)
        at com.apollographql.apollo3.gradle.internal.ServiceloaderKt.apolloCompilerPlugin(SourceFile:1)
        at com.apollographql.apollo3.gradle.internal.GenerateSourcesFromIr.execute(SourceFile:5)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
        at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
        at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
        at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
        at org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
        at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
        at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
        at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$1.lambda$execute$0(IsolatedClassloaderWorkerFactory.java:57)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.IsolatedClassloaderWorkerFactory$1.execute(IsolatedClassloaderWorkerFactory.java:49)
        at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:170)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162)
        at org.gradle.internal.Factories$1.create(Factories.java:31)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:264)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:128)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:133)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126)
        ... 2 more


BUILD FAILED in 24s

@martinbonnin
Copy link
Contributor

Thanks for the stacktrace, I'll dig.

In the meantime, I have vague recollections of builds becoming somewhat "wrong" with an empty .jar file. Again this is very very vague but might be worth opening apollo-compiler-plugins/adapter-modifier/build/libs/adapter-modifier.jar and double checking it contains bytecode as well as the META-INF file.

@leinardi
Copy link
Author

leinardi commented Mar 20, 2024

Never mind: Diktat added my company package to the plugin class changing it from package hooks to package com.mycompany.hooks 🤦

Sorry for the noise 🙈

@martinbonnin
Copy link
Contributor

No worries, thanks for the follow up!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants