/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ċ Ġ* Ġ< p /> Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ġ< p /> Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ġ< p /> Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ċ Ġ* Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ċ Ġ* Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ġ< p /> Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ċ Ġ* Ġthe ĠSoftware . Ċ Ġ* Ġ< p /> Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ* AS ĠIS *, ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO Ċ Ġ* ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , Ċ Ġ* ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġorg . jetbrains . plugins . azure . cloud shell . control channel Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . annotations . SerializedName Ċ import Ġcom . intellij . ide . actions . Re veal File Action Ċ import Ġcom . intellij . notification . Notification Ċ import Ġcom . intellij . notification . Notification Listener Ċ import Ġcom . intellij . notification . Notification Type Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . file Chooser . FileChooser Factory Ċ import Ġcom . intellij . openapi . file Chooser . File Saver Descriptor Ċ import Ġcom . intellij . openapi . progress . Perform In Background Option Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . vfs . Local FileSystem Ċ import Ġcom . intellij . util . Path Util Ċ import Ġorg . jetbrains . plugins . azure . R ider Azure Bundle Ċ import Ġorg . jetbrains . plugins . azure . Azure Notifications Ċ import Ġorg . jetbrains . plugins . azure . cloud shell . rest . Cloud Console Service Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġjavax . swing . event . Hyper link Event Ċ Ċ class ĠDownload Control MessageHandler ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgson : ĠGson , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcloud Console Service : ĠCloud Console Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcloud Console BaseUrl : ĠString ) ĊĠĠĠ Ġ: ĠControl MessageHandler Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getInstance ( Download Control MessageHandler :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontent Disposition Header Regex Ġ= Ġ"( ? <= filename =\" ). * ?( ? =\ ") ". to Regex () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle ( json Control Message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġgson . fromJson ( json Control Message , ĠDownload Control Message :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠTask . Background able ( project , ĠR ider Azure Bundle . message (" progress . cloud _ shell . download ing _ file "), Ġtrue , ĠPerform In Background Option . DE AF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdownload Result Ġ= Ġcloud Console Service . download File From Terminal ( cloud Console BaseUrl Ġ+ Ġmessage . file Uri ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! download Result . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġdownloading Ġfile Ġfrom Ġcloud Ġterminal . ĠResponse Ġreceived Ġfrom ĠAPI : Ġ${ download Result . code ()} Ġ${ download Result . message ()} Ġ- Ġ${ download Result . error Body ()?. string () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġcontent Disposition Header Regex . find ( download Result . raw (). header (" Content - Disposition ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġif Ġ( match Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Result . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('/', Ġ'-') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('\\ ', Ġ'-') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cloud shell -" Ġ+ ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠFile Chooser Factory . getInstance (). create Save FileDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Saver Descriptor ( R ider Azure Bundle . message (" context _ menu . cloud _ shell . save _ file "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĠPath Util . getFile Extension ( fileName ) Ġ?: Ġ""), Ġproject ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget File Ġ= Ġdialog . save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal FileSystem . getInstance (). find File By Path ( System . getProperty (" user . home ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġtarget File . get Virtual File ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġvirtual File !!. get OutputStream ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Result . body () !!. byte Stream (). copy To ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAzure Notifications . notify ( project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR ider Azure Bundle . message (" common . azure "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR ider Azure Bundle . message (" notification . cloud _ shell . download _ file . subtitle ", ĠfileName ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR ider Azure Bundle . message (" notification . cloud _ shell . download _ file . message ", ĠfileName ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ< a Ġhref =' show '>" Ġ+ ĠR ider Azure Bundle . message (" notification . cloud _ shell . download _ file . message . show _ file ") Ġ+ Ġ"</ a >", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . INFORMATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠNotification Listener . Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhyper link Activated ( notification : ĠNotification , Ġe : ĠHyper link Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! project . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . description ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" show " Ġ-> ĠRe veal File Action . open File ( File ( virtual File . present able Url )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. queue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠDownload Control Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ SerializedName (" audience ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ: ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ SerializedName (" file Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ: ĠString ĊĠĠĠ Ġ) Ċ } Ċ