package Ġat . y awk . jav ab rowser . generator . work Ċ Ċ import Ġat . y awk . jav ab rowser . generator . Artifact Config Ċ import Ġat . y awk . jav ab rowser . generator . Res uming Url InputStream Ċ import Ġat . y awk . jav ab rowser . generator . Source Set Config Ċ import Ġat . y awk . jav ab rowser . generator . source . get Required Modules Ċ import Ġat . y awk . jav ab rowser . generator . source . parse Module File Ċ import Ġcom . github . l ub en . z std . Z std InputStream Ċ import Ġkotlinx . coroutines . sync . Semaphore Ċ import Ġkotlinx . coroutines . sync . with Permit Ċ import Ġorg . apache . commons . compress . arch ivers . tar . Tar Archive InputStream Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . zip . Zip InputStream Ċ Ċ private Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Prepare J dk Worker :: class . java ) Ċ Ċ class ĠPrepare J dk Worker ( ĊĠĠĠ Ġprivate Ġval Ġtemp Dir Provider : ĠTemp Dir Provider , ĊĠĠĠ Ġparallel Fetch : ĠInt Ġ= Ġ 1 Ċ ) Ġ: ĠPrepare Artifact Worker < Artifact Config . Java > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfetch Semaphore Ġ= ĠSem aphore ( parallel Fetch ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Artifact Id ( config : ĠArtifact Config . Java ) Ġ= Ġ" java /${ config . version }" ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġprepare Artifact ( ĊĠĠĠĠĠĠĠ Ġartifact Id : ĠString , ĊĠĠĠĠĠĠĠ Ġconfig : ĠArtifact Config . Java , ĊĠĠĠĠĠĠĠ Ġlistener : ĠPrepare Artifact Worker . Prepare Listener ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . accept Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrepare Artifact Worker . Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Artifact Ids Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaliases Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Metadata Ġ= Ġconfig . metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtemp Dir Provider . with TempDir ( artifactId ) Ġ{ Ġtmp Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodules Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġj igsaw Ġ 9 : Ġj dk - updates _ jdk 9 u /{ jdk , jax p }/ src /* /{ share , sol aris }/ classes /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġj igsaw Ġ 1 0 + : Ġj dk - updates _ jdk 1 0 u / src /* /{ share , sol aris }/ classes /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġold : Ġj dk 6 _ jdk 6 / jdk / src /{ share , sol aris }/ classes /* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġplatforms Ġat Ġlow Ġindices Ġin Ġthis Ġlist Ġwill Ġoverwrite Ġfiles Ġfrom Ġhigh Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplatforms Ġ= ĠlistOf (" share ", Ġ" linux ", Ġ" unix ", Ġ" sol aris ", Ġ" mac osx ", Ġ" windows ", Ġ" a ix ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplatform Group Ġ= Ġ"( ?< platform >" Ġ+ Ġplatforms . join ToString ("| ") Ġ+ Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Group Ġ= Ġ"( ?< module >[ a - z . ]+ )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Patterns Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . jigsaw ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ /? [ \\ w - ]+ /( \\ w + /) ? src /$ module Group /$ platform Group / classes / (? < path >. + )$ "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ /? [ \\ w - ]+ / build /$ platform Group -[ \\ w - ]+ / support / gens rc /$ module Group / (? < path >. + )$ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ /? \\ w +/ jdk / src /$ platform Group / classes / (? < path >. + )$ "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ /? \\ w +/ build /$ platform Group -[ \\ w - ]+ /( jdk /) ? gens rc / (? < path >. + )$ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbest Platform Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Archive ( config . archive Url ) Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . isDirectory ) Ġreturn @ load Archive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġname Patterns . map Ġ{ Ġit . matcher ( entry . name ) Ġ}. first OrNull Ġ{ Ġit . matches () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ load Archive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġif Ġ( config . jigsaw ) Ġmatcher . group (" module ") Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplatform Ġ= Ġmatcher . group (" platform ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġmatcher . group (" path ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Path Ġ= Ġif Ġ( module Ġ== Ġnull ) Ġpath Ġelse Ġ"$ module /$ path " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Platform Ġ= Ġbest Platform [ out Path ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Platform Ġ== Ġplatform ) Ġthrow ĠAssertionError (" Duplicate Ġfile : Ġ${ entry . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Platform Ġ== Ġnull Ġ|| Ġplatforms . indexOf ( old Platform ) Ġ> Ġplatforms . indexOf ( platform )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest Ġ= Ġtmp . resolve ( out Path ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dest . startsWith ( tmp )) Ġthrow ĠAssertionError (" Bad Ġpath : Ġ${ entry . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directories ( dest . parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠFile AlreadyExists Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( entry . stream , Ġdest , ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . jigsaw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġmodules . map NotNull Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Info Ġ= Ġtmp . resolve ( module ). resolve (" module - info . java ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( module Info )) Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeps Ġ= Ġget Required Modules ( parse Module File ( module Info )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ!= Ġ" java . base ") Ġdeps Ġ= Ġdeps Ġ+ Ġ" java . base " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ġto Ġdeps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Modules Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġrequest Module ( module : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ! in Ġsorted Modules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . getValue ( module ). forEach Ġ{ Ġrequest Module ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Modules . add ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies . keys . forEach Ġ{ Ġrequest Module ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbinary Root ( module : ĠString ) Ġ= Ġtmp . resolve (" bin "). resolve ( module ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( module Ġin Ġsorted Modules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Root Ġ= Ġtmp . resolve ( module ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Deps Ġ= Ġdependencies . getValue ( module ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . compile Source Set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Set Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Tag Ġ= Ġ"$ artifactId /$ module ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Root Ġ= Ġsource Root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Running Vm Boot classpath Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Prefix Ġ= Ġ"$ module /", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġmodule Deps . map Ġ{ Ġbinary Root ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Classes To Ġ= Ġbinary Root ( module ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu irk Is Java Base Ġ= Ġmodule Ġ== Ġ" java . base " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpre - jigsaw , Ġcompile Ġeverything Ġat Ġonce ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . compile Source Set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Set Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Tag Ġ= Ġartifact Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Root Ġ= Ġtmp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Running Vm Boot classpath Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqu irk Is Java Base Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠArchive Entry ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġis Directory : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġstream : ĠInputStream ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Archive ( archive Url : ĠURL , Ġhandle Entry : Ġ( Archive Entry ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Semaphore . with Permit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Loading ĠJDK Ġarchive Ġ{}", Ġarchive Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRes uming Url InputStream ( archive Url ). buffered (). use Ġ{ Ġurl Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( archive Url . file . endsWith (". z st ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTar Archive InputStream ( Z std InputStream ( url Stream ). buffered ()). use Ġ{ Ġtar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġtar . next Entry Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Entry ( Archive Entry ( entry . name , Ġentry . isDirectory , Ġtar )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( archive Url . file . endsWith (". zip ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip InputStream ( url Stream ). use Ġ{ Ġzip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġzip . next Entry Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Entry ( Archive Entry ( entry . name , Ġentry . isDirectory , Ġzip )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown Ġfile Ġextension : Ġ$ archive Url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }