/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠAlex ĠMag al ha es Ġ< alex @ pens ato code . org > Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . pens ato code . simp licity . jdbc . sql Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . dao . DataAccess Resource FailureException Ċ Ċ import Ġjavax . sql . DataSource Ċ import Ġjava . sql . Database MetaData Ċ import Ġjava . sql . SQLException Ċ import Ġjava . util . Array Deque Ċ import Ġjava . util . Weak HashMap Ċ Ċ object ĠSql Generator Factory Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Sql Generator Factory :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġgenerators Ġ= ĠArray Deque < Sql Generator >() ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠWeak HashMap < DataSource , ĠSql Generator >( 2 , Ġ 1 . 0 f ) ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Generator ( Default Sql Generator ()) ĊĠĠĠĠĠĠĠ Ġregister Generator ( Limit Offset Sql Generator ()) ĊĠĠĠĠĠĠĠ Ġregister Generator ( SQL 2 0 0 8 Sql Generator ()) ĊĠĠĠĠĠĠĠ Ġregister Generator ( Oracle 9 Sql Generator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param ĠdataSource ĠThe ĠDataSource Ġfor Ġwhich Ġto Ġfind Ġcompatible ĠSQL ĠGenerator . ĊĠĠĠĠ Ġ* Ġ@ return ĠAn ĠSQL ĠGenerator Ġcompatible Ġwith Ġthe Ġgiven Ġ` dataSource `. ĊĠĠĠĠ Ġ* Ġ@ throws ĠData Access Resource FailureException Ġif Ġexception Ġis Ġthrown Ġwhen ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġtrying Ġto Ġobtain ĠConnection Ġor ĠMeta Data Ġfrom Ġthe Ġ` dataSource `. ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġcompatible ĠSQL ĠGenerator Ġis Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Generator ( dataSource : ĠDataSource ): ĠSql Generator Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cache . containsKey ( dataSource )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache [ dataSource ] Ġas ĠSql Generator ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠmetaData : ĠDatabase MetaData ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData Ġ= ĠdataSource . connection . metaData ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠData Access Resource FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġretrieve Ġdatabase Ġmetadata ", Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( generator Ġin Ġgenerators ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generator . is Compatible ( metaData )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Using ĠSQL ĠGenerator Ġ{} Ġfor ĠdataSource Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . java Class . name , ĠdataSource . java Class ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( dataSource , Ġgenerator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Exception Ġoccurred Ġwhen Ġinvoking Ġis Compatible () Ġon Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . java Class . simple Name , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġnot Ġhappen , Ġbecause Ġregistry Ġshould Ġalways Ġcontain Ġone ĊĠĠĠĠĠĠĠ Ġ// Ġ" default " Ġgenerator Ġthat Ġreturns Ġtrue Ġfor Ġevery ĠDatabase MetaData . ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġcompatible ĠSQL ĠGenerator Ġfound .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġ` sql Generator ` Ġto Ġthe Ġtop Ġof Ġthe Ġgenerators Ġregistry . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġsql Generator ĠThe ĠSQL ĠGenerator Ġinstance Ġto Ġregister . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Generator ( sql Generator : ĠSql Generator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerators . push ( sql Generator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġgenerators Ġfrom Ġthe Ġfactory 's Ġregistry . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerators . clear () ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠ Ġ} Ċ } Ċ