Skip to content

Commit bdc714f

Browse files
authored
Merge branch 'main' into enableFlexibelCustomization
2 parents cd7a950 + 9e3760e commit bdc714f

File tree

13 files changed

+78
-37
lines changed

13 files changed

+78
-37
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" : "/transform: support transformations to Java 21"
4+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ const val DOWNLOAD_PROXY_WILDCARD_ERROR: String = "Dangling meta character '*' n
6565
const val DOWNLOAD_SSL_HANDSHAKE_ERROR: String = "Unable to execute HTTP request: javax.net.ssl.SSLHandshakeException"
6666
const val INVALID_ARTIFACT_ERROR: String = "Invalid artifact"
6767
val patchDescriptions = mapOf(
68-
"Prepare minimal upgrade to Java 17" to "This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks.",
68+
"Prepare minimal upgrade to Java 17" to "This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 17.",
69+
"Prepare minimal upgrade to Java 21" to "This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 21.",
6970
"Popular Enterprise Specifications and Application Frameworks upgrade" to "This diff patch covers the set of upgrades for Jakarta EE 10, Hibernate 6.2, " +
7071
"and Micronaut 3.",
7172
"HTTP Client Utilities, Apache Commons Utilities, and Web Frameworks" to "This diff patch covers the set of upgrades for Apache HTTP Client 5, Apache " +

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
122122
}
123123
private val artifactHandler = ArtifactHandler(project, GumbyClient.getInstance(project))
124124
private val supportedJavaMappings = mapOf(
125-
JavaSdkVersion.JDK_1_8 to setOf(JavaSdkVersion.JDK_17),
126-
JavaSdkVersion.JDK_11 to setOf(JavaSdkVersion.JDK_17),
127-
JavaSdkVersion.JDK_17 to setOf(JavaSdkVersion.JDK_17),
125+
JavaSdkVersion.JDK_1_8 to setOf(JavaSdkVersion.JDK_17, JavaSdkVersion.JDK_21),
126+
JavaSdkVersion.JDK_11 to setOf(JavaSdkVersion.JDK_17, JavaSdkVersion.JDK_21),
127+
JavaSdkVersion.JDK_17 to setOf(JavaSdkVersion.JDK_17, JavaSdkVersion.JDK_21),
128+
JavaSdkVersion.JDK_21 to setOf(JavaSdkVersion.JDK_21),
128129
)
129130

130131
init {

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

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

66
import com.intellij.openapi.project.Project
7+
import com.intellij.openapi.projectRoots.JavaSdkVersion
78
import com.intellij.openapi.vfs.VirtualFile
89
import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType
910
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_PREREQUISITES
@@ -176,8 +177,12 @@ private val selectTargetVersionFormItem = FormItem(
176177
mandatory = true,
177178
options = listOf(
178179
FormItemOption(
179-
label = "JDK17",
180-
value = "17",
180+
label = JavaSdkVersion.JDK_17.toString(),
181+
value = JavaSdkVersion.JDK_17.toString(),
182+
),
183+
FormItemOption(
184+
label = JavaSdkVersion.JDK_21.toString(),
185+
value = JavaSdkVersion.JDK_21.toString(),
181186
)
182187
)
183188
)
@@ -226,14 +231,14 @@ private val selectOneOrMultipleDiffsFlagFormItem = FormItem(
226231
)
227232
)
228233

229-
private fun getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName: String): String = """
234+
private fun getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName: String, targetJdkVersion: String): String = """
230235
### ${message("codemodernizer.chat.prompt.title.details")}
231236
-------------
232237
233238
| | |
234239
| :------------------- | -------: |
235240
| **${message("codemodernizer.chat.prompt.label.module")}** | $moduleName |
236-
| **${message("codemodernizer.chat.prompt.label.target_version")}** | JDK17 |
241+
| **${message("codemodernizer.chat.prompt.label.target_version")}** | $targetJdkVersion |
237242
""".trimIndent()
238243

239244
private fun getUserSQLConversionSelectionFormattedMarkdown(moduleName: String, schema: String) = """
@@ -279,13 +284,13 @@ fun buildLanguageUpgradeProjectValidChatContent() = CodeTransformChatMessageCont
279284

