Skip to content

Commit 9a4bfd6

Browse files
deps(lsp): implement aws/updateConfiguration (#5600)
1 parent a8da8ca commit 9a4bfd6

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageServer.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
99
import org.eclipse.lsp4j.services.LanguageServer
1010
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
12+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.UpdateConfigurationParams
1213
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
1314
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams
1415
import java.util.concurrent.CompletableFuture
@@ -29,4 +30,7 @@ interface AmazonQLanguageServer : LanguageServer {
2930

3031
@JsonRequest("aws/getConfigurationFromServer")
3132
fun getConfigurationFromServer(params: GetConfigurationFromServerParams): CompletableFuture<LspServerConfigurations>
33+
34+
@JsonRequest("aws/updateConfiguration")
35+
fun updateConfiguration(params: UpdateConfigurationParams): CompletableFuture<LspServerConfigurations>
3236
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenPr
1515
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
1616
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1717
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
18+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
19+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.UpdateConfigurationParams
1820
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.BearerCredentials
1921
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
2022
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayloadData
23+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
24+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
25+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
2126
import software.aws.toolkits.jetbrains.utils.isQConnected
2227
import software.aws.toolkits.jetbrains.utils.isQExpired
2328
import java.util.concurrent.CompletableFuture
@@ -28,16 +33,21 @@ class DefaultAuthCredentialsService(
2833
serverInstance: Disposable,
2934
) : AuthCredentialsService,
3035
BearerTokenProviderListener,
31-
ToolkitConnectionManagerListener {
36+
ToolkitConnectionManagerListener,
37+
QRegionProfileSelectedListener {
3238

3339
init {
3440
project.messageBus.connect(serverInstance).apply {
3541
subscribe(BearerTokenProviderListener.TOPIC, this@DefaultAuthCredentialsService)
3642
subscribe(ToolkitConnectionManagerListener.TOPIC, this@DefaultAuthCredentialsService)
43+
subscribe(QRegionProfileSelectedListener.TOPIC, this@DefaultAuthCredentialsService)
3744
}
3845

3946
if (isQConnected(project) && !isQExpired(project)) {
4047
updateTokenFromActiveConnection()
48+
.thenRun {
49+
updateConfiguration()
50+
}
4151
}
4252
}
4353

@@ -70,23 +80,23 @@ class DefaultAuthCredentialsService(
7080
updateTokenFromConnection(newConnection)
7181
}
7282

73-
private fun updateTokenFromActiveConnection() {
83+
private fun updateTokenFromActiveConnection(): CompletableFuture<ResponseMessage> {
7484
val connection = ToolkitConnectionManager.getInstance(project)
7585
.activeConnectionForFeature(QConnection.getInstance())
76-
?: return
86+
?: return CompletableFuture.failedFuture(IllegalStateException("No active Q connection"))
7787

78-
updateTokenFromConnection(connection)
88+
return updateTokenFromConnection(connection)
7989
}
8090

81-
private fun updateTokenFromConnection(connection: ToolkitConnection) {
91+
private fun updateTokenFromConnection(connection: ToolkitConnection): CompletableFuture<ResponseMessage> =
8292
(connection.getConnectionSettings() as? TokenConnectionSettings)
8393
?.tokenProvider
8494
?.delegate
8595
?.let { it as? BearerTokenProvider }
8696
?.currentToken()
8797
?.accessToken
8898
?.let { token -> updateTokenCredentials(token, true) }
89-
}
99+
?: CompletableFuture.failedFuture(IllegalStateException("Unable to get token from connection"))
90100

91101
override fun invalidate(providerId: String) {
92102
deleteTokenCredentials()
@@ -108,4 +118,20 @@ class DefaultAuthCredentialsService(
108118
encrypted = false
109119
)
110120
}
121+
122+
override fun onProfileSelected(project: Project, profile: QRegionProfile?) {
123+
updateConfiguration()
124+
}
125+
126+
private fun updateConfiguration(): CompletableFuture<LspServerConfigurations> {
127+
val payload = UpdateConfigurationParams(
128+
section = "aws.q",
129+
settings = mapOf(
130+
"profileArn" to QRegionProfileManager.getInstance().activeProfile(project)?.arn
131+
)
132+
)
133+
return AmazonQLspService.executeIfRunning(project) { server ->
134+
server.updateConfiguration(payload)
135+
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
136+
}
111137
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/LspServerConfigurations.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ data class WorkspaceInfo(val workspaceRoot: String, val workspaceId: String)
88

99
// This represents the entire array
1010
data class LspServerConfigurations(val workspaces: List<WorkspaceInfo>)
11+
12+
data class UpdateConfigurationParams(
13+
val section: String,
14+
val settings: LSPAny,
15+
)
16+
17+
typealias LSPAny = Any?

0 commit comments

Comments
 (0)