Skip to content

Commit 2b6251e

Browse files
author
David Hasani
committed
rest of CSB
1 parent 65c526c commit 2b6251e

29 files changed

+589
-114
lines changed

plugins/amazonq/codetransform/jetbrains-community/resources/META-INF/codetransform-ext-java.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<projectService serviceImplementation="software.aws.toolkits.jetbrains.services.codemodernizer.panels.managers.CodeModernizerBottomWindowPanelManager"/>
1919
<toolWindow id="aws.codewhisperer.codetransform" anchor="bottom" doNotActivateOnStart="true" canCloseContents="false"
2020
factoryClass="software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeModernizerBottomToolWindowFactory"
21-
icon="AllIcons.Actions.Preview"/>
21+
icon="AllIcons.Actions.Properties"/>
2222
<fileEditorProvider implementation="software.aws.toolkits.jetbrains.services.codemodernizer.plan.CodeModernizerPlanEditorProvider"/>
2323
<fileEditorProvider implementation="software.aws.toolkits.jetbrains.services.codemodernizer.summary.CodeModernizerSummaryEditorProvider"/>
2424
</extensions>

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

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModerni
5050
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactDir
5151
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isValidCodeTransformConnection
5252
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.openTroubleshootingGuideNotificationAction
53+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.zipToPath
5354
import software.aws.toolkits.jetbrains.utils.notifyInfo
5455
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
5556
import software.aws.toolkits.jetbrains.utils.notifyStickyWarn
5657
import software.aws.toolkits.resources.message
5758
import software.aws.toolkits.telemetry.CodeTransformArtifactType
5859
import java.io.File
59-
import java.nio.file.Files
6060
import java.nio.file.Path
6161
import java.time.Instant
6262
import java.util.concurrent.atomic.AtomicBoolean
@@ -112,32 +112,12 @@ class ArtifactHandler(
112112
}
113113
}
114114

