Skip to content

Commit 612419f

Browse files
committed
feedback
1 parent a69c852 commit 612419f

File tree

3 files changed

+41
-12
lines changed

3 files changed

+41
-12
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.toolwindow
55

66
import com.intellij.openapi.actionSystem.ActionManager
7-
import com.intellij.openapi.application.ApplicationManager
87
import com.intellij.openapi.application.runInEdt
98
import com.intellij.openapi.project.DumbAware
109
import com.intellij.openapi.project.Project
@@ -66,9 +65,6 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
6665
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
6766
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let { qConn ->
6867
openMeetQPage(project)
69-
ApplicationManager.getApplication().executeOnPooledThread {
70-
QRegionProfileManager.getInstance().validateProfile(project)
71-
}
7268
}
7369
prepareChatContent(project, qPanel)
7470
}

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/QRegionProfileManagerTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileSwitchIn
4040
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
4141
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
4242
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
43+
import software.aws.toolkits.jetbrains.utils.satisfiesKt
4344
import software.aws.toolkits.jetbrains.utils.xmlElement
4445
import java.net.URI
4546
import java.util.function.Consumer
@@ -105,6 +106,23 @@ class QRegionProfileManagerTest {
105106
assertThat(sut.activeProfile(project)).isNull()
106107
}
107108

109+
@Test
110+
fun `data is cleared when user logs out`() {
111+
sut.switchProfile(project, QRegionProfile(arn = "arn", profileName = "foo_profile"), QProfileSwitchIntent.User)
112+
assertThat(sut.activeProfile(project)).isEqualTo(QRegionProfile(arn = "arn", profileName = "foo_profile"))
113+
114+
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let {
115+
if (it is AwsBearerTokenConnection) {
116+
logoutFromSsoConnection(project, it)
117+
}
118+
}
119+
120+
assertThat(sut.state).satisfiesKt {
121+
assertThat(it.connectionIdToActiveProfile).isEmpty()
122+
assertThat(it.connectionIdToProfileList).isEmpty()
123+
}
124+
}
125+
108126
@Test
109127
fun `switch should send message onProfileChanged for active switch`() {
110128
var cnt = 0

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.profile
55

66
import com.intellij.openapi.Disposable
7+
import com.intellij.openapi.application.ApplicationManager
78
import com.intellij.openapi.components.BaseState
89
import com.intellij.openapi.components.PersistentStateComponent
910
import com.intellij.openapi.components.Service
@@ -26,6 +27,7 @@ import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
2627
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
2728
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
2829
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
30+
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
2931
import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
3032
import software.aws.toolkits.jetbrains.utils.notifyInfo
3133
import software.aws.toolkits.resources.AmazonQBundle.message
@@ -41,7 +43,20 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
4143

4244
// Map to store connectionId to its active profile
4345
private val connectionIdToActiveProfile = Collections.synchronizedMap<String, QRegionProfile>(mutableMapOf())
44-
private val connectionIdToProfileList = mutableMapOf<String, Int>()
46+
private val connectionIdToProfileCount = mutableMapOf<String, Int>()
47+
48+
init {
49+
ApplicationManager.getApplication().messageBus.connect(this)
50+
.subscribe(
51+
BearerTokenProviderListener.TOPIC,
52+
object : BearerTokenProviderListener {
53+
override fun invalidate(providerId: String) {
54+
connectionIdToActiveProfile.remove(providerId)
55+
connectionIdToProfileCount.remove(providerId)
56+
}
57+
}
58+
)
59+
}
4560

4661
// should be call on project startup to validate if profile is still active
4762
@RequiresBackgroundThread
@@ -80,7 +95,7 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
8095
switchProfile(project, mappedProfiles.first(), intent = QProfileSwitchIntent.Update)
8196
}
8297
mappedProfiles.takeIf { it.isNotEmpty() }?.also {
83-
connectionIdToProfileList[connection.id] = it.size
98+
connectionIdToProfileCount[connection.id] = it.size
8499
} ?: error("You don't have access to the resource")
85100
} catch (e: Exception) {
86101
LOG.warn(e) { "Failed to list region profiles: ${e.message}" }
@@ -112,7 +127,7 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
112127
Telemetry.amazonq.didSelectProfile.use { span ->
113128
span.source(intent.value)
114129
.amazonQProfileRegion(newProfile.region)
115-
.profileCount(connectionIdToProfileList[conn.id])
130+
.profileCount(connectionIdToProfileCount[conn.id])
116131
.ssoRegion(conn.region)
117132
.credentialStartUrl(conn.startUrl)
118133
.result(MetricResult.Succeeded)
@@ -141,13 +156,13 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
141156

142157
// for each idc connection, user should have a profile, otherwise should show the profile selection error page
143158
fun isPendingProfileSelection(project: Project): Boolean = getIdcConnectionOrNull(project)?.let { conn ->
144-
val profileCounts = connectionIdToProfileList[conn.id] ?: 0
159+
val profileCounts = connectionIdToProfileCount[conn.id] ?: 0
145160
val activeProfile = connectionIdToActiveProfile[conn.id]
146161
profileCounts == 0 || (profileCounts > 1 && activeProfile?.arn.isNullOrEmpty())
147162
} ?: false
148163

149164
fun shouldDisplayProfileInfo(project: Project): Boolean = getIdcConnectionOrNull(project)?.let { conn ->
150-
(connectionIdToProfileList[conn.id] ?: 0) > 1
165+
(connectionIdToProfileCount[conn.id] ?: 0) > 1
151166
} ?: false
152167

153168
fun getQClientSettings(project: Project): TokenConnectionSettings {
@@ -193,16 +208,16 @@ class QRegionProfileManager : PersistentStateComponent<QProfileState>, Disposabl
193208
override fun getState(): QProfileState {
194209
val state = QProfileState()
195210
state.connectionIdToActiveProfile.putAll(this.connectionIdToActiveProfile)
196-
state.connectionIdToProfileList.putAll(this.connectionIdToProfileList)
211+
state.connectionIdToProfileList.putAll(this.connectionIdToProfileCount)
197212
return state
198213
}
199214

200215
override fun loadState(state: QProfileState) {
201216
connectionIdToActiveProfile.clear()
202217
connectionIdToActiveProfile.putAll(state.connectionIdToActiveProfile)
203218

204-
connectionIdToProfileList.clear()
205-
connectionIdToProfileList.putAll(state.connectionIdToProfileList)
219+
connectionIdToProfileCount.clear()
220+
connectionIdToProfileCount.putAll(state.connectionIdToProfileList)
206221
}
207222
}
208223

0 commit comments

Comments
 (0)