Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "feature",
"description" : "Amazon Q Code Transformation: allow users to skip tests"
}
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
customerSelection.configurationFile,
customerSelection.sourceJavaVersion,
customerSelection.targetJavaVersion,
customerSelection.customBuildCommand
),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
CodeTransformStart("codetransform-start"),
CodeTransformStop("codetransform-stop"),
CodeTransformCancel("codetransform-cancel"),
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
CodeTransformNew("codetransform-new"),
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
Expand Down Expand Up @@ -64,6 +65,7 @@ class CodeTransformChatApp : AmazonQApp {
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
Expand Down Expand Up @@ -153,6 +155,7 @@ class CodeTransformChatApp : AmazonQApp {
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ interface InboundAppMessagesHandler {

suspend fun processCodeTransformStopAction(tabId: String)

suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests)

suspend fun processCodeTransformOpenTransformHub(message: IncomingCodeTransformMessage.CodeTransformOpenTransformHub)

suspend fun processCodeTransformOpenMvnBuild(message: IncomingCodeTransformMessage.CodeTransformOpenMvnBuild)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@
id = CodeTransformButtonId.StartTransformation.id,
)

private val confirmSkipTestsSelectionButton = Button(
keepCardAfterClick = false,
waitMandatoryFormItems = true,
text = message("codemodernizer.chat.message.button.confirm"),
id = CodeTransformButtonId.ConfirmSkipTests.id,
)

private val openMvnBuildButton = Button(
id = CodeTransformButtonId.OpenMvnBuild.id,
text = message("codemodernizer.chat.message.button.view_build"),
Expand Down Expand Up @@ -134,6 +141,22 @@
)
)

private val selectSkipTestsFlagFormItem = FormItem(
id = CodeTransformFormItemId.SelectSkipTestsFlag.id,
title = message("codemodernizer.chat.form.user_selection.item.choose_skip_tests_option"),
mandatory = true,
options = listOf(
FormItemOption(
label = message("codemodernizer.chat.message.skip_tests_form.do_not_skip"),
value = message("codemodernizer.chat.message.skip_tests_form.do_not_skip"),
),
FormItemOption(
label = message("codemodernizer.chat.message.skip_tests_form.skip"),
value = message("codemodernizer.chat.message.skip_tests_form.skip"),
)
)
)

private fun getUserSelectionFormattedMarkdown(moduleName: String): String = """
### ${message("codemodernizer.chat.prompt.title.details")}
-------------
Expand All @@ -144,6 +167,13 @@
| **${message("codemodernizer.chat.prompt.label.target_version")}** | JDK17 |
""".trimIndent()

private fun getUserSkipTestsFlagSelectionFormattedMarkdown(skipTestsSelection: String): String {
var skipTestsText = skipTestsSelection
// just for correct grammar
if (skipTestsText == message("codemodernizer.chat.message.skip_tests_form.do_not_skip")) skipTestsText = "not skip unit tests"
return message("codemodernizer.chat.message.skip_tests_form.response", skipTestsText.lowercase())

Check warning on line 174 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
}

private fun getUserHilSelectionMarkdown(dependencyName: String, currentVersion: String, selectedVersion: String): String = """
### ${message("codemodernizer.chat.prompt.title.dependency_details")}
-------------
Expand All @@ -156,7 +186,7 @@
""".trimIndent()

fun buildCheckingValidProjectChatContent() = CodeTransformChatMessageContent(
message = message("codemodernizer.chat.message.validation.check_eligible_projects"),

Check warning on line 189 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
type = CodeTransformChatMessageType.PendingAnswer,
)

Expand Down Expand Up @@ -184,11 +214,26 @@
)
)

fun buildAuthRestoredFollowup(): CodeTransformChatMessageContent = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
followUps = listOf(
startNewTransformFollowUp
fun buildUserInputSkipTestsFlagChatIntroContent(): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.message.skip_tests"),
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.form.user_selection.title"),
buttons = listOf(
confirmSkipTestsSelectionButton,
cancelUserSelectionButton,
),
formItems = listOf(selectSkipTestsFlagFormItem),
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
message = getUserSkipTestsFlagSelectionFormattedMarkdown(skipTestsSelection)
)

fun buildUserInputChatContent(project: Project, validationResult: ValidationResult): CodeTransformChatMessageContent {
Expand Down Expand Up @@ -243,7 +288,7 @@

fun buildCompileLocalFailedChatContent() = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
message = "${message(

Check warning on line 291 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
"codemodernizer.chat.message.local_build_failed"
)}\n\n${message(
"codemodernizer.chat.message.validation.error.more_info",
Expand Down Expand Up @@ -283,14 +328,14 @@
is UploadFailureReason.OTHER -> "${message(
"codemodernizer.chat.message.upload_failed_other",
failureReason.errorMessage
)}\n\n${message(

Check warning on line 331 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
"codemodernizer.chat.message.validation.error.more_info",
CODE_TRANSFORM_TROUBLESHOOT_DOC_UPLOAD_ERROR_OVERVIEW
)}"

