// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . ide . plugins . marketplace Ċ Ċ import Ġcom . fasterxml . jackson . core . type . Type Reference Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . intellij . ide . Ide Bundle Ċ import Ġcom . intellij . ide . plugins . PluginManager Core Ċ import Ġcom . intellij . ide . plugins . Plugin Node Ċ import Ġcom . intellij . ide . plugins . auth . Plugin Auth Service . add Auth Headers If They Exist Ċ import Ġcom . intellij . openapi . application . Path Manager Ċ import Ġcom . intellij . openapi . application . impl . Application Info Impl Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . update Settings . impl . Plugin Downloader Ċ import Ġcom . intellij . openapi . util . Build Number Ċ import Ġcom . intellij . util . Url Ċ import Ġcom . intellij . util . Urls Ċ import Ġcom . intellij . util . io . Http Requests Ċ import Ġcom . intellij . util . io . URL Util Ċ import Ġcom . intellij . util . io . read Text Ċ import Ġcom . intellij . util . io . write Ċ import Ġorg . jetbrains . annotations . Api Status Ċ import Ġorg . jetbrains . annotations . N ls Ċ import Ġorg . xml . sax . Input Source Ċ import Ġorg . xml . sax . SAX Exception Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Reader Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URLConnection Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . NoSuch File Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjavax . xml . parsers . Parser ConfigurationException Ċ import Ġjavax . xml . parsers . SAX Parser Factory Ċ Ċ private Ġval ĠLOG Ġ= Ġlogger < Market place Requests >() Ċ private Ġconst Ġval ĠFULL _ PLUGIN S _ XML _ IDS _ FILENAME Ġ= Ġ" plugins XML Ids . json " Ċ Ċ @ Api Status . Internal Ċ open Ġclass ĠMarketplace Requests Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠINSTANCE Ġ= ĠMarketplace Requests () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetInstance (): ĠMarketplace Requests Ġ= ĠINSTANCE ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġparse Plugin List ( reader : ĠReader ): ĠList < Plugin Node > Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSAX Parser Factory . newInstance (). new SAX Parser () ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠRepository Content Handler () ĊĠĠĠĠĠĠĠ Ġparser . parse ( Input Source ( reader ), Ġhandler ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhandler . plugins List ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠParser ConfigurationException , Ġis ĠSAX Exception , Ġis ĠRuntimeException Ġ-> Ġthrow ĠIOException ( e ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠP LU GIN _ MANAGER _ URL Ġ= ĠApplication Info Impl . get Shadow Instance (). plugin Manager Url . trim End ('/') ĊĊĠ Ġprivate Ġval ĠA VA IL ABLE _ PLUGIN S _ XML _ IDS _ URL Ġ= Ġ"${ PLUGIN _ MANAGER _ URL }/ files /$ FULL _ PLUGIN S _ XML _ IDS _ FILENAME " ĊĊĠ Ġprivate Ġval ĠIDE _ BUILD _ FOR _ REQUEST Ġ= ĠURL Util . encode URIComponent ( get Build For Plugin Repository Requests ()) ĊĊĠ Ġprivate Ġval ĠMARK ET PLACE _ ORG AN IZ ATIONS _ URL Ġ= ĠUrl s . new From Encoded ( ĊĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ api / search / aggregation / organizations " ĊĠ Ġ). add Parameters ( map Of (" build " Ġto ĠIDE _ BUILD _ FOR _ REQUEST )) ĊĊĠ Ġprivate Ġval ĠMARK ET PLACE _ TAGS _ URL Ġ= ĠUrl s . new From Encoded ( ĊĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ api / search / aggregation / tags " ĊĠ Ġ). add Parameters ( map Of (" build " Ġto ĠIDE _ BUILD _ FOR _ REQUEST )) ĊĊĠ Ġprivate Ġval ĠJ ET BR AIN S _ PLUGIN S _ URL Ġ= ĠUrl s . new From Encoded ( ĊĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ api / search / plugins ? organization = Jet Brains & max = 1 0 0 0 " ĊĠ Ġ). add Parameters ( map Of (" build " Ġto ĠIDE _ BUILD _ FOR _ REQUEST )) ĊĊĠ Ġprivate Ġval ĠCOMP AT IBLE _ UPDATE _ URL : ĠString Ġ= Ġ"${ PLUGIN _ MANAGER _ URL }/ api / search / compatible Updates " ĊĊĠ Ġprivate Ġval ĠobjectMapper Ġby Ġlazy Ġ{ ĠObjectMapper () Ġ} ĊĊĠ Ġprivate Ġfun Ġget Updates Metadata Files Directory (): ĠPath Ġ= ĠPaths . get ( Path Manager . get Plugins Path (), Ġ" meta ") ĊĊĠ Ġinternal Ġfun Ġget Broken Plugins File (): ĠPath Ġ= ĠPaths . get ( Path Manager . get Plugins Path (), Ġ" broken Plugins . json ") ĊĊĠ Ġprivate Ġfun Ġget Update Metadata File ( update : ĠIde Compatible Update ): ĠPath Ġ{ ĊĠĠĠ Ġreturn Ġget Updates Metadata Files Directory (). resolve ( update . external Update Id Ġ+ Ġ". json ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Update Metadata Url ( update : ĠIde Compatible Update ) Ġ= ĊĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ files /${ update . external Plugin Id }/${ update . external Update Id }/ meta . json " ĊĊĠ Ġprivate Ġfun Ġcreate Search Url ( query : ĠString , Ġcount : ĠInt ): ĠUrl Ġ= ĠUrl s . new From Encoded ( ĊĠĠĠ Ġ"$ PLUGIN _ MANAGER _ URL / api / search / plugins ?$ query & build =$ IDE _ BUILD _ FOR _ REQUEST & max =$ count " ĊĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġcreate Feature Url ( param : ĠMap < String , ĠString >) Ġ= ĠUrl s . new From Encoded ( ĊĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ feature / get Implement ations " ĊĠ Ġ). add Parameters ( param ) ĊĊĠ Ġfun Ġget Features ( param : ĠMap < String , ĠString >): ĠList < Feature Impl > Ġ{ ĊĠĠĠ Ġif Ġ( param . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn ĠHttp Requests ĊĠĠĠĠĠĠĠ Ġ. request ( create Feature Url ( param )) ĊĠĠĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . inputStream , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < List < Feature Impl >>() Ġ{} ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġfeatures Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġget Market place Plugins ( indicator : ĠProgress Indicator ?): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġplugin Xml Ids File Ġ= ĠPaths . get ( Path Manager . get Plugins Path (), ĠFULL _ PLUGIN S _ XML _ IDS _ FILENAME ) ĊĠĠĠ Ġreturn Ġread OrUpdate File ( ĊĠĠĠĠĠ Ġplugin Xml Ids File , ĊĠĠĠĠĠ ĠA VA IL ABLE _ PLUGIN S _ XML _ IDS _ URL , ĊĠĠĠĠĠ Ġindicator , ĊĠĠĠĠĠ ĠIde Bundle . message (" progress . download ing . available . plugins "), ĊĠĠĠĠĠ Ġ:: parse Xml Ids ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġget Market place Cached Plugins (): ĠList < String >? Ġ{ ĊĠĠĠ Ġval Ġplugin Xml Ids File Ġ= ĠPaths . get ( Path Manager . get Plugins Path (), ĠFULL _ PLUGIN S _ XML _ IDS _ FILENAME ) ĊĠĠĠ Ġif Ġ( Files . size ( plugin Xml Ids File ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠFiles . new BufferedReader ( plugin Xml Ids File ). use (:: parse Xml Ids ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Build For Plugin Repository Requests (): ĠString Ġ{ ĊĠĠĠ Ġval Ġapp Info Ġ= ĠApplication Info Impl . get Shadow Instance () ĊĠĠĠ Ġval Ġcompatible Build Ġ= ĠPlugin Manager Core . get Plugins Compatible Build () Ġ?: Ġapp Info . apiVersion ĊĠĠĠ Ġreturn ĠBuild Number . fromString With Product Code ( compatible Build , Ġapp Info . build . product Code ) !!. asString () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġsearch Plugins ( query : ĠString , Ġcount : ĠInt ): ĠList < Plugin Node > Ġ{ ĊĠĠĠ Ġval Ġmarket place Search Plugin Data Ġ= ĠHttp Requests . request ( create Search Url ( query , Ġcount )) ĊĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( ĊĠĠĠĠĠĠĠĠĠ Ġit . inputStream , ĊĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < List < Market place Search Plugin Data >>() Ġ{} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠMarketplace ĠSearch ĠService Ġcan Ġproduce Ġobjects Ġwithout Ġ" external Update Id ". ĠIt Ġmeans Ġthat Ġan Ġupdate Ġis Ġnot Ġin Ġthe Ġsearch Ġindex Ġyet . ĊĠĠĠ Ġreturn Ġmarket place Search Plugin Data . filter Ġ{ Ġit . external Update Id Ġ!= Ġnull Ġ}. map Ġ{ Ġit . to Plugin Node () Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetAll Plugins V endors (): ĠList < String > Ġ= Ġtry Ġ{ ĊĠĠĠ ĠHttp Requests ĊĠĠĠĠĠ Ġ. request ( MARK ET PLACE _ ORG AN IZ ATIONS _ URL ) ĊĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( it . inputStream , ĠAg gregation Search Response :: class . java ). aggreg ations . keys . toList () ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġorganizations Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠ Ġempty List () ĊĠ Ġ} ĊĊĠ Ġfun Ġget Broken Plugins (): ĠList < Market place Broken Plugin > Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġread OrUpdate File ( ĊĠĠĠĠĠĠĠ Ġget Broken Plugins File (), ĊĠĠĠĠĠĠĠ Ġ"${ PLUGIN _ MANAGER _ URL }/ files / broken Plugins . json ", ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠ Ġ) Ġ{ ĠobjectMapper . readValue ( it , Ġobject Ġ: ĠType Reference < List < Market place Broken Plugin >>() Ġ{}) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġbroken Ġplugins Ġfile Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĊĠ Ġfun ĠgetAll Plugins Tags (): ĠList < String > Ġ= Ġtry Ġ{ ĊĠĠĠ ĠHttp Requests ĊĠĠĠĠĠ Ġ. request ( MARK ET PLACE _ TAGS _ URL ) ĊĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( it . inputStream , ĠAg gregation Search Response :: class . java ). aggreg ations . keys . toList () ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġtags Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠ Ġempty List () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġload Plugin Descriptor ( xml Id : ĠString , Ġide Compatible Update : ĠIde Compatible Update , Ġindicator : ĠProgress Indicator ? Ġ= Ġnull ): ĠPlugin Node Ġ{ ĊĠĠĠ Ġreturn Ġread OrUpdate File ( ĊĠĠĠĠĠ Ġget Update Metadata File ( ide Compatible Update ), ĊĠĠĠĠĠ Ġget Update Metadata Url ( ide Compatible Update ), ĊĠĠĠĠĠ Ġindicator , ĊĠĠĠĠĠ ĠIde Bundle . message (" progress . download ing . plugins . meta ", Ġxml Id ), ĊĠĠĠĠĠ Ġ:: parse Json Plugin Meta ĊĠĠĠ Ġ). to Plugin Node () ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġload Last Compatible Plugin Descriptors ( ids : ĠList < String >, Ġbuild Number : ĠBuild Number ? Ġ= Ġnull ): ĠList < Plugin Node > Ġ{ ĊĠĠĠ Ġif Ġ( ids . isEmpty ()) Ġreturn Ġempty List () ĊĠĠĠ Ġval Ġdata : ĠList < Ide Compatible Update > Ġ= ĠgetLast Compatible Plugin Update ( ids , Ġbuild Number ) ĊĠĠĠ Ġreturn Ġdata . map Ġ{ Ġload Plugin Descriptor ( it . plugin Id , Ġit , Ġnull ) Ġ} ĊĠ Ġ} ĊĊĊĠ Ġfun Ġload Plugin Details ( plugin Node : ĠPlugin Node ): ĠPlugin Node Ġ{ ĊĠĠĠ Ġval Ġexternal Plugin Id Ġ= Ġplugin Node . external Plugin Id ĊĠĠĠ Ġval Ġexternal Update Id Ġ= Ġplugin Node . external Update Id ĊĠĠĠ Ġif Ġ( external Plugin Id Ġ== Ġnull Ġ|| Ġexternal Update Id Ġ== Ġnull ) Ġreturn Ġplugin Node ĊĠĠĠ Ġval Ġide Compatible Update Ġ= ĠIde Compatible Update ( external Update Id Ġ= Ġexternal Update Id , Ġexternal Plugin Id Ġ= Ġexternal Plugin Id ) ĊĠĠĠ Ġreturn Ġload Plugin Descriptor ( plugin Node . plugin Id . id String , Ġide Compatible Update ). apply Ġ{ ĊĠĠĠĠĠ Ġ// ĠThese Ġthree Ġfields Ġare Ġnot Ġpresent Ġin Ġ` Int ellij Update Metadata `, Ġbut Ġpresent Ġin Ġ` Market place Search Plugin Data ` ĊĠĠĠĠĠ Ġrating Ġ= Ġplugin Node . rating ĊĠĠĠĠĠ Ġdownloads Ġ= Ġplugin Node . downloads ĊĠĠĠĠĠ Ġdate Ġ= Ġplugin Node . date ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġ< T > Ġread OrUpdate File ( file : ĠPath ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator : ĠProgress Indicator ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ N ls Ġindicator Message : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser : Ġ( Reader ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġe Tag Ġ= Ġif Ġ( file Ġ== Ġnull ) Ġnull Ġelse Ġload E tag For File ( file ) ĊĠĠĠ Ġreturn ĠHttp Requests ĊĠĠĠĠĠ Ġ. request ( url ) ĊĠĠĠĠĠ Ġ. tun er Ġ{ Ġconnection Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( e Tag Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconnection . setRequest Property (" If - None - Match ", Ġe Tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. tun er Ġ{ Ġconnection Ġ-> Ġ Ġadd Auth Headers If They Exist ( connection , Ġurl ) Ġ} ĊĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠ Ġ. connect Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġindicator ?. check Canceled () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġrequest . connection ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġis Not Modified ( connection , Ġfile )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ connect ĠFiles . new BufferedReader ( file ). use ( parser ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( indicator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . text 2 Ġ= Ġindicator Message ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ connect Ġrequest . reader . use ( parser ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġsynchronized ( INSTANCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . save ToFile ( file , Ġindicator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . getHeader Field (" ET ag ") ?. let Ġ{ Ġsave ET ag For File ( file , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn @ connect ĠFiles . new BufferedReader ( file ). use ( parser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfile Text Ġ= Ġfile ?. read Text () ĊĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Error Ġreading ĠMarketplace Ġfile : Ġurl =$ url Ġfile =${ file ?. fileName }. ĠFile Ġcontent :\ n $ file Text ") ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠgetLast Compatible Plugin Update ( ids : ĠList < String >, Ġbuild Number : ĠBuild Number ? Ġ= Ġnull ): ĠList < Ide Compatible Update > Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġif Ġ( ids . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġdata Ġ= ĠobjectMapper . writeValue AsString ( Compatible Update Request ( Plugin Downloader . get Build Number For Download ( build Number ), Ġids )) ĊĠĠĠĠĠ Ġreturn ĠHttp Requests ĊĠĠĠĠĠĠĠ Ġ. post ( Urls . new From Encoded ( COMPAT IBLE _ UPDATE _ URL ). to External Form (), ĠHttp Requests . JSON _ CONTENT _ TYPE ) ĊĠĠĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . write ( data ) ĊĠĠĠĠĠĠĠĠĠ ĠobjectMapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. readValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . inputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < List < Ide Compatible Update >>() Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġcompatible Ġupdates Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun ĠgetLast Compatible Plugin Update ( id : ĠString , Ġbuild Number : ĠBuild Number ? Ġ= Ġnull , Ġindicator : ĠProgress Indicator ? Ġ= Ġnull ): ĠPlugin Node ? Ġ{ ĊĠĠĠ Ġval Ġdata Ġ= ĠgetLast Compatible Plugin Update ( listOf ( id ), Ġbuild Number ). first OrNull () ĊĠĠĠ Ġreturn Ġdata ?. let Ġ{ Ġload Plugin Descriptor ( id , Ġit , Ġindicator ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġget Compatible Updates By Module ( module : ĠString , Ġbuild Number : ĠBuild Number ? Ġ= Ġnull ): ĠList < Ide Compatible Update > Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġdata Ġ= ĠobjectMapper . writeValue AsString ( ĊĠĠĠĠĠĠĠ ĠCompat ible Update For Module Request ( Plugin Downloader . get Build Number For Download ( build Number ), Ġmodule )) ĊĠĠĠĠĠ Ġval Ġurl Ġ= ĠUrl s . new From Encoded ( COMPAT IBLE _ UPDATE _ URL ). to External Form () ĊĠĠĠĠĠ Ġreturn ĠHttp Requests ĊĠĠĠĠĠĠĠ Ġ. post ( url , ĠHttp Requests . JSON _ CONTENT _ TYPE ) ĊĠĠĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . write ( data ) ĊĠĠĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( it . inputStream , Ġobject Ġ: ĠType Reference < List < Ide Compatible Update >>() Ġ{}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget Ġcompatible Ġupdate Ġby Ġmodule Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġjet Brains Plugins Ids : ĠSet < String >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġfun Ġload Jet Brains Plugins Ids () Ġ{ ĊĠĠĠ Ġif Ġ( jet Brains Plugins Ids Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġjet Brains Plugins Ids Ġ= Ġtry Ġ{ ĊĠĠĠĠĠ ĠHttp Requests ĊĠĠĠĠĠĠĠ Ġ. request ( J ET BR AIN S _ PLUGIN S _ URL ) ĊĠĠĠĠĠĠĠ Ġ. product Name As UserAgent () ĊĠĠĠĠĠĠĠ Ġ. throw StatusCode Exception ( false ) ĊĠĠĠĠĠĠĠ Ġ. connect Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( it . inputStream , Ġobject Ġ: ĠType Reference < List < Market place Search Plugin Data >>() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Market place Search Plugin Data :: id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlog Warn Or Print If Debug (" Can Ġnot Ġget ĠJetBrains Ġplugins ' ĠIDs Ġfrom ĠMarketplace ", Ġe ) ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Xml Ids ( reader : ĠReader ) Ġ= ĠobjectMapper . readValue ( reader , Ġobject Ġ: ĠType Reference < List < String >>() Ġ{}) ĊĊĠ Ġprivate Ġfun Ġparse Json Plugin Meta ( reader : ĠReader ) Ġ= ĠobjectMapper . readValue ( reader , ĠInt ellij Update Metadata :: class . java ) ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġopen Ġfun Ġdownload Plugin ( plugin Url : ĠString , Ġindicator : ĠProgress Indicator ): ĠFile Ġ{ ĊĠĠĠ Ġreturn ĠMarketplace Plugin Download Service . download Plugin ( plugin Url , Ġindicator ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġopen Ġfun Ġdownload Plugin Via Block Map ( plugin Url : ĠString , Ġprev Plugin : ĠPath , Ġindicator : ĠProgress Indicator ): ĠFile Ġ{ ĊĠĠĠ Ġreturn ĠMarketplace Plugin Download Service . download Plugin Via Block Map ( plugin Url , Ġprev Plugin , Ġindicator ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġload E tag For File ( file : ĠPath ): ĠString Ġ{ ĊĠ Ġval Ġe Tag File Ġ= Ġget ET ag File ( file ) ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġval Ġlines Ġ= ĠFiles . read All Lines ( e Tag File ) ĊĠĠĠ Ġif Ġ( lines . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġlines [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLOG . warn (" Can 't Ġload ĠE Tag Ġfrom Ġ'" Ġ+ Ġe Tag File Ġ+ Ġ" '. ĠUnexpected Ġnumber Ġof Ġlines : Ġ" Ġ+ Ġlines . size ) ĊĠĠĠ ĠFiles . delete IfExists ( e Tag File ) ĊĠ Ġ} ĊĠ Ġcatch Ġ( ignore : ĠNoSuch File Exception ) Ġ{ ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠ ĠLOG . warn (" Can 't Ġload ĠE Tag Ġfrom Ġ'$ e Tag File '", Ġe ) ĊĠ Ġ} ĊĠ Ġreturn Ġ"" Ċ } Ċ Ċ private Ġfun Ġget ET ag File ( file : ĠPath ): ĠPath Ġ= Ġfile . parent . resolve ("${ file . fileName }. etag ") Ċ Ċ private Ġfun Ġsave ET ag For File ( file : ĠPath , Ġe Tag : ĠString ) Ġ{ ĊĠ Ġval Ġe Tag File Ġ= Ġget ET ag File ( file ) ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġe Tag File . write ( e Tag ) ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠ ĠLOG . warn (" Can 't Ġsave ĠE Tag Ġto Ġ'$ e Tag File '", Ġe ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġis Not Modified ( url Connection : ĠURL Connection , Ġfile : ĠPath ?): ĠBoolean Ġ{ ĊĠ Ġreturn Ġfile Ġ!= Ġnull Ġ&& ĠFiles . size ( file ) Ġ> Ġ 0 Ġ&& Ġurl Connection Ġis ĠHttp URLConnection Ġ&& Ġurl Connection . response Code Ġ== ĠHttp URLConnection . HTTP _ NOT _ MODI FIED Ċ } Ċ Ċ private Ġdata Ġclass ĠCompat ible Update Request ( val Ġbuild : ĠString , Ġval Ġplugin XML Ids : ĠList < String >) Ċ private Ġdata Ġclass ĠCompat ible Update For Module Request ( val Ġbuild : ĠString , Ġval Ġmodule : ĠString ) Ċ Ċ private Ġfun Ġlog Warn Or Print If Debug ( message : ĠString , Ġthrowable : ĠThrowable ) Ġ{ ĊĠ Ġif Ġ( LOG . isDebugEnabled ) Ġ{ ĊĠĠĠ ĠLOG . debug ( message , Ġthrowable ) ĊĠ Ġ} ĊĠ Ġelse Ġ{ ĊĠĠĠ ĠLOG . warn ("$ message :${ throwable . message }") ĊĠ Ġ} Ċ }