Skip to content

Commit 3e50177

Browse files
authored
should stop transformation on profile changed (#2007)
1 parent 3937e7f commit 3e50177

File tree

5 files changed

+79
-9
lines changed

5 files changed

+79
-9
lines changed

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import software.aws.toolkits.core.utils.warn
3232
import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope
3333
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_MVN_FAILURE
3434
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_PROJECT_SIZE
35+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
36+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
3537
import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient
3638
import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformMessageListener
3739
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_POM_FILE_NAME
@@ -130,6 +132,22 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
130132

131133
init {
132134
CodeModernizerSessionState.getInstance(project).setDefaults()
135+
initQRegionProfileSelectedListener()
136+
}
137+
138+
private fun initQRegionProfileSelectedListener() {
139+
project.messageBus.connect(this).subscribe(
140+
QRegionProfileSelectedListener.TOPIC,
141+
object : QRegionProfileSelectedListener {
142+
override fun onProfileSelected(project: Project, profile: QRegionProfile?) {
143+
stopModernize()
144+
codeTransformationSession?.let {
145+
Disposer.dispose(it)
146+
}
147+
codeTransformationSession = null
148+
}
149+
}
150+
)
133151
}
134152

135153
fun validate(project: Project, transformationType: CodeTransformType): ValidationResult {
@@ -259,7 +277,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
259277

260278
fun runModernize(copyResult: MavenCopyCommandsResult? = null) {
261279
initStopParameters()
262-
val session = codeTransformationSession as CodeModernizerSession
280+
val session = codeTransformationSession ?: return
263281
initModernizationJobUI(true, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
264282
launchModernizationJob(session, copyResult)
265283
}

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

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

66
import com.intellij.openapi.Disposable
77
import com.intellij.openapi.application.runInEdt
8+
import com.intellij.openapi.util.Disposer
89
import com.intellij.serviceContainer.AlreadyDisposedException
910
import com.intellij.util.io.HttpRequests
1011
import kotlinx.coroutines.delay
@@ -149,6 +150,9 @@ class CodeModernizerSession(
149150
* Based on [CodeWhispererCodeScanSession]
150151
*/
151152
suspend fun createModernizationJob(copyResult: MavenCopyCommandsResult?): CodeModernizerStartJobResult {
153+
if (this.isDisposed.get()) {
154+
return CodeModernizerStartJobResult.Cancelled
155+
}
152156
LOG.info { "Compressing local project" }
153157
val payload: File?
154158
var payloadSize = 0
@@ -182,6 +186,9 @@ class CodeModernizerSession(
182186
payloadSize = payload.length().toInt()
183187

184188
LOG.info { "Uploading zip file with size: $payloadSize bytes" }
189+
if (this.isDisposed.get()) {
190+
return CodeModernizerStartJobResult.Cancelled
191+
}
185192

186193
if (payloadSize > MAX_ZIP_SIZE) {
187194
telemetryErrorMessage = "Project exceeds max upload size"
@@ -210,7 +217,7 @@ class CodeModernizerSession(
210217
telemetryErrorMessage = "Credential expired before uploading project"
211218
return CodeModernizerStartJobResult.ZipUploadFailed(UploadFailureReason.CREDENTIALS_EXPIRED)
212219
}
213-
if (shouldStop.get()) {
220+
if (shouldStop.get() || this.isDisposed.get()) {
214221
LOG.warn { "Job was cancelled by user before upload was called" }
215222
telemetryErrorMessage = "Cancelled when about to upload project"
216223
return CodeModernizerStartJobResult.Cancelled
@@ -285,7 +292,7 @@ class CodeModernizerSession(
285292
CodeTransformMessageListener.instance.onUploadResult()
286293

287294
return try {
288-
if (shouldStop.get()) {
295+
if (shouldStop.get() || this.isDisposed.get()) {
289296
LOG.warn { "Job was cancelled by user before start job was called" }
290297
return CodeModernizerStartJobResult.Cancelled
291298
}
@@ -625,6 +632,8 @@ class CodeModernizerSession(
625632

626633
override fun dispose() {
627634
isDisposed.set(true)
635+
shouldStop.set(true)
636+
Disposer.dispose(sessionContext)
628637
}
629638

630639
fun getActiveJobId() = state.currentJobId

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import org.slf4j.Logger
1616
import software.aws.toolkits.core.utils.error
1717
import software.aws.toolkits.core.utils.info
1818
import software.aws.toolkits.jetbrains.services.codemodernizer.CodeTransformTelemetryManager
19+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
1920
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
2021
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult
2122
import software.aws.toolkits.telemetry.CodeTransformBuildCommand
@@ -25,6 +26,7 @@ import java.nio.file.Files
2526
import java.nio.file.Path
2627

2728
fun runHilMavenCopyDependency(
29+
context: CodeModernizerSessionContext,
2830
sourceFolder: File,
2931
destinationDir: File,
3032
logBuilder: StringBuilder,
@@ -35,6 +37,7 @@ fun runHilMavenCopyDependency(
3537
try {
3638
// Create shared parameters
3739
val transformMvnRunner = TransformMavenRunner(project)
40+
context.mavenRunnerQueue.add(transformMvnRunner)
3841
val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings
3942

4043
// run copy dependencies
@@ -57,7 +60,14 @@ fun runHilMavenCopyDependency(
5760
return MavenCopyCommandsResult.Success(destinationDir)
5861
}
5962

60-
fun runMavenCopyCommands(sourceFolder: File, logBuilder: StringBuilder, logger: Logger, project: Project, shouldSkipTests: Boolean): MavenCopyCommandsResult {
63+
fun runMavenCopyCommands(
64+
context: CodeModernizerSessionContext,
65+
sourceFolder: File,
66+
logBuilder: StringBuilder,
67+
logger: Logger,
68+
project: Project,
69+
shouldSkipTests: Boolean,
70+
): MavenCopyCommandsResult {
6171
val currentTimestamp = System.currentTimeMillis()
6272
val destinationDir = Files.createTempDirectory("transformation_dependencies_temp_$currentTimestamp")
6373
val telemetry = CodeTransformTelemetryManager.getInstance(project)
@@ -68,6 +78,7 @@ fun runMavenCopyCommands(sourceFolder: File, logBuilder: StringBuilder, logger:
6878
try {
6979
// Create shared parameters
7080
val transformMvnRunner = TransformMavenRunner(project)
81+
context.mavenRunnerQueue.add(transformMvnRunner)
7182
val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings
7283

7384
val sourceVirtualFile = LocalFileSystem.getInstance().findFileByIoFile(sourceFolder)
@@ -282,10 +293,17 @@ private fun runMavenDependencyUpdatesReport(
282293
return dependencyUpdatesReportRunnable
283294
}
284295

285-
fun runDependencyReportCommands(sourceFolder: File, logBuilder: StringBuilder, logger: Logger, project: Project): MavenDependencyReportCommandsResult {
296+
fun runDependencyReportCommands(
297+
context: CodeModernizerSessionContext,
298+
sourceFolder: File,
299+
logBuilder: StringBuilder,
300+
logger: Logger,
301+
project: Project,
302+
): MavenDependencyReportCommandsResult {
286303
logger.info { "Executing IntelliJ bundled Maven" }
287304

288305
val transformMvnRunner = TransformMavenRunner(project)
306+
context.mavenRunnerQueue.add(transformMvnRunner)
289307
val mvnSettings = MavenRunner.getInstance(project).settings.clone() // clone required to avoid editing user settings
290308

291309
val runnable = runMavenDependencyUpdatesReport(sourceFolder, logBuilder, mvnSettings, transformMvnRunner, logger)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven
55

66
import com.intellij.execution.process.ProcessAdapter
77
import com.intellij.execution.process.ProcessEvent
8+
import com.intellij.execution.process.ProcessHandler
89
import com.intellij.execution.process.ProcessOutputTypes
910
import com.intellij.execution.runners.ProgramRunner
1011
import com.intellij.execution.ui.RunContentDescriptor
@@ -16,11 +17,13 @@ import org.jetbrains.idea.maven.execution.MavenRunnerParameters
1617
import org.jetbrains.idea.maven.execution.MavenRunnerSettings
1718

1819
class TransformMavenRunner(val project: Project) {
20+
private var handler: ProcessHandler? = null
1921

2022
fun run(parameters: MavenRunnerParameters, settings: MavenRunnerSettings, onComplete: TransformRunnable) {
2123
FileDocumentManager.getInstance().saveAllDocuments()
2224
val callback = ProgramRunner.Callback { descriptor: RunContentDescriptor ->
2325
val handler = descriptor.processHandler
26+
this.handler = handler
2427
if (handler == null) {
2528
// add log error here
2629
onComplete.setExitCode(-1)
@@ -50,4 +53,8 @@ class TransformMavenRunner(val project: Project) {
5053
// Setting isDelegateBuild = true allows us to set the JRE used by Maven during runtime
5154
MavenRunConfigurationType.runConfiguration(project, parameters, null, settings, callback, false)
5255
}
56+
57+
fun cancel() {
58+
this.handler?.destroyProcess()
59+
}
5360
}

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

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

66
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
7+
import com.intellij.openapi.Disposable
78
import com.intellij.openapi.application.runInEdt
89
import com.intellij.openapi.application.runReadAction
910
import com.intellij.openapi.project.Project
@@ -19,6 +20,7 @@ import software.aws.toolkits.core.utils.putNextEntry
1920
import software.aws.toolkits.jetbrains.services.codemodernizer.EXPLAINABILITY_V1
2021
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_DEPENDENCIES_ROOT_NAME
2122
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_MANIFEST_FILE_NAME
23+
import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.TransformMavenRunner
2224
import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runDependencyReportCommands
2325
import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runHilMavenCopyDependency
2426
import software.aws.toolkits.jetbrains.services.codemodernizer.ideMaven.runMavenCopyCommands
@@ -59,6 +61,7 @@ const val INVALID_SUFFIX_REPOSITORIES = "repositories"
5961
const val ORACLE_DB = "ORACLE"
6062
const val AURORA_DB = "AURORA_POSTGRESQL"
6163
const val RDS_DB = "POSTGRESQL"
64+
6265
data class CodeModernizerSessionContext(
6366
val project: Project,
6467
var configurationFile: VirtualFile? = null, // used to ZIP module
@@ -71,9 +74,11 @@ data class CodeModernizerSessionContext(
7174
val sourceServerName: String? = null,
7275
var schema: String? = null,
7376
val sqlMetadataZip: File? = null,
74-
) {
77+
) : Disposable {
7578
private val mapper = jacksonObjectMapper()
7679
private val ignoredDependencyFileExtensions = setOf(INVALID_SUFFIX_SHA, INVALID_SUFFIX_REPOSITORIES)
80+
private var isDisposed = false
81+
val mavenRunnerQueue: MutableList<TransformMavenRunner> = mutableListOf()
7782

7883
private fun File.isMavenTargetFolder(): Boolean {
7984
val hasPomSibling = this.resolveSibling(MAVEN_CONFIGURATION_FILE_NAME).exists()
@@ -100,19 +105,22 @@ data class CodeModernizerSessionContext(
100105
}
101106

102107
fun executeMavenCopyCommands(sourceFolder: File, buildLogBuilder: StringBuilder): MavenCopyCommandsResult {
108+
if (isDisposed) return MavenCopyCommandsResult.Cancelled
103109
val shouldSkipTests = customBuildCommand == MAVEN_BUILD_SKIP_UNIT_TESTS
104-
return runMavenCopyCommands(sourceFolder, buildLogBuilder, LOG, project, shouldSkipTests)
110+
return runMavenCopyCommands(this, sourceFolder, buildLogBuilder, LOG, project, shouldSkipTests)
105111
}
106112

107113
private fun executeHilMavenCopyDependency(sourceFolder: File, destinationFolder: File, buildLogBuilder: StringBuilder) = runHilMavenCopyDependency(
114+
this,
108115
sourceFolder,
109116
destinationFolder,
110117
buildLogBuilder,
111118
LOG,
112-
project
119+
project,
113120
)
114121

115122
fun copyHilDependencyUsingMaven(hilTepDirPath: Path): MavenCopyCommandsResult {
123+
if (isDisposed) return MavenCopyCommandsResult.Cancelled
116124
val sourceFolder = File(getPathToHilArtifactPomFolder(hilTepDirPath).pathString)
117125
val destinationFolder = Files.createDirectories(getPathToHilDependenciesRootDir(hilTepDirPath)).toFile()
118126
val buildLogBuilder = StringBuilder("Starting Build Log...\n")
@@ -121,21 +129,24 @@ data class CodeModernizerSessionContext(
121129
}
122130

123131
fun getDependenciesUsingMaven(): MavenCopyCommandsResult {
132+
if (isDisposed) return MavenCopyCommandsResult.Cancelled
124133
val root = configurationFile?.parent
125134
val sourceFolder = File(root?.path)
126135
val buildLogBuilder = StringBuilder("Starting Build Log...\n")
127136
return executeMavenCopyCommands(sourceFolder, buildLogBuilder)
128137
}
129138

130139
fun createDependencyReportUsingMaven(hilTempPomPath: Path): MavenDependencyReportCommandsResult {
140+
if (isDisposed) return MavenDependencyReportCommandsResult.Cancelled
131141
val sourceFolder = File(hilTempPomPath.pathString)
132142
val buildLogBuilder = StringBuilder("Starting Build Log...\n")
133143
return executeDependencyVersionReportUsingMaven(sourceFolder, buildLogBuilder)
134144
}
145+
135146
private fun executeDependencyVersionReportUsingMaven(
136147
sourceFolder: File,
137148
buildLogBuilder: StringBuilder,
138-
) = runDependencyReportCommands(sourceFolder, buildLogBuilder, LOG, project)
149+
) = runDependencyReportCommands(this, sourceFolder, buildLogBuilder, LOG, project)
139150

140151
fun createZipForHilUpload(hilTempPath: Path, manifest: CodeTransformHilDownloadManifest?, targetVersion: String): ZipCreationResult =
141152
runReadAction {
@@ -326,6 +337,13 @@ data class CodeModernizerSessionContext(
326337
CodeModernizerBottomWindowPanelManager.getInstance(project).setJobStartingUI()
327338
}
328339

340+
override fun dispose() {
341+
isDisposed = true
342+
this.mavenRunnerQueue.forEach {
343+
it.cancel()
344+
}
345+
}
346+
329347
companion object {
330348
private val LOG = getLogger<CodeModernizerSessionContext>()
331349
}

0 commit comments

Comments
 (0)