Skip to content

Commit dc28b82

Browse files
committed
move generic doWith callback to Jdbc and update dependent modules
1 parent 2cfb98c commit dc28b82

File tree

12 files changed

+98
-157
lines changed

12 files changed

+98
-157
lines changed

jooby-ebean/src/main/java/org/jooby/ebean/Ebeanby.java

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,10 @@
1818
*/
1919
package org.jooby.ebean;
2020

21-
import static java.util.Objects.requireNonNull;
22-
2321
import java.util.Arrays;
2422
import java.util.HashSet;
2523
import java.util.Properties;
2624
import java.util.Set;
27-
import java.util.function.BiConsumer;
28-
import java.util.function.Consumer;
2925

3026
import org.jooby.Env;
3127
import org.jooby.internal.ebean.EbeanEnhancer;
@@ -151,8 +147,6 @@
151147
*/
152148
public class Ebeanby extends Jdbc {
153149

154-
private BiConsumer<ServerConfig, Config> configurer;
155-
156150
private Set<String> packages = new HashSet<>();
157151

158152
/**
@@ -184,28 +178,6 @@ public Ebeanby packages(final String... packages) {
184178
return this;
185179
}
186180

187-
/**
188-
* Callback to programmatically configure a {@link ServerConfig}.
189-
*
190-
* @param configurer Callback.
191-
* @return This module.
192-
*/
193-
public Ebeanby doWith(final Consumer<ServerConfig> configurer) {
194-
requireNonNull(configurer, "Configurer callback is required.");
195-
return doWith((config, conf) -> configurer.accept(config));
196-
}
197-
198-
/**
199-
* Callback to programmatically configure a {@link ServerConfig}.
200-
*
201-
* @param configurer Callback.
202-
* @return This module.
203-
*/
204-
public Ebeanby doWith(final BiConsumer<ServerConfig, Config> configurer) {
205-
this.configurer = requireNonNull(configurer, "Configurer callback is required.");
206-
return this;
207-
}
208-
209181
@Override
210182
public void configure(final Env env, final Config conf, final Binder binder) {
211183
configure(env, conf, binder, (name, ds) -> {
@@ -237,9 +209,7 @@ public void configure(final Env env, final Config conf, final Binder binder) {
237209
config.setDefaultServer(cprops.getBoolean("defaultServer"));
238210
config.setRegister(cprops.getBoolean("register"));
239211

240-
if (configurer != null) {
241-
configurer.accept(config, conf);
242-
}
212+
callback(config, conf);
243213

244214
EbeanManaged server = new EbeanManaged(conf, config);
245215
env.onStart(server::start);

jooby-ebean/src/test/java/org/jooby/ebean/EbeanbyTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public void configureCallback() throws Exception {
135135
.expect(onStop)
136136
.run(unit -> {
137137
new Ebeanby()
138-
.doWith(conf -> {
138+
.doWith((final ServerConfig conf) -> {
139139
conf.setName("xx");
140140
})
141141
.configure(unit.get(Env.class), config(), unit.get(Binder.class));

jooby-hbm/src/main/java/org/jooby/hbm/Hbm.java

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
*/
1919
package org.jooby.hbm;
2020

21-
import static java.util.Objects.requireNonNull;
22-
2321
import java.net.URL;
2422
import java.util.ArrayList;
2523
import java.util.Arrays;
@@ -28,7 +26,6 @@
2826
import java.util.Map;
2927
import java.util.function.BiConsumer;
3028
import java.util.function.Consumer;
31-
import java.util.function.Function;
3229
import java.util.stream.Collectors;
3330

3431
import javax.inject.Provider;
@@ -63,13 +60,11 @@
6360
import org.jooby.internal.hbm.UnitOfWorkProvider;
6461
import org.jooby.jdbc.Jdbc;
6562

66-
import com.google.common.base.Throwables;
6763
import com.google.inject.Binder;
6864
import com.typesafe.config.Config;
6965
import com.typesafe.config.ConfigFactory;
7066

7167
import javaslang.concurrent.Promise;
72-
import javaslang.control.Try;
7368

7469
/**
7570
* <h1>hibernate</h1>
@@ -335,25 +330,12 @@
335330
*/
336331
public class Hbm extends Jdbc {
337332

338-
private static final Function<? super Throwable, ? extends Try<? extends Void>> CCE = x -> {
339-
if (x instanceof ClassCastException) {
340-
StackTraceElement src = x.getStackTrace()[0];
341-
if (src.getClassName().equals(Hbm.class.getName())) {
342-
return Try.success(null);
343-
}
344-
}
345-
return Try.failure(x);
346-
};
347-
348333
private List<BiConsumer<SessionFactoryImplementor, Registry>> listeners = new ArrayList<>();
349334

350335
private List<Consumer<Binder>> bindings = new ArrayList<>();
351336

352337
private List<BiConsumer<MetadataSources, Config>> sources = new ArrayList<>();
353338

354-
@SuppressWarnings("rawtypes")
355-
private List<BiConsumer> callback = new ArrayList<>();
356-
357339
/**
358340
* Creates a new {@link Hbm} module.
359341
*
@@ -466,8 +448,9 @@ public <T> Hbm onEvent(final EventType<T> type, final Class<? extends T> listene
466448
* @param configurer Configurer callback.
467449
* @return This module
468450
*/
451+
@Override
469452
public <T> Hbm doWith(final BiConsumer<T, Config> configurer) {
470-
this.callback.add(requireNonNull(configurer, "Configurer required."));
453+
super.doWith(configurer);
471454
return this;
472455
}
473456

@@ -490,9 +473,10 @@ public <T> Hbm doWith(final BiConsumer<T, Config> configurer) {
490473
* @param configurer Configurer callback.
491474
* @return This module
492475
*/
476+
@Override
493477
public <T> Hbm doWith(final Consumer<T> configurer) {
494-
requireNonNull(configurer, "Configurer required.");
495-
return doWith((final T b, final Config c) -> configurer.accept(b));
478+
super.doWith(configurer);
479+
return this;
496480
}
497481

498482
@Override
@@ -578,13 +562,6 @@ public Config config() {
578562
return ConfigFactory.parseResources(getClass(), "hbm.conf").withFallback(super.config());
579563
}
580564

581-
@SuppressWarnings("unchecked")
582-
protected void callback(final Object value, final Config conf) {
583-
this.callback.forEach(it -> Try.run(() -> it.accept(value, conf))
584-
.recoverWith(CCE)
585-
.getOrElseThrow(Throwables::propagate));
586-
}
587-
588565
private static Map<Object, Object> settings(final Env env, final Config config) {
589566
Map<Object, Object> $ = new HashMap<>();
590567
config.getConfig("hibernate")

jooby-hbm/src/test/java/org/jooby/hbm/HbmTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ public void withEvent() throws Exception {
306306
SessionFactoryImplementor sf = unit.get(SessionFactoryImplementor.class);
307307
expect(sf.getServiceRegistry()).andReturn(sri);
308308
})
309-
.expect(unit-> {
309+
.expect(unit -> {
310310
AnnotatedBindingBuilder abb = unit.mock(AnnotatedBindingBuilder.class);
311311
abb.asEagerSingleton();
312312

jooby-jdbc/src/main/java/org/jooby/jdbc/Jdbc.java

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.common.base.Preconditions.checkArgument;
2222
import static java.util.Objects.requireNonNull;
2323

24+
import java.util.ArrayList;
2425
import java.util.Arrays;
2526
import java.util.HashMap;
2627
import java.util.List;
@@ -40,6 +41,7 @@
4041

4142
import com.google.common.base.CharMatcher;
4243
import com.google.common.base.Splitter;
44+
import com.google.common.base.Throwables;
4345
import com.google.inject.Binder;
4446
import com.typesafe.config.Config;
4547
import com.typesafe.config.ConfigFactory;
@@ -217,6 +219,16 @@
217219
*/
218220
public class Jdbc implements Jooby.Module {
219221

222+
static final Function<? super Throwable, ? extends Try<? extends Void>> CCE = x -> {
223+
if (x instanceof ClassCastException) {
224+
StackTraceElement src = x.getStackTrace()[0];
225+
if (src.getFileName() == null || src.getClassName().equals(Jdbc.class.getName())) {
226+
return Try.success(null);
227+
}
228+
}
229+
return Try.failure(x);
230+
};
231+
220232
public static Function<String, String> DB_NAME = url -> {
221233
BiFunction<String, String, Tuple2<String, Map<String, String>>> indexOf = (str, token) -> {
222234
int i = str.indexOf(token);
@@ -240,7 +252,8 @@ public class Jdbc implements Jooby.Module {
240252
.orElse(parts.get(parts.size() - 1)));
241253
};
242254

243-
private BiConsumer<HikariConfig, Config> conf;
255+
@SuppressWarnings("rawtypes")
256+
private final List<BiConsumer> callback = new ArrayList<>();
244257

245258
private final String dbref;
246259

@@ -266,25 +279,51 @@ public Jdbc() {
266279
}
267280

268281
/**
269-
* Programmatically configure a {@link HikariConfig}.
282+
* Configurer callback to apply advanced configuration while bootstrapping hibernate:
283+
*
284+
* <pre>{@code
285+
* {
286+
* use(new Jdbc()
287+
* .doWith((HikariConfig conf) -> {
288+
* // do with conf
289+
* })
290+
* .doWith((HikariDataSource ds) -> {
291+
* // do with ds
292+
* })
293+
* );
294+
* }
295+
* }</pre>
270296
*
271-
* @param conf Configurer callback.
272-
* @return This module.
297+
* @param configurer Configurer callback.
298+
* @return This module
273299
*/
274-
public Jdbc doWithHikari(final BiConsumer<HikariConfig, Config> conf) {
275-
this.conf = requireNonNull(conf, "Configurer required.");
300+
public <T> Jdbc doWith(final BiConsumer<T, Config> configurer) {
301+
this.callback.add(requireNonNull(configurer, "Configurer required."));
276302
return this;
277303
}
278304

279305
/**
280-
* Programmatically configure a {@link HikariConfig}.
306+
* Configurer callback to apply advanced configuration while bootstrapping hibernate:
307+
*
308+
* <pre>{@code
309+
* {
310+
* use(new Jdbc()
311+
* .doWith((HikariConfig conf) -> {
312+
* // do with conf
313+
* })
314+
* .doWith((HikariDataSource ds) -> {
315+
* // do with ds
316+
* })
317+
* );
318+
* }
319+
* }</pre>
281320
*
282-
* @param conf Configurer callback.
283-
* @return This module.
321+
* @param configurer Configurer callback.
322+
* @return This module
284323
*/
285-
public Jdbc doWithHikari(final Consumer<HikariConfig> conf) {
286-
requireNonNull(conf, "Configurer required.");
287-
return doWithHikari((h, c) -> conf.accept(h));
324+
public <T> Jdbc doWith(final Consumer<T> configurer) {
325+
requireNonNull(configurer, "Configurer required.");
326+
return doWith((final T b, final Config c) -> configurer.accept(b));
288327
}
289328

290329
@Override
@@ -294,7 +333,7 @@ public void configure(final Env env, final Config config, final Binder binder) {
294333
}
295334

296335
protected void configure(final Env env, final Config config, final Binder binder,
297-
final BiConsumer<String, HikariDataSource> callback) {
336+
final BiConsumer<String, HikariDataSource> extensions) {
298337
Config dbconf;
299338
String url, dbname, dbkey;
300339
boolean seturl = false;
@@ -318,12 +357,10 @@ protected void configure(final Env env, final Config config, final Binder binder
318357
props.setProperty("url", url);
319358
}
320359

321-
if (conf != null) {
322-
conf.accept(hikariConf, config);
323-
}
324-
325360
HikariDataSource ds = new HikariDataSource(hikariConf);
326-
callback.accept(dbname, ds);
361+
callback(ds, config);
362+
363+
extensions.accept(dbname, ds);
327364

328365
env.serviceKey()
329366
.generate(DataSource.class, dbname, k -> binder.bind(k).toInstance(ds));
@@ -415,6 +452,13 @@ private HikariConfig hikariConfig(final String url, final String key, final Stri
415452
return new HikariConfig(props);
416453
}
417454

455+
@SuppressWarnings("unchecked")
456+
protected void callback(final Object value, final Config conf) {
457+
this.callback.forEach(it -> Try.run(() -> it.accept(value, conf))
458+
.recoverWith(CCE)
459+
.getOrElseThrow(Throwables::propagate));
460+
}
461+
418462
private Optional<String> dbtype(final String url, final Config config) {
419463
String type = Arrays.stream(url.toLowerCase().split(":"))
420464
.filter(token -> !(token.equals("jdbc") || token.equals("jtds")))

jooby-jdbc/src/test/java/org/jooby/jdbc/JdbcTest.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.typesafe.config.ConfigValueFactory.fromAnyRef;
44
import static org.easymock.EasyMock.expect;
5+
import static org.junit.Assert.assertEquals;
56

67
import java.util.Properties;
78

@@ -100,6 +101,22 @@ public void fsdb() throws Exception {
100101
});
101102
}
102103

104+
@Test
105+
public void cceExceptionInSource() throws Exception {
106+
ClassCastException cce = new ClassCastException();
107+
StackTraceElement e = new StackTraceElement(Jdbc.class.getName(), "accept", null, 0);
108+
cce.setStackTrace(new StackTraceElement[]{e });
109+
assertEquals(true, Jdbc.CCE.apply(cce).isSuccess());
110+
}
111+
112+
@Test
113+
public void cceExceptionWithoutSource() throws Exception {
114+
ClassCastException cce = new ClassCastException();
115+
StackTraceElement e = new StackTraceElement(JdbcTest.class.getName(), "accept", null, 0);
116+
cce.setStackTrace(new StackTraceElement[]{e });
117+
assertEquals(true, Jdbc.CCE.apply(cce).isSuccess());
118+
}
119+
103120
@Test
104121
public void dbWithCallback() throws Exception {
105122
Config config = ConfigFactory.parseResources(getClass(), "jdbc.conf");
@@ -117,12 +134,12 @@ public void dbWithCallback() throws Exception {
117134
.expect(serviceKey("jdbctest"))
118135
.expect(onStop)
119136
.expect(unit -> {
120-
HikariConfig h = unit.get(HikariConfig.class);
137+
HikariDataSource h = unit.get(HikariDataSource.class);
121138
h.setAllowPoolSuspension(true);
122139
})
123140
.run(unit -> {
124141
new Jdbc()
125-
.doWithHikari(h -> {
142+
.doWith((final HikariConfig h) -> {
126143
h.setAllowPoolSuspension(true);
127144
})
128145
.configure(unit.get(Env.class), dbconf, unit.get(Binder.class));

0 commit comments

Comments
 (0)