Skip to content

Commit 8f526d8

Browse files
authored
Cache ApolloKotlinService into project settings (#5962)
1 parent 3bcfcbf commit 8f526d8

File tree

4 files changed

+72
-13
lines changed

4 files changed

+72
-13
lines changed
Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,56 @@
11
package com.apollographql.ijplugin.gradle
22

33
import com.intellij.util.messages.Topic
4+
import com.intellij.util.xmlb.annotations.Attribute
5+
import com.intellij.util.xmlb.annotations.Transient
6+
import com.intellij.util.xmlb.annotations.XCollection
47

58
interface ApolloKotlinServiceListener {
69
companion object {
710
@Topic.ProjectLevel
8-
val TOPIC: Topic<ApolloKotlinServiceListener> = Topic.create("ApolloKotlinServices are available", ApolloKotlinServiceListener::class.java)
11+
val TOPIC: Topic<ApolloKotlinServiceListener> =
12+
Topic.create("ApolloKotlinServices are available", ApolloKotlinServiceListener::class.java)
913
}
1014

1115
fun apolloKotlinServicesAvailable()
1216
}
1317

18+
/**
19+
* Represents an Apollo Kotlin service as configured in the Apollo Gradle plugin configuration.
20+
*
21+
* These are built from the [com.apollographql.apollo3.gradle.api.ApolloGradleToolingModel] and are used to configure the GraphQL plugin,
22+
* and are cached into the project settings.
23+
*
24+
* @see com.apollographql.ijplugin.gradle.GradleToolingModelService
25+
* @see com.apollographql.ijplugin.graphql.ApolloGraphQLConfigContributor
26+
* @see com.apollographql.ijplugin.settings.ProjectSettingsService
27+
*/
1428
data class ApolloKotlinService(
15-
val gradleProjectPath: String,
16-
val serviceName: String,
17-
val schemaPaths: List<String>,
18-
val operationPaths: List<String>,
19-
val endpointUrl: String?,
20-
val endpointHeaders: Map<String, String>?,
29+
@Attribute
30+
val gradleProjectPath: String = "",
31+
32+
@Attribute
33+
val serviceName: String = "",
34+
35+
@XCollection
36+
val schemaPaths: List<String> = emptyList(),
37+
38+
@XCollection
39+
val operationPaths: List<String> = emptyList(),
40+
41+
@Attribute
42+
val endpointUrl: String? = null,
43+
44+
@XCollection
45+
val endpointHeaders: Map<String, String>? = null,
2146
) {
22-
data class Id(val gradleProjectPath: String, val serviceName: String) {
47+
data class Id(
48+
@Attribute
49+
val gradleProjectPath: String = "",
50+
51+
@Attribute
52+
val serviceName: String = "",
53+
) {
2354
override fun toString(): String {
2455
val formattedPath = gradleProjectPath.split(":").filterNot { it.isEmpty() }.joinToString("-")
2556
return "$formattedPath/$serviceName"
@@ -34,5 +65,8 @@ data class ApolloKotlinService(
3465
}
3566
}
3667

37-
val id = Id(gradleProjectPath, serviceName)
68+
val id
69+
@Transient
70+
get() = Id(gradleProjectPath, serviceName)
71+
3872
}

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,20 @@ class GradleToolingModelService(
4444

4545
private var fetchToolingModelsTask: FetchToolingModelsTask? = null
4646

47-
var apolloKotlinServices: List<ApolloKotlinService> = emptyList()
47+
var apolloKotlinServices: List<ApolloKotlinService> = project.projectSettingsState.apolloKotlinServices
48+
private set
4849

4950
init {
5051
logd("project=${project.name}")
5152
startObserveApolloProject()
5253
startOrStopObserveGradleHasSynced()
5354
startOrAbortFetchToolingModels()
5455
startObserveSettings()
56+
57+
if (apolloKotlinServices.isNotEmpty()) {
58+
// Services are available, notify interested parties
59+
project.messageBus.syncPublisher(ApolloKotlinServiceListener.TOPIC).apolloKotlinServicesAvailable()
60+
}
5561
}
5662

5763
private fun startObserveApolloProject() {
@@ -261,10 +267,12 @@ class GradleToolingModelService(
261267
apolloKotlinServices += getApolloKotlinService(toolingModel.projectPathCompat, serviceInfo.name)
262268
}
263269
}
264-
this.apolloKotlinServices = apolloKotlinServices
265270
logd("apolloKotlinServices=$apolloKotlinServices")
271+
this.apolloKotlinServices = apolloKotlinServices
272+
// Cache the ApolloKotlinServices into the project settings
273+
project.projectSettingsState.apolloKotlinServices = apolloKotlinServices
266274

267-
// Project files are available, notify interested parties
275+
// Services are available, notify interested parties
268276
project.messageBus.syncPublisher(ApolloKotlinServiceListener.TOPIC).apolloKotlinServicesAvailable()
269277
}
270278

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/project/ApolloProjectManagerListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ internal class ApolloProjectManagerListener : ProjectManagerListener {
2222
DumbService.getInstance(project).runWhenSmart {
2323
logd("apolloVersion=" + project.apolloProjectService.apolloVersion)
2424
project.service<ApolloCodegenService>()
25+
project.service<GraphQLConfigService>()
2526
project.service<GradleToolingModelService>()
2627
project.service<ProjectSettingsService>()
27-
project.service<GraphQLConfigService>()
2828
project.service<SandboxService>()
2929
project.service<FieldInsightsService>()
3030
project.service<TelemetryService>()

intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,14 @@ class ProjectSettingsService(private val project: Project) : PersistentStateComp
7171
_state.telemetryInstanceId = value
7272
}
7373

74+
override var apolloKotlinServices: List<ApolloKotlinService>
75+
get() = _state.apolloKotlinServices
76+
set(value) {
77+
_state.apolloKotlinServices = value
78+
}
79+
7480
private var lastNotifiedState: ProjectSettingsState? = null
81+
7582
private fun notifySettingsChanged() {
7683
if (lastNotifiedState != _state) {
7784
lastNotifiedState = _state.copy()
@@ -98,8 +105,17 @@ interface ProjectSettingsState {
98105
var contributeConfigurationToGraphqlPlugin: Boolean
99106
var apolloKotlinServiceConfigurations: List<ApolloKotlinServiceConfiguration>
100107
var telemetryInstanceId: String
108+
109+
/**
110+
* Cache of the ApolloKotlinServices constructed from the Gradle tooling models.
111+
* @see com.apollographql.ijplugin.gradle.GradleToolingModelService
112+
*/
113+
var apolloKotlinServices: List<ApolloKotlinService>
101114
}
102115

116+
/**
117+
* User configuration associated with an [ApolloKotlinService].
118+
*/
103119
data class ApolloKotlinServiceConfiguration(
104120
@Attribute
105121
val id: String = "",
@@ -133,6 +149,7 @@ data class ProjectSettingsStateImpl(
133149
override var contributeConfigurationToGraphqlPlugin: Boolean = true,
134150
override var apolloKotlinServiceConfigurations: List<ApolloKotlinServiceConfiguration> = emptyList(),
135151
override var telemetryInstanceId: String = "",
152+
override var apolloKotlinServices: List<ApolloKotlinService> = emptyList(),
136153
) : ProjectSettingsState
137154

138155

0 commit comments

Comments
 (0)