Skip to content

Commit 4e6c759

Browse files
authored
fix(amazonq): ensure plan opens for min JDK upgrades (#6000)
Transformation plan was not opening for min JDK upgrades due to isPlanComplete method bug: if doing a JDK upgrade, as soon as plan is non-null, plan is complete, so open it.
1 parent e121ccd commit 4e6c759

File tree

5 files changed

+74
-13
lines changed

5 files changed

+74
-13
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
477477
transformType,
478478
jobId
479479
) { new, plan ->
480-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
480+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext, transformType)
481481
}
482482

483483
private suspend fun handleJobStarted(jobId: JobId, session: CodeModernizerSession): CodeModernizerJobCompletedResult {
@@ -491,7 +491,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
491491
val transformType = if (session.sessionContext.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
492492

493493
return session.pollUntilJobCompletion(transformType, jobId) { new, plan ->
494-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
494+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext, transformType)
495495
}
496496
}
497497

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ class CodeModernizerSession(
478478
}
479479

480480
if (!isTransformationPlanEditorOpened && transformType == CodeTransformType.LANGUAGE_UPGRADE) {
481-
val isPlanComplete = isPlanComplete(state.transformationPlan)
482-
if (isPlanComplete) {
481+
val isPlanComplete = isPlanComplete(state.transformationPlan, sessionContext)
482+
if (isPlanComplete && state.transformationPlan != null) {
483483
tryOpenTransformationPlanEditor()
484484
isTransformationPlanEditorOpened = true
485485
}

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2222
import software.aws.toolkits.core.utils.getLogger
2323
import software.aws.toolkits.core.utils.warn
2424
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult
25+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
2526
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
2627
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.CodeModernizerBanner
2728
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.CodeModernizerJobHistoryTablePanel
@@ -244,20 +245,25 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
244245
return actionManager.createActionToolbar(ACTION_PLACE, group, false)
245246
}
246247

247-
fun handleJobTransition(new: TransformationStatus, plan: TransformationPlan?, sourceJdk: JavaSdkVersion, transformType: CodeTransformType) = invokeLater {
248+
fun handleJobTransition(
249+
new: TransformationStatus,
250+
plan: TransformationPlan?,
251+
sessionContext: CodeModernizerSessionContext,
252+
transformType: CodeTransformType,
253+
) = invokeLater {
248254
if (new in listOf(
249255
TransformationStatus.PLANNED,
250256
TransformationStatus.TRANSFORMING,
251257
TransformationStatus.TRANSFORMED,
252258
TransformationStatus.PAUSED,
253259
TransformationStatus.COMPLETED,
254260
TransformationStatus.PARTIALLY_COMPLETED
255-
) && transformType == CodeTransformType.LANGUAGE_UPGRADE && isPlanComplete(plan)
261+
) && transformType == CodeTransformType.LANGUAGE_UPGRADE && isPlanComplete(plan, sessionContext)
256262
) {
257263
addPlanToBanner()
258264
}
259265
buildProgressSplitterPanelManager.apply {
260-
handleProgressStateChanged(new, plan, sourceJdk, transformType)
266+
handleProgressStateChanged(new, plan, sessionContext.sourceJavaVersion, transformType)
261267
if (timer == null) {
262268
timer = Timer()
263269
timer?.scheduleAtFixedRate(

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.BILLING
4747
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.JOB_STATISTICS_TABLE_KEY
4848
import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runClientSideBuild
4949
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact.Companion.MAPPER
50+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
5051
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
5152
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
5253
import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable
@@ -286,8 +287,12 @@ fun findDownloadArtifactProgressUpdate(transformationSteps: List<TransformationS
286287
update.downloadArtifacts()?.firstOrNull()?.downloadArtifactId() != null
287288
}
288289

289-
// once dependency changes table (key of "1") available, plan is complete
290-
fun isPlanComplete(plan: TransformationPlan?) = plan?.transformationSteps()?.get(0)?.progressUpdates()?.any { update -> update.name() == "1" } == true
290+
// plan is complete once dependency changes table (key of "1") available, or as soon as it's available for min JDK upgrades
291+
fun isPlanComplete(plan: TransformationPlan?, sessionContext: CodeModernizerSessionContext): Boolean {
292+
val isDepChangesTablePresent = plan?.transformationSteps()?.get(0)?.progressUpdates()?.any { update -> update.name() == "1" } == true
293+
val isMinJdkUpgrade = sessionContext.sourceJavaVersion.name != sessionContext.targetJavaVersion.name
294+
return isDepChangesTablePresent || isMinJdkUpgrade
295+
}
291296

292297
// "name" holds the ID of the corresponding plan step (where table will go) and "description" holds the plan data
293298
fun getTableMapping(stepZeroProgressUpdates: List<TransformationProgressUpdate>): Map<String, List<String>> =

plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package software.aws.toolkits.jetbrains.services.codemodernizer
55

66
import com.fasterxml.jackson.module.kotlin.readValue
7+
import com.intellij.openapi.project.Project
8+
import com.intellij.openapi.projectRoots.JavaSdkVersion
79
import com.intellij.testFramework.LightVirtualFile
810
import io.mockk.every
911
import io.mockk.just
@@ -16,6 +18,7 @@ import org.jetbrains.yaml.YAMLFileType
1618
import org.junit.Before
1719
import org.junit.Test
1820
import org.mockito.Mockito
21+
import org.mockito.Mockito.mock
1922
import org.mockito.kotlin.any
2023
import org.mockito.kotlin.times
2124
import org.mockito.kotlin.verify
@@ -28,6 +31,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2831
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStep
2932
import software.amazon.awssdk.services.ssooidc.model.InvalidGrantException
3033
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact.Companion.MAPPER
34+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
3135
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
3236
import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable
3337
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.combineTableRows
@@ -53,6 +57,8 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase
5357
super.setup()
5458
}
5559

60+
private val mockProject: Project = mock(Project::class.java)
61+
5662
@Test
5763
fun `can poll for updates`() {
5864
Mockito.doReturn(
@@ -254,7 +260,6 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase
254260

255261
@Test
256262
fun `isPlanComplete returns true when plan has progress update with name '1'`() {
257-
// Arrange
258263
val plan = TransformationPlan.builder()
259264
.transformationSteps(
260265
listOf(
@@ -270,7 +275,15 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase
270275
)
271276
)
272277
.build()
273-
val result = isPlanComplete(plan)
278+
279+
// dependency upgrade
280+
val sessionContext = CodeModernizerSessionContext(
281+
project = mockProject,
282+
sourceJavaVersion = JavaSdkVersion.JDK_17,
283+
targetJavaVersion = JavaSdkVersion.JDK_17
284+
)
285+
286+
val result = isPlanComplete(plan, sessionContext)
274287
assertThat(result).isTrue()
275288
}
276289

@@ -283,18 +296,55 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase
283296
.progressUpdates(
284297
listOf(
285298
TransformationProgressUpdate.builder()
286-
.name("2")
299+
.name("not-1")
287300
.build()
288301
)
289302
)
290303
.build()
291304
)
292305
)
293306
.build()
294-
val result = isPlanComplete(plan)
307+
308+
// dependency upgrade
309+
val sessionContext = CodeModernizerSessionContext(
310+
project = mockProject,
311+
sourceJavaVersion = JavaSdkVersion.JDK_17,
312+
targetJavaVersion = JavaSdkVersion.JDK_17
313+
)
314+
315+
val result = isPlanComplete(plan, sessionContext)
295316
assertThat(result).isFalse()
296317
}
297318

319+
@Test
320+
fun `isPlanComplete returns true when doing a min JDK upgrade`() {
321+
val plan = TransformationPlan.builder()
322+
.transformationSteps(
323+
listOf(
324+
TransformationStep.builder()
325+
.progressUpdates(
326+
listOf(
327+
TransformationProgressUpdate.builder()
328+
.name("not-1")
329+
.build()
330+
)
331+
)
332+
.build()
333+
)
334+
)
335+
.build()
336+
337+
// min JDK upgrade
338+
val sessionContext = CodeModernizerSessionContext(
339+
project = mockProject,
340+
sourceJavaVersion = JavaSdkVersion.JDK_1_8,
341+
targetJavaVersion = JavaSdkVersion.JDK_17
342+
)
343+
344+
val result = isPlanComplete(plan, sessionContext)
345+
assertThat(result).isTrue()
346+
}
347+
298348
@Test
299349
fun `getClientInstructionArtifactId extracts artifact ID from transformation plan`() {
300350
val step1 = TransformationStep.builder()

0 commit comments

Comments
 (0)