package Ġcom . s xt anna . database . base Ċ Ċ import Ġcom . s xt anna . database . config . Database Config Ċ import Ġcom . s xt anna . database . task . Database Task Ċ import Ġcom . s xt anna . database . type . ID atabase Ċ import Ġcom . s xt anna . database . type . Switch Ċ import Ġjava . io . Closeable Ċ import Ġjava . util . function . Consumer Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġthat Ġrepresents Ġall Ġdatabase Ġwrapper Ġtypes Ċ Ġ* Ċ Ġ* Ġ@ param Ġ[ R ] ĠThe Ġresource Ġtype Ċ Ġ* Ġ@ param Ġ[ C ] ĠThe Ġconfig Ġtype Ċ Ġ* Ġ@ param Ġ[ T ] ĠThe Ġtask Ġtype Ċ Ġ*/ Ċ abstract Ġclass ĠDatabase < R Ġ: ĠClose able , Ġout ĠC Ġ: ĠDatabase Config , ĠT Ġ: ĠDatabase Task < R >> Ġ: ĠID atabase < R , ĠT >, ĠSwitch Ġ{ ĊĊ ĉ abstract Ġval Ġconf Ġ: ĠC Ċ ĉ abstract Ġval Ġname Ġ: ĠString ĊĊ ĉ var Ġis Enabled Ġ: ĠBoolean Ġ= Ġfalse Ċĉ ĉ private Ġset ĊĊĊ ĉ /** Ċĉ Ġ* ĠAttempt Ġto Ġenable Ġthis ĠDatabase . Ċĉ Ġ* Ċĉ Ġ* Ġ* ĠRuns Ġ[ load ], Ġthen Ġsets Ġis Enabled Ġto Ġtrue Ċĉ Ġ* Ċĉ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġalready Ġenabled Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalStateException :: class ) Ċ ĉ override Ġfun Ġenable () Ġ{ Ċĉ ĉ check ( isEnabled . not ()) Ġ{ Ġ" Database Ġ$ name Ġis Ġalready Ġenabled " Ġ} ĊĊĉ ĉ load () Ċĉ ĉ isEnabled Ġ= Ġtrue Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAttempt Ġto Ġdisable Ġthis ĠDatabase . Ċĉ Ġ* Ċĉ Ġ* Ġ* ĠRuns Ġ[ po ison ], Ġthen Ġsets Ġis Enabled Ġto Ġfalse Ċĉ Ġ* Ċĉ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġnot Ġenabled Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalStateException :: class ) Ċ ĉ override Ġfun Ġdisable () Ġ{ Ċĉ ĉ check ( isEnabled ) Ġ{ Ġ" Database Ġ$ name Ġisn 't Ġenabled " Ġ} ĊĊĉ ĉ try Ġ{ Ċĉĉ ĉ po ison () Ċĉ ĉ } Ċĉ ĉ catch Ġ( ex Ġ: ĠException ) Ġ{ Ċĉĉ ĉ println (" Failed Ġto Ġpo ison Ġdatabase Ġ$ name ") Ċĉ ĉ } Ċĉ ĉ isEnabled Ġ= Ġfalse Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* ĠInitialize Ġthe Ġconnection Ġmanager Ġfor Ġthis ĠDatabase . Ċĉ Ġ* ĠIf Ġthis Ġthrows Ġan Ġexception Ġit Ġwill Ġdis rupt Ġthe Ġenable Ġprocess Ġand Ġcause Ġcalls Ġto Ġ[ resource ] Ġto Ġthrow Ġexceptions Ċĉ Ġ*/ Ċ ĉ protected Ġabstract Ġfun Ġload () ĊĊ ĉ /** Ċĉ Ġ* ĠDestroy Ġthe Ġconnection Ġmanager Ġof Ġthis ĠDatabase . Ċĉ Ġ*/ Ċ ĉ protected Ġabstract Ġfun Ġpo ison () ĊĊĊ ĉ /** Ċĉ Ġ* ĠAttempt Ġto Ġpull Ġa Ġresource Ġfrom Ġthe Ġconnection Ġmanager . Ċĉ Ġ* Ċĉ Ġ* Ġ@ return ĠThe Ġ[ R ] Ġor Ġnull Ċĉ Ġ*/ Ċ ĉ protected Ġabstract Ġfun Ġpool Resource () Ġ: ĠR ? ĊĊ ĉ /** Ċĉ Ġ* ĠCreate Ġa Ġ[ T ] Ġfor Ġexecution Ċĉ Ġ* Ċĉ Ġ* Ġ@ return Ġ[ T ] Ġready Ġfor Ġexecution Ċĉ Ġ*/ Ċ ĉ protected Ġabstract Ġfun Ġcreate Task ( resource Ġ: ĠR ) Ġ: ĠT ĊĊĊ ĉ /** Ċĉ Ġ* ĠAttempt Ġto Ġpull Ġa Ġresource Ġfrom Ġthe Ġconnection Ġmanager Ġwith Ġchecks . Ċĉ Ġ* Ċĉ Ġ* ĠChecks Ċĉ Ġ* Ġ* ĠIf Ġthe Ġdatabase Ġis Ġenabled Ġfirst Ċĉ Ġ* Ġ* ĠIf Ġthe Ġresource Ġis Ġnull Ġbefore Ġreturning Ċĉ Ġ* Ċĉ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġany Ġof Ġthe Ġchecks Ġfail Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalStateException :: class ) Ċ ĉ fun Ġresource () Ġ: ĠR Ġ{ Ċĉ ĉ check ( isEnabled ) Ġ{ Ġ" Database Ġ$ name Ġis Ġnot Ġenabled , Ġresources Ġcannot Ġbe Ġpulled " Ġ} Ċĉ ĉ return ĠcheckNotNull ( pool Resource ()) Ġ{ Ġ" Failed Ġto Ġget Ġresource Ġfrom Ġdatabase Ġ$ name Ġpool " Ġ} Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* ĠInvoke Ġan Ġaction Ġusing Ġthis ĠDatabase Ċĉ Ġ* Ċĉ Ġ* Ġ* Preferred Ġfunction Ġfor ĠKotlin Ġusage * Ċĉ Ġ* Ċĉ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġresource Ġcan 't Ġbe Ġcreated Ċĉ Ġ* Ġ@ see Ġ[ resource ] Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalStateException :: class ) Ċ ĉ @ Jvm Synt hetic Ġ// ĠThis Ġhide s Ġthe Ġfunction Ġfrom ĠJava , Ġdo Ġtell Ġif Ġthis Ġhas Ġa Ġnegative Ġimpact Ċ ĉ override Ġoperator Ġfun Ġinvoke ( block Ġ: ĠT . () Ġ-> ĠUnit ) Ġ{ Ċĉ ĉ resource (). use Ġ{ Ġcreate Task ( it ). block () Ġ} Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* ĠInvoke Ġan Ġaction Ġusing Ġthis ĠDatabase Ċĉ Ġ* Ċĉ Ġ* Ġ* Preferred Ġfunction Ġfor ĠJava Ġusage * Ċĉ Ġ* Ċĉ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġresource Ġcan 't Ġbe Ġcreated Ċĉ Ġ* Ġ@ see Ġ[ resource ] Ċĉ Ġ*/ Ċ ĉ @ Throws ( IllegalStateException :: class ) Ċ ĉ override Ġfun Ġexecute ( block Ġ: ĠConsumer < @ ParameterName (" task ") ĠT >) Ġ= Ġinvoke Ġ{ Ġblock . accept ( this ) Ġ} Ċ Ċ }