Skip to content

Commit 2bb2623

Browse files
dhasani23David Hasani
andauthored
fix(CodeTransform): prompt user for JAVA_HOME (#4433)
Co-authored-by: David Hasani <[email protected]>
1 parent dd82987 commit 2bb2623

File tree

8 files changed

+149
-118
lines changed

8 files changed

+149
-118
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/toolkit/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4269,7 +4269,7 @@
42694269
},
42704270
"devDependencies": {
42714271
"@aws-sdk/types": "^3.13.1",
4272-
"@aws-toolkits/telemetry": "^1.0.184",
4272+
"@aws-toolkits/telemetry": "^1.0.186",
42734273
"@aws/fully-qualified-names": "^2.1.1",
42744274
"@cspotcode/source-map-support": "^0.8.1",
42754275
"@sinonjs/fake-timers": "^10.0.2",

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

Lines changed: 73 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,25 @@ async function collectInput(validProjects: Map<vscode.QuickPickItem, JDKVersion
8181
const validSourceVersions: vscode.QuickPickItem[] = versionsArray.map(version => ({
8282
label: version,
8383
}))
84+
validSourceVersions.push({ label: 'Other' }) // if user selects 'Other', terminate execution
8485
await MultiStepInputFlowController.run(input => pickSourceVersion(input, state, validSourceVersions))
8586
if (!state.sourceJavaVersion) {
8687
throw new ToolkitError('No version selected', { code: 'NoVersionSelected' })
88+
} else if (state.sourceJavaVersion.label === 'Other') {
89+
telemetry.codeTransform_jobStartedCompleteFromPopupDialog.emit({
90+
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
91+
codeTransformJavaSourceVersionsAllowed: JDKToTelemetryValue(
92+
transformByQState.getSourceJDKVersion()!
93+
) as CodeTransformJavaSourceVersionsAllowed, // will be 'undefined'
94+
codeTransformJavaTargetVersionsAllowed: JDKToTelemetryValue(
95+
transformByQState.getTargetJDKVersion()
96+
) as CodeTransformJavaTargetVersionsAllowed,
97+
result: MetadataResult.Fail,
98+
})
99+
await vscode.window.showErrorMessage(CodeWhispererConstants.unsupportedJavaVersionSelectedMessage, {
100+
modal: true,
101+
})
102+
throw new ToolkitError('', { code: 'OtherVersionSelected' })
87103
}
88104
return state as UserInputState
89105
}
@@ -141,6 +157,47 @@ async function pickSourceVersion(
141157
transformByQState.setSourceJDKVersion(JDKVersion.JDK8)
142158
} else if (pick === validSourceVersions[1]) {
143159
transformByQState.setSourceJDKVersion(JDKVersion.JDK11)
160+
} else if (pick === validSourceVersions[2]) {
161+
// corresponds with the 'Other' option
162+
transformByQState.setSourceJDKVersion(JDKVersion.UNSUPPORTED)
163+
}
164+
}
165+
166+
async function setMaven() {
167+
let mavenWrapperExecutableName = os.platform() === 'win32' ? 'mvnw.cmd' : 'mvnw'
168+
const mavenWrapperExecutablePath = path.join(transformByQState.getProjectPath(), mavenWrapperExecutableName)
169+
if (fs.existsSync(mavenWrapperExecutablePath)) {
170+
if (mavenWrapperExecutableName === 'mvnw') {
171+
mavenWrapperExecutableName = './mvnw' // add the './' for non-Windows
172+
}
173+
transformByQState.setMavenName(mavenWrapperExecutableName)
174+
} else {
175+
transformByQState.setMavenName('mvn')
176+
}
177+
}
178+
179+
async function validateJavaHome() {
180+
const versionData = await getVersionData()
181+
let javaVersionUsedByMaven = versionData[1]
182+
if (javaVersionUsedByMaven !== undefined) {
183+
javaVersionUsedByMaven = javaVersionUsedByMaven.slice(0, 3)
184+
if (javaVersionUsedByMaven === '1.8') {
185+
javaVersionUsedByMaven = JDKVersion.JDK8
186+
} else if (javaVersionUsedByMaven === '11.') {
187+
javaVersionUsedByMaven = JDKVersion.JDK11
188+
}
189+
}
190+
if (javaVersionUsedByMaven !== transformByQState.getSourceJDKVersion()) {
191+
// means either javaVersionUsedByMaven is undefined or it does not match the project JDK
192+
// TO-DO: give user help on how to find JAVA_HOME for corresponding project JDK
193+
const javaHome = await vscode.window.showInputBox({
194+
title: CodeWhispererConstants.transformByQWindowTitle,
195+
prompt: `${CodeWhispererConstants.enterJavaHomeMessage} ${transformByQState.getSourceJDKVersion()}`,
196+
})
197+
if (!javaHome || !javaHome.trim()) {
198+
throw new ToolkitError('No JAVA_HOME provided', { code: 'NoJavaHomePath' })
199+
}
200+
transformByQState.setJavaHome(javaHome.trim())
144201
}
145202
}
146203

