diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt index 3650491688f..584a849229f 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt @@ -325,7 +325,7 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos ApplicationManager.getApplication().executeOnPooledThread { var errorMessage = "" val profiles = try { - QRegionProfileManager.getInstance().listRegionProfiles(project) + QRegionProfileManager.getInstance().listProfilesCompletableFuture(project).get() } catch (e: Exception) { e.message?.let { errorMessage = it diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileDialog.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileDialog.kt index c0921f3362f..0c0cb74addf 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileDialog.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileDialog.kt @@ -75,7 +75,7 @@ class QRegionProfileDialog( combo.proposeModelUpdate { model -> try { - QRegionProfileManager.getInstance().listRegionProfiles(project)?.forEach { + QRegionProfileManager.getInstance().listProfilesCompletableFuture(project).get()?.forEach { model.addElement(it) } ?: error("Attempted to fetch profiles while there does not exist") diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt index b3b242c363d..dc6f35a19ea 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/profile/QRegionProfileManager.kt @@ -36,6 +36,7 @@ import software.aws.toolkits.telemetry.MetricResult import software.aws.toolkits.telemetry.Telemetry import java.time.Duration import java.util.Collections +import java.util.concurrent.CompletableFuture import kotlin.reflect.KClass @Service(Service.Level.APP) @@ -45,6 +46,7 @@ class QRegionProfileManager : PersistentStateComponent, Disposabl // Map to store connectionId to its active profile private val connectionIdToActiveProfile = Collections.synchronizedMap(mutableMapOf()) private val connectionIdToProfileCount = mutableMapOf() + private var job: CompletableFuture?>? = null init { ApplicationManager.getApplication().messageBus.connect(this) @@ -65,7 +67,7 @@ class QRegionProfileManager : PersistentStateComponent, Disposabl val conn = getIdcConnectionOrNull(project) val selected = activeProfile(project) ?: return val profiles = tryOrNull { - listRegionProfiles(project) + listProfilesCompletableFuture(project).get() } if (profiles == null || profiles.none { it.arn == selected.arn }) { @@ -104,6 +106,21 @@ class QRegionProfileManager : PersistentStateComponent, Disposabl } } + fun listProfilesCompletableFuture(project: Project): CompletableFuture?> { + this.job?.let { ongoingJob -> + return ongoingJob + } + + val future = CompletableFuture.supplyAsync { + listRegionProfiles(project) + }.whenComplete { t, u -> + this.job = null + } + + this.job = future + return future + } + fun activeProfile(project: Project): QRegionProfile? = getIdcConnectionOrNull(project)?.let { connectionIdToActiveProfile[it.id] } fun hasValidConnectionButNoActiveProfile(project: Project): Boolean = getIdcConnectionOrNull(project) != null && activeProfile(project) == null