Skip to content

Commit 7054dfc

Browse files
author
David Hasani
committed
rest of CSB
1 parent f4fca12 commit 7054dfc

29 files changed

+592
-115
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
@@ -890,7 +890,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
890890
// Add delay between upload complete and trying to resume
891891
delay(500)
892892

893-
codeTransformationSession?.resumeTransformFromHil()
893+
codeTransformationSession?.resumeTransformation()
894894
} else {
895895
throw CodeModernizerException("Cannot create dependency zip for HIL")
896896
}

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
@@ -19,6 +19,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
1919
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdateStatus
2020
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus
2121
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationUserActionStatus
22+
import software.amazon.awssdk.services.codewhispererruntime.model.UploadContext
2223
import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
2324
import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
2425
import software.aws.toolkits.core.utils.Waiters.waitUntil
@@ -170,6 +171,7 @@ class CodeModernizerSession(
170171
}
171172
// for language upgrades, copyResult should always be Successful here, failure cases already handled
172173
val result = sessionContext.createZipWithModuleFiles(copyResult)
174+
sessionContext.originalUploadZipPath = result.payload.toPath()
173175

174176
if (result is ZipCreationResult.Missing1P) {
175177
telemetryErrorMessage = "Missing 1p dependencies"
@@ -276,9 +278,7 @@ class CodeModernizerSession(
276278
return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.OTHER(e.localizedMessage))
277279
} finally {
278280
telemetry.uploadProject(payloadSize, startTime, true, telemetryErrorMessage)
279-
if (payload != null) {
280-
deleteUploadArtifact(payload)
281-
}
281+
// do not delete upload ZIP; re-used for client-side build
282282
}
283283

284284
// Send upload completion message to chat (only if successful)
@@ -302,12 +302,6 @@ class CodeModernizerSession(
302302
}
303303
}
304304

