Skip to content

Commit abb8c1f

Browse files
committed
ITA-562 Add (back) jdbi2 support for legacy applications
To be able to efficiently service applications using the servicebuilder without rewriting all dao classes we reintroduced jdbi2 with deprecation warnings.
1 parent c9265ac commit abb8c1f

File tree

10 files changed

+349
-98
lines changed

10 files changed

+349
-98
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ The code is tailored specific for our needs, it is dependent on our libraries an
4242

4343
## Version 10
4444
###### Breaking changes
45-
* Removed support for JDBI2
45+
* ~~Removed~~ Deprecated JDBI2 (it was removed in 10.0.0, but reintroduced in 10.1)
4646
###### New features
4747
* Added support for JDBI3

servicebuilder-addons/src/main/java/no/obos/util/servicebuilder/Addons.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,16 @@ public static H2InMemoryDatasourceAddon h2InMemoryDatasource() {
6666
</dependency>
6767
*/
6868
public static JdbiAddon jdbi() {
69-
return JdbiAddon.defaults;
69+
return jdbi3();
70+
}
71+
72+
@Deprecated
73+
public static JdbiAddon jdbi2() {
74+
return Jdbi2Addon.defaults;
75+
}
76+
77+
public static JdbiAddon jdbi3() {
78+
return Jdbi3Addon.defaults;
7079
}
7180

7281
/*

servicebuilder-db-jdbi/pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@
2727
<groupId>org.jdbi</groupId>
2828
<artifactId>jdbi3-sqlobject</artifactId>
2929
</dependency>
30-
30+
<dependency>
31+
<groupId>org.jdbi</groupId>
32+
<artifactId>jdbi</artifactId>
33+
<version>2.78</version>
34+
</dependency>
3135

3236
<dependency>
3337
<groupId>no.obos.util</groupId>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package no.obos.util.servicebuilder.addon;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableSet;
5+
import lombok.Getter;
6+
import lombok.experimental.Wither;
7+
import no.obos.util.servicebuilder.JerseyConfig;
8+
import no.obos.util.servicebuilder.ServiceConfig;
9+
import no.obos.util.servicebuilder.model.Addon;
10+
import no.obos.util.servicebuilder.util.GuavaHelper;
11+
import no.obos.util.servicebuilder.util.JdbiAddonUtil;
12+
import org.jdbi.v3.core.Jdbi;
13+
import org.skife.jdbi.v2.DBI;
14+
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
15+
16+
import javax.sql.DataSource;
17+
import java.util.Set;
18+
19+
@Deprecated
20+
public class Jdbi2Addon implements JdbiAddon {
21+
22+
public static final JdbiAddon defaults =
23+
new Jdbi2Addon(null, null, ImmutableList.of());
24+
@Getter
25+
@Wither
26+
final String name;
27+
@Wither
28+
final DBI dbi;
29+
@Wither
30+
final ImmutableList<Class<?>> daos;
31+
32+
private Jdbi2Addon(String name, DBI dbi, ImmutableList<Class<?>> daos) {
33+
this.name = name;
34+
this.dbi = dbi;
35+
this.daos = daos;
36+
}
37+
38+
39+
public Addon initialize(ServiceConfig serviceConfig)
40+
{
41+
DataSource dataSource = JdbiAddonUtil.getDataSource(this, serviceConfig, name);
42+
DBI dbi = new DBI(dataSource);
43+
return this.dbi(dbi);
44+
}
45+
46+
47+
@Override
48+
public void addToJerseyConfig(JerseyConfig jerseyConfig) {
49+
jerseyConfig.addBinder(binder -> {
50+
if (name != null) {
51+
binder.bind(dbi).to(DBI.class).named(name);
52+
binder.bind(this).to(Jdbi2Addon.class).named(name);
53+
} else {
54+
binder.bind(dbi).to(DBI.class);
55+
binder.bind(this).to(Jdbi2Addon.class);
56+
}
57+
58+
daos.forEach(clazz ->
59+
binder.bindFactory(new DaoFactory(null, dbi, clazz)).to(clazz)
60+
);
61+
62+
});
63+
}
64+
65+
@Override
66+
public <T> T createDao(Class<T> requiredType) {
67+
return dbi.onDemand(requiredType);
68+
}
69+
70+
@Override
71+
public Set<Class<?>> initializeAfter() {
72+
return ImmutableSet.of(DataSourceAddon.class);
73+
}
74+
75+
public JdbiAddon dao(Class<?> dao) {
76+
return withDaos(GuavaHelper.plus(daos, dao));
77+
}
78+
79+
public JdbiAddon name(String name) {
80+
return withName(name);
81+
}
82+
83+
@Override
84+
public JdbiAddon jdbi(Jdbi jdbi) {
85+
throw new NotImplementedException();
86+
}
87+
88+
public JdbiAddon dbi(DBI dbi) {
89+
return withDbi(dbi);
90+
}
91+
92+
93+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package no.obos.util.servicebuilder.addon;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableSet;
5+
import lombok.Getter;
6+
import lombok.experimental.Wither;
7+
import no.obos.util.servicebuilder.JerseyConfig;
8+
import no.obos.util.servicebuilder.ServiceConfig;
9+
import no.obos.util.servicebuilder.model.Addon;
10+
import no.obos.util.servicebuilder.util.GuavaHelper;
11+
import no.obos.util.servicebuilder.util.JdbiAddonUtil;
12+
import org.jdbi.v3.core.Jdbi;
13+
import org.jdbi.v3.sqlobject.SqlObjectPlugin;
14+
import org.skife.jdbi.v2.DBI;
15+
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
16+
17+
import javax.sql.DataSource;
18+
import java.util.Set;
19+
20+
public class Jdbi3Addon implements JdbiAddon {
21+
22+
public static final JdbiAddon defaults =
23+
new Jdbi3Addon(null, null, ImmutableList.of());
24+
@Getter
25+
@Wither
26+
final String name;
27+
@Wither
28+
final Jdbi jdbi;
29+
@Wither
30+
final ImmutableList<Class<?>> daos;
31+
32+
private Jdbi3Addon(String name, Jdbi jdbi, ImmutableList<Class<?>> daos) {
33+
this.name = name;
34+
this.jdbi = jdbi;
35+
this.daos = daos;
36+
}
37+
38+
39+
@Override
40+
public void addToJerseyConfig(JerseyConfig jerseyConfig) {
41+
jerseyConfig.addBinder(binder -> {
42+
if (name != null) {
43+
binder.bind(jdbi).to(Jdbi.class).named(name);
44+
binder.bind(this).to(Jdbi3Addon.class).named(name);
45+
} else {
46+
binder.bind(jdbi).to(Jdbi.class);
47+
binder.bind(this).to(Jdbi3Addon.class);
48+
}
49+
50+
daos.forEach(clazz ->
51+
binder.bindFactory(new DaoFactory(jdbi, null, clazz)).to(clazz)
52+
);
53+
54+
});
55+
}
56+
57+
public Addon initialize(ServiceConfig serviceConfig)
58+
{
59+
DataSource dataSource = JdbiAddonUtil.getDataSource(this, serviceConfig, name);
60+
Jdbi jdbi = Jdbi.create(dataSource);
61+
SqlObjectPlugin sqlObjectPlugin = new SqlObjectPlugin();
62+
sqlObjectPlugin.customizeJdbi(jdbi);
63+
return this.jdbi(jdbi);
64+
}
65+
66+
public <T> T createDao(Class<T> requiredType) {
67+
return jdbi.onDemand(requiredType);
68+
}
69+
70+
@Override
71+
public Set<Class<?>> initializeAfter() {
72+
return ImmutableSet.of(DataSourceAddon.class);
73+
}
74+
75+
public JdbiAddon dao(Class<?> dao) {
76+
return withDaos(GuavaHelper.plus(daos, dao));
77+
}
78+
79+
public JdbiAddon name(String name) {
80+
return withName(name);
81+
}
82+
83+
@Override
84+
public JdbiAddon dbi(DBI dbi) {
85+
throw new NotImplementedException();
86+
}
87+
88+
public JdbiAddon jdbi(Jdbi jdbi) {
89+
return withJdbi(jdbi);
90+
}
91+
}
Lines changed: 25 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,59 @@
11
package no.obos.util.servicebuilder.addon;
22

3-
import com.google.common.collect.ImmutableList;
4-
import com.google.common.collect.ImmutableSet;
5-
import lombok.AccessLevel;
63
import lombok.AllArgsConstructor;
7-
import lombok.Getter;
8-
import lombok.experimental.Wither;
94
import no.obos.util.servicebuilder.JerseyConfig;
105
import no.obos.util.servicebuilder.ServiceConfig;
11-
import no.obos.util.servicebuilder.exception.DependenceException;
126
import no.obos.util.servicebuilder.model.Addon;
13-
import no.obos.util.servicebuilder.util.GuavaHelper;
147
import org.glassfish.hk2.api.Factory;
158
import org.jdbi.v3.core.Jdbi;
16-
import org.jdbi.v3.sqlobject.SqlObjectPlugin;
9+
import org.skife.jdbi.v2.DBI;
1710

18-
import javax.sql.DataSource;
1911
import java.util.Set;
2012

21-
@AllArgsConstructor(access = AccessLevel.PRIVATE)
22-
public class JdbiAddon implements NamedAddon {
2313

24-
@Getter
25-
@Wither(AccessLevel.PRIVATE)
26-
public final String name;
27-
@Wither(AccessLevel.PRIVATE)
28-
public final Jdbi jdbi;
29-
@Wither(AccessLevel.PRIVATE)
30-
public final ImmutableList<Class<?>> daos;
14+
public interface JdbiAddon extends NamedAddon {
15+
16+
JdbiAddon defaults = Jdbi3Addon.defaults;
3117

32-
public static final JdbiAddon defaults =
33-
new JdbiAddon(null, null, ImmutableList.of());
3418

3519
@Override
36-
public Addon initialize(ServiceConfig serviceConfig) {
37-
DataSourceAddon dataSourceAddon = serviceConfig.addonInstanceNamed(DataSourceAddon.class, name);
38-
if (dataSourceAddon == null) {
39-
if (name == null) {
40-
throw new DependenceException(this.getClass(), DataSourceAddon.class, " no unnamed datasourceaddon found");
41-
} else {
42-
throw new DependenceException(this.getClass(), DataSourceAddon.class, " no datasourceaddon for name " + name);
43-
}
44-
}
45-
DataSource dataSource = dataSourceAddon.getDataSource();
46-
Jdbi jdbi = Jdbi.create(dataSource);
47-
SqlObjectPlugin sqlObjectPlugin = new SqlObjectPlugin();
48-
sqlObjectPlugin.customizeJdbi(jdbi);
49-
return this.jdbi(jdbi);
50-
}
20+
Addon initialize(ServiceConfig serviceConfig);
5121

5222
@Override
53-
public void addToJerseyConfig(JerseyConfig jerseyConfig) {
54-
jerseyConfig.addBinder(binder -> {
55-
if (name != null) {
56-
binder.bind(jdbi).to(Jdbi.class).named(name);
57-
binder.bind(this).to(JdbiAddon.class).named(name);
58-
} else {
59-
binder.bind(jdbi).to(Jdbi.class);
60-
binder.bind(this).to(JdbiAddon.class);
61-
}
23+
void addToJerseyConfig(JerseyConfig jerseyConfig);
6224

63-
daos.forEach(clazz ->
64-
binder.bindFactory(new DaoFactory(jdbi, clazz)).to(clazz)
65-
);
25+
<T> T createDao(Class<T> requiredType);
26+
27+
@Override
28+
Set<Class<?>> initializeAfter();
29+
30+
JdbiAddon dao(Class<?> dao);
31+
32+
JdbiAddon name(String name);
33+
34+
JdbiAddon dbi(DBI dbi);
35+
36+
JdbiAddon jdbi(Jdbi jdbi);
6637

67-
});
68-
}
6938

7039
@AllArgsConstructor
71-
public static class DaoFactory implements Factory<Object> {
40+
class DaoFactory implements Factory<Object> {
7241

7342
final Jdbi jdbi;
43+
final DBI dbi;
7444
final Class<?> clazz;
7545

7646
public Object provide() {
77-
return jdbi.onDemand(clazz);
47+
if (jdbi != null) {
48+
return jdbi.onDemand(clazz);
49+
} else {
50+
return dbi.onDemand(clazz);
51+
}
7852
}
7953

8054
@Override
8155
public void dispose(Object instance) {
8256

8357
}
8458
}
85-
86-
public <T> T createDao(Class<T> requiredType) {
87-
return jdbi.onDemand(requiredType);
88-
}
89-
90-
91-
@Override
92-
public Set<Class<?>> initializeAfter() {
93-
return ImmutableSet.of(DataSourceAddon.class);
94-
}
95-
96-
public JdbiAddon dao(Class<?> dao) {
97-
return withDaos(GuavaHelper.plus(daos, dao));
98-
}
99-
100-
public JdbiAddon name(String name) {
101-
return withName(name);
102-
}
103-
104-
public JdbiAddon jdbi(Jdbi jdbi) {
105-
return withJdbi(jdbi);
106-
}
10759
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package no.obos.util.servicebuilder.util;
2+
3+
import no.obos.util.servicebuilder.ServiceConfig;
4+
import no.obos.util.servicebuilder.addon.DataSourceAddon;
5+
import no.obos.util.servicebuilder.addon.JdbiAddon;
6+
import no.obos.util.servicebuilder.exception.DependenceException;
7+
8+
import javax.sql.DataSource;
9+
10+
11+
public abstract class JdbiAddonUtil {
12+
13+
public static DataSource getDataSource(JdbiAddon jdbiAddon, ServiceConfig serviceConfig, String name) {
14+
DataSourceAddon dataSourceAddon = serviceConfig.addonInstanceNamed(DataSourceAddon.class, name);
15+
if (dataSourceAddon == null) {
16+
if (name == null) {
17+
throw new DependenceException(jdbiAddon.getClass(), DataSourceAddon.class, " no unnamed datasourceaddon found");
18+
} else {
19+
throw new DependenceException(jdbiAddon.getClass(), DataSourceAddon.class, " no datasourceaddon for name " + name);
20+
}
21+
}
22+
return dataSourceAddon.getDataSource();
23+
}
24+
25+
}

0 commit comments

Comments
 (0)