Skip to content

Commit 2b3c852

Browse files
author
David Hasani
committed
grep for sql statements
1 parent 1655d39 commit 2b3c852

File tree

4 files changed

+50
-16
lines changed

4 files changed

+50
-16
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
@@ -60,7 +60,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeMo
6060
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.STATES_WHERE_PLAN_EXIST
6161
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.createFileCopy
6262
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.findLineNumberByString
63-
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModules
63+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModulesWithSQL
6464
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getMavenVersion
6565
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile
6666
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactPomFile
@@ -160,7 +160,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
160160
}
161161

162162
if (transformationType == CodeTransformType.SQL_CONVERSION) {
163-
val javaModules = project.getJavaModules()
163+
val javaModules = project.getJavaModulesWithSQL()
164164
return if (javaModules.isNotEmpty()) {
165165
ValidationResult(
166166
true,

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.panels.managers.C
9595
import software.aws.toolkits.jetbrains.services.codemodernizer.session.ChatSessionStorage
9696
import software.aws.toolkits.jetbrains.services.codemodernizer.session.Session
9797
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
98-
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModules
98+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModulesWithSQL
9999
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile
100100
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTransformAvailable
101101
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.toVirtualFile
@@ -150,13 +150,22 @@ class CodeTransformChatController(
150150
// Publish a metric when transform is first initiated from chat prompt.
151151
telemetry.initiateTransform()
152152

153-
val anyModuleContainsOracleSQL = true // TODO: implement, and make sure to say "Checking for eligible modules..." here too
153+
val anyModuleContainsOracleSQL = codeModernizerManager.validate(context.project, CodeTransformType.SQL_CONVERSION).valid
154154

155-
if (anyModuleContainsOracleSQL) {
156-
this.getUserObjective(message.tabId)
157-
} else {
155+
if (!anyModuleContainsOracleSQL) {
158156
this.handleLanguageUpgrade()
157+
return
158+
}
159+
160+
val eligibleForLanguageUpgrade = codeModernizerManager.validate(context.project, CodeTransformType.LANGUAGE_UPGRADE).valid
161+
162+
if (!eligibleForLanguageUpgrade) {
163+
this.handleSQLConversion()
164+
return
159165
}
166+
167+
// eligible for both language upgrade and sql conversion, so ask user what they want to do
168+
this.getUserObjective(message.tabId)
160169
}
161170

162171
private suspend fun getUserObjective(tabId: String) {
@@ -170,7 +179,7 @@ class CodeTransformChatController(
170179
buildCheckingValidProjectChatContent()
171180
)
172181

173-
codeTransformChatHelper.chatDelayLong()
182+
codeTransformChatHelper.chatDelayShort()
174183

175184
val validationResult = codeModernizerManager.validate(context.project, transformationType)
176185

@@ -337,8 +346,7 @@ class CodeTransformChatController(
337346
addNewMessage(buildSQLMetadataValidationSuccessIntroChatContent())
338347
addNewMessage(buildSQLMetadataValidationSuccessDetailsChatContent(metadataValidationResult))
339348
addNewMessage(buildModuleSchemaFormIntroChatContent())
340-
// already validated that there are open Java modules at this point
341-
addNewMessage(buildModuleSchemaFormChatContent(context.project, context.project.getJavaModules(), metadataValidationResult.schemaOptions))
349+
addNewMessage(buildModuleSchemaFormChatContent(context.project, context.project.getJavaModulesWithSQL(), metadataValidationResult.schemaOptions))
342350
}
343351
val selection = CustomerSelection(
344352
// for SQL conversions (no sourceJavaVersion), use dummy value of Java 8 so that startJob API can be called

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.intellij.openapi.projectRoots.impl.JavaSdkImpl
1010
import com.intellij.openapi.roots.LanguageLevelModuleExtensionImpl
1111
import com.intellij.openapi.roots.ModuleRootManager
1212
import com.intellij.openapi.roots.ProjectRootManager
13+
import com.intellij.openapi.vfs.VirtualFile
14+
import java.io.File
1315

1416
/**
1517
* @description Try to get the module SDK version and/or Language level from the project settings > modules > source field.
@@ -35,5 +37,29 @@ fun Module.tryGetJdkLanguageLevelJdk(): JavaSdkVersion? {
3537
val moduleRootManager = ModuleRootManager.getInstance(this)
3638
val languageLevelModuleExtension = moduleRootManager.getModuleExtension(LanguageLevelModuleExtensionImpl::class.java)
3739
val languageLevel = languageLevelModuleExtension?.languageLevel
38-
return languageLevel?.let { JavaSdkVersion.fromLanguageLevel(it) } ?: null
40+
return languageLevel?.let { JavaSdkVersion.fromLanguageLevel(it) }
41+
}
42+
43+
// search for Strings that indicate embedded Oracle SQL statements are present
44+
fun containsSQL(contentRoot: VirtualFile): Boolean {
45+
val patterns = listOf(
46+
"oracle.jdbc.OracleDriver",
47+
"jdbc:oracle:thin:@//",
48+
"jdbc:oracle:oci:@//"
49+
)
50+
51+
val isWindows = System.getProperty("os.name").lowercase().startsWith("Windows")
52+
val searchCommand = if (isWindows) "findstr" else "grep"
53+
val searchOptions = if (isWindows) listOf("/i", "/s") else listOf("-i", "-r")
54+
55+
for (pattern in patterns) {
56+
val command = listOf(searchCommand, *searchOptions.toTypedArray(), pattern)
57+
val processBuilder = ProcessBuilder(command)
58+
processBuilder.directory(File(contentRoot.path))
59+
val process = processBuilder.start()
60+
if (process.waitFor() == 0) {
61+
return true
62+
}
63+
}
64+
return false
3965
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ fun Project.getSupportedModules(supportedJavaMappings: Map<JavaSdkVersion, Set<J
7979
moduleJdk in supportedJavaMappings
8080
}
8181

82-
// return the first file or directory found inside each open Java module, so that user can select a Module for us to ZIP
83-
fun Project.getJavaModules() = this.modules.flatMap { module ->
82+
// return the first file or directory found inside each open Java module that contains SQL statements, so that user can select a Module for us to ZIP
83+
fun Project.getJavaModulesWithSQL() = this.modules.flatMap { module ->
8484
val rootManager = ModuleRootManager.getInstance(module)
8585
if (rootManager.sdk?.sdkType?.name?.lowercase()?.contains("java") == true) {
8686
val contentRoots = rootManager.contentRoots
8787
if (contentRoots.isNotEmpty()) {
88-
val firstContentRoot = contentRoots.first()
89-
val children = firstContentRoot.children
90-
if (children.isNotEmpty()) {
88+
val contentRoot = contentRoots.first()
89+
val children = contentRoot.children
90+
if (children.isNotEmpty() && containsSQL(contentRoot)) {
9191
listOf(children.first())
9292
} else {
9393
emptyList()

0 commit comments

Comments
 (0)