Skip to content

Commit 409fd60

Browse files
authored
Simplify maven execution (#4135)
1 parent 1aa0d2c commit 409fd60

File tree

16 files changed

+399
-457
lines changed

16 files changed

+399
-457
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.intellij.openapi.components.State
1313
import com.intellij.openapi.components.Storage
1414
import com.intellij.openapi.components.service
1515
import com.intellij.openapi.project.Project
16+
import com.intellij.openapi.projectRoots.JavaSdkVersion
1617
import com.intellij.openapi.roots.ProjectRootManager
1718
import com.intellij.openapi.util.Disposer
1819
import com.intellij.openapi.vfs.VirtualFile
@@ -55,6 +56,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeMo
5556
import software.aws.toolkits.jetbrains.services.codemodernizer.ui.components.BuildErrorDialog
5657
import software.aws.toolkits.jetbrains.services.codemodernizer.ui.components.PreCodeTransformUserDialog
5758
import software.aws.toolkits.jetbrains.services.codemodernizer.ui.components.ValidationErrorDialog
59+
import software.aws.toolkits.jetbrains.utils.actions.OpenBrowserAction
5860
import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend
5961
import software.aws.toolkits.jetbrains.utils.notifyError
6062
import software.aws.toolkits.jetbrains.utils.notifyInfo
@@ -99,7 +101,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
99101
field = session
100102
}
101103
private val artifactHandler = ArtifactHandler(project, GumbyClient.getInstance(project))
102-
104+
private val supportedJavaMappings = mapOf(
105+
JavaSdkVersion.JDK_1_8 to setOf(JavaSdkVersion.JDK_17),
106+
JavaSdkVersion.JDK_11 to setOf(JavaSdkVersion.JDK_17),
107+
)
103108
init {
104109
CodeModernizerSessionState.getInstance(project).setDefaults()
105110
}
@@ -134,7 +139,19 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
134139
)
135140
)
136141
}
137-
val validatedBuildFiles = project.getSupportedBuildModules(supportedBuildFileNames)
142+
val supportedModules = project.getSupportedModules(supportedJavaMappings).toSet()
143+
val validProjectJdk = project.getSupportedJavaMappings(supportedJavaMappings).isNotEmpty()
144+
if (supportedModules.isEmpty() && !validProjectJdk) {
145+
return ValidationResult(
146+
false,
147+
message("codemodernizer.notification.warn.invalid_project.description.reason.invalid_jdk_versions", supportedJavaMappings.keys.joinToString()),
148+
InvalidTelemetryReason(
149+
CodeTransformPreValidationError.UnsupportedJavaVersion,
150+
project.tryGetJdk().toString()
151+
)
152+
)
153+
}
154+
val validatedBuildFiles = project.getSupportedBuildFilesWithSupportedJdk(supportedBuildFileNames, supportedJavaMappings)
138155
return if (validatedBuildFiles.isNotEmpty()) {
139156
ValidationResult(true, validatedBuildFiles = validatedBuildFiles)
140157
} else {
@@ -255,6 +272,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
255272
fun getCustomerSelection(validatedBuildFiles: List<VirtualFile>): CustomerSelection? = PreCodeTransformUserDialog(
256273
project,
257274
validatedBuildFiles,
275+
supportedJavaMappings,
258276
).create()
259277

260278
private fun notifyJobFailure(failureReason: String?, retryable: Boolean) {
@@ -383,6 +401,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
383401
is CodeModernizerStartJobResult.Cancelled -> {
384402
CodeModernizerJobCompletedResult.JobAbortedBeforeStarting
385403
}
404+
405+
is CodeModernizerStartJobResult.CancelledMissingDependencies -> {
406+
CodeModernizerJobCompletedResult.JobAbortedMissingDependencies
407+
}
386408
}
387409
}
388410

@@ -507,6 +529,11 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
507529
artifactHandler.displayDiffAction(jobId)
508530
}
509531

