Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import software.amazon.awssdk.services.codewhispererruntime.model.GetTestGenerationResponse
import software.amazon.awssdk.services.codewhispererruntime.model.IdeCategory
import software.amazon.awssdk.services.codewhispererruntime.model.InlineChatUserDecision
import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableCustomizationsRequest

Check warning on line 25 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse
import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse
Expand All @@ -35,7 +35,7 @@
import software.amazon.awssdk.services.codewhispererruntime.model.SuggestionState
import software.amazon.awssdk.services.codewhispererruntime.model.TargetCode
import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
import software.aws.toolkits.core.utils.debug

Check warning on line 38 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
Expand Down Expand Up @@ -78,8 +78,6 @@

fun getCodeFixJob(request: GetCodeFixJobRequest): GetCodeFixJobResponse

fun listAvailableCustomizations(): List<CodeWhispererCustomization>

fun startTestGeneration(uploadId: String, targetCode: List<TargetCode>, userInput: String): StartTestGenerationResponse

fun getTestGeneration(jobId: String, jobGroupName: String): GetTestGenerationResponse
Expand Down Expand Up @@ -281,28 +279,6 @@

override fun getCodeFixJob(request: GetCodeFixJobRequest): GetCodeFixJobResponse = bearerClient().getCodeFixJob(request)

// DO NOT directly use this method to fetch customizations, use wrapper [CodeWhispererModelConfigurator.listCustomization()] instead
override fun listAvailableCustomizations(): List<CodeWhispererCustomization> =
bearerClient().listAvailableCustomizationsPaginator(
ListAvailableCustomizationsRequest.builder().profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn).build()
)
.stream()
.toList()
.flatMap { resp ->
LOG.debug {
"listAvailableCustomizations: requestId: ${resp.responseMetadata().requestId()}, customizations: ${
resp.customizations().map { it.name() }
}"
}
resp.customizations().map {
CodeWhispererCustomization(
arn = it.arn(),
name = it.name(),
description = it.description()
)
}
}

override fun startTestGeneration(uploadId: String, targetCode: List<TargetCode>, userInput: String): StartTestGenerationResponse =
bearerClient().startTestGeneration { builder ->
builder.uploadId(uploadId)
Expand Down Expand Up @@ -801,7 +777,7 @@
}

