Skip to content

Commit a6e7320

Browse files
committed
Refactor hikari module + Environment.loadClass
1 parent c282be6 commit a6e7320

3 files changed

Lines changed: 46 additions & 41 deletions

File tree

jooby/src/main/java/io/jooby/Environment.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.HashMap;
3131
import java.util.List;
3232
import java.util.Map;
33+
import java.util.Optional;
3334
import java.util.stream.Collectors;
3435
import java.util.stream.Stream;
3536

@@ -106,7 +107,7 @@ public Environment(@Nonnull ClassLoader classLoader, @Nonnull Config conf, @Nonn
106107
* @param names Optional environment names.
107108
* @return True if any of the given names is active.
108109
*/
109-
public boolean isActive(String name, String... names) {
110+
public boolean isActive(@Nonnull String name, String... names) {
110111
return this.actives.contains(name.toLowerCase())
111112
|| Stream.of(names).map(String::toLowerCase).anyMatch(this.actives::contains);
112113
}
@@ -116,10 +117,22 @@ public boolean isActive(String name, String... names) {
116117
*
117118
* @return Application class loader.
118119
*/
119-
public ClassLoader getClassLoader() {
120+
public @Nonnull ClassLoader getClassLoader() {
120121
return classLoader;
121122
}
122123

124+
public @Nonnull Optional<Class> loadClass(@Nonnull String className) {
125+
try {
126+
return Optional.of(classLoader.loadClass(className));
127+
} catch (ClassNotFoundException x) {
128+
return Optional.empty();
129+
}
130+
}
131+
132+
public boolean isClassPresent(String className) {
133+
return loadClass(className).isPresent();
134+
}
135+
123136
@Override public String toString() {
124137
return actives + "\n" + toString(conf).trim();
125138
}

modules/jooby-hikari/src/main/java/io/jooby/hikari/Hikari.java

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public HikariConfig build(Environment env, String database) {
5656
} else {
5757
Config conf = env.getConfig();
5858
dburl = Stream.of(database + ".url", database)
59-
.filter(key -> conf.hasPath(key) && conf.getValue(key).valueType() == ConfigValueType.STRING)
59+
.filter(key -> conf.hasPath(key)
60+
&& conf.getValue(key).valueType() == ConfigValueType.STRING)
6061
.findFirst()
6162
.map(conf::getString)
6263
.orElse(null);
@@ -138,12 +139,10 @@ private void props(Environment env, BiConsumer<String, String> consumer, String.
138139
conf.getConfig(key).root().unwrapped().forEach((k, v) -> {
139140
if (v instanceof String) {
140141
consumer.accept(k, (String) v);
141-
} else {
142-
System.out.println(k);
143142
}
144143
});
145144
}
146-
} catch (ConfigException.BadPath ignored) {
145+
} catch (ConfigException.BadPath | ConfigException.BugOrBroken expected) {
147146
// do nothing
148147
}
149148
}
@@ -180,7 +179,7 @@ public Hikari() {
180179

181180
@Override public void install(@Nonnull Jooby application) {
182181
if (hikari == null) {
183-
hikari = builder().build(application.getEnvironment(), database);
182+
hikari = create().build(application.getEnvironment(), database);
184183
}
185184
HikariDataSource dataSource = new HikariDataSource(hikari);
186185

@@ -195,7 +194,7 @@ public Hikari() {
195194
application.onStop(dataSource::close);
196195
}
197196

198-
public static Builder builder() {
197+
public static Builder create() {
199198
return new Builder();
200199
}
201200

@@ -282,18 +281,19 @@ public static Map<String, Object> defaults(String database, Environment env) {
282281
case "mysql": {
283282
// url jdbc:mysql://<host>:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
284283
// 6.x
285-
dataSourceClass("com.mysql.cj.jdbc.MysqlDataSource", name -> {
286-
defaults.put("dataSourceClassName", name);
287-
});
284+
env.loadClass("com.mysql.cj.jdbc.MysqlDataSource")
285+
.ifPresent(klass -> defaults.put("dataSourceClassName", klass.getName()));
288286
// 5.x
289-
dataSourceClass("com.mysql.jdbc.jdbc2.optional.MysqlDataSource", name -> {
290-
defaults.put("dataSourceClassName", name);
291-
defaults.put("dataSource.encoding", env.getConfig().getString("application.charset"));
292-
defaults.put("dataSource.cachePrepStmts", true);
293-
defaults.put("dataSource.prepStmtCacheSize", 250);
294-
defaults.put("dataSource.prepStmtCacheSqlLimit", 2048);
295-
defaults.put("dataSource.useServerPrepStmts", true);
296-
});
287+
if (!defaults.containsKey("dataSourceClassName")) {
288+
env.loadClass("com.mysql.jdbc.jdbc2.optional.MysqlDataSource").ifPresent(klass -> {
289+
defaults.put("dataSourceClassName", klass.getName());
290+
defaults.put("dataSource.encoding", env.getConfig().getString("application.charset"));
291+
defaults.put("dataSource.cachePrepStmts", true);
292+
defaults.put("dataSource.prepStmtCacheSize", 250);
293+
defaults.put("dataSource.prepStmtCacheSqlLimit", 2048);
294+
defaults.put("dataSource.useServerPrepStmts", true);
295+
});
296+
}
297297
return defaults;
298298
}
299299
case "sqlserver": {
@@ -341,12 +341,4 @@ public static Map<String, Object> defaults(String database, Environment env) {
341341
}
342342
}
343343
}
344-
345-
private static void dataSourceClass(String name, Consumer<String> consumer) {
346-
try {
347-
consumer.accept(Hikari.class.getClassLoader().loadClass(name).getName());
348-
} catch (ClassNotFoundException e) {
349-
// ignore
350-
}
351-
}
352344
}

modules/jooby-hikari/src/test/java/io/jooby/hikari/HikariTest.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class HikariTest {
2020

2121
@Test
2222
public void mem() {
23-
HikariConfig conf = Hikari.builder()
23+
HikariConfig conf = Hikari.create()
2424
.build(new Environment(getClass().getClassLoader(), mapOf("db", "mem"), "test"));
2525
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());
2626
assertEquals("org.h2.jdbcx.JdbcDataSource", conf.getDataSourceClassName());
@@ -35,7 +35,7 @@ public void mem() {
3535

3636
@Test
3737
public void fs() {
38-
HikariConfig conf = Hikari.builder()
38+
HikariConfig conf = Hikari.create()
3939
.build(new Environment(getClass().getClassLoader(),
4040
mapOf("db", "fs", "application.name", "foo", "application.tmpdir", "target"), "test"));
4141
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());
@@ -51,7 +51,7 @@ public void fs() {
5151

5252
@Test
5353
public void dbWithCredentials() {
54-
HikariConfig conf = Hikari.builder()
54+
HikariConfig conf = Hikari.create()
5555
.build(new Environment(getClass().getClassLoader(),
5656
mapOf("db.url", "jdbc:mysql://localhost/db", "db.user", "root", "db.password", ""), "test"));
5757
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());
@@ -66,7 +66,7 @@ public void dbWithCredentials() {
6666

6767
@Test
6868
public void connectionString() {
69-
HikariConfig conf = Hikari.builder()
69+
HikariConfig conf = Hikari.create()
7070
.build(new Environment(getClass().getClassLoader(), mapOf("mydb.user", "root", "mydb.password", ""), "test"),
7171
"jdbc:mysql://localhost/mydb");
7272
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());
@@ -81,7 +81,7 @@ public void connectionString() {
8181

8282
@Test
8383
public void memConnectionString() {
84-
HikariConfig conf = Hikari.builder()
84+
HikariConfig conf = Hikari.create()
8585
.build(new Environment(getClass().getClassLoader(), ConfigFactory.empty(), "test"), "mem");
8686
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());
8787
assertEquals("org.h2.jdbcx.JdbcDataSource", conf.getDataSourceClassName());
@@ -103,7 +103,7 @@ public void multipledb() {
103103
"db.audit.password", "p2",
104104
"hikari.maximumPoolSize", "5",
105105
"hikari.audit.maximumPoolSize", "1"), "test");
106-
HikariConfig db = Hikari.builder().build(env, "db.main");
106+
HikariConfig db = Hikari.create().build(env, "db.main");
107107
assertEquals(5, db.getMaximumPoolSize());
108108
assertEquals("com.mysql.cj.jdbc.MysqlDataSource", db.getDataSourceClassName());
109109
assertEquals(null, db.getJdbcUrl());
@@ -113,7 +113,7 @@ public void multipledb() {
113113
assertEquals("p1", db.getDataSourceProperties().getProperty("password"));
114114
assertEquals("jdbc:mysql://localhost/main", db.getDataSourceProperties().getProperty("url"));
115115

116-
db = Hikari.builder().build(env, "db.audit");
116+
db = Hikari.create().build(env, "db.audit");
117117
assertEquals(1, db.getMaximumPoolSize());
118118
assertEquals("com.mysql.cj.jdbc.MysqlDataSource", db.getDataSourceClassName());
119119
assertEquals(null, db.getJdbcUrl());
@@ -126,7 +126,7 @@ public void multipledb() {
126126

127127
@Test
128128
public void dbUrlWithParams() {
129-
HikariConfig conf = Hikari.builder()
129+
HikariConfig conf = Hikari.create()
130130
.build(new Environment(getClass().getClassLoader(),
131131
mapOf("db.url",
132132
"jdbc:mysql://localhost/db?useEncoding=true&characterEncoding=UTF-8"), "test"));
@@ -143,7 +143,7 @@ public void dbUrlWithParams() {
143143

144144
@Test
145145
public void hikariOptions() {
146-
HikariConfig conf = Hikari.builder()
146+
HikariConfig conf = Hikari.create()
147147
.build(new Environment(getClass().getClassLoader(),
148148
mapOf("db.url", "jdbc:mysql://localhost/db", "hikari.db.maximumPoolSize", "5"), "test"));
149149
assertEquals(5, conf.getMaximumPoolSize());
@@ -158,7 +158,7 @@ public void hikariOptions() {
158158

159159
@Test
160160
public void hikariDefaultOptions() {
161-
HikariConfig conf = Hikari.builder()
161+
HikariConfig conf = Hikari.create()
162162
.build(new Environment(getClass().getClassLoader(),
163163
mapOf("db.url", "jdbc:mysql://localhost/db", "hikari.maximumPoolSize", "5"), "test"));
164164
assertEquals(5, conf.getMaximumPoolSize());
@@ -173,7 +173,7 @@ public void hikariDefaultOptions() {
173173

174174
@Test
175175
public void hikariOverrideOptions() {
176-
HikariConfig conf = Hikari.builder()
176+
HikariConfig conf = Hikari.create()
177177
.build(new Environment(getClass().getClassLoader(),
178178
mapOf("db.url", "jdbc:mysql://localhost/db", "hikari.maximumPoolSize", "5",
179179
"hikari.db.maximumPoolSize", "7"), "test"));
@@ -189,7 +189,7 @@ public void hikariOverrideOptions() {
189189

190190
@Test
191191
public void overrideDataSource() {
192-
HikariConfig conf = Hikari.builder()
192+
HikariConfig conf = Hikari.create()
193193
.build(new Environment(getClass().getClassLoader(),
194194
mapOf("db.url", "jdbc:mysql://localhost/db", "hikari.dataSourceClassName",
195195
"test.MyDS"), "test"));
@@ -204,7 +204,7 @@ public void overrideDataSource() {
204204

205205
@Test
206206
public void noUrlProperty() {
207-
HikariConfig conf = Hikari.builder()
207+
HikariConfig conf = Hikari.create()
208208
.build(new Environment(getClass().getClassLoader(),
209209
mapOf(
210210
"db.host", "localhost",
@@ -224,7 +224,7 @@ public void noUrlProperty() {
224224

225225
@Test
226226
public void log4jdbc() {
227-
HikariConfig conf = Hikari.builder()
227+
HikariConfig conf = Hikari.create()
228228
.build(new Environment(getClass().getClassLoader(),
229229
mapOf("db.url", "jdbc:log4jdbc:mysql://localhost/db"), "test"));
230230
assertEquals(MAX_POOL_SIZE, conf.getMaximumPoolSize());

0 commit comments

Comments
 (0)