280285
fun buildProjectInvalidChatContent(validationResult: ValidationResult): CodeTransformChatMessageContent {
281286
val errorMessage = when (validationResult.invalidTelemetryReason.category) {
282-
CodeTransformPreValidationError.NoPom -> message("codemodernizer.chat.message.validation.error.no_pom", CODE_TRANSFORM_PREREQUISITES)
283-
CodeTransformPreValidationError.UnsupportedJavaVersion -> message("codemodernizer.chat.message.validation.error.unsupported_java_version")
287+
CodeTransformPreValidationError.UnsupportedJavaVersion, CodeTransformPreValidationError.UnsupportedBuildSystem ->
288+
message("codemodernizer.chat.message.validation.error.unsupported_module")
284289
CodeTransformPreValidationError.RemoteRunProject -> message("codemodernizer.notification.warn.invalid_project.description.reason.remote_backend")
285290
CodeTransformPreValidationError.NonSsoLogin -> message("codemodernizer.notification.warn.invalid_project.description.reason.not_logged_in")
286291
CodeTransformPreValidationError.EmptyProject -> message("codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots")
287-
CodeTransformPreValidationError.UnsupportedBuildSystem -> message("codemodernizer.chat.message.validation.error.no_pom")
288292
CodeTransformPreValidationError.NoJavaProject -> message("codemodernizer.chat.message.validation.error.no_java_project")
293+
CodeTransformPreValidationError.JavaDowngradeAttempt -> message("codemodernizer.chat.message.validation.error.downgrade_attempt")
289294
else -> message("codemodernizer.chat.message.validation.error.other")
290295
}
291296

@@ -318,9 +323,9 @@ fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
318323
formItems = listOf(selectSkipTestsFlagFormItem),
319324
type = CodeTransformChatMessageType.FinalizedAnswer,
320325
)
321-
fun buildUserInputOneOrMultipleDiffsChatIntroContent(): CodeTransformChatMessageContent =
326+
fun buildUserInputOneOrMultipleDiffsChatIntroContent(version: String): CodeTransformChatMessageContent =
322327
CodeTransformChatMessageContent(
323-
message = message("codemodernizer.chat.message.one_or_multiple_diffs"),
328+
message = message("codemodernizer.chat.message.one_or_multiple_diffs", version.substring(4)), // extract "17" / "21" from "JDK_17" / "JDK_21"
324329
type = CodeTransformChatMessageType.FinalizedAnswer,
325330
)
326331
fun buildUserInputOneOrMultipleDiffsFlagChatContent(): CodeTransformChatMessageContent =
@@ -441,9 +446,9 @@ fun buildUserSQLConversionSelectionSummaryChatContent(moduleName: String, schema
441446
message = getUserSQLConversionSelectionFormattedMarkdown(moduleName, schema)
442447
)
443448

444-
fun buildUserLanguageUpgradeSelectionSummaryChatContent(moduleName: String) = CodeTransformChatMessageContent(
449+
fun buildUserLanguageUpgradeSelectionSummaryChatContent(moduleName: String, targetJdkVersion: String) = CodeTransformChatMessageContent(
445450
type = CodeTransformChatMessageType.Prompt,
446-
message = getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName)
451+
message = getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName, targetJdkVersion)
447452
)
448453

