Skip to content
This repository was archived by the owner on Oct 24, 2020. It is now read-only.

Commit 44efa52

Browse files
committed
Add the DataSourceNameResolver class and the DataSourceResolver class
1 parent 7d49eef commit 44efa52

File tree

8 files changed

+202
-30
lines changed

8 files changed

+202
-30
lines changed

deployment/src/main/java/org/seasar/doma/quarkus/deployment/DomaProcessor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.seasar.doma.jdbc.Config;
3232
import org.seasar.doma.jdbc.criteria.Entityql;
3333
import org.seasar.doma.jdbc.criteria.NativeSql;
34+
import org.seasar.doma.quarkus.runtime.DataSourceNameResolver;
35+
import org.seasar.doma.quarkus.runtime.DataSourceResolver;
3436
import org.seasar.doma.quarkus.runtime.DomaConfig;
3537
import org.seasar.doma.quarkus.runtime.DomaProducer;
3638
import org.seasar.doma.quarkus.runtime.DomaRecorder;
@@ -54,7 +56,9 @@ AdditionalBeanBuildItem additionalBeans() {
5456
DomaProducer.class,
5557
JtaRequiresNewController.class,
5658
ScriptExecutor.class,
57-
UnsupportedTransactionManager.class);
59+
UnsupportedTransactionManager.class,
60+
DataSourceNameResolver.DefaultDataSourceNameResolver.class,
61+
DataSourceResolver.DefaultDataSourceResolver.class);
5862
}
5963

