Skip to content

Commit 2d8d533

Browse files
author
David Hasani
committed
short circuit lang upgrades
1 parent 62bbbe1 commit 2d8d533

File tree

4 files changed

+78
-35
lines changed

4 files changed

+78
-35
lines changed

packages/core/src/amazonqGumby/chat/controller/controller.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,28 @@ export class GumbyController {
194194
try {
195195
embeddedSQLProjects = await getValidSQLConversionCandidateProjects()
196196
} catch (err) {
197-
getLogger().error(`Error validating SQL conversion projects: ${err}`)
197+
getLogger().error(`CodeTransformation: error validating SQL conversion projects: ${err}`)
198198
}
199199

200200
if (embeddedSQLProjects.length === 0) {
201201
await this.handleLanguageUpgrade(message)
202202
return
203203
}
204204

205+
let javaUpgradeProjects: TransformationCandidateProject[] = []
206+
try {
207+
javaUpgradeProjects = await getValidLanguageUpgradeCandidateProjects()
208+
} catch (err) {
209+
getLogger().error(`CodeTransformation: error validating Java upgrade projects: ${err}`)
210+
}
211+
212+
// TO-DO: in this case, should we say "I can't do a language upgrade, but I found embedded SQL I can convert..."
213+
// and vice-versa for the case above with handleLanguageUpgrade
214+
if (javaUpgradeProjects.length === 0) {
215+
await this.handleSQLConversion(message)
216+
return
217+
}
218+
205219
// if previous transformation was already running, show correct message to user
206220
switch (this.sessionStorage.getSession().conversationState) {
207221
case ConversationState.JOB_SUBMITTED:
@@ -230,7 +244,10 @@ export class GumbyController {
230244
this.sessionStorage.getSession().conversationState = ConversationState.WAITING_FOR_TRANSFORMATION_OBJECTIVE
231245
this.messenger.sendStaticTextResponse('choose-transformation-objective', message.tabID)
232246
this.messenger.sendChatInputEnabled(message.tabID, true)
233-
this.messenger.sendUpdatePlaceholder(message.tabID, CodeWhispererConstants.chooseTransformationObjective)
247+
this.messenger.sendUpdatePlaceholder(
248+
message.tabID,
249+
CodeWhispererConstants.chooseTransformationObjectivePlaceholder
250+
)
234251
}
235252

236253
private async beginTransformation(message: any) {
@@ -316,13 +333,7 @@ export class GumbyController {
316333

317334
private async validateSQLConversionProjects(message: any) {
318335
try {
319-
const validProjects = await telemetry.codeTransform_validateProject.run(async () => {
320-
telemetry.record({
321-
codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(),
322-
})
323-
const validProjects = await getValidSQLConversionCandidateProjects()
324-
return validProjects
325-
})
336+
const validProjects = await getValidSQLConversionCandidateProjects()
326337
return validProjects
327338
} catch (e: any) {
328339
if (e instanceof NoJavaProjectsFoundError) {

packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ export class Messenger {
422422
message = CodeWhispererConstants.noJavaProjectsFoundChatMessage
423423
break
424424
case 'no-maven-java-project-found':
425+
// shown when user has no pom.xml, but at this point also means they have no eligible SQL conversion projects
425426
message = CodeWhispererConstants.noPomXmlFoundChatMessage
426427
break
427428
case 'could-not-compile-project':
@@ -706,6 +707,13 @@ ${codeSnippet}
706707
}
707708

708709
public async sendSelectSQLMetadataFileMessage(tabID: string) {
710+
this.dispatcher.sendAsyncEventProgress(
711+
new AsyncEventProgressMessage(tabID, {
712+
inProgress: true,
713+
message: 'I can convert the embedded Oracle SQL in your project to PostgreSQL.',
714+
})
715+
)
716+
709717
const message = CodeWhispererConstants.selectSQLMetadataFileHelpMessage
710718
const buttons: ChatItemButton[] = []
711719

packages/core/src/codewhisperer/commands/startTransformByQ.ts

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -730,37 +730,59 @@ export async function finalizeTransformationJob(status: string) {
730730
export async function getValidLanguageUpgradeCandidateProjects() {
731731
const openProjects = await getOpenProjects()
732732
const javaMavenProjects = await validateOpenProjects(openProjects)
733+
getLogger().info(`CodeTransformation: found ${javaMavenProjects.length} projects eligible for language upgrade`)
733734
return javaMavenProjects
734735
}
735736

736737
export async function getValidSQLConversionCandidateProjects() {
737-
const openProjects = await getOpenProjects()
738-
const javaProjects = await getJavaProjects(openProjects)
739738
const embeddedSQLProjects: TransformationCandidateProject[] = []
740-
for (const project of javaProjects) {
741-
// as long as at least one of these strings is found, project contains embedded SQL statements
742-
const searchStrings = ['oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@//', 'jdbc:oracle:oci:@//']
743-
for (const str of searchStrings) {
744-
const command = process.platform === 'win32' ? 'findstr' : 'grep'
745-
// case-insensitive, recursive search
746-
const args = command === 'findstr' ? ['/i', '/s', str] : ['-i', '-r', str]
747-
const spawnResult = spawnSync(command, args, {
748-
cwd: project.path,
749-
shell: false,
750-
encoding: 'utf-8',
751-
})
752-
/*
753-
in case the search unexpectedly fails, still allow user to transform that project.
754-
error is set when command fails to spawn; stderr is set when command itself fails.
755-
status of 0 plus anything in stdout means search string was detected.
756-
status will be non-zero and stdout / stderr / error will be empty when search string is not detected.
757-
*/
758-
if (spawnResult.error || spawnResult.stderr || (spawnResult.status === 0 && spawnResult.stdout.trim())) {
759-
embeddedSQLProjects.push(project)
760-
break
739+
await telemetry.codeTransform_validateProject.run(async () => {
740+
telemetry.record({
741+
codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(),
742+
})
743+
const openProjects = await getOpenProjects()
744+
const javaProjects = await getJavaProjects(openProjects)
745+
let errorLog = ''
746+
for (const project of javaProjects) {
747+
// as long as at least one of these strings is found, project contains embedded SQL statements
748+
const searchStrings = ['oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@//', 'jdbc:oracle:oci:@//']
749+
for (const str of searchStrings) {
750+
const command = process.platform === 'win32' ? 'findstr' : 'grep'
751+
// case-insensitive, recursive search
752+
const args = command === 'findstr' ? ['/i', '/s', str] : ['-i', '-r', str]
753+
const spawnResult = spawnSync(command, args, {
754+
cwd: project.path,
755+
shell: false,
756+
encoding: 'utf-8',
757+
})
758+
// just for telemetry purposes
759+
if (spawnResult.error || spawnResult.stderr) {
760+
errorLog += `${JSON.stringify(spawnResult)}---`
761+
} else {
762+
errorLog += `${command} succeeded: ${spawnResult.status}`
763+
}
764+
/*
765+
note:
766+
error is set when command fails to spawn; stderr is set when command itself fails.
767+
status of 0 means search string was detected (will be printed to stdout).
768+
status will be non-zero and stdout / stderr / error will be empty when search string is not detected.
769+
*/
770+
getLogger().info(
771+
`CodeTransformation: searching for ${str} in ${project.path}, result = ${JSON.stringify(spawnResult)}`
772+
)
773+
if (spawnResult.status === 0) {
774+
embeddedSQLProjects.push(project)
775+
break
776+
}
761777
}
762778
}
763-
}
779+
getLogger().info(
780+
`CodeTransformation: found ${embeddedSQLProjects.length} projects with embedded SQL statements`
781+
)
782+
telemetry.record({
783+
codeTransformMetadata: errorLog,
784+
})
785+
})
764786
return embeddedSQLProjects
765787
}
766788

packages/core/src/codewhisperer/models/constants.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,9 @@ export const codeTransformLocThreshold = 100000
452452
export const jobStartedChatMessage =
453453
'I am starting to transform your code. It can take 10 to 30 minutes to upgrade your code, depending on the size of your project. To monitor progress, go to the Transformation Hub. If I run into any issues, I might pause the transformation to get input from you on how to proceed.'
454454

455-
export const chooseTransformationObjective = 'Enter "language upgrade" or "sql conversion"'
455+
export const chooseTransformationObjective = `I can help you with the following tasks:\n- Upgrade your Java 8 and Java 11 codebases to Java 17, or upgrade Java 17 code with up to date libraries and other dependencies.\n- Convert embedded SQL code for Oracle to PostgreSQL database migrations in AWS DMS.\n\nWhat would you like to do? You can enter "language upgrade" or "sql conversion".`
456+
457+
export const chooseTransformationObjectivePlaceholder = 'Enter "language upgrade" or "sql conversion"'
456458

457459
export const uploadingCodeStepMessage = 'Upload your code'
458460

@@ -591,7 +593,7 @@ export const jobPartiallyCompletedChatMessage = `I ${getTransformationActionStri
591593

592594
export const jobPartiallyCompletedNotification = `Amazon Q ${getTransformationActionString()} part of your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.`
593595

594-
export const noPomXmlFoundChatMessage = `Sorry, I couldn\'t find a project that I can upgrade. I couldn\'t find a pom.xml file in any of your open projects. Currently, I can only upgrade Java 8 or Java 11 projects built on Maven. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).`
596+
export const noPomXmlFoundChatMessage = `Sorry, I couldn\'t find a project that I can upgrade. I couldn\'t find a pom.xml file in any of your open projects, nor could I find any embedded SQL statements. Currently, I can only upgrade Java 8 or Java 11 projects built on Maven, or Oracle SQL to PostgreSQL in Java projects. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).`
595597

596598
export const noJavaHomeFoundChatMessage = `Sorry, I couldn\'t locate your Java installation. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).`
597599

0 commit comments

Comments
 (0)