Skip to content

Commit 53cb61e

Browse files
author
David Hasani
committed
part 2 of DMS
1 parent 61fd91a commit 53cb61e

File tree

8 files changed

+61
-44
lines changed

8 files changed

+61
-44
lines changed

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
165165
return if (javaModules.isNotEmpty()) {
166166
ValidationResult(
167167
true,
168-
validatedJavaModules = javaModules,
169168
)
170169
} else {
171170
ValidationResult(
@@ -265,7 +264,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
265264
}
266265

267266
suspend fun resumePollingFromHil() {
268-
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession)
267+
val transformationType = if (codeTransformationSession?.sessionContext?.schema != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
268+
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession, transformationType)
269269
postModernizationJob(result)
270270
}
271271

@@ -348,7 +348,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
348348
CodeModernizerSessionState.getInstance(project).currentJobCreationTime = currentJobResult.creationTime()
349349
codeTransformationSession = session
350350
initModernizationJobUI(false, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
351-
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion)
351+
val transformationType = if (session.sessionContext.schema != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
352+
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion, transformationType)
352353
session.resumeJob(currentJobResult.creationTime(), lastJobId)
353354
val result = handleJobStarted(lastJobId, session)
354355
postModernizationJob(result)
@@ -450,10 +451,11 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
450451
private suspend fun handleJobResumedFromHil(
451452
jobId: JobId,
452453
session: CodeModernizerSession,
454+
transformationType: CodeTransformType,
453455
): CodeModernizerJobCompletedResult = session.pollUntilJobCompletion(
454456
jobId
455457
) { new, plan ->
456-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
458+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformationType)
457459
}
458460

459461
private suspend fun handleJobStarted(jobId: JobId, session: CodeModernizerSession): CodeModernizerJobCompletedResult {
@@ -464,8 +466,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
464466
codeModernizerBottomWindowPanelManager.setJobRunningUI()
465467
}
466468

469+
val transformationType = if (session.sessionContext.schema != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
470+
467471
return session.pollUntilJobCompletion(jobId) { new, plan ->
468-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
472+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformationType)
469473
}
470474
}
471475

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ private val confirmUserSelectionSQLConversionModuleSchemaButton = Button(
6262
)
6363

6464
private val confirmUserSelectionSQLConversionMetadataButton = Button(
65-
keepCardAfterClick = true,
65+
keepCardAfterClick = true, // TODO: make this false if you can't figure out how to disable the Select button after its been clicked once
6666
waitMandatoryFormItems = true,
6767
text = message("codemodernizer.chat.message.button.select"),
6868
id = CodeTransformButtonId.SelectSQLMetadata.id,
@@ -149,16 +149,14 @@ private fun getSelectModuleFormItem(project: Project, moduleBuildFiles: List<Vir
149149
}
150150
)
151151

152-
private fun getSelectSQLModuleFormItem(javaModules: List<Module>) = FormItem(
152+
private fun getSelectSQLModuleFormItem(project: Project, javaModules: List<VirtualFile>) = FormItem(
153153
id = CodeTransformFormItemId.SelectModule.id,
154154
title = message("codemodernizer.chat.form.user_selection.item.choose_module"),
155155
mandatory = true,
156156
options = javaModules.map {
157157
FormItemOption(
158-
label = it.name,
159-
// TODO: what if there are no contentRoots?
160-
// value = path to any file in the module, will use to ZIP the entire module later
161-
value = ModuleRootManager.getInstance(it).contentRoots[0].children[0].path
158+
label = project.getModuleOrProjectNameForFile(it),
159+
value = it.path,
162160
)
163161
}
164162
)
@@ -261,7 +259,7 @@ fun buildProjectInvalidChatContent(validationResult: ValidationResult): CodeTran
261259
CodeTransformPreValidationError.NonSsoLogin -> message("codemodernizer.notification.warn.invalid_project.description.reason.not_logged_in")
262260
CodeTransformPreValidationError.EmptyProject -> message("codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots")
263261
CodeTransformPreValidationError.UnsupportedBuildSystem -> message("codemodernizer.chat.message.validation.error.no_pom")
264-
CodeTransformPreValidationError.NoJavaProject -> "Sorry, I could not find an open Java module."
262+
CodeTransformPreValidationError.NoJavaProject -> "Sorry, I could not find an open Java module. Make sure you have a module open that has the JDK configured and has at least 1 content root."
265263
else -> message("codemodernizer.chat.message.validation.error.other")
266264
}
267265

@@ -328,14 +326,14 @@ fun buildUserInputSQLConversionMetadataChatContent(): CodeTransformChatMessageCo
328326
)
329327
}
330328