115-
suspend fun unzipToPath(byteArrayList: List<ByteArray>, outputDirPath: Path? = null): Pair<Path, Int> {
116-
val zipFilePath = withContext(getCoroutineBgContext()) {
117-
if (outputDirPath == null) {
118-
Files.createTempFile(null, ".zip")
119-
} else {
120-
Files.createTempFile(outputDirPath, null, ".zip")
121-
}
122-
}
123-
var totalDownloadBytes = 0
124-
withContext(getCoroutineBgContext()) {
125-
Files.newOutputStream(zipFilePath).use {
126-
for (bytes in byteArrayList) {
127-
it.write(bytes)
128-
totalDownloadBytes += bytes.size
129-
}
130-
}
131-
}
132-
return zipFilePath to totalDownloadBytes
133-
}
134-
135115
suspend fun downloadHilArtifact(jobId: JobId, artifactId: String, tmpDir: File): CodeTransformHilDownloadArtifact? {
136116
val downloadResultsResponse = clientAdaptor.downloadExportResultArchive(jobId, artifactId)
137117

138118
return try {
139119
val tmpPath = tmpDir.toPath()
140-
val (downloadZipFilePath, _) = unzipToPath(downloadResultsResponse, tmpPath)
120+
val (downloadZipFilePath, _) = zipToPath(downloadResultsResponse, tmpPath)
141121
LOG.info { "Successfully converted the hil artifact download to a zip at ${downloadZipFilePath.toAbsolutePath()}." }
142122
CodeTransformHilDownloadArtifact.create(downloadZipFilePath, getPathToHilArtifactDir(tmpPath))
143123
} catch (e: Exception) {
@@ -211,7 +191,7 @@ class ArtifactHandler(
211191
val totalDownloadBytes: Int
212192
val zipPath: String
213193
try {
214-
val result = unzipToPath(downloadResultsResponse)
194+
val result = zipToPath(downloadResultsResponse)
215195
path = result.first
216196
totalDownloadBytes = result.second
217197
zipPath = path.toAbsolutePath().toString()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
909909
// Add delay between upload complete and trying to resume
910910
delay(500)
911911

912-
codeTransformationSession?.resumeTransformFromHil()
912+
codeTransformationSession?.resumeTransformation()
913913
} else {
914914
throw CodeModernizerException("Cannot create dependency zip for HIL")
915915
}

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2020
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdateStatus
2121
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus
2222
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationUserActionStatus
23+
import software.amazon.awssdk.services.codewhispererruntime.model.UploadContext
2324
import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
2425
import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
2526
import software.aws.toolkits.core.utils.Waiters.waitUntil
@@ -174,6 +175,7 @@ class CodeModernizerSession(
174175
}
175176
// for language upgrades, copyResult should always be Successful here, failure cases already handled
176177
val result = sessionContext.createZipWithModuleFiles(copyResult)
178+
sessionContext.originalUploadZipPath = result.payload.toPath()
177179

178180
if (result is ZipCreationResult.Missing1P) {
179181
telemetryErrorMessage = "Missing 1p dependencies"
@@ -283,9 +285,7 @@ class CodeModernizerSession(
283285
return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.OTHER(e.localizedMessage))
284286
} finally {
285287
telemetry.uploadProject(payloadSize, startTime, true, telemetryErrorMessage)
286-
if (payload != null) {
287-
deleteUploadArtifact(payload)
288-
}
288+
// do not delete upload ZIP; re-used for client-side build
289289
}
290290

291291
// Send upload completion message to chat (only if successful)
@@ -309,12 +309,6 @@ class CodeModernizerSession(
309309
}
310310
}
311311

312-
internal fun deleteUploadArtifact(payload: File) {
313-
if (!payload.delete()) {
314-
LOG.warn { "Unable to delete upload artifact." }
315-
}
316-
}
317-
318312
private fun startJob(uploadId: String): StartTransformationResponse {
319313
val sourceLanguage = sessionContext.sourceJavaVersion.name.toTransformationLanguage()
320314
val targetLanguage = sessionContext.targetJavaVersion.name.toTransformationLanguage()
@@ -341,9 +335,10 @@ class CodeModernizerSession(
341335
*/
342336
fun resumeJob(startTime: Instant, jobId: JobId) = state.putJobHistory(sessionContext, TransformationStatus.STARTED, jobId.id, startTime)
343337

344-
fun resumeTransformFromHil() {
338+
fun resumeTransformation() {
345339
val clientAdaptor = GumbyClient.getInstance(sessionContext.project)
346340
clientAdaptor.resumeCodeTransformation(state.currentJobId as JobId, TransformationUserActionStatus.COMPLETED)
341+
getLogger<CodeModernizerManager>().info("Successfully resumed transformation with status of COMPLETED")
347342
}
348343

349344
fun rejectHilAndContinue(): ResumeTransformationResponse {
@@ -390,7 +385,7 @@ class CodeModernizerSession(
390385
/**
391386
* Adapted from [CodeWhispererCodeScanSession]
392387
*/
393-
suspend fun uploadPayload(payload: File): String {
388+
suspend fun uploadPayload(payload: File, uploadContext: UploadContext? = null): String {
394389
val sha256checksum: String = Base64.getEncoder().encodeToString(
395390
withContext(getCoroutineBgContext()) {
396391
DigestUtils.sha256(FileInputStream(payload))
@@ -400,7 +395,7 @@ class CodeModernizerSession(
400395
throw AlreadyDisposedException("Disposed when about to create upload URL")
401396
}
402397
val clientAdaptor = GumbyClient.getInstance(sessionContext.project)
403-
val createUploadUrlResponse = clientAdaptor.createGumbyUploadUrl(sha256checksum)
398+
val createUploadUrlResponse = clientAdaptor.createGumbyUploadUrl(sha256checksum, uploadContext)
404399

405400
LOG.info {
406401
"Uploading project artifact at ${payload.path} with checksum $sha256checksum using uploadId: ${
@@ -428,9 +423,9 @@ class CodeModernizerSession(
428423
createUploadUrlResponse.kmsKeyArn().orEmpty(),
429424
) { shouldStop.get() }
430425
}
431-
LOG.info { "Upload to S3 succeeded" }
426+
LOG.info { "Upload of ${payload.path} to S3 succeeded with upload context of ${uploadContext.toString()}" }
432427
if (!shouldStop.get()) {
433-
LOG.info { "Uploaded artifact. Latency: ${calculateTotalLatency(uploadStartTime, Instant.now())}ms" }
428+
LOG.info { "Uploaded artifact. Latency: ${calculateTotalLatency(uploadStartTime, Instant.now())} ms" }
434429
}
435430
return createUploadUrlResponse.uploadId()
436431
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
4646
CodeTransformStop("codetransform-stop"),
4747
CodeTransformCancel("codetransform-cancel"),
4848
CodeTransformContinue("codetransform-continue"),
49+
CodeTransformAgree("codetransform-agree"),
4950
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
5051
CodeTransformConfirmOneOrMultipleDiffs("codetransform-confirm-one-or-multiple-diffs"),
5152
CodeTransformNew("codetransform-new"),
@@ -81,6 +82,7 @@ class CodeTransformChatApp : AmazonQApp {
8182
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
8283
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
8384
CodeTransformMessageTypes.CodeTransformContinue.type to IncomingCodeTransformMessage.CodeTransformContinue::class,
85+
CodeTransformMessageTypes.CodeTransformAgree.type to IncomingCodeTransformMessage.CodeTransformAgreeToLocalBuild::class,
8486
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
8587
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
8688
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
@@ -194,6 +196,7 @@ class CodeTransformChatApp : AmazonQApp {
194196
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
195197
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
196198
is IncomingCodeTransformMessage.CodeTransformContinue -> inboundAppMessagesHandler.processCodeTransformContinueAction(message)
199+
is IncomingCodeTransformMessage.CodeTransformAgreeToLocalBuild -> inboundAppMessagesHandler.processCodeTransformAgreeToLocalBuild(message)
197200
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
198201
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
199202
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ interface InboundAppMessagesHandler {
1313

1414
suspend fun processCodeTransformContinueAction(message: IncomingCodeTransformMessage.CodeTransformContinue)
1515

16+
suspend fun processCodeTransformAgreeToLocalBuild(message: IncomingCodeTransformMessage.CodeTransformAgreeToLocalBuild)
17+
1618
suspend fun processCodeTransformStartAction(message: IncomingCodeTransformMessage.CodeTransformStart)
1719

1820
suspend fun processCodeTransformSelectSQLMetadataAction(message: IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata)

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ class GumbyClient(private val project: Project) {
6161
private val amazonQStreamingClient
6262
get() = AmazonQStreamingClient.getInstance(project)
6363

64-
fun createGumbyUploadUrl(sha256Checksum: String): CreateUploadUrlResponse {
64+
fun createGumbyUploadUrl(sha256Checksum: String, context: UploadContext? = null): CreateUploadUrlResponse {
6565
val request = CreateUploadUrlRequest.builder()
6666
.contentChecksumType(ContentChecksumType.SHA_256)
6767
.contentChecksum(sha256Checksum)
6868
.uploadIntent(UploadIntent.TRANSFORMATION)
6969
.profileArn(QRegionProfileManager.getInstance().activeProfile(project)?.arn)
70+
.uploadContext(context)
7071
.build()
7172
return callApi({ bearerClient().createUploadUrl(request) }, apiName = "CreateUploadUrl")
7273
}
@@ -164,27 +165,27 @@ class GumbyClient(private val project: Project) {
164165

165166
suspend fun downloadExportResultArchive(
166167
jobId: JobId,
167-
hilDownloadArtifactId: String? = null,
168+
downloadArtifactId: String? = null,
168169
downloadArtifactType: TransformationDownloadArtifactType? = TransformationDownloadArtifactType.CLIENT_INSTRUCTIONS,
169170
): MutableList<ByteArray> = amazonQStreamingClient.exportResultArchive(
170171
jobId.id,
171172
ExportIntent.TRANSFORMATION,
172-
if (hilDownloadArtifactId == null) {
173+
if (downloadArtifactId == null) {
173174
null
174175
} else {
175176
ExportContext
176177
.builder()
177178
.transformationExportContext(
178179
TransformationExportContext
179180
.builder()
180-
.downloadArtifactId(hilDownloadArtifactId)
181+
.downloadArtifactId(downloadArtifactId)
181182
.downloadArtifactType(downloadArtifactType.toString())
182183
.build()
183184
)
184185
.build()
185186
},
186187
{ e ->
187-
LOG.error(e) { "ExportResultArchive failed: ${e.message}" }
188+
LOG.error(e) { "ExportResultArchive on job ${jobId.id} and artifact $downloadArtifactId failed: ${e.message}" }
188189
},
189190
{ startTime ->
190191
LOG.info { "ExportResultArchive latency: ${calculateTotalLatency(startTime, Instant.now())}" }

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ private val continueTransformationButton = Button(
5252
id = CodeTransformButtonId.ContinueTransformation.id,
5353
)
5454

55+
// used to agree to local build
56+
private val agreeToLocalBuildButton = Button(
57+
keepCardAfterClick = false,
58+
waitMandatoryFormItems = false,
59+
text = "Agree",
60+
id = CodeTransformButtonId.AgreeToLocalBuild.id,
61+
)
62+
5563
private val confirmUserSelectionLanguageUpgradeButton = Button(
5664
keepCardAfterClick = false,
5765
waitMandatoryFormItems = true,
@@ -282,11 +290,20 @@ fun buildChooseTransformationObjectiveChatContent() = CodeTransformChatMessageCo
282290
type = CodeTransformChatMessageType.FinalizedAnswer,
283291
)
284292

285-
fun buildObjectiveChosenChatContent(objective: String) = CodeTransformChatMessageContent(
286-
message = objective,
293+
fun buildUserReplyChatContent(reply: String) = CodeTransformChatMessageContent(
294+
message = reply,
287295
type = CodeTransformChatMessageType.Prompt,
288296
)
289297

298+
fun buildPermissionToBuildChatContent() = CodeTransformChatMessageContent(
299+
message = message("codemodernizer.chat.message.permission_to_build"),
300+
type = CodeTransformChatMessageType.FinalizedAnswer,
301+
buttons = listOf(
302+
cancelUserSelectionButton,
303+
agreeToLocalBuildButton
304+
)
305+
)
306+
290307
fun buildCheckingValidProjectChatContent() = CodeTransformChatMessageContent(
291308
message = message("codemodernizer.chat.message.validation.check_eligible_modules"),
292309
type = CodeTransformChatMessageType.PendingAnswer,
@@ -399,6 +416,11 @@ fun buildUserInputCustomDependencyVersionsChatContent() = CodeTransformChatMessa
399416
type = CodeTransformChatMessageType.FinalizedAnswer,
400417
)
401418

419+
fun buildPromptTargetJDKPathChatContent(prompt: String) = CodeTransformChatMessageContent(
420+
message = prompt,
421+
type = CodeTransformChatMessageType.FinalizedAnswer,
422+
)
423+
402424
fun buildCustomDependencyVersionsFileValidChatContent() = CodeTransformChatMessageContent(
403425
message = "I received your .yaml file and will upload it to Q.",
404426
type = CodeTransformChatMessageType.FinalizedAnswer,

0 commit comments

Comments
 (0)