// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . kotlin . idea . artifacts Ċ Ċ import Ġcom . intellij . jar Repository . Jar Repository Manager Ċ import Ġcom . intellij . openapi . application . Path Manager Ċ import Ġorg . eclipse . ae ther . repository . Remote Repository Ċ import Ġorg . j dom . input . SAX Builder Ċ import Ġorg . jetbrains . idea . maven . ae ther . Artifact Kind Ċ import Ġorg . jetbrains . idea . maven . ae ther . Artifact Repository Manager Ċ import Ġorg . jetbrains . idea . maven . ae ther . Progress Consumer Ċ import Ġjava . io . File Ċ Ċ internal Ġfun Ġfind Library ( ĊĠĠĠĠĠĠĠ Ġrepo Location : ĠRepo Location , ĊĠĠĠĠĠĠĠ Ġlibrary : ĠString , ĊĠĠĠĠĠĠĠ ĠgroupId : ĠString , ĊĠĠĠĠĠĠĠ Ġartifact Id : ĠString , ĊĠĠĠĠĠĠĠ Ġkind : ĠLibrary File Kind Ġ= ĠLibrary File Kind . CLASSES Ċ ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġlibraries Dir Ġ= ĠFile ( Path Manager . get Home Path (), Ġ". idea / libraries ") ĊĠĠĠ Ġif Ġ(! libraries Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġfind Ġ$ libraries Dir ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlibrary File Ġ= ĠFile ( libraries Dir , Ġlibrary ) ĊĠĠĠ Ġif Ġ(! library File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġfind Ġlibrary Ġ$ library ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdocument Ġ= Ġlibrary File . inputStream (). use Ġ{ Ġstream Ġ-> ĠSAX Builder (). build ( stream ) Ġ} ĊĠĠĠ Ġval Ġurl Scheme Ġ= Ġ" jar ://" ĊĠĠĠ Ġval Ġpath In Repository Ġ= ĠgroupId . replace ('.', Ġ'/') Ġ+ Ġ'/' Ġ+ Ġartifact Id ĊĠĠĠ Ġval Ġpath Prefix Ġ= Ġ"$ url Scheme $ repo Location /$ path In Repository /" ĊĊĠĠĠ Ġval Ġroot Ġ= Ġdocument . root Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild (" library ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getChild ( kind . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getChildren (" root ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . single OrNull Ġ{ Ġ( it . getAttribute Value (" url ") Ġ?: Ġ""). startsWith ( path Prefix ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Root Ġ'$ path In Repository ' Ġnot Ġfound Ġin Ġlibrary Ġ$ library ") ĊĊĠĠĠ Ġval Ġurl Ġ= Ġroot . getAttribute Value (" url ") Ġ?: Ġ"" ĊĠĠĠ Ġval Ġpath Ġ= Ġurl . drop ( url Scheme . length ). drop Last ( 2 ) Ġ// Ġlast Ġ'! /' ĊĊĠĠĠ Ġval Ġresult Ġ= ĠFile ( substitute Path Variables ( path )) ĊĠĠĠ Ġif Ġ(! result . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( kind Ġ== ĠLibrary File Kind . SOURCES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġresult . name Without Extension . drop ( artifactId . length Ġ+ Ġ 1 ). drop Last ( kind . classifier Suffix . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolve Artifact ( groupId , Ġartifact Id , Ġversion , Ġkind ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" File Ġ$ result Ġdoesn 't Ġexist ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ internal Ġenum Ġclass ĠRepo Location Ġ{ ĊĠĠĠ ĠPROJECT _ DIR Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"\ $ PROJECT _ DIR \ $" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĠĠĠ ĠM AV EN _ REPOSITORY Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"\ $ MA VEN _ REPOSITORY \ $" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġenum Ġclass ĠLibrary File Kind ( val Ġclassifier Suffix : ĠString , Ġval Ġartifact Kind : ĠArtifact Kind ) Ġ{ ĊĠĠĠ ĠCL AS SES ("", ĠArtifact Kind . AR TI FACT ), ĠSO URCES ("- sources ", ĠArtifact Kind . SOURCES ); Ċ } Ċ Ċ private Ġval Ġremote Maven Repositories : ĠList < Remote Repository > Ġby Ġlazy Ġ{ ĊĠĠĠ Ġval Ġjar Repositories File Ġ= ĠFile ( Path Manager . get Home Path (), Ġ". idea / jar Repositories . xml ") ĊĠĠĠ Ġval Ġdocument Ġ= Ġjar Repositories File . inputStream (). use Ġ{ Ġstream Ġ-> ĠSAX Builder (). build ( stream ) Ġ} ĊĊĠĠĠ Ġval Ġrepositories Ġ= Ġmutable ListOf < Remote Repository >() ĊĊĠĠĠ Ġfor Ġ( remote Repo Ġin Ġdocument . root Element . getChild (" component ") ?. getChildren (" remote - repository "). or Empty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġremote Repo . getChildren (" option ") Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Option Value ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= Ġoptions . find Ġ{ Ġit . getAttribute Value (" name ") Ġ== Ġkey Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoption . getAttribute Value (" value ") ?. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġget Option Value (" id ") Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġget Option Value (" url ") Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġrepositories Ġ+= ĠArtifact Repository Manager . create Remote Repository ( id , Ġurl ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn @ lazy Ġrepositories Ċ } Ċ Ċ private Ġfun Ġsubstitute Path Variables ( path : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( path . startsWith ("${ Repo Location . PROJECT _ DIR }/ ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Dir Ġ= ĠFile ( Path Manager . get Home Path ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġproject Dir . resolve ( path . drop ( Repo Location . PROJECT _ DIR . toString (). length )). absolute Path ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( path . startsWith ("${ Repo Location . MA VEN _ REPOSITORY }/ ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm 2 Repo Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( File ( System . getProperty (" user . home ", Ġnull ) Ġ?: Ġerror (" Unable Ġto Ġget Ġthe Ġuser Ġhome Ġdirectory "), Ġ". m 2 ")). resolve (" repository ") ĊĠĠĠĠĠĠĠ Ġreturn Ġm 2 Repo . absolute Path Ġ+ Ġpath . drop ( Repo Location . MA VEN _ REPOSITORY . toString (). length ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġpath Ċ } Ċ Ċ private Ġfun Ġresolve Artifact ( groupId : ĠString , Ġartifact Id : ĠString , Ġversion : ĠString , Ġkind : ĠLibrary File Kind ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġrepository Manager Ġ= ĠArtifact Repository Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJar Repository Manager . getLocal Repository Path (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Maven Repositories , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Consumer . DE AF , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġartifacts Ġ= Ġrepository Manager . resolve Dependency As Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId , Ġartifact Id , Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( kind . artifact Kind ), Ġfalse , Ġempty List () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġassert ( artifacts . size Ġ== Ġ 1 ) Ġ{ Ġ" Single Ġartifact Ġexpected Ġfor Ġlibrary Ġ\"$ groupId :$ artifactId :$ version \", Ġgot Ġ$ artifacts " Ġ} ĊĠĠĠ Ġreturn Ġartifacts . single (). file Ċ } Ċ