305-
internal fun deleteUploadArtifact(payload: File) {
306-
if (!payload.delete()) {
307-
LOG.warn { "Unable to delete upload artifact." }
308-
}
309-
}
310-
311305
private fun startJob(uploadId: String): StartTransformationResponse {
312306
val sourceLanguage = sessionContext.sourceJavaVersion.name.toTransformationLanguage()
313307
val targetLanguage = sessionContext.targetJavaVersion.name.toTransformationLanguage()
@@ -334,9 +328,10 @@ class CodeModernizerSession(
334328
*/
335329
fun resumeJob(startTime: Instant, jobId: JobId) = state.putJobHistory(sessionContext, TransformationStatus.STARTED, jobId.id, startTime)
336330

337-
fun resumeTransformFromHil() {
331+
fun resumeTransformation() {
338332
val clientAdaptor = GumbyClient.getInstance(sessionContext.project)
339333
clientAdaptor.resumeCodeTransformation(state.currentJobId as JobId, TransformationUserActionStatus.COMPLETED)
334+
getLogger<CodeModernizerManager>().info("Successfully resumed transformation with status of COMPLETED")
340335
}
341336

342337
fun rejectHilAndContinue(): ResumeTransformationResponse {
@@ -383,7 +378,7 @@ class CodeModernizerSession(
383378
/**
384379
* Adapted from [CodeWhispererCodeScanSession]
385380
*/
386-
suspend fun uploadPayload(payload: File): String {
381+
suspend fun uploadPayload(payload: File, uploadContext: UploadContext? = null): String {
387382
val sha256checksum: String = Base64.getEncoder().encodeToString(
388383
withContext(getCoroutineBgContext()) {
389384
DigestUtils.sha256(FileInputStream(payload))
@@ -393,7 +388,7 @@ class CodeModernizerSession(
393388
throw AlreadyDisposedException("Disposed when about to create upload URL")
394389
}
395390
val clientAdaptor = GumbyClient.getInstance(sessionContext.project)
396-
val createUploadUrlResponse = clientAdaptor.createGumbyUploadUrl(sha256checksum)
391+
val createUploadUrlResponse = clientAdaptor.createGumbyUploadUrl(sha256checksum, uploadContext)
397392

398393
LOG.info {
399394
"Uploading project artifact at ${payload.path} with checksum $sha256checksum using uploadId: ${
@@ -421,9 +416,9 @@ class CodeModernizerSession(
421416
createUploadUrlResponse.kmsKeyArn().orEmpty(),
422417
) { shouldStop.get() }
423418
}
424-
LOG.info { "Upload to S3 succeeded" }
419+
LOG.info { "Upload of ${payload.path} to S3 succeeded with upload context of ${uploadContext.toString()}" }
425420
if (!shouldStop.get()) {
426-
LOG.info { "Uploaded artifact. Latency: ${calculateTotalLatency(uploadStartTime, Instant.now())}ms" }
421+
LOG.info { "Uploaded artifact. Latency: ${calculateTotalLatency(uploadStartTime, Instant.now())} ms" }
427422
}
428423
return createUploadUrlResponse.uploadId()
429424
}

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
@@ -43,6 +43,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
4343
CodeTransformStop("codetransform-stop"),
4444
CodeTransformCancel("codetransform-cancel"),
4545
CodeTransformContinue("codetransform-continue"),
46+
CodeTransformAgree("codetransform-agree"),
4647
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
4748
CodeTransformConfirmOneOrMultipleDiffs("codetransform-confirm-one-or-multiple-diffs"),
4849
CodeTransformNew("codetransform-new"),
@@ -78,6 +79,7 @@ class CodeTransformChatApp : AmazonQApp {
7879
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
7980
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
8081
CodeTransformMessageTypes.CodeTransformContinue.type to IncomingCodeTransformMessage.CodeTransformContinue::class,
82+
CodeTransformMessageTypes.CodeTransformAgree.type to IncomingCodeTransformMessage.CodeTransformAgreeToLocalBuild::class,
8183
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
8284
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
8385
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
@@ -182,6 +184,7 @@ class CodeTransformChatApp : AmazonQApp {
182184
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
183185
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
184186
is IncomingCodeTransformMessage.CodeTransformContinue -> inboundAppMessagesHandler.processCodeTransformContinueAction(message)
187+
is IncomingCodeTransformMessage.CodeTransformAgreeToLocalBuild -> inboundAppMessagesHandler.processCodeTransformAgreeToLocalBuild(message)
185188
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
186189
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
187190
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
@@ -66,11 +66,12 @@ class GumbyClient(private val project: Project) {
6666
private val amazonQStreamingClient
6767
get() = AmazonQStreamingClient.getInstance(project)
6868

69-
fun createGumbyUploadUrl(sha256Checksum: String): CreateUploadUrlResponse {
69+
fun createGumbyUploadUrl(sha256Checksum: String, context: UploadContext? = null): CreateUploadUrlResponse {
7070
val request = CreateUploadUrlRequest.builder()
7171
.contentChecksumType(ContentChecksumType.SHA_256)
7272
.contentChecksum(sha256Checksum)
7373
.uploadIntent(UploadIntent.TRANSFORMATION)
74+
.uploadContext(context)
7475
.build()
7576
return callApi({ bearerClient().createUploadUrl(request) }, apiName = "CreateUploadUrl")
7677
}
@@ -158,27 +159,27 @@ class GumbyClient(private val project: Project) {
158159

159160
suspend fun downloadExportResultArchive(
160161
jobId: JobId,
161-
hilDownloadArtifactId: String? = null,
162+
downloadArtifactId: String? = null,
162163
downloadArtifactType: TransformationDownloadArtifactType? = TransformationDownloadArtifactType.CLIENT_INSTRUCTIONS,
163164
): MutableList<ByteArray> = amazonQStreamingClient.exportResultArchive(
164165
jobId.id,
165166
ExportIntent.TRANSFORMATION,
166-
if (hilDownloadArtifactId == null) {
167+
if (downloadArtifactId == null) {
167168
null
168169
} else {
169170
ExportContext
170171
.builder()
171172
.transformationExportContext(
172173
TransformationExportContext
173174
.builder()
174-
.downloadArtifactId(hilDownloadArtifactId)
175+
.downloadArtifactId(downloadArtifactId)
175176
.downloadArtifactType(downloadArtifactType.toString())
176177
.build()
177178
)
178179
.build()
179180
},
180181
{ e ->
181-
LOG.error(e) { "ExportResultArchive failed: ${e.message}" }
182+
LOG.error(e) { "ExportResultArchive on job ${jobId.id} and artifact $downloadArtifactId failed: ${e.message}" }
182183
},
183184
{ startTime ->
184185
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)