companion object {
private val LOG = getLogger<CodeWhispererClientAdaptorImpl>()

Check warning on line 780 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused symbol

Property "LOG" is never used
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.notifyErrorCodeWhispererUsageLimit
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.promptReAuth
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CustomizationConstants
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextProvider
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import software.aws.toolkits.jetbrains.utils.isInjectedText
Expand Down Expand Up @@ -333,7 +334,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
val displayMessage: String

if (
CodeWhispererConstants.Customization.invalidCustomizationExceptionPredicate(e) ||
CustomizationConstants.invalidCustomizationExceptionPredicate(e) ||
e is ResourceNotFoundException
) {
(e as CodeWhispererRuntimeException)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.notifyErrorCodeWhispererUsageLimit
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.promptReAuth
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CustomizationConstants
import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextProvider
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import software.aws.toolkits.jetbrains.utils.isInjectedText
Expand Down Expand Up @@ -360,7 +361,7 @@ class CodeWhispererServiceNew(private val cs: CoroutineScope) : Disposable {
val displayMessage: String

if (
CodeWhispererConstants.Customization.invalidCustomizationExceptionPredicate(e) ||
CustomizationConstants.invalidCustomizationExceptionPredicate(e) ||
e is ResourceNotFoundException
) {
(e as CodeWhispererRuntimeException)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.ui.JBColor
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.codewhispererruntime.model.AccessDeniedException

Check warning on line 11 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException

Check warning on line 12 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CodeWhispererConstants.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeScanResponse
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava
import software.aws.toolkits.telemetry.CodewhispererGettingStartedTask
Expand Down Expand Up @@ -59,7 +59,6 @@
val scanResultsKey = DataKey.create<CodeScanResponse>("amazonq.codescan.result")
val scanScopeKey = DataKey.create<CodeAnalysisScope>("amazonq.codescan.scope")

const val Q_CUSTOM_LEARN_MORE_URI = "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/customizations.html"
const val Q_SUPPORTED_LANG_URI = "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-language-ide-support.html"
const val CODEWHISPERER_CODE_SCAN_LEARN_MORE_URI = "https://docs.aws.amazon.com/codewhisperer/latest/userguide/security-scans.html"
const val CODEWHISPERER_ONBOARDING_DOCUMENTATION_URI = "https://docs.aws.amazon.com/codewhisperer/latest/userguide/features.html"
Expand Down Expand Up @@ -157,27 +156,6 @@
val Sigv4ClientRegion = Region.US_EAST_1
}

object Customization {
private const val noAccessToCustomizationMessage = "Your account is not authorized to use CodeWhisperer Enterprise."
private const val invalidCustomizationMessage = "You are not authorized to access"

val noAccessToCustomizationExceptionPredicate: (e: Exception) -> Boolean = { e ->
if (e !is CodeWhispererRuntimeException) {
false
} else {
e is AccessDeniedException && (e.message?.contains(noAccessToCustomizationMessage, ignoreCase = true) ?: false)
}
}

val invalidCustomizationExceptionPredicate: (e: Exception) -> Boolean = { e ->
if (e !is CodeWhispererRuntimeException) {
false
} else {
e is AccessDeniedException && (e.message?.contains(invalidCustomizationMessage, ignoreCase = true) ?: false)
}
}
}

object CrossFile {
const val CHUNK_SIZE = 60
const val NUMBER_OF_LINE_IN_CHUNK = 50
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package migration.software.aws.toolkits.jetbrains.services.codewhisperer.customization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp

import com.intellij.notification.NotificationType
import com.intellij.openapi.project.Project
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
import org.eclipse.lsp4j.ConfigurationParams
import org.eclipse.lsp4j.MessageActionItem
import org.eclipse.lsp4j.MessageParams
Expand All @@ -20,6 +21,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credential
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import java.util.concurrent.CompletableFuture
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator

/**
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
Expand Down Expand Up @@ -79,14 +81,31 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC

return CompletableFuture.completedFuture(
buildList {
val qSettings = CodeWhispererSettings.getInstance()
params.items.forEach {
when (it.section) {
AmazonQLspConstants.LSP_CW_CONFIGURATION_KEY -> {
add(
CodeWhispererLspConfiguration(
shouldShareData = CodeWhispererSettings.getInstance().isMetricOptIn(),
shouldShareCodeReferences = CodeWhispererSettings.getInstance().isIncludeCodeWithReference(),
shouldEnableWorkspaceContext = CodeWhispererSettings.getInstance().isWorkspaceContextEnabled()
shouldShareData = qSettings.isMetricOptIn(),
shouldShareCodeReferences = qSettings.isIncludeCodeWithReference(),
// server context
shouldEnableWorkspaceContext = qSettings.isWorkspaceContextEnabled()
)
)
}
AmazonQLspConstants.LSP_Q_CONFIGURATION_KEY -> {
add(
AmazonQLspConfiguration(
optOutTelemetry = AwsSettings.getInstance().isTelemetryEnabled,
customization = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn,
// local context
enableLocalIndexing = qSettings.isProjectContextEnabled(),
indexWorkerThreads = qSettings.getProjectContextIndexThreadCount(),
enableGpuAcceleration = qSettings.isProjectContextGpu(),
localIndexing = LocalIndexingConfiguration(
maxIndexSizeMB = qSettings.getProjectContextIndexMaxSize()
)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp

import com.google.gson.annotations.SerializedName

data class AmazonQLspConfiguration(
@SerializedName(AmazonQLspConstants.LSP_OPT_OUT_TELEMETRY_CONFIGURATION_KEY)
val optOutTelemetry: Boolean? = null,

@SerializedName(AmazonQLspConstants.LSP_ENABLE_TELEMETRY_EVENTS_CONFIGURATION_KEY)
Copy link
Contributor Author

@samgst-amazon samgst-amazon Mar 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true

This is not currently being used but will be in future migrations. not exactly sure what it should be pointing to in current codebase

val enableTelemetryEvents: Boolean? = null,

@SerializedName(AmazonQLspConstants.LSP_CUSTOMIZATION_CONFIGURATION_KEY)
val customization: String? = null,

val enableLocalIndexing: Boolean? = null,

val enableGpuAcceleration: Boolean? = null,

val indexWorkerThreads: Int? = null,

val localIndexing: LocalIndexingConfiguration? = null,
)

data class LocalIndexingConfiguration(
val ignoreFilePatterns: List<String>? = null,
val maxFileSizeMB: Int? = null,
val maxIndexSizeMB: Int? = null,
val indexCacheDirPath: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ object AmazonQLspConstants {
const val LSP_CW_CONFIGURATION_KEY = "aws.codeWhisperer"
const val LSP_CW_OPT_OUT_KEY = "shareCodeWhispererContentWithAWS"
const val LSP_CODE_REFERENCES_OPT_OUT_KEY = "includeSuggestionsWithCodeReferences"
const val LSP_Q_CONFIGURATION_KEY = "aws.q"
const val LSP_OPT_OUT_TELEMETRY_CONFIGURATION_KEY = "optOutTelemetry"
const val LSP_ENABLE_TELEMETRY_EVENTS_CONFIGURATION_KEY = "enableTelemetryEventsToDestination"
const val LSP_CUSTOMIZATION_CONFIGURATION_KEY = "customization"
const val LSP_WORKSPACE_CONTEXT_ENABLED_KEY = "workspaceContext"
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,32 +26,31 @@
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.core.utils.tryOrNull
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.Q_CUSTOM_LEARN_MORE_URI
import software.aws.toolkits.jetbrains.ui.AsyncComboBox
import software.aws.toolkits.jetbrains.utils.notifyInfo
import software.aws.toolkits.resources.message

Check warning on line 31 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

Remove deprecated symbol import
import javax.swing.JComponent
import javax.swing.JList

private val NoDataToDisplay = CustomizationUiItem(
CodeWhispererCustomization("", message("codewhisperer.custom.dialog.option.no_data"), ""),

Check warning on line 36 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
false,

Check notice on line 37 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Boolean literal argument without parameter name

Boolean literal argument without a parameter name
false

Check notice on line 38 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Boolean literal argument without parameter name

Boolean literal argument without a parameter name
)

private fun notifyCustomizationIsSelected(project: Project, customizationUiItem: CustomizationUiItem?) {
// TODO: localize
val content = customizationUiItem?.let {
"Amazon Q inline suggestions are now coming from the ${it.customization.name} customization"
} ?: "Amazon Q inline suggestions are now coming from the ${message("codewhisperer.custom.dialog.option.default")}"

Check warning on line 45 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead

notifyInfo(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 48 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
content = content,
project = project,
notificationActions = listOf(
NotificationAction.create(
message("codewhisperer.notification.custom.simple.button.got_it")

Check warning on line 53 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
) { _, notification -> notification.expire() }
)
)
Expand Down Expand Up @@ -81,8 +80,8 @@
private val panel: DialogPanel by lazy { drawPanel() }

init {
title = message("codewhisperer.custom.dialog.title")

Check warning on line 83 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
setOKButtonText(message("codewhisperer.custom.dialog.ok_button.text"))

Check warning on line 84 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead

val selectedOption = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.let {
RadioButtonOption.Customization
Expand Down Expand Up @@ -128,7 +127,7 @@
// TODO: check if we can render a multi-line combo box
private fun drawPanel() = panel {
row {
label(message("codewhisperer.custom.dialog.panel.title")).bold()

Check warning on line 130 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
}

lateinit var customizationButton: Cell<JBRadioButton>
Expand All @@ -137,8 +136,8 @@

buttonsGroup {
row {
defaultButton = radioButton(message("codewhisperer.custom.dialog.option.default"), RadioButtonOption.Default)

Check warning on line 139 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
.comment(message("codewhisperer.custom.dialog.model.default.comment"))

Check warning on line 140 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
.actionListener { _, component ->
if (component.isSelected) {
isOKActionEnabled = CodeWhispererModelConfigurator.getInstance().activeCustomization(project) != null
Expand All @@ -147,7 +146,7 @@
}.topGap(TopGap.MEDIUM)

row {
customizationButton = radioButton(message("codewhisperer.custom.dialog.option.customization"), RadioButtonOption.Customization)

Check warning on line 149 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
.actionListener { _, component ->
if (component.isSelected) {
isOKActionEnabled =
Expand All @@ -162,11 +161,11 @@
lateinit var customizationComment: Row
indent {
noCustomizationComment = row("") {
rowComment(message("codewhisperer.custom.dialog.option.customization.description.no_customization", Q_CUSTOM_LEARN_MORE_URI))
rowComment(message("codewhisperer.custom.dialog.option.customization.description.no_customization", "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/customizations.html"))

Check warning on line 164 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
}.visible(false)

customizationComment = row("") {
rowComment(message("codewhisperer.custom.dialog.option.customization.description"))

Check warning on line 168 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
}.visible(false)
}

Expand Down Expand Up @@ -242,7 +241,7 @@
}
}

private object CustomizationRenderer : ColoredListCellRenderer<CustomizationUiItem>() {

Check warning on line 244 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Serializable object must implement 'readResolve'

Serializable object must implement 'readResolve'
override fun customizeCellRenderer(
list: JList<out CustomizationUiItem>,
value: CustomizationUiItem?,
Expand All @@ -265,7 +264,7 @@

if (it != NoDataToDisplay) {
val description = if (it.customization.description.isNullOrBlank()) {
message("codewhisperer.custom.dialog.customization.no_description")

Check warning on line 267 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
} else {
it.customization.description
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,23 @@
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import com.intellij.util.xmlb.annotations.MapAnnotation
import com.intellij.util.xmlb.annotations.Property
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableCustomizationsRequest

Check warning on line 22 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
import software.aws.toolkits.jetbrains.services.amazonq.calculateIfIamIdentityCenterConnection
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor

Check warning on line 30 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants

Check warning on line 31 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CustomizationConstants
import software.aws.toolkits.jetbrains.utils.notifyInfo
import software.aws.toolkits.jetbrains.utils.notifyWarn
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
import software.aws.toolkits.resources.message

Check warning on line 36 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

Remove deprecated symbol import
import java.util.Collections
import java.util.concurrent.atomic.AtomicBoolean

Expand All @@ -37,11 +41,11 @@

private fun notifyInvalidSelectedCustomization(project: Project) {
notifyWarn(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 44 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
content = message("codewhisperer.notification.custom.not_available"),

Check warning on line 45 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
project = project,
notificationActions = listOf(
NotificationAction.create(message("codewhisperer.notification.custom.simple.button.select_another_customization")) { _, notification ->

Check warning on line 48 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
CodeWhispererModelConfigurator.getInstance().showConfigDialog(project)
notification.expire()
}
Expand All @@ -52,11 +56,11 @@
private fun notifyNewCustomization(project: Project) {
if (ApplicationManager.getApplication().isUnitTestMode) return
notifyInfo(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 59 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
content = message("codewhisperer.notification.custom.new_customization"),

Check warning on line 60 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
project = project,
notificationActions = listOf(
NotificationAction.createSimpleExpiring(message("codewhisperer.notification.custom.simple.button.select_customization")) {

Check warning on line 63 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
CodeWhispererModelConfigurator.getInstance().showConfigDialog(project)
}
)
Expand All @@ -65,7 +69,7 @@

@Service(Service.Level.APP)
@State(name = "codewhispererCustomizationStates", storages = [Storage("aws.xml")])
class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, PersistentStateComponent<CodeWhispererCustomizationState>, Disposable {

Check warning on line 72 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Extension class should be final and non-public

Service implementation should not be public. If a service is supposed to be used outside its module, extract an interface from it and specify it as serviceInterface in plugin.xml.
// TODO: refactor and clean these states, probably not need all the follwing and it's hard to maintain
// Map to store connectionId to its active customization
private val connectionIdToActiveCustomizationArn = Collections.synchronizedMap<String, CodeWhispererCustomization>(mutableMapOf())
Expand Down Expand Up @@ -105,15 +109,36 @@
}
}

/**
* DO NOT directly use this method to fetch customizations, use wrapper [listCustomizations] instead
*/
private fun listAvailableCustomizations(project: Project): List<CodeWhispererCustomization> =
QRegionProfileManager.getInstance().getQClient<CodeWhispererRuntimeClient>(project)
.listAvailableCustomizationsPaginator {}
.flatMap { resp ->
LOG.debug {
"listAvailableCustomizations: requestId: ${resp.responseMetadata().requestId()}, customizations: ${
resp.customizations().map { it.name() }
}"
}
resp.customizations().map {
CodeWhispererCustomization(
arn = it.arn(),
name = it.name(),
description = it.description()
)
}
}

@RequiresBackgroundThread
override fun listCustomizations(project: Project, passive: Boolean): List<CustomizationUiItem>? =
calculateIfIamIdentityCenterConnection(project) {
// 1. invoke API and get result
val listAvailableCustomizationsResult = try {
CodeWhispererClientAdaptor.getInstance(project).listAvailableCustomizations()
listAvailableCustomizations(project)
} catch (e: Exception) {
val requestId = (e as? CodeWhispererRuntimeException)?.requestId()
val logMessage = if (CodeWhispererConstants.Customization.noAccessToCustomizationExceptionPredicate(e)) {
val logMessage = if (CustomizationConstants.noAccessToCustomizationExceptionPredicate(e)) {
// TODO: not required for non GP users
"ListAvailableCustomizations: connection ${it.id} is not allowlisted, requestId: ${requestId.orEmpty()}"
} else {
Expand Down Expand Up @@ -235,7 +260,7 @@
false
} else {
calculateIfIamIdentityCenterConnection(project) {
val cachedValue = connectionIdToIsAllowlisted[it.id]

Check notice on line 263 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Variable declaration could be moved inside 'when'

Variable declaration could be moved into 'when'
when (cachedValue) {
true -> true

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.codewhisperer.util

import software.amazon.awssdk.services.codewhispererruntime.model.AccessDeniedException
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException

object CustomizationConstants {
private const val noAccessToCustomizationMessage = "Your account is not authorized to use CodeWhisperer Enterprise."

Check notice on line 10 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CustomizationConstants.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Const property naming convention

Const property name `noAccessToCustomizationMessage` should not contain lowercase letters

Check notice

Code scanning / QDJVMC

Const property naming convention Note

Const property name noAccessToCustomizationMessage should not contain lowercase letters
private const val invalidCustomizationMessage = "You are not authorized to access"

Check notice on line 11 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CustomizationConstants.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Const property naming convention

Const property name `invalidCustomizationMessage` should not contain lowercase letters

Check notice

Code scanning / QDJVMC

Const property naming convention Note

Const property name invalidCustomizationMessage should not contain lowercase letters

val noAccessToCustomizationExceptionPredicate: (e: Exception) -> Boolean = { e ->
if (e !is CodeWhispererRuntimeException) {
false
} else {
e is software.amazon.awssdk.services.codewhispererruntime.model.AccessDeniedException && (e.message?.contains(noAccessToCustomizationMessage, ignoreCase = true) ?: false)

Check warning on line 17 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/util/CustomizationConstants.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Redundant qualifier name

Redundant qualifier name
}
}

val invalidCustomizationExceptionPredicate: (e: Exception) -> Boolean = { e ->
if (e !is CodeWhispererRuntimeException) {
false
} else {
e is AccessDeniedException && (e.message?.contains(invalidCustomizationMessage, ignoreCase = true) ?: false)
}
}
}
Loading
Loading