is UploadFailureReason.CREDENTIALS_EXPIRED -> message("q.connection.expired")

is UploadFailureReason.SSL_HANDSHAKE_ERROR -> "${message(

Check warning on line 338 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
"codemodernizer.chat.message.upload_failed_ssl_error"
)}\n\n${message(
"codemodernizer.chat.message.validation.error.more_info",
Expand Down Expand Up @@ -421,7 +466,7 @@
hilDownloadArtifact: CodeTransformHilDownloadArtifact,
showButton: Boolean = true
) = CodeTransformChatMessageContent(
message = message("codemodernizer.chat.message.hil.pom_snippet_title") +

Check warning on line 469 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
"\n\n```xml" +
"\n" +
"<dependencies>\n" +
Expand Down Expand Up @@ -485,7 +530,7 @@

fun buildHilResumeWithErrorContent() = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
message = message("codemodernizer.chat.message.hil.continue_after_error"),

Check warning on line 533 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
buttons = listOf(
openTransformHubButton,
stopTransformButton,
Expand All @@ -504,7 +549,7 @@
val artifactText = getDownloadedArtifactTextFromType(downloadFailureReason.artifactType)
val (message, docLink) = when (downloadFailureReason) {
is DownloadFailureReason.SSL_HANDSHAKE_ERROR -> Pair(
message("codemodernizer.chat.message.download_failed_ssl", artifactText),

Check warning on line 552 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
CODE_TRANSFORM_TROUBLESHOOT_DOC_CONFIGURE_PROXY,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserCancelledChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserHilSelection
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatIntroContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSelectionSummaryChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSkipTestsFlagSelectionChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserStopTransformChatContent
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.AuthenticationNeededExceptionMessage
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessage
Expand Down Expand Up @@ -88,6 +91,7 @@
private val authController = AuthController()
private val messagePublisher = context.messagesFromAppToUi
private val codeModernizerManager = CodeModernizerManager.getInstance(context.project)
private var configurationFile: VirtualFile? = null
private val codeTransformChatHelper = CodeTransformChatHelper(context.messagesFromAppToUi, chatSessionStorage)
private val artifactHandler = ArtifactHandler(context.project, GumbyClient.getInstance(context.project))
private val telemetry = CodeTransformTelemetryManager.getInstance(context.project)
Expand Down Expand Up @@ -208,28 +212,46 @@
val moduleVirtualFile: VirtualFile = modulePath.toVirtualFile() as VirtualFile
val moduleName = context.project.getModuleOrProjectNameForFile(moduleVirtualFile)

configurationFile = modulePath.toVirtualFile() as VirtualFile

codeTransformChatHelper.run {
addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
addNewMessage(buildCompileLocalInProgressChatContent())
addNewMessage(buildUserInputSkipTestsFlagChatIntroContent())
addNewMessage(buildUserInputSkipTestsFlagChatContent())
}
}

// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleVirtualFile, context.project)?.tryGetJdk(context.project)
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")

override suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests) {
// should never happen since at this point user has already selected a module with a build file
if (configurationFile == null) throw RuntimeException("No build file selected")
val sourceJdk = getSourceJdk(configurationFile!!)
val customBuildCommand = when (message.skipTestsSelection) {
message("codemodernizer.chat.message.skip_tests_form.skip") -> "test-compile"
else -> "test"
}
codeTransformChatHelper.addNewMessage(buildUserSkipTestsFlagSelectionChatContent(message.skipTestsSelection))
val selection = CustomerSelection(
moduleVirtualFile,
configurationFile!!,
sourceJdk,
JavaSdkVersion.JDK_17
JavaSdkVersion.JDK_17,
customBuildCommand
)

// Publish metric to capture user selection before local build starts
telemetry.submitSelection("Confirm", selection)

codeTransformChatHelper.addNewMessage(buildCompileLocalInProgressChatContent())
codeModernizerManager.runLocalMavenBuild(context.project, selection)
}

private fun getSourceJdk(moduleConfigurationFile: VirtualFile): JavaSdkVersion {
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleConfigurationFile, context.project)?.tryGetJdk(context.project)
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")
return sourceJdk
}

private suspend fun handleMavenBuildResult(mavenBuildResult: MavenCopyCommandsResult) {
when (mavenBuildResult) {
MavenCopyCommandsResult.Cancelled -> {
Expand Down Expand Up @@ -436,7 +458,7 @@
CodeTransformChatMessage(
tabId = tabId,
messageType = ChatMessageType.Answer,
message = message("codemodernizer.chat.message.error_request")

Check warning on line 461 in plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

View workflow job for this annotation

GitHub Actions / qodana

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
)
)
return false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ sealed interface CodeTransformBaseMessage : AmazonQMessage
enum class CodeTransformButtonId(val id: String) {
StartTransformation("codetransform-input-confirm"),
CancelTransformation("codetransform-input-cancel"),
ConfirmSkipTests("codetransform-input-confirm-skip-tests"),
StopTransformation("stop_transform"),
OpenTransformationHub("open_transformation_hub"),
OpenMvnBuild("open_mvn_build"),
Expand All @@ -32,6 +33,7 @@ enum class CodeTransformButtonId(val id: String) {
enum class CodeTransformFormItemId(val id: String) {
SelectModule("module"),
SelectTargetVersion("targetVersion"),
SelectSkipTestsFlag("skipTestsSelection"),
DependencyVersion("dependencyVersion"),
}

Expand Down Expand Up @@ -81,6 +83,11 @@ sealed interface IncomingCodeTransformMessage : CodeTransformBaseMessage {
@JsonProperty("tabID") val tabId: String,
) : IncomingCodeTransformMessage

data class CodeTransformConfirmSkipTests(
@JsonProperty("tabID") val tabId: String,
val skipTestsSelection: String,
) : IncomingCodeTransformMessage

data class CodeTransformOpenMvnBuild(
@JsonProperty("tabID") val tabId: String,
) : IncomingCodeTransformMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ data class CodeModernizerSessionContext(
val configurationFile: VirtualFile,
val sourceJavaVersion: JavaSdkVersion,
val targetJavaVersion: JavaSdkVersion,
val customBuildCommand: String,
) {
private val mapper = jacksonObjectMapper()
private val ignoredDependencyFileExtensions = setOf(INVALID_SUFFIX_SHA, INVALID_SUFFIX_REPOSITORIES)
Expand Down Expand Up @@ -200,7 +201,7 @@ data class CodeModernizerSessionContext(
val outputFile = createTemporaryZipFile { zip ->
// 1) Manifest file
val dependenciesRoot = if (depDirectory != null) "$ZIP_DEPENDENCIES_PATH/${depDirectory.name}" else null
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot))
mapper.writeValueAsString(ZipManifest(dependenciesRoot = dependenciesRoot, customBuildCommand = customBuildCommand))
.byteInputStream()
.use {
zip.putNextEntry(Path(MANIFEST_PATH).toString(), it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ import com.intellij.openapi.vfs.VirtualFile
data class CustomerSelection(
val configurationFile: VirtualFile,
val sourceJavaVersion: JavaSdkVersion,
val targetJavaVersion: JavaSdkVersion
val targetJavaVersion: JavaSdkVersion,
val customBuildCommand: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ data class ZipManifest(
val buildLogs: String = BUILD_LOG_PATH,
val version: String = UPLOAD_ZIP_MANIFEST_VERSION.toString(),
val hilCapabilities: List<String> = listOf(HIL_1P_UPGRADE_CAPABILITY),
val transformCapabilities: List<String> = listOf(EXPLAINABILITY_V1)
val transformCapabilities: List<String> = listOf(EXPLAINABILITY_V1),
val customBuildCommand: String = "",
)
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ enum class JobDetails {
CONFIGURATION_FILE_PATH,
TARGET_JAVA_VERSION,
SOURCE_JAVA_VERSION,
CUSTOM_BUILD_COMMAND,
}

enum class StateFlags {
Expand All @@ -29,6 +30,7 @@ fun buildState(context: CodeModernizerSessionContext, isJobOngoing: Boolean, job
JobDetails.CONFIGURATION_FILE_PATH to context.configurationFile.path,
JobDetails.TARGET_JAVA_VERSION to context.targetJavaVersion.description,
JobDetails.SOURCE_JAVA_VERSION to context.sourceJavaVersion.description,
JobDetails.CUSTOM_BUILD_COMMAND to context.customBuildCommand
)
)
flags.putAll(
Expand Down Expand Up @@ -56,6 +58,12 @@ class CodeModernizerState : BaseState() {
lastJobContext[JobDetails.SOURCE_JAVA_VERSION] ?: throw RuntimeException("Expected source language for migration path of previous job but was null")
val targetJavaSdkVersion = JavaSdkVersion.fromVersionString(targetString) ?: throw RuntimeException("Invalid Java SDK version $targetString")
val sourceJavaSdkVersion = JavaSdkVersion.fromVersionString(sourceString) ?: throw RuntimeException("Invalid Java SDK version $sourceString")
return CodeModernizerSessionContext(project, configurationFile, sourceJavaSdkVersion, targetJavaSdkVersion)
return CodeModernizerSessionContext(
project,
configurationFile,
sourceJavaSdkVersion,
targetJavaSdkVersion,
lastJobContext[JobDetails.CUSTOM_BUILD_COMMAND] ?: ""
)
}
}
Loading
Loading