@@ -4,6 +4,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer
4
4
5
5
import com.intellij.notification.NotificationAction
6
6
import com.intellij.openapi.Disposable
7
+ import com.intellij.openapi.actionSystem.AnAction
7
8
import com.intellij.openapi.application.ApplicationManager
8
9
import com.intellij.openapi.application.runInEdt
9
10
import com.intellij.openapi.components.PersistentStateComponent
@@ -47,6 +48,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
47
48
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_CONFIGURATION_FILE_NAME
48
49
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
49
50
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult
51
+ import software.aws.toolkits.jetbrains.services.codemodernizer.model.UploadFailureReason
50
52
import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult
51
53
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.managers.CodeModernizerBottomWindowPanelManager
52
54
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
@@ -197,6 +199,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
197
199
*/
198
200
fun addCodeModernizeUI (setSelected : Boolean = false, moduleOrProjectNameForFile : String? = null) = runInEdt {
199
201
val appModernizerBottomWindow = getBottomToolWindow()
202
+ appModernizerBottomWindow.isAvailable = true
200
203
if (! appModernizerBottomWindow.contentManager.contents.contains(codeModernizerBottomWindowPanelContent)) {
201
204
appModernizerBottomWindow.contentManager.addContent(codeModernizerBottomWindowPanelContent)
202
205
}
@@ -249,13 +252,13 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
249
252
CodeModernizerSessionState .getInstance(project).currentJobStopTime = Instant .MIN
250
253
}
251
254
252
- private fun notifyJobFailure (failureReason : String? ) {
255
+ private fun notifyJobFailure (failureReason : String? , actions : Collection < AnAction > = listOf() ) {
253
256
val reason = failureReason ? : message(" codemodernizer.notification.info.modernize_failed.unknown_failure_reason" ) // should not happen
254
257
notifyStickyInfo(
255
258
message(" codemodernizer.notification.info.modernize_failed.title" ),
256
259
reason,
257
260
project,
258
- listOf (displayFeedbackNotificationAction())
261
+ listOf (displayFeedbackNotificationAction(), * actions.toTypedArray() )
259
262
)
260
263
}
261
264
@@ -301,6 +304,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
301
304
}
302
305
303
306
fun resumeJob (session : CodeModernizerSession , lastJobId : JobId , currentJobResult : TransformationJob ) = projectCoroutineScope(project).launch {
307
+ isJobSuccessfullyResumed.set(true )
308
+ CodeTransformMessageListener .instance.onTransformResuming()
304
309
if (isModernizationJobActive()) {
305
310
runInEdt { getBottomToolWindow().show() }
306
311
return @launch
@@ -340,6 +345,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
340
345
managerState.flags[StateFlags .IS_ONGOING ] = false
341
346
}
342
347
348
+ fun isJobOngoingInState () = managerState.flags.getOrDefault(StateFlags .IS_ONGOING , false )
349
+
343
350
fun handleLocalMavenBuildResult (mavenCopyCommandsResult : MavenCopyCommandsResult ) {
344
351
codeTransformationSession?.setLastMvnBuildResult(mavenCopyCommandsResult)
345
352
// Send IDE notifications first
@@ -467,6 +474,9 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
467
474
}
468
475
}
469
476
477
+ /* *
478
+ * Silently try to resume the job, informs users only when job successfully resumed, suppresses exceptions.
479
+ */
470
480
fun tryResumeJob (onProjectFirstOpen : Boolean = false) = projectCoroutineScope(project).launch {
471
481
try {
472
482
val notYetResumed = isResumingJob.compareAndSet(false , true )
@@ -492,40 +502,16 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
492
502
val result = session.getJobDetails(lastJobId)
493
503
when (result.status()) {
494
504
TransformationStatus .COMPLETED -> {
495
- CodeTransformMessageListener .instance.onTransformResuming()
496
- notifyStickyInfo(
497
- message(" codemodernizer.manager.job_finished_title" ),
498
- message(" codemodernizer.manager.job_finished_content" ),
499
- project,
500
- listOf (
501
- displayDiffNotificationAction(lastJobId),
502
- displaySummaryNotificationAction(lastJobId),
503
- viewTransformationHubAction()
504
- )
505
- )
506
505
resumeJob(session, lastJobId, result)
507
506
setJobNotOngoing()
508
507
}
509
508
510
509
TransformationStatus .PARTIALLY_COMPLETED -> {
511
- CodeTransformMessageListener .instance.onTransformResuming()
512
- notifyStickyInfo(
513
- message(" codemodernizer.notification.info.modernize_failed.title" ),
514
- message(" codemodernizer.manager.job_failed_content" , result.reason()),
515
- project,
516
- listOf (
517
- displayDiffNotificationAction(lastJobId),
518
- displaySummaryNotificationAction(lastJobId),
519
- displayFeedbackNotificationAction(),
520
- viewTransformationHubAction()
521
- )
522
- )
523
510
resumeJob(session, lastJobId, result)
524
511
setJobNotOngoing()
525
512
}
526
513
527
514
TransformationStatus .UNKNOWN_TO_SDK_VERSION -> {
528
- CodeTransformMessageListener .instance.onTransformResuming()
529
515
notifyStickyInfo(
530
516
message(" codemodernizer.notification.warn.on_resume.unknown_status_response.title" ),
531
517
message(" codemodernizer.notification.warn.on_resume.unknown_status_response.content" ),
@@ -534,13 +520,11 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
534
520
}
535
521
536
522
TransformationStatus .STOPPED , TransformationStatus .STOPPING -> {
537
- CodeTransformMessageListener .instance.onTransformResuming()
523
+ // If user stopped the last job, there is no need for us to resume the job
538
524
setJobNotOngoing()
539
525
}
540
526
541
527
else -> {
542
- isJobSuccessfullyResumed.set(true )
543
- CodeTransformMessageListener .instance.onTransformResuming()
544
528
resumeJob(session, lastJobId, result)
545
529
notifyStickyInfo(
546
530
message(" codemodernizer.manager.job_ongoing_title" ),
@@ -561,10 +545,6 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
561
545
}
562
546
}
563
547
564
- private fun viewTransformationHubAction () = NotificationAction .createSimple(message(" codemodernizer.notification.info.modernize_complete.view_summary" )) {
565
- getBottomToolWindow().show()
566
- }
567
-
568
548
private fun resumeJobNotificationAction (session : CodeModernizerSession , lastJobId : JobId , currentJobResult : TransformationJob ) =
569
549
NotificationAction .createSimple(message(" codemodernizer.notification.info.modernize_ongoing.view_status" )) {
570
550
resumeJob(session, lastJobId, currentJobResult)
@@ -593,9 +573,24 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
593
573
result.failureReason
594
574
)
595
575
596
- is CodeModernizerJobCompletedResult .ZipUploadFailed -> notifyJobFailure(
597
- message(" codemodernizer.notification.warn.upload_failed" , result.failureReason.toString()),
598
- )
576
+ is CodeModernizerJobCompletedResult .ZipUploadFailed -> {
577
+ if (result.failureReason is UploadFailureReason .CREDENTIALS_EXPIRED ) {
578
+ setJobNotOngoing()
579
+ CodeTransformMessageListener .instance.onCheckAuth()
580
+ notifyJobFailure(
581
+ message(" codemodernizer.notification.warn.upload_failed_expired_credentials.content" ),
582
+ listOf (
583
+ NotificationAction .createSimpleExpiring(message(" codemodernizer.notification.warn.action.reauthenticate" )) {
584
+ CodeTransformMessageListener .instance.onReauthStarted()
585
+ }
586
+ )
587
+ )
588
+ } else {
589
+ notifyJobFailure(
590
+ message(" codemodernizer.notification.warn.upload_failed" , result.failureReason.toString()),
591
+ )
592
+ }
593
+ }
599
594
600
595
is CodeModernizerJobCompletedResult .RetryableFailure -> notifyJobFailure(
601
596
result.failureReason
@@ -902,4 +897,17 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
902
897
903
898
return true
904
899
}
900
+
901
+ /* *
902
+ * When customer attempts to download an artifact and it fails for some reason (credential expiry etc)
903
+ * we need to be able to resume the job in order for customers to be able to reattempt the download.
904
+ * This sets the job as ongoing in the persistent state so that when tryResumeJob is triggered the
905
+ * IDE attempts to resume the job.
906
+ */
907
+ fun handleResumableDownloadArtifactFailure (job : JobId ) {
908
+ // handle the case when user clicks long living notification but has a new job running
909
+ val session = this .codeTransformationSession ? : return
910
+ if (session.getActiveJobId() != job) return
911
+ setJobOngoing(job, session.sessionContext)
912
+ }
905
913
}
0 commit comments