449454
fun buildCompileLocalInProgressChatContent() = CodeTransformChatMessageContent(

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransfo
9393
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
9494
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadArtifactResult
9595
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason
96+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason
9697
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
9798
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_RUN_UNIT_TESTS
9899
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_SKIP_UNIT_TESTS
@@ -115,6 +116,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.QFeature
115116
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.broadcastQEvent
116117
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
117118
import software.aws.toolkits.resources.message
119+
import software.aws.toolkits.telemetry.CodeTransformPreValidationError
118120

119121
class CodeTransformChatController(
120122
private val context: AmazonQAppInitContext,
@@ -298,14 +300,28 @@ class CodeTransformChatController(
298300
val moduleVirtualFile: VirtualFile = modulePath.toVirtualFile() as VirtualFile
299301
val moduleName = context.project.getModuleOrProjectNameForFile(moduleVirtualFile)
300302

301-
codeTransformChatHelper.addNewMessage(buildUserLanguageUpgradeSelectionSummaryChatContent(moduleName))
303+
codeTransformChatHelper.addNewMessage(buildUserLanguageUpgradeSelectionSummaryChatContent(moduleName, targetVersion))
302304

303305
val sourceJdk = getSourceJdk(moduleVirtualFile)
304306

307+
val sourceVersion = sourceJdk.toString()
308+
309+
if (sourceVersion == JavaSdkVersion.JDK_21.toString() && targetVersion == JavaSdkVersion.JDK_17.toString()) {
310+
codeTransformChatHelper.addNewMessage(
311+
buildProjectInvalidChatContent(
312+
ValidationResult(
313+
false,
314+
InvalidTelemetryReason(CodeTransformPreValidationError.JavaDowngradeAttempt)
315+
)
316+
)
317+
)
318+
return
319+
}
320+
305321
val selection = CustomerSelection(
306322
configurationFile = moduleVirtualFile,
307323
sourceJavaVersion = sourceJdk,
308-
targetJavaVersion = JavaSdkVersion.JDK_17,
324+
targetJavaVersion = if (targetVersion == JavaSdkVersion.JDK_17.toString()) JavaSdkVersion.JDK_17 else JavaSdkVersion.JDK_21,
309325
)
310326

311327
// Create and set a session
@@ -387,8 +403,9 @@ class CodeTransformChatController(
387403
codeModernizerManager.codeTransformationSession?.let {
388404
it.sessionContext.customBuildCommand = customBuildCommand
389405
}
406+
val targetJdkVersion = codeModernizerManager.codeTransformationSession?.sessionContext?.targetJavaVersion?.name.orEmpty()
390407
codeTransformChatHelper.run {
391-
addNewMessage(buildUserInputOneOrMultipleDiffsChatIntroContent())
408+
addNewMessage(buildUserInputOneOrMultipleDiffsChatIntroContent(targetJdkVersion))
392409
addNewMessage(buildUserInputOneOrMultipleDiffsFlagChatContent())
393410
}
394411
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ data class CodeModernizerSessionContext(
6363
val project: Project,
6464
var configurationFile: VirtualFile? = null, // used to ZIP module
6565
val sourceJavaVersion: JavaSdkVersion, // always needed for startJob API
66-
val targetJavaVersion: JavaSdkVersion = JavaSdkVersion.JDK_17, // only one supported
66+
val targetJavaVersion: JavaSdkVersion, // 17 or 21
6767
var transformCapabilities: List<String> = listOf(EXPLAINABILITY_V1),
6868
var customBuildCommand: String = MAVEN_BUILD_RUN_UNIT_TESTS, // run unit tests by default
6969
val sourceVendor: String = ORACLE_DB, // only one supported

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import java.io.File
1010
data class CustomerSelection(
1111
val configurationFile: VirtualFile? = null, // used to ZIP module
1212
val sourceJavaVersion: JavaSdkVersion, // always needed, use default of JDK_8 for SQL conversions for startJob API call
13-
val targetJavaVersion: JavaSdkVersion = JavaSdkVersion.JDK_17,
13+
val targetJavaVersion: JavaSdkVersion, // 17 or 21
1414
val sourceVendor: String = ORACLE_DB, // only one supported
1515
val targetVendor: String? = null,
1616
val sourceServerName: String? = null,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,6 @@ fun String.toTransformationLanguage() = when (this) {
8080
"JDK_1_8" -> TransformationLanguage.JAVA_8
8181
"JDK_11" -> TransformationLanguage.JAVA_11
8282
"JDK_17" -> TransformationLanguage.JAVA_17
83+
"JDK_21" -> TransformationLanguage.JAVA_21
8384
else -> TransformationLanguage.UNKNOWN_TO_SDK_VERSION
8485
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class CodeWhispererCodeModernizerGumbyClientTest : CodeWhispererCodeModernizerTe
136136
}
137137

138138
@Test
139-
fun `check startCodeModernization`() {
139+
fun `check startCodeModernization on JAVA_17 target`() {
140140
val actual = gumbyClient.startCodeModernization("jobId", TransformationLanguage.JAVA_8, TransformationLanguage.JAVA_17)
141141
argumentCaptor<StartTransformationRequest>().apply {
142142
verify(bearerClient).startTransformation(capture())
@@ -146,6 +146,17 @@ class CodeWhispererCodeModernizerGumbyClientTest : CodeWhispererCodeModernizerTe
146146
}
147147
}
148148

149+
@Test
150+
fun `check startCodeModernization on JAVA_21 target`() {
151+
val actual = gumbyClient.startCodeModernization("jobId", TransformationLanguage.JAVA_8, TransformationLanguage.JAVA_21)
152+
argumentCaptor<StartTransformationRequest>().apply {
153+
verify(bearerClient).startTransformation(capture())
154+
verifyNoInteractions(streamingBearerClient)
155+
assertThat(actual).isInstanceOf(StartTransformationResponse::class.java)
156+
assertThat(actual).usingRecursiveComparison().comparingOnlyFields("transformationJobId").isEqualTo(exampleStartCodeMigrationResponse)
157+
}
158+
}
159+
149160
@Test
150161
fun `check getCodeModernizationPlan`() {
151162
val actual = gumbyClient.getCodeModernizationPlan(JobId("JobId"))

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class CodeWhispererUserModificationTracker(private val project: Project) : Dispo
135135
}
136136

137137
private fun emitTelemetryOnChatCodeInsert(insertedCode: InsertedCodeModificationEntry) {
138-
try {
138+
val modificationPercentage = try {
139139
val file = insertedCode.vFile
140140
if (file == null || (!file.isValid)) throw Exception("Record OnChatCodeInsert - invalid file")
141141

@@ -145,11 +145,12 @@ class CodeWhispererUserModificationTracker(private val project: Project) : Dispo
145145
val currentString = document?.getText(
146146
TextRange(insertedCode.range.startOffset, insertedCode.range.endOffset)
147147
)
148-
val modificationPercentage = checkDiff(currentString?.trim(), insertedCode.originalString.trim())
149-
sendModificationWithChatTelemetry(insertedCode, modificationPercentage)
148+
checkDiff(currentString?.trim(), insertedCode.originalString.trim())
150149
} catch (e: Exception) {
151-
sendModificationWithChatTelemetry(insertedCode, null)
150+
null
152151
}
152+
153+
sendModificationWithChatTelemetry(insertedCode, modificationPercentage)
153154
}
154155

155156
private fun emitTelemetryOnSuggestion(acceptedSuggestion: AcceptedSuggestionEntry) {

0 commit comments

Comments
 (0)