532+
private fun openTroubleshootingGuideNotificationAction() = OpenBrowserAction(
533+
message("codemodernizer.notification.info.view_troubleshooting_guide"),
534+
url = "https://docs.aws.amazon.com/amazonq/latest/aws-builder-use-ug/code-transformation.html#transform-issues"
535+
)
536+
510537
private fun displaySummaryNotificationAction(jobId: JobId) =
511538
NotificationAction.createSimple(message("codemodernizer.notification.info.modernize_complete.view_summary")) {
512539
artifactHandler.showTransformationSummary(jobId)
@@ -558,6 +585,12 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
558585

559586
is CodeModernizerJobCompletedResult.ManagerDisposed -> LOG.warn { "Manager disposed" }
560587
is CodeModernizerJobCompletedResult.JobAbortedBeforeStarting -> LOG.warn { "Job was aborted" }
588+
is CodeModernizerJobCompletedResult.JobAbortedMissingDependencies -> notifyStickyInfo(
589+
message("codemodernizer.notification.warn.maven_failed.title"),
590+
message("codemodernizer.notification.warn.maven_failed.content"),
591+
project,
592+
listOf(openTroubleshootingGuideNotificationAction()),
593+
)
561594
}
562595
}
563596

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.plan.CodeModerniz
3232
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
3333
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeTransformTelemetryState
3434
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanSession
35-
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
3635
import software.aws.toolkits.resources.message
3736
import software.aws.toolkits.telemetry.CodeTransformApiNames
3837
import software.aws.toolkits.telemetry.CodetransformTelemetry
@@ -79,17 +78,12 @@ class CodeModernizerSession(
7978
}
8079
val startTime = Instant.now()
8180
val result = sessionContext.createZipWithModuleFiles()
82-
payload = when (result) {
83-
is ZipCreationResult.Missing1P -> {
84-
notifyStickyInfo(
85-
message("codemodernizer.notification.info.maven_failed.title"),
86-
message("codemodernizer.notification.info.maven_failed.content")
87-
)
88-
result.payload
89-
}
9081

91-
is ZipCreationResult.Succeeded -> result.payload
82+
if (result is ZipCreationResult.Missing1P) {
83+
return CodeModernizerStartJobResult.CancelledMissingDependencies
9284
}
85+
86+
payload = result.payload
9387
CodetransformTelemetry.jobCreateZipEndTime(
9488
codeTransformTotalByteSize = payload.length().toInt(),
9589
codeTransformSessionId = CodeTransformTelemetryState.instance.getSessionId(),

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformUtils.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.intellij.execution.util.ExecUtil
99
import com.intellij.openapi.application.ApplicationInfo
1010
import com.intellij.openapi.module.ModuleUtil
1111
import com.intellij.openapi.project.Project
12-
import com.intellij.openapi.projectRoots.JavaSdkVersion
1312
import com.intellij.openapi.util.SystemInfo
1413
import com.intellij.openapi.vfs.VfsUtilCore
1514
import com.intellij.openapi.vfs.VirtualFile
@@ -45,11 +44,9 @@ import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnecti
4544
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.BearerTokenFeatureSet
4645
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.checkBearerConnectionValidity
4746
import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient
48-
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.CodeModernizerUIConstants
4947
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
5048
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_CONFIGURATION_FILE_NAME
5149
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeTransformTelemetryState
52-
import software.aws.toolkits.resources.message
5350
import software.aws.toolkits.telemetry.CodetransformTelemetry
5451
import java.io.File
5552
import java.io.FileOutputStream
@@ -132,17 +129,6 @@ fun String.toTransformationLanguage() = when (this) {
132129
else -> TransformationLanguage.UNKNOWN_TO_SDK_VERSION
133130
}
134131

135-
fun getJdkVersionText(version: JavaSdkVersion?): String {
136-
val jdkVersionText: String = if (version == null) {
137-
message("codemodernizer.customerselectiondialog.unknown_jdk")
138-
} else if (CodeModernizerUIConstants.supportedSourceJDKs.contains(version)) { // detected java version is supported
139-
message("codemodernizer.customerselectiondialog.found_supported_jdk", version)
140-
} else {
141-
message("codemodernizer.customerselectiondialog.found_unsupported_jdk", version) // found the version, but unsupported
142-
}
143-
return jdkVersionText
144-
}
145-
146132
fun calculateTotalLatency(startTime: Instant, endTime: Instant) = (endTime.toEpochMilli() - startTime.toEpochMilli()).toInt()
147133

148134
data class PollingResult(

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/ModuleUtils.kt

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
package software.aws.toolkits.jetbrains.services.codemodernizer
55

6+
import com.intellij.openapi.application.runReadAction
67
import com.intellij.openapi.module.Module
78
import com.intellij.openapi.module.ModuleUtil
89
import com.intellij.openapi.project.Project
10+
import com.intellij.openapi.project.modules
911
import com.intellij.openapi.projectRoots.JavaSdkVersion
1012
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl
1113
import com.intellij.openapi.roots.ModuleRootManager
@@ -22,29 +24,60 @@ fun Module.tryGetJdk(project: Project): JavaSdkVersion? {
2224
}
2325

2426
/**
25-
* @description Strategy:
26-
* 1. Find folders with pom.xml or build.gradle.kts or build.gradle
27-
* 2. Filter out subdirectories
27+
* @description Try to get the project SDK version from the "project structure" settings
2828
*/
29-
fun Project.getSupportedBuildModules(supportedBuildFileNames: List<String>): List<VirtualFile> {
29+
fun Project.tryGetJdk(): JavaSdkVersion? {
30+
val projectSdk = ProjectRootManager.getInstance(this).projectSdk
31+
val javaSdk = JavaSdkImpl.getInstance()
32+
return javaSdk.getVersion(projectSdk ?: return null)
33+
}
34+
35+
fun Project.getSupportedJavaMappings(supportedJavaMappings: Map<JavaSdkVersion, Set<JavaSdkVersion>>): List<String> {
36+
val projectSdk = ProjectRootManager.getInstance(this).projectSdk
37+
val javaSdk = JavaSdkImpl.getInstance()
38+
return if (projectSdk == null) {
39+
listOf()
40+
} else {
41+
supportedJavaMappings.getOrDefault(javaSdk.getVersion(projectSdk), listOf()).map { it.name }.toList()
42+
}
43+
}
44+
45+
private fun Project.getAllSupportedBuildFiles(supportedBuildFileNames: List<String>): List<VirtualFile> {
46+
/**
47+
* Strategy:
48+
* 1. Find folders with pom.xml or build.gradle.kts or build.gradle
49+
* 2. Filter out subdirectories
50+
*/
3051
val projectRootManager = ProjectRootManager.getInstance(this)
3152
val probableProjectRoot = this.basePath?.toVirtualFile() // May point to only one intellij module (the first opened one)
3253
val probableContentRoots = projectRootManager.contentRoots.toMutableSet() // May not point to the topmost folder of modules
3354
probableContentRoots.add(probableProjectRoot) // dedupe
3455
val topLevelRoots = filterOnlyParentFiles(probableContentRoots)
35-
val detectedBuildFiles = topLevelRoots.flatMap { root ->
56+
return topLevelRoots.flatMap { root ->
3657
findBuildFiles(root.toNioPath().toFile(), supportedBuildFileNames).mapNotNull { it.path.toVirtualFile() }
3758
}
38-
return detectedBuildFiles
3959
}
4060

41-
/**
42-
* @description Try to get the project SDK version from the "project structure" settings
43-
*/
44-
fun Project.tryGetJdk(): JavaSdkVersion? {
45-
val projectSdk = ProjectRootManager.getInstance(this).projectSdk
46-
val javaSdk = JavaSdkImpl.getInstance()
47-
return javaSdk.getVersion(projectSdk ?: return null)
61+
fun Project.getSupportedBuildFilesWithSupportedJdk(
62+
supportedBuildFileNames: List<String>,
63+
supportedJavaMappings: Map<
64+
JavaSdkVersion,
65+
Set<JavaSdkVersion>
66+
>
67+
): List<VirtualFile> {
68+
val detectedBuildFiles = this.getAllSupportedBuildFiles(supportedBuildFileNames)
69+
val supportedModules = this.getSupportedModules(supportedJavaMappings).toSet()
70+
val validProjectJdk = this.getSupportedJavaMappings(supportedJavaMappings).isNotEmpty()
71+
val projectRootManager = ProjectRootManager.getInstance(this)
72+
return detectedBuildFiles.filter {
73+
val moduleOfFile = runReadAction { projectRootManager.fileIndex.getModuleForFile(it) }
74+
return@filter (moduleOfFile in supportedModules) || (moduleOfFile == null && validProjectJdk)
75+
}
76+
}
77+
78+
fun Project.getSupportedModules(supportedJavaMappings: Map<JavaSdkVersion, Set<JavaSdkVersion>>) = this.modules.filter {
79+
val moduleJdk = it.tryGetJdk(this) ?: return@filter false
80+
moduleJdk in supportedJavaMappings
4881
}
4982

5083
fun Project.getModuleOrProjectNameForFile(file: VirtualFile) = ModuleUtil.findModuleForFile(file, this)?.name ?: this.name

0 commit comments

Comments
 (0)