331-
fun buildModuleSchemaFormChatContent(javaModules: List<Module>, schemaOptions: Set<String>) = CodeTransformChatMessageContent(
329+
fun buildModuleSchemaFormChatContent(project: Project, javaModules: List<VirtualFile>, schemaOptions: Set<String>) = CodeTransformChatMessageContent(
332330
type = CodeTransformChatMessageType.FinalizedAnswer,
333331
buttons = listOf(
334332
confirmUserSelectionSQLConversionModuleSchemaButton,
335333
cancelUserSelectionButton,
336334
),
337335
formItems = listOf(
338-
getSelectSQLModuleFormItem(javaModules),
336+
getSelectSQLModuleFormItem(project, javaModules),
339337
getSelectSQLSchemaFormItem(schemaOptions),
340338
),
341339
)
@@ -364,9 +362,9 @@ fun buildSQLMetadataValidationSuccessDetailsChatContent(validationResult: SqlMet
364362
""".trimIndent(),
365363
)
366364

367-
fun buildSQLMetadataValidationErrorChatContent(errorReason: String?) = CodeTransformChatMessageContent(
365+
fun buildSQLMetadataValidationErrorChatContent(errorReason: String) = CodeTransformChatMessageContent(
368366
type = CodeTransformChatMessageType.FinalizedAnswer,
369-
message = if (errorReason == "user cancelled .sct metadata dialog window") message("codemodernizer.chat.message.transform_cancelled_by_user") else errorReason,
367+
message = errorReason,
370368
)
371369

372370
fun buildUserCancelledChatContent() = CodeTransformChatMessageContent(

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,7 @@ class CodeTransformChatController(
289289
}
290290
}
291291

292-
private fun validateSctMetadata(selectedFile: VirtualFile?): SqlMetadataValidationResult {
293-
if (selectedFile == null) {
294-
return SqlMetadataValidationResult(false, "user cancelled .sct metadata dialog window")
295-
}
292+
private fun validateSctMetadata(selectedFile: VirtualFile): SqlMetadataValidationResult {
296293
val fileContent = selectedFile.contentsToByteArray().toString(Charsets.UTF_8)
297294
val xmlDeserializer = XmlMapper(JacksonXmlModule())
298295
var sctMetadata: Map<*, *>? = null
@@ -354,7 +351,7 @@ class CodeTransformChatController(
354351
val moduleName = context.project.getModuleOrProjectNameForFile(message.modulePath.toVirtualFile() as VirtualFile)
355352
codeTransformChatHelper.addNewMessage(buildUserSQLConversionSelectionSummaryChatContent(moduleName, message.schema))
356353
codeModernizerManager.codeTransformationSession?.let {
357-
it.sessionContext.configurationFile = message.modulePath.toVirtualFile() as VirtualFile // any file in the module; will use to createZip
354+
it.sessionContext.configurationFile = message.modulePath.toVirtualFile() as VirtualFile // any file in the selected module works fine; will use to createZip
358355
it.sessionContext.schema = message.schema
359356
}
360357
// start the SQL conversion
@@ -369,7 +366,7 @@ class CodeTransformChatController(
369366
.withDescription("Select .sct metadata file")
370367
.withFileFilter { it.extension == "sct" }
371368

372-
val selectedFile = FileChooser.chooseFile(descriptor, null, null)
369+
val selectedFile = FileChooser.chooseFile(descriptor, null, null) ?: return@runInEdt
373370

374371
val metadataValidationResult = this.validateSctMetadata(selectedFile)
375372

@@ -388,7 +385,8 @@ class CodeTransformChatController(
388385
addNewMessage(buildSQLMetadataValidationSuccessIntroChatContent())
389386
addNewMessage(buildSQLMetadataValidationSuccessDetailsChatContent(metadataValidationResult))
390387
addNewMessage(buildModuleSchemaFormIntroChatContent())
391-
addNewMessage(buildModuleSchemaFormChatContent(context.project.getJavaModules(), metadataValidationResult.schemaOptions))
388+
// already validated that there are open Java modules at this point
389+
addNewMessage(buildModuleSchemaFormChatContent(context.project, context.project.getJavaModules(), metadataValidationResult.schemaOptions))
392390
}
393391
val selection = CustomerSelection(
394392
// for SQL conversions (no sourceJavaVersion), use dummy value of Java 8 so that startJob API can be called
@@ -397,7 +395,7 @@ class CodeTransformChatController(
397395
sourceVendor = metadataValidationResult.sourceVendor,
398396
targetVendor = metadataValidationResult.targetVendor,
399397
sourceServerName = metadataValidationResult.sourceServerName,
400-
configurationFile = selectedFile!! // TODO (david): revisit this, will get overwritten in processCodeTransformSelectSQLModuleSchemaAction
398+
configurationFile = selectedFile
401399
)
402400
codeModernizerManager.createCodeModernizerSession(selection, context.project)
403401
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ data class CustomerSelection(
1313
val sourceVendor: String = "ORACLE", // only one supported
1414
val targetVendor: String? = null,
1515
val sourceServerName: String? = null,
16+
// note: schema and customBuildCommand are passed in to CodeModernizerSessionContext separately, *after* CodeModernizerSession is created
1617
)

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
package software.aws.toolkits.jetbrains.services.codemodernizer.model
55

66
import com.intellij.openapi.vfs.VirtualFile
7-
import com.intellij.openapi.module.Module
87
import software.aws.toolkits.telemetry.CodeTransformBuildSystem
98

109
data class ValidationResult(
1110
val valid: Boolean,
1211
val invalidTelemetryReason: InvalidTelemetryReason = InvalidTelemetryReason(),
1312
val validatedBuildFiles: List<VirtualFile> = emptyList(),
14-
val validatedJavaModules: List<Module> = emptyList(),
1513
val buildSystem: CodeTransformBuildSystem = CodeTransformBuildSystem.Unknown,
1614
val buildSystemVersion: String = "",
1715
)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/BuildProgressSplitterPanelManager.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
1313
import software.aws.toolkits.jetbrains.services.codemodernizer.model.BuildProgressStepTreeItem
1414
import software.aws.toolkits.jetbrains.services.codemodernizer.model.BuildStepStatus
1515
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerException
16+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
1617
import software.aws.toolkits.jetbrains.services.codemodernizer.model.ProgressStepId
1718
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.BuildProgressStepDetailsPanel
1819
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.BuildProgressTreePanel
@@ -114,7 +115,7 @@ class BuildProgressSplitterPanelManager(private val project: Project) :
114115
}
115116
}
116117

117-
fun handleProgressStateChanged(newState: TransformationStatus, transformationPlan: TransformationPlan?, jdkVersion: JavaSdkVersion) {
118+
fun handleProgressStateChanged(newState: TransformationStatus, transformationPlan: TransformationPlan?, jdkVersion: JavaSdkVersion, transformationType: CodeTransformType) {
118119
val currentState = statusTreePanel.getCurrentElements()
119120
val loadingPanelText: String
120121
// show the details panel when there are progress updates
@@ -126,6 +127,10 @@ class BuildProgressSplitterPanelManager(private val project: Project) :
126127
)
127128

128129
fun maybeAdd(stepId: ProgressStepId, string: String) {
130+
// don't show building message for SQL conversions since we don't build the code
131+
if (string == message("codemodernizer.toolwindow.progress.building") && transformationType == CodeTransformType.SQL_CONVERSION) {
132+
return
133+
}
129134
if (currentState.none { it.id == stepId }) {
130135
currentState.add(BuildProgressStepTreeItem(string, BuildStepStatus.WORKING, stepId))
131136
}
@@ -140,11 +145,8 @@ class BuildProgressSplitterPanelManager(private val project: Project) :
140145
maybeAdd(ProgressStepId.UPLOADING, message("codemodernizer.toolwindow.progress.uploading"))
141146
maybeAdd(ProgressStepId.BUILDING, message("codemodernizer.toolwindow.progress.building"))
142147
}
143-
if (newState in setOf(
144-
TransformationStatus.PREPARED,
145-
TransformationStatus.PLANNING,
146-
)
147-
) {
148+
// immediately jump to planning stage for SQL conversions after upload completes since we don't build the code
149+
if (newState in setOf(TransformationStatus.PREPARED, newState == TransformationStatus.PLANNING) || transformationType == CodeTransformType.SQL_CONVERSION) {
148150
maybeAdd(ProgressStepId.UPLOADING, message("codemodernizer.toolwindow.progress.uploading"))
149151
maybeAdd(ProgressStepId.BUILDING, message("codemodernizer.toolwindow.progress.building"))
150152
maybeAdd(ProgressStepId.PLANNING, message("codemodernizer.toolwindow.progress.planning"))
@@ -215,19 +217,17 @@ class BuildProgressSplitterPanelManager(private val project: Project) :
215217
}
216218

217219
TransformationStatus.PREPARING -> {
218-
loadingPanelText = message("codemodernizer.toolwindow.scan_in_progress.building", jdkVersion.description)
220+
loadingPanelText = if (transformationType != CodeTransformType.SQL_CONVERSION) message("codemodernizer.toolwindow.scan_in_progress.building", jdkVersion.description) else message("codemodernizer.toolwindow.scan_in_progress.planning")
219221
statuses.update(BuildStepStatus.DONE, ProgressStepId.UPLOADING)
220222
}
221223

222-
// TODO: don't show users that we're building project for SQL conversions
223-
224224
TransformationStatus.PREPARED -> {
225-
loadingPanelText = message("codemodernizer.toolwindow.scan_in_progress.building", jdkVersion.description)
225+
loadingPanelText = if (transformationType != CodeTransformType.SQL_CONVERSION) message("codemodernizer.toolwindow.scan_in_progress.building", jdkVersion.description) else message("codemodernizer.toolwindow.scan_in_progress.planning")
226226
statuses.update(BuildStepStatus.DONE, ProgressStepId.BUILDING)
227227
}
228228

229229
TransformationStatus.PLANNING -> {
230-
loadingPanelText = message("codemodernizer.toolwindow.scan_in_progress.planning")
230+
loadingPanelText = if (transformationType != CodeTransformType.SQL_CONVERSION) message("codemodernizer.toolwindow.scan_in_progress.building", jdkVersion.description) else message("codemodernizer.toolwindow.scan_in_progress.planning")
231231
statuses.update(BuildStepStatus.DONE, ProgressStepId.BUILDING)
232232
}
233233

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2121
import software.aws.toolkits.core.utils.getLogger
2222
import software.aws.toolkits.core.utils.warn
2323
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult
24+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
2425
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.CodeModernizerBanner
2526
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.CodeModernizerJobHistoryTablePanel
2627
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.LoadingPanel
@@ -238,7 +239,7 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
238239
return actionManager.createActionToolbar(ACTION_PLACE, group, false)
239240
}
240241

241-
fun handleJobTransition(new: TransformationStatus, plan: TransformationPlan?, sourceJavaVersion: JavaSdkVersion) = invokeLater {
242+
fun handleJobTransition(new: TransformationStatus, plan: TransformationPlan?, sourceJavaVersion: JavaSdkVersion, transformationType: CodeTransformType) = invokeLater {
242243
if (new in listOf(
243244
TransformationStatus.PLANNED,
244245
TransformationStatus.TRANSFORMING,
@@ -251,7 +252,7 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
251252
addPlanToBanner()
252253
}
253254
buildProgressSplitterPanelManager.apply {
254-
handleProgressStateChanged(new, plan, sourceJavaVersion)
255+
handleProgressStateChanged(new, plan, sourceJavaVersion, transformationType)
255256
if (timer == null) {
256257
timer = Timer()
257258
timer?.scheduleAtFixedRate(
@@ -300,11 +301,11 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
300301
}
301302
}
302303

303-
fun setResumeJobUI(currentJobResult: TransformationJob, plan: TransformationPlan?, sourceJavaVersion: JavaSdkVersion) {
304+
fun setResumeJobUI(currentJobResult: TransformationJob, plan: TransformationPlan?, sourceJavaVersion: JavaSdkVersion, transformationType: CodeTransformType) {
304305
setJobRunningUI()
305306
buildProgressSplitterPanelManager.apply {
306307
reset()
307-
handleProgressStateChanged(currentJobResult.status(), plan, sourceJavaVersion)
308+
handleProgressStateChanged(currentJobResult.status(), plan, sourceJavaVersion, transformationType)
308309
}
309310
}
310311

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,27 @@ fun Project.getSupportedModules(supportedJavaMappings: Map<JavaSdkVersion, Set<J
8080
moduleJdk in supportedJavaMappings
8181
}
8282

83-
fun Project.getJavaModules(): List<Module> {
84-
return this.modules.filter { module ->
83+
// return the first file or directory found inside each open Java module, so that user can select a Module for us to ZIP
84+
// does not strictly need to return the first file or directory found, any one would work fine
85+
fun Project.getJavaModules(): List<VirtualFile> {
86+
return this.modules.flatMap { module ->
8587
val rootManager = ModuleRootManager.getInstance(module)
86-
rootManager.sdk?.sdkType?.name?.lowercase()?.contains("java") ?: false
88+
if (rootManager.sdk?.sdkType?.name?.lowercase()?.contains("java") == true) {
89+
val contentRoots = rootManager.contentRoots
90+
if (contentRoots.isNotEmpty()) {
91+
val firstContentRoot = contentRoots.first()
92+
val children = firstContentRoot.children
93+
if (children.isNotEmpty()) {
94+
listOf(children.first())
95+
} else {
96+
emptyList()
97+
}
98+
} else {
99+
emptyList()
100+
}
101+
} else {
102+
emptyList()
103+
}
87104
}
88105
}
89106

0 commit comments

Comments
 (0)