Skip to content

Commit e0ff6cc

Browse files
Merge main into feature/q-inlinechat
2 parents e134135 + 0e94d02 commit e0ff6cc

37 files changed

+1024
-204
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Feature(Amazon Q Code Transformation): support conversions of embedded SQL from Oracle to PostgreSQL"
4+
}

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

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni
4141
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
4242
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult
4343
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact
44+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
4445
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
4546
import software.aws.toolkits.jetbrains.services.codemodernizer.model.Dependency
4647
import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason
@@ -59,6 +60,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeMo
5960
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.STATES_WHERE_PLAN_EXIST
6061
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.createFileCopy
6162
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.findLineNumberByString
63+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModulesWithSQL
6264
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getMavenVersion
6365
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile
6466
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactPomFile
@@ -125,53 +127,64 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
125127
JavaSdkVersion.JDK_11 to setOf(JavaSdkVersion.JDK_17),
126128
JavaSdkVersion.JDK_17 to setOf(JavaSdkVersion.JDK_17),
127129
)
130+
128131
init {
129132
CodeModernizerSessionState.getInstance(project).setDefaults()
130133
}
131134

132-
fun validate(project: Project): ValidationResult {
135+
fun validate(project: Project, transformationType: CodeTransformType): ValidationResult {
133136
fun validateCore(project: Project): ValidationResult {
134137
if (isRunningOnRemoteBackend()) {
135138
return ValidationResult(
136139
false,
137-
message("codemodernizer.notification.warn.invalid_project.description.reason.remote_backend"),
138140
InvalidTelemetryReason(
139-
CodeTransformPreValidationError.RemoteRunProject
141+
CodeTransformPreValidationError.RemoteRunProject,
140142
)
141143
)
142144
}
143145
if (!isCodeTransformAvailable(project)) {
144146
return ValidationResult(
145147
false,
146-
message("codemodernizer.notification.warn.invalid_project.description.reason.not_logged_in"),
147148
InvalidTelemetryReason(
148-
CodeTransformPreValidationError.NonSsoLogin
149+
CodeTransformPreValidationError.NonSsoLogin,
149150
)
150151
)
151152
}
152153

153154
if (ProjectRootManager.getInstance(project).contentRoots.isEmpty()) {
154155
return ValidationResult(
155156
false,
156-
message("codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots"),
157157
InvalidTelemetryReason(
158-
CodeTransformPreValidationError.NoPom
158+
CodeTransformPreValidationError.EmptyProject,
159159
)
160160
)
161161
}
162+
163+
if (transformationType == CodeTransformType.SQL_CONVERSION) {
164+
val javaModules = project.getJavaModulesWithSQL()
165+
return if (javaModules.isNotEmpty()) {
166+
ValidationResult(
167+
true,
168+
)
169+
} else {
170+
ValidationResult(
171+
false,
172+
InvalidTelemetryReason(
173+
CodeTransformPreValidationError.NoJavaProject,
174+
)
175+
)
176+
}
177+
}
178+
162179
val supportedModules = project.getSupportedModules(supportedJavaMappings).toSet()
163180
val validProjectJdk = project.getSupportedJavaMappings(supportedJavaMappings).isNotEmpty()
164181
val projectJdk = project.tryGetJdk()
165182
if (supportedModules.isEmpty() && !validProjectJdk) {
166183
return ValidationResult(
167184
false,
168-
message(
169-
"codemodernizer.notification.warn.invalid_project.description.reason.invalid_jdk_versions",
170-
supportedJavaMappings.keys.joinToString()
171-
),
172185
InvalidTelemetryReason(
173186
CodeTransformPreValidationError.UnsupportedJavaVersion,
174-
projectJdk?.toString().orEmpty()
187+
projectJdk.toString()
175188
)
176189
)
177190
}
@@ -180,17 +193,12 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
180193
ValidationResult(
181194
true,
182195
validatedBuildFiles = validatedBuildFiles,
183-
validatedProjectJdkName = projectJdk?.description.orEmpty(),
184196
buildSystem = CodeTransformBuildSystem.Maven,
185197
buildSystemVersion = getMavenVersion(project)
186198
)
187199
} else {
188200
ValidationResult(
189201
false,
190-
invalidReason = message(
191-
"codemodernizer.notification.warn.invalid_project.description.reason.no_valid_files",
192-
supportedBuildFileNames.joinToString()
193-
),
194202
invalidTelemetryReason = InvalidTelemetryReason(
195203
CodeTransformPreValidationError.UnsupportedBuildSystem,
196204
if (isGradleProject(project)) "Gradle build" else "other build"
@@ -248,15 +256,17 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
248256
}
249257
}
250258

251-
fun runModernize(copyResult: MavenCopyCommandsResult) {
259+
fun runModernize(copyResult: MavenCopyCommandsResult? = null) {
252260
initStopParameters()
253261
val session = codeTransformationSession as CodeModernizerSession
254262
initModernizationJobUI(true, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
255263
launchModernizationJob(session, copyResult)
256264
}
257265

258266
suspend fun resumePollingFromHil() {
259-
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession)
267+
val transformationType =
268+
if (codeTransformationSession?.sessionContext?.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
269+
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession, transformationType)
260270
postModernizationJob(result)
261271
}
262272

@@ -312,7 +322,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
312322
)
313323
}
314324

315-
fun launchModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult) = projectCoroutineScope(project).launch {
325+
fun launchModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult?) = projectCoroutineScope(project).launch {
316326
val result = initModernizationJob(session, copyResult)
317327

318328
postModernizationJob(result)
@@ -339,7 +349,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
339349
CodeModernizerSessionState.getInstance(project).currentJobCreationTime = currentJobResult.creationTime()
340350
codeTransformationSession = session
341351
initModernizationJobUI(false, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
342-
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion)
352+
val transformationType = if (session.sessionContext.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
353+
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion, transformationType)
343354
session.resumeJob(currentJobResult.creationTime(), lastJobId)
344355
val result = handleJobStarted(lastJobId, session)
345356
postModernizationJob(result)
@@ -395,7 +406,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
395406

396407
fun parseBuildFile(): String? = parseBuildFile(codeTransformationSession?.sessionContext?.configurationFile)
397408

398-
internal suspend fun initModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult): CodeModernizerJobCompletedResult =
409+
private suspend fun initModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult?): CodeModernizerJobCompletedResult =
399410
when (val result = session.createModernizationJob(copyResult)) {
400411
is CodeModernizerStartJobResult.ZipCreationFailed -> {
401412
CodeModernizerJobCompletedResult.UnableToCreateJob(
@@ -441,10 +452,12 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
441452
private suspend fun handleJobResumedFromHil(
442453
jobId: JobId,
443454
session: CodeModernizerSession,
455+
transformType: CodeTransformType,
444456
): CodeModernizerJobCompletedResult = session.pollUntilJobCompletion(
457+
transformType,
445458
jobId
446459
) { new, plan ->
447-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
460+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
448461
}
449462

450463
private suspend fun handleJobStarted(jobId: JobId, session: CodeModernizerSession): CodeModernizerJobCompletedResult {
@@ -455,8 +468,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
455468
codeModernizerBottomWindowPanelManager.setJobRunningUI()
456469
}
457470

458-
return session.pollUntilJobCompletion(jobId) { new, plan ->
459-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
471+
val transformType = if (session.sessionContext.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
472+
473+
return session.pollUntilJobCompletion(transformType, jobId) { new, plan ->
474+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
460475
}
461476
}
462477

@@ -667,10 +682,14 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
667682
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) {
668683
codeTransformationSession = CodeModernizerSession(
669684
CodeModernizerSessionContext(
670-
project,
671-
customerSelection.configurationFile,
672-
customerSelection.sourceJavaVersion,
673-
customerSelection.targetJavaVersion,
685+
project = project,
686+
configurationFile = customerSelection.configurationFile,
687+
sourceJavaVersion = customerSelection.sourceJavaVersion,
688+
targetJavaVersion = customerSelection.targetJavaVersion,
689+
sourceVendor = customerSelection.sourceVendor,
690+
targetVendor = customerSelection.targetVendor,
691+
sourceServerName = customerSelection.sourceServerName,
692+
sqlMetadataZip = customerSelection.sqlMetadataZip,
674693
),
675694
)
676695
}

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni
3232
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
3333
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult
3434
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact
35+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
3536
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadArtifactResult
3637
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
3738
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
@@ -61,12 +62,7 @@ import java.util.concurrent.CancellationException
6162
import java.util.concurrent.atomic.AtomicBoolean
6263
import javax.net.ssl.SSLHandshakeException
6364

64-
const val ZIP_SOURCES_PATH = "sources"
65-
const val BUILD_LOG_PATH = "build-logs.txt"
66-
const val UPLOAD_ZIP_MANIFEST_VERSION = 1.0F
6765
const val MAX_ZIP_SIZE = 2000000000 // 2GB
68-
const val HIL_1P_UPGRADE_CAPABILITY = "HIL_1pDependency_VersionUpgrade"
69-
const val EXPLAINABILITY_V1 = "EXPLAINABILITY_V1"
7066

7167
// constants for handling SDKClientException
7268
const val CONNECTION_REFUSED_ERROR: String = "Connection refused"
@@ -144,7 +140,7 @@ class CodeModernizerSession(
144140
*
145141
* Based on [CodeWhispererCodeScanSession]
146142
*/
147-
fun createModernizationJob(copyResult: MavenCopyCommandsResult): CodeModernizerStartJobResult {
143+
fun createModernizationJob(copyResult: MavenCopyCommandsResult?): CodeModernizerStartJobResult {
148144
LOG.info { "Compressing local project" }
149145
val payload: File?
150146
var payloadSize = 0
@@ -164,6 +160,7 @@ class CodeModernizerSession(
164160
telemetryErrorMessage = "Disposed when about to create zip"
165161
return CodeModernizerStartJobResult.Disposed
166162
}
163+
// for language upgrades, copyResult should always be Successful here, failure cases already handled
167164
val result = sessionContext.createZipWithModuleFiles(copyResult)
168165

169166
if (result is ZipCreationResult.Missing1P) {
@@ -324,11 +321,6 @@ class CodeModernizerSession(
324321
return clientAdaptor.getCodeModernizationJob(jobId.id).transformationJob()
325322
}
326323

327-
fun getTransformPlanDetails(jobId: JobId): TransformationPlan {
328-
LOG.info { "Getting transform plan details." }
329-
return clientAdaptor.getCodeModernizationPlan(jobId).transformationPlan()
330-
}
331-
332324
/**
333325
* This will resume the job, i.e. it will resume the main job loop kicked of by [createModernizationJob]
334326
*/
@@ -418,6 +410,7 @@ class CodeModernizerSession(
418410
}
419411

420412
suspend fun pollUntilJobCompletion(
413+
transformType: CodeTransformType,
421414
jobId: JobId,
422415
jobTransitionHandler: (currentStatus: TransformationStatus, migrationPlan: TransformationPlan?) -> Unit,
423416
): CodeModernizerJobCompletedResult {
@@ -432,6 +425,7 @@ class CodeModernizerSession(
432425
var passedStart = false
433426

434427
val result = jobId.pollTransformationStatusAndPlan(
428+
transformType,
435429
succeedOn = setOf(
436430
TransformationStatus.COMPLETED,
437431
TransformationStatus.PAUSED,
@@ -463,8 +457,8 @@ class CodeModernizerSession(
463457
}
464458
}
465459

466-
// Open the transformation plan detail panel once transformation plan is available
467-
if (state.transformationPlan != null && !isTransformationPlanEditorOpened) {
460+
// Open the transformation plan detail panel once transformation plan is available (no plan for SQL conversions)
461+
if (transformType != CodeTransformType.SQL_CONVERSION && state.transformationPlan != null && !isTransformationPlanEditorOpened) {
468462
tryOpenTransformationPlanEditor()
469463
isTransformationPlanEditorOpened = true
470464
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ private enum class CodeTransformMessageTypes(val type: String) {
3232
TabCreated("new-tab-was-created"),
3333
TabRemoved("tab-was-removed"),
3434
Transform("transform"),
35+
ChatPrompt("chat-prompt"), // for getting the transformation objective
3536
CodeTransformStart("codetransform-start"),
37+
CodeTransformSelectSQLMetadata("codetransform-select-sql-metadata"),
38+
CodeTransformSelectSQLModuleSchema("codetransform-select-sql-module-schema"),
3639
CodeTransformStop("codetransform-stop"),
3740
CodeTransformCancel("codetransform-cancel"),
3841
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
@@ -63,8 +66,11 @@ class CodeTransformChatApp : AmazonQApp {
6366
CodeTransformMessageTypes.TabRemoved.type to IncomingCodeTransformMessage.TabRemoved::class,
6467
CodeTransformMessageTypes.Transform.type to IncomingCodeTransformMessage.Transform::class,
6568
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
69+
CodeTransformMessageTypes.CodeTransformSelectSQLMetadata.type to IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata::class,
70+
CodeTransformMessageTypes.CodeTransformSelectSQLModuleSchema.type to IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema::class,
6671
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
6772
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
73+
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
6874
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
6975
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
7076
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
@@ -153,8 +159,12 @@ class CodeTransformChatApp : AmazonQApp {
153159
when (message) {
154160
is IncomingCodeTransformMessage.Transform -> inboundAppMessagesHandler.processTransformQuickAction(message)
155161
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
162+
is IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata -> inboundAppMessagesHandler.processCodeTransformSelectSQLMetadataAction(message)
163+
is IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema ->
164+
inboundAppMessagesHandler.processCodeTransformSelectSQLModuleSchemaAction(message)
156165
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
157166
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
167+
is IncomingCodeTransformMessage.ChatPrompt -> inboundAppMessagesHandler.processChatPromptMessage(message)
158168
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
159169
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
160170
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)

0 commit comments

Comments
 (0)