204204package org .jooby .jdbc ;
205205
206206import com .google .common .base .CharMatcher ;
207-
208207import static com .google .common .base .Preconditions .checkArgument ;
209-
210208import com .google .common .base .Splitter ;
211- import com .google .common .base .Strings ;
212209import com .google .inject .Binder ;
213210import com .google .inject .Key ;
214211import com .google .inject .name .Names ;
215212import com .typesafe .config .Config ;
213+ import com .typesafe .config .ConfigException ;
216214import com .typesafe .config .ConfigFactory ;
217215import com .typesafe .config .ConfigObject ;
218216import com .typesafe .config .ConfigValue ;
219217import com .typesafe .config .ConfigValueFactory ;
220218import com .typesafe .config .ConfigValueType ;
221219import com .zaxxer .hikari .HikariConfig ;
222220import com .zaxxer .hikari .HikariDataSource ;
223-
224221import static java .util .Objects .requireNonNull ;
225-
226222import org .jooby .Env ;
227223import org .jooby .Jooby ;
228224import org .jooby .funzy .Throwing ;
240236import java .util .function .BiConsumer ;
241237import java .util .function .Consumer ;
242238import java .util .function .Function ;
239+ import java .util .stream .Stream ;
243240
244241/**
245242 * <h1>jdbc</h1>
@@ -578,6 +575,7 @@ private Config dbConfig(final String key, final Config source) {
578575 return Try .apply (() -> source .getConfig ("databases." + db ))
579576 .map (it -> {
580577 // Rewrite embedded db
578+ it = it .getConfig ("dataSource" );
581579 Config dbtree = it .withValue ("url" , ConfigValueFactory .fromAnyRef (
582580 it .getString ("url" ).replace ("{mem.seed}" , System .currentTimeMillis () + "" )));
583581 // write embedded with current key
@@ -605,16 +603,15 @@ private HikariConfig hikariConfig(final String url, final String key, final Stri
605603 props .setProperty (propertyName , propertyValue );
606604 };
607605
608- Throwing .Function <String , Config > dbconf = Throwing .<String , Config >throwingFunction (
609- path -> conf .getConfig (path ))
606+ Throwing .Function <String , Config > dbconf = Throwing .<String , Config >throwingFunction (path -> conf .getConfig (path ))
610607 .orElse (ConfigFactory .empty ());
611608
612609 Config $hikari = dbconf .apply (key + ".hikari" )
613610 .withFallback (dbconf .apply ("db." + db + ".hikari" ))
614611 .withFallback (dbconf .apply ("hikari" ));
615612
616613 // figure it out db type.
617- dbtype = dbtype (url , conf );
614+ dbtype = dbtype (url );
618615
619616 /**
620617 * dump properties from less to higher precedence
@@ -623,24 +620,20 @@ private HikariConfig hikariConfig(final String url, final String key, final Stri
623620 * # db.* -> dataSource.*
624621 * # hikari.* -> * (no prefix)
625622 */
626- dbtype .ifPresent (type -> dbconf (conf , type )
627- .entrySet ().forEach (entry -> dumper .accept ("dataSource." , entry )));
623+ Stream .of (url .split (":" ))
624+ .forEach (type -> dbconf (conf , type )
625+ .entrySet ().forEach (entry -> dumper .accept ("" , entry )));
628626
629627 dbconf .apply (key )
630628 .withoutPath ("hikari" )
631629 .entrySet ().forEach (entry -> dumper .accept ("dataSource." , entry ));
632630
633631 $hikari .entrySet ().forEach (entry -> dumper .accept ("" , entry ));
634632
635- String dataSourceClassName = props .getProperty ("dataSourceClassName" );
636- if (Strings .isNullOrEmpty (dataSourceClassName )) {
637- // adjust dataSourceClassName when missing
638- dataSourceClassName = props .getProperty ("dataSource.dataSourceClassName" );
639- props .setProperty ("dataSourceClassName" , dataSourceClassName );
633+ if (props .containsKey ("driverClassName" )) {
634+ props .remove ("dataSourceClassName" );
635+ props .setProperty ("jdbcUrl" , url );
640636 }
641-
642- // remove dataSourceClassName under dataSource
643- props .remove ("dataSource.dataSourceClassName" );
644637 // set pool name
645638 props .setProperty ("poolName" , dbtype .map (type -> type + "." + db ).orElse (db ));
646639
@@ -653,17 +646,21 @@ private HikariConfig hikariConfig(final String url, final String key, final Stri
653646
654647 @ SuppressWarnings ("unchecked" )
655648 private Config dbconf (final Config conf , final String type ) {
656- String dbtype = "databases." + type ;
657- ConfigValue value = conf .getValue (dbtype );
658- if (value .valueType () == ConfigValueType .OBJECT ) {
659- return ((ConfigObject ) value ).toConfig ();
649+ try {
650+ String dbtype = "databases." + type ;
651+ ConfigValue value = conf .getValue (dbtype );
652+ if (value .valueType () == ConfigValueType .OBJECT ) {
653+ return ((ConfigObject ) value ).toConfig ();
654+ }
655+ List <Config > list = (List <Config >) conf .getConfigList (dbtype );
656+ ClassLoader loader = getClass ().getClassLoader ();
657+ return list .stream ()
658+ .filter (it -> dataSourcePresent (loader , it .getString ("dataSourceClassName" )))
659+ .findFirst ()
660+ .orElse (list .get (0 ));
661+ } catch (ConfigException .Missing | ConfigException .BadPath x ) {
662+ return ConfigFactory .empty ();
660663 }
661- List <Config > list = (List <Config >) conf .getConfigList (dbtype );
662- ClassLoader loader = getClass ().getClassLoader ();
663- return list .stream ()
664- .filter (it -> dataSourcePresent (loader , it .getString ("dataSourceClassName" )))
665- .findFirst ()
666- .orElse (list .get (0 ));
667664 }
668665
669666 private boolean dataSourcePresent (final ClassLoader loader , final String className ) {
@@ -684,9 +681,9 @@ protected void callback(final Object value, final Config conf) {
684681 }).recover (CCE ::apply ).get ());
685682 }
686683
687- private Optional <String > dbtype (final String url , final Config config ) {
684+ private Optional <String > dbtype (final String url ) {
688685 String type = Arrays .stream (url .toLowerCase ().split (":" ))
689- .filter (token -> !(token .equals ("jdbc" ) || token .equals ("jtds" )))
686+ .filter (token -> !(token .equals ("jdbc" ) || token .equals ("jtds" )|| token . equals ( "log4jdbc" ) ))
690687 .findFirst ()
691688 .get ();
692689
0 commit comments