6064
@BuildStep
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.seasar.doma.quarkus.deployment;
2+
3+
import javax.inject.Inject;
4+
import javax.ws.rs.GET;
5+
import javax.ws.rs.Path;
6+
import javax.ws.rs.PathParam;
7+
import javax.ws.rs.Produces;
8+
import javax.ws.rs.core.MediaType;
9+
import org.seasar.doma.jdbc.Config;
10+
11+
@Path("/{tenant}")
12+
public class DataSourceResolverResource {
13+
14+
@Inject Config config;
15+
16+
@GET
17+
@Path("/{id}")
18+
@Produces(MediaType.TEXT_PLAIN)
19+
public String name(@PathParam("id") int id) throws Exception {
20+
var dataSource = config.getDataSource();
21+
try (var connection = dataSource.getConnection()) {
22+
try (var statement = connection.createStatement()) {
23+
try (var resultSet = statement.executeQuery("select name from employee")) {
24+
if (resultSet.next()) {
25+
return resultSet.getString(1);
26+
}
27+
throw new IllegalStateException("empty");
28+
}
29+
}
30+
}
31+
}
32+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.seasar.doma.quarkus.deployment;
2+
3+
import static org.hamcrest.core.Is.is;
4+
5+
import io.quarkus.arc.Unremovable;
6+
import io.quarkus.datasource.common.runtime.DataSourceUtil;
7+
import io.quarkus.test.QuarkusUnitTest;
8+
import io.restassured.RestAssured;
9+
import io.vertx.ext.web.RoutingContext;
10+
import javax.enterprise.context.RequestScoped;
11+
import javax.inject.Inject;
12+
import org.jboss.shrinkwrap.api.ShrinkWrap;
13+
import org.jboss.shrinkwrap.api.asset.StringAsset;
14+
import org.jboss.shrinkwrap.api.spec.JavaArchive;
15+
import org.junit.jupiter.api.Test;
16+
import org.junit.jupiter.api.extension.RegisterExtension;
17+
import org.seasar.doma.quarkus.runtime.DataSourceNameResolver;
18+
19+
public class DataSourceResolverTest {
20+
21+
@RegisterExtension
22+
static QuarkusUnitTest runner =
23+
new QuarkusUnitTest()
24+
.setArchiveProducer(
25+
() ->
26+
ShrinkWrap.create(JavaArchive.class)
27+
.add(
28+
new StringAsset(
29+
"quarkus.datasource.db-kind=h2\n"
30+
+ "quarkus.datasource.username=USERNAME-NAMED\n"
31+
+ "quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:testing_default\n"
32+
+ "quarkus.datasource.jdbc.driver=org.h2.Driver\n"
33+
+ "quarkus.datasource.sales.db-kind=h2\n"
34+
+ "quarkus.datasource.sales.username=USERNAME-NAMED\n"
35+
+ "quarkus.datasource.sales.jdbc.url=jdbc:h2:tcp://localhost/mem:testing_sales\n"
36+
+ "quarkus.datasource.sales.jdbc.driver=org.h2.Driver\n"
37+
+ "quarkus.doma.sql-load-script=import.sql\n"
38+
+ "quarkus.doma.sales.sql-load-script=import_sales.sql\n"
39+
+ "quarkus.doma.log.sql=true\n"),
40+
"application.properties")
41+
.addAsResource("import.sql")
42+
.addAsResource("import_sales.sql")
43+
.addClass(DataSourceResolverResource.class)
44+
.addClass(TenantResolver.class));
45+
46+
@RequestScoped
47+
@Unremovable
48+
static class TenantResolver implements DataSourceNameResolver {
49+
50+
@Inject RoutingContext context;
51+
52+
@Override
53+
public String resolve(String candidateName) {
54+
var path = context.request().path();
55+
var parts = path.split("/");
56+
if (parts.length == 0) {
57+
throw new IllegalStateException("parts.length == 0");
58+
}
59+
var dataSourceName = parts[1];
60+
if (dataSourceName == null || dataSourceName.equals("default")) {
61+
return DataSourceUtil.DEFAULT_DATASOURCE_NAME;
62+
}
63+
return dataSourceName;
64+
}
65+
}
66+
67+
@Test
68+
void test() {
69+
RestAssured.when().get("/default/1").then().body(is("aaa"));
70+
RestAssured.when().get("/sales/1").then().body(is("aaa_sales"));
71+
}
72+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
create table employee (id int, name varchar(10));
2-
insert into employee (id, name) values (1, 'aaa');
3-
insert into employee (id, name) values (2, 'bbb');
2+
insert into employee (id, name) values (1, 'aaa_sales');
3+
insert into employee (id, name) values (2, 'bbb_sales');
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.seasar.doma.quarkus.runtime;
2+
3+
import io.quarkus.arc.DefaultBean;
4+
import io.quarkus.arc.Unremovable;
5+
import java.util.Objects;
6+
import javax.inject.Singleton;
7+
8+
public interface DataSourceNameResolver {
9+
10+
String resolve(String candidateName);
11+
12+
@Singleton
13+
@DefaultBean
14+
@Unremovable
15+
class DefaultDataSourceNameResolver implements DataSourceNameResolver {
16+
17+
@Override
18+
public String resolve(String candidateName) {
19+
return Objects.requireNonNull(candidateName);
20+
}
21+
}
22+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.seasar.doma.quarkus.runtime;
2+
3+
import io.quarkus.agroal.runtime.DataSources;
4+
import io.quarkus.arc.DefaultBean;
5+
import io.quarkus.arc.Unremovable;
6+
import java.util.Objects;
7+
import javax.inject.Inject;
8+
import javax.inject.Singleton;
9+
import javax.sql.DataSource;
10+
11+
public interface DataSourceResolver {
12+
13+
DataSource resolve(String dataSourceName);
14+
15+
@Singleton
16+
@DefaultBean
17+
@Unremovable
18+
class DefaultDataSourceResolver implements DataSourceResolver {
19+
20+
private final DataSources dataSources;
21+
22+
@Inject
23+
public DefaultDataSourceResolver(DataSources dataSources) {
24+
this.dataSources = Objects.requireNonNull(dataSources);
25+
}
26+
27+
@Override
28+
public DataSource resolve(String dataSourceName) {
29+
Objects.requireNonNull(dataSourceName);
30+
return dataSources.getDataSource(dataSourceName);
31+
}
32+
}
33+
}

runtime/src/main/java/org/seasar/doma/quarkus/runtime/DomaConfig.java

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.seasar.doma.quarkus.runtime;
22

33
import java.util.Objects;
4+
import java.util.function.Supplier;
45
import javax.sql.DataSource;
56
import org.seasar.doma.jdbc.ClassHelper;
67
import org.seasar.doma.jdbc.CommandImplementors;
@@ -21,7 +22,8 @@
2122

2223
public class DomaConfig implements Config {
2324

24-
private final DataSource dataSource;
25+
private final Supplier<String> dataSourceNameSupplier;
26+
private final DataSourceResolver dataSourceResolver;
2527
private final Dialect dialect;
2628
private final SqlFileRepository sqlFileRepository;
2729
private final ScriptFileLoader scriptFileLoader;
@@ -37,14 +39,14 @@ public class DomaConfig implements Config {
3739
private final Commenter commenter;
3840
private final EntityListenerProvider entityListenerProvider;
3941
private final TransactionManager transactionManager;
40-
private final String dataSourceName;
4142
private final int batchSize;
4243
private final int fetchSize;
4344
private final int maxRows;
4445
private final int queryTimeout;
4546

4647
public DomaConfig(
47-
DataSource dataSource,
48+
Supplier<String> dataSourceNameSupplier,
49+
DataSourceResolver dataSourceResolver,
4850
Dialect dialect,
4951
SqlFileRepository sqlFileRepository,
5052
ScriptFileLoader scriptFileLoader,
@@ -60,12 +62,12 @@ public DomaConfig(
6062
Commenter commenter,
6163
EntityListenerProvider entityListenerProvider,
6264
TransactionManager transactionManager,
63-
String dataSourceName,
6465
int batchSize,
6566
int fetchSize,
6667
int maxRows,
6768
int queryTimeout) {
68-
this.dataSource = Objects.requireNonNull(dataSource);
69+
this.dataSourceNameSupplier = Objects.requireNonNull(dataSourceNameSupplier);
70+
this.dataSourceResolver = Objects.requireNonNull(dataSourceResolver);
6971
this.dialect = Objects.requireNonNull(dialect);
7072
this.sqlFileRepository = Objects.requireNonNull(sqlFileRepository);
7173
this.scriptFileLoader = Objects.requireNonNull(scriptFileLoader);
@@ -81,21 +83,28 @@ public DomaConfig(
8183
this.commenter = Objects.requireNonNull(commenter);
8284
this.entityListenerProvider = Objects.requireNonNull(entityListenerProvider);
8385
this.transactionManager = Objects.requireNonNull(transactionManager);
84-
this.dataSourceName = Objects.requireNonNull(dataSourceName);
8586
this.batchSize = batchSize;
8687
this.fetchSize = fetchSize;
8788
this.maxRows = maxRows;
8889
this.queryTimeout = queryTimeout;
8990
}
9091

92+
public Supplier<String> getDataSourceNameSupplier() {
93+
return dataSourceNameSupplier;
94+
}
95+
96+
public DataSourceResolver getDataSourceResolver() {
97+
return dataSourceResolver;
98+
}
99+
91100
@Override
92101
public Dialect getDialect() {
93102
return dialect;
94103
}
95104

96105
@Override
97106
public DataSource getDataSource() {
98-
return dataSource;
107+
return dataSourceResolver.resolve(dataSourceNameSupplier.get());
99108
}
100109

101110
@Override
@@ -170,7 +179,7 @@ public EntityListenerProvider getEntityListenerProvider() {
170179

171180
@Override
172181
public String getDataSourceName() {
173-
return dataSourceName;
182+
return dataSourceNameSupplier.get();
174183
}
175184

176185
@Override
@@ -197,10 +206,11 @@ public static Builder builder() {
197206
return new Builder();
198207
}
199208

200-
public static Builder builder(Config config) {
209+
public static Builder builder(DomaConfig config) {
201210
Objects.requireNonNull(config);
202211
var builder = new Builder();
203-
builder.setDataSource(config.getDataSource());
212+
builder.setDataSourceNameSupplier(config.getDataSourceNameSupplier());
213+
builder.setDataSourceResolver(config.getDataSourceResolver());
204214
builder.setDialect(config.getDialect());
205215
builder.setSqlFileRepository(config.getSqlFileRepository());
206216
builder.setScriptFileLoader(config.getScriptFileLoader());
@@ -216,7 +226,6 @@ public static Builder builder(Config config) {
216226
builder.setCommenter(config.getCommenter());
217227
builder.setEntityListenerProvider(config.getEntityListenerProvider());
218228
builder.setTransactionManager(config.getTransactionManager());
219-
builder.setDataSourceName(config.getDataSourceName());
220229
builder.setBatchSize(config.getBatchSize());
221230
builder.setFetchSize(config.getFetchSize());
222231
builder.setMaxRows(config.getMaxRows());
@@ -350,7 +359,8 @@ public TransactionManager getTransactionManager() {
350359

351360
public static class Builder {
352361

353-
private DataSource dataSource;
362+
private Supplier<String> dataSourceNameSupplier;
363+
private DataSourceResolver dataSourceResolver;
354364
private Dialect dialect;
355365
private SqlFileRepository sqlFileRepository;
356366
private ScriptFileLoader scriptFileLoader;
@@ -366,14 +376,18 @@ public static class Builder {
366376
private Commenter commenter;
367377
private EntityListenerProvider entityListenerProvider;
368378
private TransactionManager transactionManager;
369-
private String dataSourceName;
370379
private int batchSize;
371380
private int fetchSize;
372381
private int maxRows;
373382
private int queryTimeout;
374383

375-
public Builder setDataSource(DataSource dataSource) {
376-
this.dataSource = dataSource;
384+
public Builder setDataSourceNameSupplier(Supplier<String> dataSourceNameSupplier) {
385+
this.dataSourceNameSupplier = dataSourceNameSupplier;
386+
return this;
387+
}
388+
389+
public Builder setDataSourceResolver(DataSourceResolver dataSourceResolver) {
390+
this.dataSourceResolver = dataSourceResolver;
377391
return this;
378392
}
379393

@@ -452,11 +466,6 @@ public Builder setTransactionManager(TransactionManager transactionManager) {
452466
return this;
453467
}
454468

455-
public Builder setDataSourceName(String dataSourceName) {
456-
this.dataSourceName = dataSourceName;
457-
return this;
458-
}
459-
460469
public Builder setBatchSize(int batchSize) {
461470
this.batchSize = batchSize;
462471
return this;
@@ -479,7 +488,8 @@ public Builder setQueryTimeout(int queryTimeout) {
479488

480489
public DomaConfig build() {
481490
return new DomaConfig(
482-
dataSource,
491+
dataSourceNameSupplier,
492+
dataSourceResolver,
483493
dialect,
484494
sqlFileRepository,
485495
scriptFileLoader,
@@ -495,7 +505,6 @@ public DomaConfig build() {
495505
commenter,
496506
entityListenerProvider,
497507
transactionManager,
498-
dataSourceName,
499508
batchSize,
500509
fetchSize,
501510
maxRows,

runtime/src/main/java/org/seasar/doma/quarkus/runtime/DomaRecorder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.seasar.doma.quarkus.runtime;
22

33
import io.quarkus.agroal.DataSource;
4-
import io.quarkus.agroal.runtime.DataSources;
54
import io.quarkus.arc.Arc;
65
import io.quarkus.arc.runtime.BeanContainerListener;
76
import io.quarkus.runtime.LaunchMode;
@@ -55,11 +54,12 @@ public Supplier<Config> configureConfig(DomaSettings.DataSourceSettings settings
5554
Objects.requireNonNull(settings);
5655
return () -> {
5756
var core = Arc.container().instance(DomaConfig.Core.class).get();
58-
var dataSourceName = settings.name;
59-
var dataSource = DataSources.fromName(dataSourceName);
57+
var dataSourceNameResolver = Arc.container().instance(DataSourceNameResolver.class).get();
58+
var dataSourceResolver = Arc.container().instance(DataSourceResolver.class).get();
59+
var candidateName = settings.name;
6060
return DomaConfig.builder(core)
61-
.setDataSourceName(dataSourceName)
62-
.setDataSource(dataSource)
61+
.setDataSourceNameSupplier(() -> dataSourceNameResolver.resolve(candidateName))
62+
.setDataSourceResolver(dataSourceResolver)
6363
.setDialect(settings.dialect.create())
6464
.setBatchSize(settings.batchSize)
6565
.setFetchSize(settings.fetchSize)

0 commit comments

Comments
 (0)