@@ -150,6 +207,10 @@ export async function startTransformByQ() {
150207
// Validate inputs. If failed, Error will be thrown and execution stops
151208
const userInputState = await validateTransformationJob()
152209

210+
await setMaven()
211+
212+
await validateJavaHome()
213+
153214
// Set the default state variables for our store and the UI
154215
await setTransformationToRunningState(userInputState)
155216

@@ -192,7 +253,7 @@ export async function preTransformationUploadCode(userInputState: UserInputState
192253
let payloadFilePath = ''
193254
throwIfCancelled()
194255
try {
195-
payloadFilePath = await zipCode(userInputState.project!.description!)
256+
payloadFilePath = await zipCode()
196257
transformByQState.setPayloadFilePath(payloadFilePath)
197258
await vscode.commands.executeCommand('aws.amazonq.refresh') // so that button updates
198259
uploadId = await uploadPayload(payloadFilePath)
@@ -340,13 +401,12 @@ export async function validateTransformationJob() {
340401
result: MetadataResult.Pass,
341402
})
342403
}
343-
404+
transformByQState.setProjectPath(userInputState.project!.description!)
344405
return userInputState
345406
}
346407

347408
export async function setTransformationToRunningState(userInputState: UserInputState) {
348409
transformByQState.setToRunning()
349-
transformByQState.setProjectPath(userInputState.project!.description!)
350410
sessionPlanProgress['uploadCode'] = StepProgress.Pending
351411
sessionPlanProgress['buildCode'] = StepProgress.Pending
352412
sessionPlanProgress['transformCode'] = StepProgress.Pending
@@ -370,11 +430,8 @@ export async function setTransformationToRunningState(userInputState: UserInputS
370430
'aws.amazonq.showPlanProgressInHub',
371431
codeTransformTelemetryState.getStartTime()
372432
)
373-
await vscode.commands.executeCommand('setContext', 'gumby.isStopButtonAvailable', true)
374-
await vscode.commands.executeCommand('setContext', 'gumby.isTransformAvailable', false)
375-
await vscode.commands.executeCommand('setContext', 'gumby.isPlanAvailable', false)
376-
await vscode.commands.executeCommand('setContext', 'gumby.isSummaryAvailable', false)
377-
await resetReviewInProgress()
433+
434+
await setContextVariables()
378435

379436
await vscode.commands.executeCommand('aws.amazonq.refresh')
380437
}
@@ -384,12 +441,9 @@ export async function postTransformationJob(userInputState: UserInputState) {
384441
const durationInMs = calculateTotalLatency(codeTransformTelemetryState.getStartTime())
385442
const resultStatusMessage = codeTransformTelemetryState.getResultStatus()
386443

387-
const versionInfoWrapper = await getVersionData('mvnw', transformByQState.getProjectPath())
388-
let mavenVersionInfoMessage = versionInfoWrapper[0]
389-
let javaVersionInfoMessage = versionInfoWrapper[1]
390-
const versionInfo = await getVersionData('mvn', transformByQState.getProjectPath())
391-
mavenVersionInfoMessage += ` (mvnw) -- ${versionInfo[0]} (mvn)`
392-
javaVersionInfoMessage += ` (mvnw) -- ${versionInfo[1]} (mvn)`
444+
const versionInfo = await getVersionData()
445+
const mavenVersionInfoMessage = `${versionInfo[0]} (${transformByQState.getMavenName()})`
446+
const javaVersionInfoMessage = `${versionInfo[1]} (${transformByQState.getMavenName()})`
393447

394448
// Note: IntelliJ implementation of ResultStatusMessage includes additional metadata such as jobId.
395449
telemetry.codeTransform_totalRunTime.emit({
@@ -515,7 +569,11 @@ export async function confirmStopTransformByQ(
515569
}
516570
}
517571

518-
async function resetReviewInProgress() {
572+
async function setContextVariables() {
573+
await vscode.commands.executeCommand('setContext', 'gumby.isStopButtonAvailable', true)
574+
await vscode.commands.executeCommand('setContext', 'gumby.isTransformAvailable', false)
575+
await vscode.commands.executeCommand('setContext', 'gumby.isPlanAvailable', false)
576+
await vscode.commands.executeCommand('setContext', 'gumby.isSummaryAvailable', false)
519577
await vscode.commands.executeCommand('setContext', 'gumby.reviewState', TransformByQReviewStatus.NotStarted)
520578
await vscode.commands.executeCommand('setContext', 'gumby.transformationProposalReviewInProgress', false)
521579
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,9 @@ export const newCustomizationAvailableKey = 'CODEWHISPERER_NEW_CUSTOMIZATION_AVA
278278

279279
export const selectProjectPrompt = 'Select the project you want to transform'
280280

281+
export const unsupportedJavaVersionSelectedMessage =
282+
'Thank you for trying our product. We currently only support Java 8 and 11. We appreciate you taking the time to use the product, and hope to expand support to more Java versions in the future.'
283+
281284
export const transformByQWindowTitle = 'Amazon Q Code Transformation'
282285

283286
export const stopTransformByQMessage = 'Stop Transformation?'
@@ -331,6 +334,8 @@ export const planIntroductionMessage =
331334

332335
export const planDisclaimerMessage = '**Proposed transformation changes** \n\n\n'
333336

337+
export const enterJavaHomeMessage = 'Enter the value of JAVA_HOME for Java'
338+
334339
export const JDK8VersionNumber = '52'
335340

336341
export const JDK11VersionNumber = '55'
@@ -357,10 +362,6 @@ export const transformationJobTimeoutSeconds = 72000
357362

358363
export const progressIntervalMs = 1000
359364

360-
export const targetLanguages = ['Java']
361-
362-
export const targetVersions = new Map<string, string[]>([['Java', ['JDK17']]])
363-
364365
export const defaultLanguage = 'Java'
365366

366367
export const contentChecksumType = 'SHA_256'

packages/toolkit/src/codewhisperer/models/model.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ export enum BuildSystem {
252252
export class ZipManifest {
253253
sourcesRoot: string = 'sources/'
254254
dependenciesRoot: string | undefined = 'dependencies/'
255+
buildLogs: string = 'build-logs.txt'
255256
version: string = '1.0'
256257
}
257258

@@ -288,6 +289,10 @@ export class TransformByQState {
288289

289290
private errorLog: string = ''
290291

292+
private mavenName: string = ''
293+
294+
private javaHome: string | undefined = undefined
295+
291296
public isNotStarted() {
292297
return this.transformByQState === TransformByQStatus.NotStarted
293298
}
@@ -372,6 +377,14 @@ export class TransformByQState {
372377
return this.errorLog
373378
}
374379

380+
public getMavenName() {
381+
return this.mavenName
382+
}
383+
384+
public getJavaHome() {
385+
return this.javaHome
386+
}
387+
375388
public appendToErrorLog(message: string) {
376389
this.errorLog += `${message}\n\n`
377390
}
@@ -452,6 +465,14 @@ export class TransformByQState {
452465
this.jobFailureErrorMessage = errorMessage
453466
}
454467

468+
public setMavenName(mavenName: string) {
469+
this.mavenName = mavenName
470+
}
471+
472+
public setJavaHome(javaHome: string) {
473+
this.javaHome = javaHome
474+
}
475+
455476
public getPrefixTextForButton() {
456477
switch (this.transformByQState) {
457478
case TransformByQStatus.NotStarted:

0 commit comments

Comments
 (0)