Skip to content

Commit cb10ebd

Browse files
Merge main into feature/remote-chat
2 parents 02db760 + 5c28a36 commit cb10ebd

31 files changed

+795
-101
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
</extensions>
2424

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

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import software.aws.toolkits.core.utils.exists
2424
import software.aws.toolkits.core.utils.getLogger
2525
import software.aws.toolkits.core.utils.info
2626
import software.aws.toolkits.jetbrains.core.coroutines.EDT
27-
import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext
2827
import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope
2928
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.NoTokenInitializedException
3029
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_DOWNLOAD_ERROR_OVERVIEW
@@ -50,13 +49,13 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModerni
5049
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactDir
5150
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isValidCodeTransformConnection
5251
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.openTroubleshootingGuideNotificationAction
52+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.zipToPath
5353
import software.aws.toolkits.jetbrains.utils.notifyInfo
5454
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
5555
import software.aws.toolkits.jetbrains.utils.notifyStickyWarn
5656
import software.aws.toolkits.resources.message
5757
import software.aws.toolkits.telemetry.CodeTransformArtifactType
5858
import java.io.File
59-
import java.nio.file.Files
6059
import java.nio.file.Path
6160
import java.time.Instant
6261
import java.util.concurrent.atomic.AtomicBoolean
@@ -112,32 +111,12 @@ class ArtifactHandler(
112111
}
113112
}
114113

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-
135114
suspend fun downloadHilArtifact(jobId: JobId, artifactId: String, tmpDir: File): CodeTransformHilDownloadArtifact? {
136115
val downloadResultsResponse = clientAdaptor.downloadExportResultArchive(jobId, artifactId)
137116

138117
return try {
139118
val tmpPath = tmpDir.toPath()
140-
val (downloadZipFilePath, _) = unzipToPath(downloadResultsResponse, tmpPath)
119+
val (downloadZipFilePath, _) = zipToPath(downloadResultsResponse, tmpPath)
141120
LOG.info { "Successfully converted the hil artifact download to a zip at ${downloadZipFilePath.toAbsolutePath()}." }
142121
CodeTransformHilDownloadArtifact.create(downloadZipFilePath, getPathToHilArtifactDir(tmpPath))
143122
} catch (e: Exception) {
@@ -211,7 +190,7 @@ class ArtifactHandler(
211190
val totalDownloadBytes: Int
212191
val zipPath: String
213192
try {
214-
val result = unzipToPath(downloadResultsResponse)
193+
val result = zipToPath(downloadResultsResponse)
215194
path = result.first
216195
totalDownloadBytes = result.second
217196
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
@@ -900,7 +900,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
900900
// Add delay between upload complete and trying to resume
901901
delay(500)
902902

903-
codeTransformationSession?.resumeTransformFromHil()
903+
codeTransformationSession?.resumeTransformation()
904904
} else {
905905
throw CodeModernizerException("Cannot create dependency zip for HIL")
906906
}

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" }
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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ private enum class CodeTransformMessageTypes(val type: String) {
4141
ChatPrompt("chat-prompt"), // for getting the transformation objective
4242
CodeTransformStart("codetransform-start"),
4343
CodeTransformSelectSQLMetadata("codetransform-select-sql-metadata"),
44+
CodeTransformConfirmCustomDependencyVersions("codetransform-input-confirm-custom-dependency-versions"),
4445
CodeTransformSelectSQLModuleSchema("codetransform-select-sql-module-schema"),
4546
CodeTransformStop("codetransform-stop"),
4647
CodeTransformCancel("codetransform-cancel"),
48+
CodeTransformContinue("codetransform-continue"),
4749
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
4850
CodeTransformConfirmOneOrMultipleDiffs("codetransform-confirm-one-or-multiple-diffs"),
4951
CodeTransformNew("codetransform-new"),
@@ -74,9 +76,12 @@ class CodeTransformChatApp : AmazonQApp {
7476
CodeTransformMessageTypes.Transform.type to IncomingCodeTransformMessage.Transform::class,
7577
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
7678
CodeTransformMessageTypes.CodeTransformSelectSQLMetadata.type to IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata::class,
79+
CodeTransformMessageTypes.CodeTransformConfirmCustomDependencyVersions.type to
80+
IncomingCodeTransformMessage.CodeTransformConfirmCustomDependencyVersions::class,
7781
CodeTransformMessageTypes.CodeTransformSelectSQLModuleSchema.type to IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema::class,
7882
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
7983
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
84+
CodeTransformMessageTypes.CodeTransformContinue.type to IncomingCodeTransformMessage.CodeTransformContinue::class,
8085
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
8186
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
8287
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
@@ -182,12 +187,14 @@ class CodeTransformChatApp : AmazonQApp {
182187
is IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata -> inboundAppMessagesHandler.processCodeTransformSelectSQLMetadataAction(message)
183188
is IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema ->
184189
inboundAppMessagesHandler.processCodeTransformSelectSQLModuleSchemaAction(message)
185-
190+
is IncomingCodeTransformMessage.CodeTransformConfirmCustomDependencyVersions ->
191+
inboundAppMessagesHandler.processCodeTransformCustomDependencyVersions(message)
186192
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
187193
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
188194
is IncomingCodeTransformMessage.ChatPrompt -> inboundAppMessagesHandler.processChatPromptMessage(message)
189195
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
190196
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
197+
is IncomingCodeTransformMessage.CodeTransformContinue -> inboundAppMessagesHandler.processCodeTransformContinueAction(message)
191198
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
192199
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
193200
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ interface InboundAppMessagesHandler {
1111

1212
suspend fun processCodeTransformCancelAction(message: IncomingCodeTransformMessage.CodeTransformCancel)
1313

14+
suspend fun processCodeTransformContinueAction(message: IncomingCodeTransformMessage.CodeTransformContinue)
15+
1416
suspend fun processCodeTransformStartAction(message: IncomingCodeTransformMessage.CodeTransformStart)
1517

1618
suspend fun processCodeTransformSelectSQLMetadataAction(message: IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata)
1719

1820
suspend fun processCodeTransformSelectSQLModuleSchemaAction(message: IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema)
1921

22+
suspend fun processCodeTransformCustomDependencyVersions(message: IncomingCodeTransformMessage.CodeTransformConfirmCustomDependencyVersions)
23+
2024
suspend fun processCodeTransformStopAction(tabId: String)
2125

2226
suspend fun processChatPromptMessage(message: IncomingCodeTransformMessage.ChatPrompt)

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())}" }

0 commit comments

Comments
 (0)