package Ġorg . jetbrains . sk iko Ċ Ċ import Ġorg . jetbrains . sk ia . Bitmap Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ object ĠLibrary Ġ{ ĊĠĠĠ Ġinternal Ġconst Ġval ĠSK IK O _ LIBRARY _ PATH _ PROPERTY Ġ= Ġ" sk iko . library . path " ĊĠĠĠ Ġinternal Ġval Ġcache Root Ġ= Ġ"${ System . getProperty (" user . home ") }/. sk iko /" ĊĠĠĠ Ġprivate Ġval Ġsk iko Library Path Ġ= ĠSystem . getProperty ( SK IK O _ LIBRARY _ PATH _ PROPERTY ) ĊĠĠĠ Ġprivate Ġvar Ġcopy Dir : ĠFile ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠSame Ġnative Ġlibrary Ġcannot Ġbe Ġloaded Ġin Ġseveral Ġclass loaders , Ġso Ġwe Ġhave Ġto Ġclone ĊĠĠĠ Ġ// Ġnative Ġlibrary Ġto Ġallow ĠSk iko Ġloading Ġto Ġwork Ġproperly Ġin Ġcomplex Ġcases , Ġi . e . ĊĠĠĠ Ġ// Ġseveral ĠIDEA Ġplugins . ĊĠĠĠ Ġprivate Ġfun Ġload Library Or Copy ( library : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load ( library . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn satisfied Link Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" already Ġloaded Ġin Ġanother Ġclass loader ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Dir Ġ= ĠFiles . create Temp Directory (" sk iko "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġcopy Dir !!. resolve ( library . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( library . to Path (), Ġtemp File . to Path (), ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File . delete On Exit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load ( temp File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunpack IfNeeded ( dest : ĠFile , Ġresource Name : ĠString , Ġdelete On Exit : ĠBoolean ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( dest , Ġresource Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile . create TempFile (" sk iko ", Ġ"", Ġdest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete On Exit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete On Exit () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLibrary :: class . java . getResource AsStream ("/ $ resourceName "). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( input , Ġtemp File . to Path (), ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . move ( temp File . to Path (), Ġfile . to Path (), ĠStandard Copy Option . ATOMIC _ MOVE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġloaded Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġ// ĠThis Ġfunction Ġdoes Ġthe Ġfollowing : Ġon Ġrequest Ġto Ġload Ġgiven Ġresource , ĊĠĠĠ Ġ// Ġit Ġchecks Ġif Ġresource Ġwith Ġgiven Ġname Ġis Ġfound Ġin Ġcontent - derived Ġdirectory ĊĠĠĠ Ġ// Ġin ĠSk iko 's Ġhome , Ġand Ġif Ġnot Ġ- Ġunpack s Ġit . ĠAlso , Ġit Ġcould Ġload Ġadditional ĊĠĠĠ Ġ// Ġlocalization Ġresource Ġon Ġplatforms Ġwhere Ġit Ġis Ġneeded . ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġload () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loaded . compare And Exchange ( false , Ġtrue )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind / unpack Ġa Ġusable Ġcopy Ġof Ġthe Ġnative Ġlibrary . ĊĠĠĠĠĠĠĠ Ġfind And Load () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġmove Ġproperties Ġto ĠSk iko Properties ĊĠĠĠĠĠĠĠ ĠSetup . init () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit Ġcode Ġexecuted Ġafter Ġlibrary Ġwas Ġloaded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . jetbrains . sk ia . impl . Library ._ n After Load () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind And Load () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" sk iko -$ host Id " ĊĠĠĠĠĠĠĠ Ġval Ġplatform Name Ġ= ĠSystem . map Library Name ( name ) ĊĠĠĠĠĠĠĠ Ġval Ġic u Ġ= Ġif Ġ( host Os . is Windows ) Ġ" ic ud tl . dat " Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġtry : Ġsystem Ġproperty Ġis Ġset . ĊĠĠĠĠĠĠĠ Ġif Ġ( sk iko Library Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Ġ= ĠFile ( File ( sk iko Library Path ), Ġplatform Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Library Or Copy ( library ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icu Ġ!= Ġnull Ġ&& Ġcopy Dir Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunpack IfNeeded ( copy Dir !! , Ġic u , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSecond Ġtry : Ġload Ġit Ġfrom Ġthe Ġbin / Ġor Ġlib / Ġdirectory Ġrelative Ġto Ġthe ĠJVM Ġhome . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġmight Ġhave Ġplaced Ġthe Ġnative Ġfiles Ġalong side Ġthe Ġother ĠJVM Ġlibraries ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġsigning Ġpurposes , Ġso Ġwe 'll Ġfind Ġit Ġhere Ġif Ġso . ĊĠĠĠĠĠĠĠ Ġval Ġj vm Files Ġ= ĠFile ( System . getProperty (" java . home "), Ġif Ġ( host Os . is Windows ) Ġ" bin " Ġelse Ġ" lib ") ĊĠĠĠĠĠĠĠ Ġval Ġpath In Jvm Ġ= Ġj vm Files . resolve ( platform Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( path In Jvm . exists () Ġ&& Ġic u ?. let Ġ{ Ġ( jvm Files . resolve ( it )). exists () Ġ} Ġ!= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Library Or Copy ( path In Jvm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThird Ġtry : Ġlook Ġup Ġin Ġor Ġextract Ġto Ġa Ġlocal Ġcache Ġdirectory . ĊĠĠĠĠĠĠĠ Ġ// ĠKey Ġthe Ġcache Ġby Ġthe Ġhash Ġof Ġthe Ġlibrary . ĊĠĠĠĠĠĠĠ Ġval Ġhash Resource Stream Ġ= ĠLibrary :: class . java . getResource AsStream ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ platform Name . sha 2 5 6 " ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠLibrary Load Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġfind Ġ$ platform Name . sha 2 5 6 , Ġproper Ġnative Ġdependency Ġmissing ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġhash Resource Stream . use Ġ{ Ġit . buffered Reader (). readLine () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Dir Ġ= ĠFile ( File ( cache Root ), Ġhash ) ĊĠĠĠĠĠĠĠ Ġcache Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġval Ġlibrary Ġ= Ġunpack IfNeeded ( cacheDir , Ġplatform Name , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġload Library Or Copy ( library ) ĊĠĠĠĠĠĠĠ Ġif Ġ( icu Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copy Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġmade Ġa Ġduplicate Ġto Ġresolve Ġclass loader Ġconflicts . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunpack IfNeeded ( copy Dir !! , Ġic u , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormal Ġpath Ġwhere ĠSk iko Ġis Ġloaded Ġonly Ġonce . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunpack IfNeeded ( cacheDir , Ġic u , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠWe Ġhave Ġto Ġkeep Ġthis Ġtiny Ġclass Ġin ĠSk iko Ġfor Ġtesting Ġpurposes . Ċ internal Ġclass ĠLibrary Test Impl () Ġ{ ĊĠĠĠ Ġfun Ġrun (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap () ĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ._ ptr ĊĠĠĠ Ġ} Ċ } Ċ