import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . parameters . options .* Ċ import Ġcom . github . aj alt . cli kt . parameters . types . file Ċ import Ġcom . github . aj alt . cli kt . parameters . types . int Ċ import Ġimport .* Ċ import Ġsource .* Ċ import Ġutil .* Ċ import Ġcom . zaxxer . hikari .* Ċ import Ġjavax . sql . DataSource Ċ import Ġjava . sql . Driver Manager Ċ import Ġmu . Kotlin Logging Ċ import Ġutil . with Env var Split Ċ import Ġjava . io . File Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= ĠCli (). main ( args ) Ċ Ċ class ĠCli Ġ: ĠCli kt Command () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdb Url Ġby Ġoption ("-- db - url ", Ġenv var Ġ= Ġ" DB _ URL "). required () ĊĠĠĠ Ġprivate Ġval Ġdb Username Ġby Ġoption ("-- db - username ", Ġenv var Ġ= Ġ" DB _ USERNAME ") ĊĠĠĠ Ġprivate Ġval Ġdb Password Ġby Ġoption ("-- db - password ", Ġenv var Ġ= Ġ" DB _ PASSWORD ") ĊĠĠĠ Ġprivate Ġval Ġdb Schema Ġby Ġoption ("-- db - schema ", Ġenv var Ġ= Ġ" DB _ SCHEMA ") ĊĠĠĠ Ġprivate Ġval Ġpar ale ll ism Ġby Ġoption ("-- parallel ism ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" PAR ALLEL IS M ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Parallel ism Ġfor Ġrequests Ġto ĠU CSC . ĠDefault Ġ 1 6 .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default ( 1 6 ) ĊĠĠĠ Ġprivate Ġval Ġassemblies Ġby Ġoption ("-- as semblies ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" AS SE MB LIES ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" As semblies Ġfor Ġwhich Ġto Ġimport Ġannotations .") ĊĉĠĠĠ Ġ. with Env var Split ( Regex . from Literal ("| ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġcy to band Files Ġby Ġoption ("-- cy to band - files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" CY TO BAND _ FILES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġcy to band Ġfiles Ġto Ġimport , Ġwith Ġassociated Ġassemblies ") ĊĉĠĠĠ Ġ. file ( exists Ġ= Ġtrue ) ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġcy to band File As semblies Ġby Ġoption ("-- cy to band - file - as semblies ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" CY TO BAND _ FILE _ AS SE MB LIES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġcy to band Ġfile Ġassemblies ") ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġchrom Length Files Ġby Ġoption ("-- chrom - length - files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" CH ROM _ LENGTH _ FILES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġchrom Ġlength Ġfiles Ġto Ġimport , Ġwith Ġassociated Ġassemblies ") ĊĉĠĠĠ Ġ. file ( exists Ġ= Ġtrue ) ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġchrom Length File As semblies Ġby Ġoption ("-- chrom - length - file - as semblies ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" CH ROM _ LENGTH _ FILE _ AS SE MB LIES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġchrom Ġlength Ġfile Ġassemblies ") ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġref Gene Files Ġby Ġoption ("-- ref - gene - files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" REF _ GEN E _ FILES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local ĠRef Seq Ġgene Ġfiles Ġto Ġimport , Ġwith Ġassociated Ġassemblies ") ĊĉĠĠĠ Ġ. file ( exists Ġ= Ġtrue ) ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġref Gene File As semblies Ġby Ġoption ("-- ref - gene - file - as semblies ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" REF _ GEN E _ FILE _ AS SE MB LIES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġref Ġgene Ġassemblies ") ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġx eno Ref Seq Gene Files Ġby Ġoption ("-- x eno - ref - gene - files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" X ENO _ REF _ GEN E _ FILES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġx eno ĠRef Seq Ġgene Ġfiles Ġto Ġimport , Ġwith Ġassociated Ġassemblies ") ĊĉĠĠĠ Ġ. file ( exists Ġ= Ġtrue ) ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġx eno Ref Seq Gene File As semblies Ġby Ġoption ("-- x eno - ref - gene - file - as semblies ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv var Ġ= Ġ" X ENO _ REF _ GEN E _ FILE _ AS SE MB LIES ", ĊĉĠĠĠ Ġhelp Ġ= Ġ" Local Ġx eno Ġref Ġgene Ġassemblies ") ĊĉĠĠĠ Ġ. multiple () ĊĠĠĠ Ġprivate Ġval Ġreplace Schema Ġby Ġoption ("-- replace - schema ", Ġenv var Ġ= Ġ" REPLACE _ SCHEMA ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Set Ġto Ġdrop Ġthe Ġgiven Ġschema Ġfirst Ġbefore Ġcreating Ġit Ġagain .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flag ( default Ġ= Ġfalse ) ĊĠĠĠ Ġprivate Ġval Ġlist Url Ġby Ġoption ("-- list - url ", Ġenv var Ġ= Ġ" LIST _ URL ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Pass Ġto Ġimport Ġa Ġlist Ġof Ġassemblies Ġfrom ĠU CSC .") ĊĠĠĠ Ġprivate Ġval Ġassembly Files Ġby Ġoption ("-- assembly - files ", Ġenv var Ġ= Ġ" AS SE MB LY _ FILES ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Pass Ġto Ġimport Ġa Ġlist Ġof Ġassemblies Ġfrom Ġa Ġlocal Ġfile .") ĊĉĠĠĠ Ġ. file ( exists Ġ= Ġtrue ) ĊĉĠĠĠ Ġ. multiple () ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimport ers Ġ= Ġmutable ListOf < Importer >() ĊĊĠĠĠĠĠĠĠ Ġval Ġdatabase As semblies : ĠMap < String , ĠList < Map < String , ĠString >>> Ġ= Ġif Ġ( list Url Ġ!== Ġnull ) Ġparse Uc sc List ( list Url !! ) Ġelse Ġmap Of () Ċ ĉ val Ġlocal As semblies : ĠList < Map < String , ĠList < Map < String , ĠString >>>> Ġ= Ġassembly Files . map Ġ{ Ġparse Uc sc File ( it ) Ġ} Ċ ĉ var Ġassembly Sources : ĠList < Assembly Source > Ġ= Ġlocal As semblies . map Ġ{ ĠAssembly Map Source ( it ) Ġ} Ċ ĉ assembly Sources Ġ+= ĠAssembly Map Source ( database As semblies ) Ċ ĉ val Ġassembly Importer Ġ= ĠAssembly Importer ( assembly Sources ) ĊĠĠĠĠĠĠĠ Ġimport ers Ġ+= Ġassembly Importer ĊĊĠĠĠĠĠĠĠ Ġval Ġcy to band Sources Ġ= Ġmutable ListOf < Cy to band Source >() Ċ ĉ for Ġ( assembly Ġin Ġassemblies ) Ġ{ ĊĉĠĠĠ Ġcy to band Sources Ġ+= ĠU CSC Cy to band Http Source ( assembly ) Ċ ĉ } Ċ ĉ cy to band Files . forEach Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĉĠĠĠ Ġcy to band Sources Ġ+= ĠCy to band File Source ( cy to band File As semblies [ index ], Ġfile ) Ċ ĉ } Ċ ĉ database As semblies . forEach Ġ{ Ġ_, Ġassemblies Ġ-> ĊĉĠĠĠ Ġassemblies . forEach Ġ{ ĊĉĠĠĠĠĠĠĠ Ġcy to band Sources Ġ+= ĠU CSC Cy to band Http Source ( it [" name "] !! , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ ĉ } Ċ ĉ import ers Ġ+= ĠCy to band Importer ( cy to band Sources ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchrom Length Sources Ġ= Ġmutable ListOf < Chrom Length Source >() Ċ ĉ for Ġ( assembly Ġin Ġassemblies ) Ġ{ ĊĉĠĠĠ Ġchrom Length Sources Ġ+= ĠU CSC Chrom Length Http Source ( assembly ) Ċ ĉ } Ċ ĉ chrom Length Files . forEach Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĉĠĠĠ Ġchrom Length Sources Ġ+= ĠCh rom Length File Source ( chrom Length File As semblies [ index ], Ġfile ) Ċ ĉ } Ċ ĉ database As semblies . forEach Ġ{ Ġ_, Ġassemblies Ġ-> ĊĉĠĠĠ Ġassemblies . forEach Ġ{ ĊĉĠĠĠĠĠĠĠ Ġchrom Length Sources Ġ+= ĠU CSC Chrom Length Http Source ( it [" name "] !! , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ ĉ } Ċ ĉ import ers Ġ+= ĠCh rom Length Importer ( chrom Length Sources ) ĊĊĠĠĠĠĠĠĠ Ġval Ġref Gene Sources Ġ= Ġmutable ListOf < Ref Seq Gene Source >() ĊĠĠĠĠĠĠĠ Ġval Ġref Gene Sources X Ġ= Ġmutable ListOf < Ref Seq Gene Source >() Ċ ĉ for Ġ( assembly Ġin Ġassemblies ) Ġ{ ĊĉĠĠĠ Ġref Gene Sources Ġ+= ĠU CSC Ref Seq Gene Http Source ( assembly ) ĊĉĠĠĠ Ġref Gene Sources X Ġ+= ĠU CSC X eno Ref Seq Gene Http Source ( assembly ) Ċ ĉ } Ċ ĉ ref Gene Files . forEach Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĉĠĠĠ Ġref Gene Sources Ġ+= ĠRef Seq Gene File Source ( ref Gene File As semblies [ index ], Ġfile ) Ċ ĉ } Ċ ĉ x eno Ref Seq Gene Files . forEach Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĉĠĠĠ Ġref Gene Sources X Ġ+= ĠRef Seq Gene File Source ( x eno Ref Seq Gene File As semblies [ index ], Ġfile ) Ċ ĉ } Ċ ĉ database As semblies . forEach Ġ{ Ġ_, Ġassemblies Ġ-> ĊĉĠĠĠ Ġassemblies . forEach Ġ{ ĊĉĠĠĠĠĠĠĠ Ġref Gene Sources Ġ+= ĠU CSC Ref Seq Gene Http Source ( it [" name "] !! , Ġtrue ) ĊĉĠĠĠĠĠĠĠ Ġref Gene Sources X Ġ+= ĠU CSC X eno Ref Seq Gene Http Source ( it [" name "] !! , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ ĉ } Ċ ĉ import ers Ġ+= ĠRef Seq Gene Importer ( ref Gene Sources ) ĊĠĠĠĠĠĠĠ Ġimport ers Ġ+= ĠRef Seq Gene Importer ( ref Gene Sources X , Ġtrue ) Ċĉ ĊĠĠĠĠĠĠĠ Ġrun Import ers ( db Url , Ġdb Username , Ġdb Password , Ġdb Schema , Ġreplace Schema , Ġimport ers ) ĊĉĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ interface ĠImport er Ġ{ ĊĠĠĠ Ġfun Ġimport ( dataSource : ĠDataSource ) Ċ } Ċ Ċ fun Ġrun Import ers ( db Url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Username : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Password : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Schema : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Schema : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport ers : ĠList < Importer >) Ġ{ ĊĊĠĠĠ Ġ// ĠCreate Ġthe Ġschema Ġif Ġit Ġdoes Ġnot Ġexist . ĊĠĠĠ ĠDriver Manager . getConnection ( db Url , Ġdb Username , Ġdb Password ). use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠ Ġconn . createStatement (). use Ġ{ Ġstmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( replace Schema ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . executeUpdate (" DROP ĠS CHE MA ĠIF ĠEXISTS Ġ$ db Schema ĠCASCADE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . executeUpdate (" CREATE ĠS CHE MA ĠIF ĠNOT ĠEXISTS Ġ$ db Schema ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġconfig Ġ= ĠH ikariConfig () ĊĠĠĠ Ġconfig . jdbc Url Ġ= Ġdb Url ĊĠĠĠ Ġconfig . username Ġ= Ġdb Username ĊĠĠĠ Ġconfig . password Ġ= Ġdb Password ĊĠĠĠ Ġconfig . schema Ġ= Ġdb Schema ĊĠĠĠ Ġconfig . minimum Idle Ġ= Ġ 1 ĊĠĠĠ Ġconfig . maximum PoolSize Ġ= Ġ 1 0 0 ĊĊĠĠĠ ĠH ikari DataSource ( config ). use Ġ{ ĠdataSource Ġ-> ĊĠĠĠĠĠĠĠ Ġfor Ġ( importer Ġin Ġimport ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimporter . import ( dataSource ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