Skip to content

Commit d9ac6f3

Browse files
authored
Merge branch 'main' into feature/add-idecategory
2 parents a1fc092 + 2e39dc0 commit d9ac6f3

File tree

11 files changed

+83
-72
lines changed

11 files changed

+83
-72
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Amazon Q /dev: Fix issue when files are deleted while preparing context"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Prevent customization override if user has manually selected a customization"
4+
}

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ mockitoKotlin = "5.4.0"
2727
mockk = "1.13.10"
2828
nimbus-jose-jwt = "9.40"
2929
node-gradle = "7.0.2"
30-
telemetryGenerator = "1.0.284"
30+
telemetryGenerator = "1.0.291"
3131
testLogger = "4.0.0"
3232
testRetry = "1.5.10"
3333
# test-only; platform provides slf4j transitively at runtime

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
5656
import software.aws.toolkits.jetbrains.utils.notifyStickyWarn
5757
import software.aws.toolkits.resources.message
5858
import software.aws.toolkits.telemetry.CodeTransformArtifactType
59-
import software.aws.toolkits.telemetry.CodeTransformVCSViewerSrcComponents
6059
import java.io.File
6160
import java.nio.file.Files
6261
import java.nio.file.Path
@@ -93,17 +92,17 @@ class ArtifactHandler(
9392
private var totalPatchFiles: Int = 0
9493
private var sharedPatchIndex: Int = 0
9594

96-
internal suspend fun displayDiff(job: JobId, source: CodeTransformVCSViewerSrcComponents) {
95+
internal suspend fun displayDiff(job: JobId) {
9796
if (isCurrentlyDownloading.get()) return
9897
when (val result = downloadArtifact(job, TransformationDownloadArtifactType.CLIENT_INSTRUCTIONS)) {
9998
is DownloadArtifactResult.Success -> {
10099
if (result.artifact !is CodeModernizerArtifact) return notifyUnableToApplyPatch("")
101100
totalPatchFiles = result.artifact.patches.size
102101
if (result.artifact.description == null) {
103-
displayDiffUsingPatch(result.artifact.patches.first(), totalPatchFiles, null, job, source)
102+
displayDiffUsingPatch(result.artifact.patches.first(), totalPatchFiles, null, job)
104103
} else {
105104
val diffDescription = result.artifact.description[getCurrentPatchIndex()]
106-
displayDiffUsingPatch(result.artifact.patches[getCurrentPatchIndex()], totalPatchFiles, diffDescription, job, source)
105+
displayDiffUsingPatch(result.artifact.patches[getCurrentPatchIndex()], totalPatchFiles, diffDescription, job)
107106
}
108107
}
109108
is DownloadArtifactResult.ParseZipFailure -> notifyUnableToApplyPatch(result.failureReason.errorMessage)
@@ -285,7 +284,6 @@ class ArtifactHandler(
285284
totalPatchFiles: Int,
286285
diffDescription: PatchInfo?,
287286
jobId: JobId,
288-
source: CodeTransformVCSViewerSrcComponents,
289287
) {
290288
withContext(EDT) {
291289
val dialog = ApplyPatchDifferentiatedDialog(
@@ -312,8 +310,7 @@ class ArtifactHandler(
312310
dialog.isModal = true
313311

314312
if (dialog.showAndGet()) {
315-
telemetry.submitSelection("Submit-${diffDescription?.name}")
316-
telemetry.viewArtifact(CodeTransformArtifactType.ClientInstructions, jobId, "Submit", source)
313+
telemetry.submitSelection("Submit-${diffDescription?.name}", jobId.toString())
317314
if (diffDescription == null) {
318315
val resultContent = CodeTransformChatMessageContent(
319316
type = CodeTransformChatMessageType.PendingAnswer,
@@ -352,7 +349,7 @@ class ArtifactHandler(
352349
}
353350
}
354351
} else {
355-
telemetry.viewArtifact(CodeTransformArtifactType.ClientInstructions, jobId, "Cancel", source)
352+
telemetry.submitSelection("Cancel", jobId.toString())
356353
}
357354
}
358355
}
@@ -465,9 +462,9 @@ class ArtifactHandler(
465462
)
466463
}
467464

468-
fun displayDiffAction(jobId: JobId, source: CodeTransformVCSViewerSrcComponents) = runReadAction {
465+
fun displayDiffAction(jobId: JobId) = runReadAction {
469466
projectCoroutineScope(project).launch {
470-
displayDiff(jobId, source)
467+
displayDiff(jobId)
471468
}
472469
}
473470

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
1111
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
1212
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
1313
import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult
14-
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
1514
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeTransformTelemetryState
1615
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency
1716
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getAuthType
@@ -24,8 +23,8 @@ import software.aws.toolkits.telemetry.CodeTransformCancelSrcComponents
2423
import software.aws.toolkits.telemetry.CodeTransformJavaSourceVersionsAllowed
2524
import software.aws.toolkits.telemetry.CodeTransformJavaTargetVersionsAllowed
2625
import software.aws.toolkits.telemetry.CodeTransformPreValidationError
27-
import software.aws.toolkits.telemetry.CodeTransformVCSViewerSrcComponents
2826
import software.aws.toolkits.telemetry.CodetransformTelemetry
27+
import software.aws.toolkits.telemetry.MetricResult
2928
import software.aws.toolkits.telemetry.Result
3029
import java.time.Instant
3130
import java.util.Base64
@@ -36,7 +35,6 @@ import java.util.Base64
3635
@Service(Service.Level.PROJECT)
3736
class CodeTransformTelemetryManager(private val project: Project) {
3837
private val sessionId get() = CodeTransformTelemetryState.instance.getSessionId()
39-
private val currentJobStatus get() = CodeModernizerSessionState.getInstance(project).currentJobStatus.toString()
4038

4139
fun initiateTransform(telemetryErrorMessage: String? = null) {
4240
CodetransformTelemetry.initiateTransform(
@@ -65,13 +63,14 @@ class CodeTransformTelemetryManager(private val project: Project) {
6563
)
6664
}
6765

68-
fun submitSelection(userChoice: String, customerSelection: CustomerSelection? = null, telemetryErrorMessage: String? = null) {
66+
fun submitSelection(userChoice: String, jobId: String? = null, customerSelection: CustomerSelection? = null, telemetryErrorMessage: String? = null) {
6967
CodetransformTelemetry.submitSelection(
70-
// TODO: remove below 2 lines (JavaSource / JavaTarget) once BI is updated to use source / target
68+
// TODO: remove the below 2 lines (JavaSource / JavaTarget) once BI is updated to use source / target
7169
codeTransformJavaSourceVersionsAllowed = CodeTransformJavaSourceVersionsAllowed.from(customerSelection?.sourceJavaVersion?.name.orEmpty()),
7270
codeTransformJavaTargetVersionsAllowed = CodeTransformJavaTargetVersionsAllowed.from(customerSelection?.targetJavaVersion?.name.orEmpty()),
7371
codeTransformSessionId = sessionId,
7472
codeTransformProjectId = customerSelection?.let { getProjectHash(it) },
73+
codeTransformJobId = jobId,
7574
source = if (userChoice == "Confirm-Java") customerSelection?.sourceJavaVersion?.name.orEmpty() else customerSelection?.sourceVendor.orEmpty(),
7675
target = if (userChoice == "Confirm-Java") customerSelection?.targetJavaVersion?.name.orEmpty() else customerSelection?.targetVendor.orEmpty(),
7776
userChoice = userChoice,
@@ -128,25 +127,6 @@ class CodeTransformTelemetryManager(private val project: Project) {
128127
)
129128
}
130129

131-
fun viewArtifact(
132-
artifactType: CodeTransformArtifactType,
133-
jobId: JobId,
134-
userChoice: String,
135-
source: CodeTransformVCSViewerSrcComponents,
136-
telemetryErrorMessage: String? = null,
137-
) {
138-
CodetransformTelemetry.viewArtifact(
139-
codeTransformArtifactType = artifactType,
140-
codeTransformVCSViewerSrcComponents = source,
141-
codeTransformSessionId = sessionId,
142-
codeTransformJobId = jobId.id,
143-
codeTransformStatus = currentJobStatus,
144-
userChoice = userChoice,
145-
result = if (telemetryErrorMessage.isNullOrEmpty()) Result.Succeeded else Result.Failed,
146-
reason = telemetryErrorMessage,
147-
)
148-
}
149-
150130
fun getProjectHash(customerSelection: CustomerSelection) = Base64.getEncoder().encodeToString(
151131
DigestUtils.sha256(customerSelection.configurationFile?.toNioPath()?.toAbsolutePath().toString())
152132
)
@@ -196,12 +176,12 @@ class CodeTransformTelemetryManager(private val project: Project) {
196176

197177
fun logHil(jobId: String, metaData: HilTelemetryMetaData, success: Boolean, reason: String) {
198178
CodetransformTelemetry.humanInTheLoop(
199-
project,
200-
jobId,
201-
metaData.toString(),
202-
sessionId,
203-
reason,
204-
success,
179+
project = project,
180+
codeTransformJobId = jobId,
181+
codeTransformMetadata = metaData.toString(),
182+
codeTransformSessionId = sessionId,
183+
reason = reason,
184+
result = if (success) MetricResult.Succeeded else MetricResult.Failed,
205185
)
206186
}
207187

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.unzipFile
113113
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.validateSctMetadata
114114
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
115115
import software.aws.toolkits.resources.message
116-
import software.aws.toolkits.telemetry.CodeTransformVCSViewerSrcComponents
117116

118117
class CodeTransformChatController(
119118
private val context: AmazonQAppInitContext,
@@ -273,7 +272,7 @@ class CodeTransformChatController(
273272

274273
override suspend fun processCodeTransformCancelAction(message: IncomingCodeTransformMessage.CodeTransformCancel) {
275274
if (!checkForAuth(message.tabId)) {
276-
telemetry.submitSelection("Cancel", null, "User is not authenticated")
275+
telemetry.submitSelection("Cancel", null, null, "User is not authenticated")
277276
return
278277
}
279278

@@ -288,7 +287,7 @@ class CodeTransformChatController(
288287

289288
override suspend fun processCodeTransformStartAction(message: IncomingCodeTransformMessage.CodeTransformStart) {
290289
if (!checkForAuth(message.tabId)) {
291-
telemetry.submitSelection("Confirm", null, "User is not authenticated")
290+
telemetry.submitSelection("Confirm", null, null, "User is not authenticated")
292291
return
293292
}
294293

@@ -311,7 +310,7 @@ class CodeTransformChatController(
311310
codeModernizerManager.createCodeModernizerSession(selection, context.project)
312311

313312
// Publish metric to capture user selection before local build starts
314-
telemetry.submitSelection("Confirm-Java", selection)
313+
telemetry.submitSelection("Confirm-Java", null, selection)
315314

316315
codeTransformChatHelper.run {
317316
addNewMessage(buildUserInputSkipTestsFlagChatIntroContent())
@@ -343,7 +342,7 @@ class CodeTransformChatController(
343342

344343
unzipFile(selectedZipFile.toNioPath(), extractedZip.toPath(), true)
345344

346-
val sctFile = extractedZip.listFiles { file -> file.name.endsWith(".sct") }.firstOrNull()
345+
val sctFile = extractedZip.listFiles { file -> file.name.endsWith(".sct") }?.firstOrNull()
347346

348347
val metadataValidationResult = validateSctMetadata(sctFile)
349348

@@ -373,7 +372,7 @@ class CodeTransformChatController(
373372
sqlMetadataZip = extractedZip,
374373
)
375374
codeModernizerManager.createCodeModernizerSession(selection, context.project)
376-
telemetry.submitSelection("Confirm-SQL", selection)
375+
telemetry.submitSelection("Confirm-SQL", null, selection)
377376
}
378377
}
379378

@@ -494,7 +493,6 @@ class CodeTransformChatController(
494493
override suspend fun processCodeTransformViewDiff(message: IncomingCodeTransformMessage.CodeTransformViewDiff) {
495494
artifactHandler.displayDiffAction(
496495
CodeModernizerSessionState.getInstance(context.project).currentJobId as JobId,
497-
CodeTransformVCSViewerSrcComponents.Chat
498496
)
499497
}
500498

plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationR
3535
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.filterOnlyParentFiles
3636
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.unzipFile
3737
import software.aws.toolkits.telemetry.CodeTransformPreValidationError
38-
import software.aws.toolkits.telemetry.CodeTransformVCSViewerSrcComponents
3938
import kotlin.io.path.Path
4039
import kotlin.io.path.createTempDirectory
4140
import kotlin.io.path.exists
@@ -55,7 +54,7 @@ class CodeWhispererCodeModernizerTest : CodeWhispererCodeModernizerTestBase() {
5554
doNothing().whenever(handler).notifyUnableToApplyPatch(any())
5655
val result = DownloadArtifactResult.ParseZipFailure(expectedError)
5756
doReturn(result).whenever(handler).downloadArtifact(any(), eq(TransformationDownloadArtifactType.CLIENT_INSTRUCTIONS), eq(false))
58-
handler.displayDiff(jobId, CodeTransformVCSViewerSrcComponents.ToastNotification)
57+
handler.displayDiff(jobId)
5958
verify(handler, times(1)).notifyUnableToApplyPatch(any())
6059
}
6160

@@ -136,15 +135,14 @@ class CodeWhispererCodeModernizerTest : CodeWhispererCodeModernizerTestBase() {
136135
doAnswer {
137136
mockDialog.showAndGet()
138137
mockDialog
139-
}.whenever(handler).displayDiffUsingPatch(any(), any(), any(), any(), any())
140-
handler.displayDiff(jobId, CodeTransformVCSViewerSrcComponents.Chat)
138+
}.whenever(handler).displayDiffUsingPatch(any(), any(), any(), any())
139+
handler.displayDiff(jobId)
141140
verify(handler, never()).notifyUnableToApplyPatch(any())
142141
verify(handler, times(1)).displayDiffUsingPatch(
143142
testCodeModernizerArtifact.patches[0],
144143
testCodeModernizerArtifact.patches.size,
145144
testCodeModernizerArtifact.description?.get(0),
146145
jobId,
147-
CodeTransformVCSViewerSrcComponents.Chat
148146
)
149147
}
150148

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,17 +157,24 @@ class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, Pe
157157
return@calculateIfIamIdentityCenterConnection customizationUiItems
158158
}
159159

160+
/**
161+
* Gets the active customization for a user. If a user has manually selected a customization,
162+
* respect that choice. If a user has not selected a customization, check if they have a customization
163+
* assigned to them via an AB feature. If so, use that customization.
164+
*/
160165
override fun activeCustomization(project: Project): CodeWhispererCustomization? {
161-
val result = calculateIfIamIdentityCenterConnection(project) { connectionIdToActiveCustomizationArn[it.id] }
162-
163-
// A/B case
164-
val customizationFeature = CodeWhispererFeatureConfigService.getInstance().getCustomizationFeature()
165-
if (customizationFeature == null || customizationFeature.value.stringValue().isEmpty()) return result
166-
return CodeWhispererCustomization(
167-
arn = customizationFeature.value.stringValue(),
168-
name = customizationFeature.variation,
169-
description = result?.description
170-
)
166+
val selectedCustomization = calculateIfIamIdentityCenterConnection(project) { connectionIdToActiveCustomizationArn[it.id] }
167+
168+
if (selectedCustomization != null) {
169+
return selectedCustomization
170+
} else {
171+
val customizationOverride = CodeWhispererFeatureConfigService.getInstance().getCustomizationFeature()
172+
if (customizationOverride == null || customizationOverride.value.stringValue().isEmpty()) return null
173+
return CodeWhispererCustomization(
174+
arn = customizationOverride.value.stringValue(),
175+
name = customizationOverride.variation,
176+
)
177+
}
171178
}
172179

173180
override fun switchCustomization(project: Project, newCustomization: CodeWhispererCustomization?) {

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,37 @@ class CodeWhispererModelConfiguratorTest {
113113
}
114114

115115
@Test
116-
fun `should override customization arn if there is one under AB test`() {
116+
fun `should not override customization arn if there is one under AB test and manual selection has been made`() {
117117
val ssoConn = spy(LegacyManagedBearerSsoConnection(region = "us-east-1", startUrl = "url 1", scopes = Q_SCOPES))
118118
ToolkitConnectionManager.getInstance(projectRule.project).switchConnection(ssoConn)
119119

120-
sut.switchCustomization(projectRule.project, CodeWhispererCustomization("foo", "customization_1", "description_1"))
121-
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(CodeWhispererCustomization("foo", "customization_1", "description_1"))
120+
sut.switchCustomization(projectRule.project, CodeWhispererCustomization("selectedCustomizationArn", "customization_1", "description_1"))
121+
assertThat(sut.activeCustomization(projectRule.project))
122+
.isEqualTo(CodeWhispererCustomization("selectedCustomizationArn", "customization_1", "description_1"))
122123

123124
abManager.stub {
124125
on { getCustomizationFeature() }.thenReturn(FeatureContext("customizationArnOverride", "foo", FeatureValue.builder().stringValue("bar").build()))
125126
}
126-
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(CodeWhispererCustomization("bar", "foo", "description_1"))
127+
assertThat(sut.activeCustomization(projectRule.project))
128+
.isEqualTo(CodeWhispererCustomization("selectedCustomizationArn", "customization_1", "description_1"))
129+
}
130+
131+
@Test
132+
fun `should override customization arn if there is one under AB test and manual selection has not been made`() {
133+
val ssoConn = spy(LegacyManagedBearerSsoConnection(region = "us-east-1", startUrl = "url 1", scopes = Q_SCOPES))
134+
ToolkitConnectionManager.getInstance(projectRule.project).switchConnection(ssoConn)
135+
136+
sut.switchCustomization(projectRule.project, CodeWhispererCustomization("selectedCustomizationArn", "customization_1", "description_1"))
137+
assertThat(sut.activeCustomization(projectRule.project))
138+
.isEqualTo(CodeWhispererCustomization("selectedCustomizationArn", "customization_1", "description_1"))
139+
sut.invalidateCustomization("selectedCustomizationArn")
140+
141+
abManager.stub {
142+
on { getCustomizationFeature() }.thenReturn(
143+
FeatureContext("customizationArnOverride", "foo", FeatureValue.builder().stringValue("overrideArn").build())
144+
)
145+
}
146+
assertThat(sut.activeCustomization(projectRule.project)).isEqualTo(CodeWhispererCustomization("overrideArn", "foo", null))
127147
}
128148

129149
@Test

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationStateUtils.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
package software.aws.toolkits.jetbrains.core.notifications
55

66
import com.intellij.openapi.components.PersistentStateComponent
7-
import com.intellij.openapi.components.RoamingType
87
import com.intellij.openapi.components.Service
98
import com.intellij.openapi.components.State
109
import com.intellij.openapi.components.Storage
1110
import com.intellij.openapi.components.service
1211
import software.aws.toolkits.core.utils.ETagProvider
1312

1413
@Service
15-
@State(name = "notificationDismissals", storages = [Storage("aws.xml", roamingType = RoamingType.DISABLED)])
14+
@State(name = "notificationDismissals", storages = [Storage("aws.xml")])
1615
class NotificationDismissalState : PersistentStateComponent<NotificationDismissalConfiguration> {
1716
private val state = NotificationDismissalConfiguration()
1817

@@ -41,7 +40,7 @@ data class NotificationDismissalConfiguration(
4140
)
4241

4342
@Service
44-
@State(name = "notificationEtag", storages = [Storage("aws.xml", roamingType = RoamingType.DISABLED)])
43+
@State(name = "notificationEtag", storages = [Storage("aws.xml")])
4544
class NotificationEtagState : PersistentStateComponent<NotificationEtagConfiguration>, ETagProvider {
4645
private val state = NotificationEtagConfiguration()
4746

0 commit comments

Comments
 (0)