package Ġme . dev n atan . k atan . core Ċ Ċ import Ġcom . github . docker java . api . Docker Client Ċ import Ġcom . github . docker java . core . Default Docker ClientConfig Ċ import Ġcom . github . docker java . core . Docker Client Impl Ċ import Ġcom . github . docker java . core . Ke yst ore SSL Config Ċ import Ġcom . github . docker java . core . Local Directory SSL Config Ċ import Ġcom . github . docker java . okhttp . Ok Docker HttpClient Ċ import Ġcom . types afe . config . Config Ċ import Ġkotlinx . coroutines . Coroutine Name Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġme . dev n atan . k atan . api . K atan Ċ import Ġme . dev n atan . k atan . api . Platform Ċ import Ġme . dev n atan . k atan . api . cache . Cache Ċ import Ġme . dev n atan . k atan . api . cache . Unavailable Cache Provider Ċ import Ġme . dev n atan . k atan . api . manager . Account Manager Ċ import Ġme . dev n atan . k atan . api . manager . Server Manager Ċ import Ġme . dev n atan . k atan . common . util . get Ċ import Ġme . dev n atan . k atan . core . cache . Redis Cache Provider Ċ import Ġme . dev n atan . k atan . core . database . Database Connector Ċ import Ġme . dev n atan . k atan . core . database . SUPPORTED _ CONNECT ORS Ċ import Ġme . dev n atan . k atan . core . database . jdbc . JDBC Connector Ċ import Ġme . dev n atan . k atan . core . exceptions . throw Sil ent Ċ import Ġme . dev n atan . k atan . core . manager . Default Account Manager Ċ import Ġme . dev n atan . k atan . core . manager . Docker Server Manager Ċ import Ġme . dev n atan . k atan . core . repository . JDBC Servers Repository Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġredis . clients . j edis . J edis Ċ import Ġredis . clients . j edis . J edis Pool Ċ import Ġredis . clients . j edis . J edis Pool Config Ċ import Ġredis . clients . j edis . Pipeline Ċ import Ġjava . io . Unchecked IOException Ċ import Ġjava . net . Connect Exception Ċ import Ġjava . security . KeyStore ĊĊ Ċ class ĠK atan Core ( val Ġconfig : ĠConfig ) Ġ: ĊĠĠĠ ĠCor outine Scope Ġby ĠCor outine Scope ( Coroutine Name (" K atan ")), ĠK atan Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDATABASE _ DI AL ECT _ FALL BACK Ġ= Ġ" H 2 " ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( K atan :: class . java ) !! ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġplatform : ĠPlatform Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPlatform ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . OS ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty (" os . name "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty (" os . arch "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty (" os . version ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġdatabase : ĠDatabase Connector ĊĠĠĠ Ġlateinit Ġvar Ġdocker : ĠDocker Client ĊĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġaccount Manager : ĠAccount Manager ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġserver Manager : ĠServer Manager ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġcache : ĠCache < Any > ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdatabase () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ= Ġconfig . getConfig (" database ") ĊĠĠĠĠĠĠĠ Ġval Ġdialect Ġ= Ġdb . get (" source ", ĠDATABASE _ DI AL ECT _ FALL BACK ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Using Ġ$ dialect Ġas Ġdatabase Ġdialect Ġ( fallback Ġto Ġ${ DATABASE _ DI AL ECT _ FALL BACK }). ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdialect Settings Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getConfig ( dialect . toLowerCase ()) ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( IllegalArgumentException (" Dialect Ġproperties Ġnot Ġfound : Ġ$ dialect ."), Ġlogger ) ĊĠĠĠĠĠĠĠ Ġ}. get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġconnect With ( dialect , Ġdialect Settings , Ġdb . get (" strict ", Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġconnect With ( dialect : ĠString , Ġconfig : ĠConfig , Ġstrict : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialect Name Ġ= Ġdialect . toLowerCase () ĊĠĠĠĠĠĠĠ Ġif Ġ(! SUPPORTED _ CONNECT ORS . containsKey ( dialect Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( IllegalArgumentException (" Database Ġdialect Ġ$ dialect Ġis Ġnot Ġsupported "), Ġlogger ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( connector , Ġsettings ) Ġ= ĠSUPPORT ED _ CONNECT ORS . getValue ( dialect Name ). invoke ( config ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Initializing Ġconnector Ġ${ connector :: class . simple Name }. ") ĊĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Ġ= Ġconnector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . connect ( settings ) ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġconnect Ġto Ġ$ dialect Ġdatabase .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strict Ġ|| Ġdialect . equals ( DATABASE _ DI AL ECT _ FALL BACK , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( it , Ġlogger ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Strict Ġmode Ġis Ġdisabled , Ġconnecting Ġagain Ġusing Ġfallback Ġdialect Ġ$ DATABASE _ DI AL ECT _ FALL BACK .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect With ( DATABASE _ DI AL ECT _ FALL BACK , Ġconfig , Ġstrict ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdocker () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Config uring ĠDocker ...") ĊĠĠĠĠĠĠĠ Ġval Ġdocker Logger Ġ= ĠLoggerFactory . getLogger ( Docker Client :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġdocker Config Ġ= Ġconfig . getConfig (" docker ") ĊĠĠĠĠĠĠĠ Ġval Ġtls Ġ= Ġdocker Config . get (" tls . verify ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Config Ġ= ĠDefault Docker ClientConfig . create Default Config Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Docker Host ( docker Config . getString (" host ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Docker Tls Verify ( tls ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . info (" TLS Ġverification Ġis Ġenabled , Ġwill Ġswitching Ġbetween ĠHTTP Ġprotocols .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Config . with Docker Cert Path ( docker Config . getString (" tls . cert Path ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . warn (" TLS Ġverification Ġis Ġnot Ġenabled . ĠIt Ġis Ġhighly Ġrecommended Ġto Ġrun ĠDocker Ġin Ġa Ġsecure Ġenvironment .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . warn (" See Ġmore : Ġhttps :// docs . docker . com / engine / security / https /") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( docker Config . get (" ssl . enabled ", Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Config . with Custom Ssl Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( docker Config . getString (" ssl . provider ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CERT " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġdocker Config . getString (" ssl . cert Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . info (" Docker ĠSSL Ġcert ification Ġpath Ġlocated Ġat Ġ{} .", Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Directory SSL Config ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" KEY _ STORE " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdocker Config . get (" key Store . provider ") Ġ?: ĠKey Store . getDefault Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeystore Ġ= ĠKey Store . getInstance ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Using Ġ{} Ġas ĠSSL Ġkey Ġstore Ġtype .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKe yst ore SSL Config ( keystore , Ġdocker Config . getString (" key Store . password ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Sil ent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalArgumentException (" Unrecognized ĠDocker ĠSSL Ġprovider . ĠMust Ġbe : ĠCERT Ġor ĠKEY _ STORE "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġdocker Config . getConfig (" properties ") ĊĠĠĠĠĠĠĠ Ġval Ġhttp Config Ġ= Ġclient Config . build () ĊĊĠĠĠĠĠĠĠ Ġdocker Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDocker Client Impl . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Config , ĠOk Docker HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. docker Host ( http Config . docker Host ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ssl Config ( http Config . ssl Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect Timeout ( properties . get (" connect Timeout ", Ġ 5 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Timeout ( properties . get (" read Timeout ", Ġ 5 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( it , Ġdocker Logger ) ĊĠĠĠĠĠĠĠ Ġ}. get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ// Ġsends Ġa Ġping Ġto Ġsee Ġif Ġthe Ġconnection Ġwill Ġbe Ġestablished . ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker . ping Cmd (). exec () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logger . info (" Start Ġcomp osing Ġserver Ġpredefined Ġcomposition Ġfiles Ġvia Ġ\" compose / ... / docker - compose . yml \" .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( e , Ġdocker Logger ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn checked IOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Sil ent ( e . cause !! , Ġdocker Logger ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcaching () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġredis Ġ= Ġconfig . getConfig (" redis ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! redis . get (" use ", Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Redis Ġcaching Ġservice Ġis Ġdisabled .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" It Ġis Ġhighly Ġrecommended Ġthat Ġyou Ġinstall ĠRedis Ġon Ġthe Ġmachine Ġand Ġactivate Ġthe Ġcaching Ġservice .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Services Ġbased Ġon Ġexternal Ġsynchronization Ġwill Ġnot Ġwork .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġredis . get (" host ", Ġ" localhost ") ĊĠĠĠĠĠĠĠ Ġlogger . info (" Redis Ġhost Ġset Ġto : Ġ$ host ") ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwe Ġhave Ġto Ġuse Ġthe Ġpool Ġinstead Ġof Ġthe Ġdirect Ġclient Ġdue Ġto ĠK atan Ġnature , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġdefault Ġinstance Ġof ĠJ edis Ġ( without Ġpool ) Ġis Ġnot Ġthread - safe ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ġ= ĠRedis Cache Provider ( J edis Pool ( J edis Pool Config (), Ġhost )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Redis Ġcaching Ġserver Ġis Ġready Ġto Ġuse .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Ġ= ĠUn available Cache Provider () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Could Ġnot Ġconnect Ġto Ġthe ĠRedis Ġserver .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Starting ĠK atan ...") ĊĠĠĠĠĠĠĠ Ġlogger . info (" Platform : Ġ${ platform . os . name } Ġ${ platform . os . version }") ĊĠĠĠĠĠĠĠ Ġdatabase () ĊĠĠĠĠĠĠĠ Ġdocker () ĊĠĠĠĠĠĠĠ Ġcaching () ĊĠĠĠĠĠĠĠ Ġaccount Manager Ġ= ĠDefault Account Manager ( this ) ĊĠĠĠĠĠĠĠ Ġserver Manager Ġ= ĠDocker Server Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġwhen Ġ( database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJDBC Connector Ġ-> ĠJDBC Servers Repository ( this , Ġdatabase Ġas ĠJDBC Connector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Sil ent ( IllegalArgumentException (" No Ġservers Ġrepository Ġavailable Ġfor Ġ$ database "), Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ }