Skip to content

Commit 7442d44

Browse files
authored
Issue #7230 - JDBC type specific setters based on EclipseLink (#7246)
Signed-off-by: Tomáš Kraus <[email protected]>
1 parent 3a1f422 commit 7442d44

23 files changed

+706
-67
lines changed

dbclient/dbclient/src/main/java/io/helidon/dbclient/DbClientContext.java

+37-18
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ public class DbClientContext implements DbContext {
3232
private final DbStatements statements;
3333
private final String dbType;
3434

35-
private DbClientContext(Builder builder) {
35+
/**
36+
* Create an instance of client context.
37+
*
38+
* @param builder Builder for {@link DbClientContext}
39+
*/
40+
protected DbClientContext(
41+
BuilderBase<? extends BuilderBase<?, ? extends DbClientContext>, ? extends DbClientContext> builder) {
3642
this.dbMapperManager = builder.dbMapperManager;
3743
this.mapperManager = builder.mapperManager;
3844
this.clientServices = builder.clientServices;
@@ -81,20 +87,33 @@ public static Builder builder() {
8187
/**
8288
* Builder for {@link DbClientContext}.
8389
*/
84-
public static class Builder implements io.helidon.common.Builder<Builder, DbClientContext> {
90+
public static final class Builder extends BuilderBase<Builder, DbClientContext> {
91+
92+
@Override
93+
public DbClientContext build() {
94+
return new DbClientContext(this);
95+
}
96+
97+
}
98+
99+
/**
100+
* Base builder for {@link DbClientContext}.
101+
*
102+
* @param <B> type of the builder
103+
* @param <T> type of the built instance
104+
*/
105+
public abstract static class BuilderBase<B extends BuilderBase<B, T>, T extends DbClientContext> implements io.helidon.common.Builder<B, T> {
85106

86107
private DbMapperManager dbMapperManager;
87108
private MapperManager mapperManager;
88109
private List<DbClientService> clientServices = List.of();
89110
private DbStatements statements;
90111
private String dbType;
91112

92-
private Builder() {
93-
}
94-
95-
@Override
96-
public DbClientContext build() {
97-
return new DbClientContext(this);
113+
/**
114+
* Creates an instance of base builder for {@link DbClientContext}.
115+
*/
116+
protected BuilderBase() {
98117
}
99118

100119
/**
@@ -103,9 +122,9 @@ public DbClientContext build() {
103122
* @param dbMapperManager DB mapper manager
104123
* @return updated builder instance
105124
*/
106-
public Builder dbMapperManager(DbMapperManager dbMapperManager) {
125+
public B dbMapperManager(DbMapperManager dbMapperManager) {
107126
this.dbMapperManager = dbMapperManager;
108-
return this;
127+
return identity();
109128
}
110129

111130
/**
@@ -114,9 +133,9 @@ public Builder dbMapperManager(DbMapperManager dbMapperManager) {
114133
* @param mapperManager mapper manager
115134
* @return updated builder instance
116135
*/
117-
public Builder mapperManager(MapperManager mapperManager) {
136+
public B mapperManager(MapperManager mapperManager) {
118137
this.mapperManager = mapperManager;
119-
return this;
138+
return identity();
120139
}
121140

122141
/**
@@ -125,9 +144,9 @@ public Builder mapperManager(MapperManager mapperManager) {
125144
* @param clientServices client service list
126145
* @return updated builder instance
127146
*/
128-
public Builder clientServices(List<DbClientService> clientServices) {
147+
public B clientServices(List<DbClientService> clientServices) {
129148
this.clientServices = clientServices;
130-
return this;
149+
return identity();
131150
}
132151

133152
/**
@@ -136,9 +155,9 @@ public Builder clientServices(List<DbClientService> clientServices) {
136155
* @param statements statements
137156
* @return updated builder instance
138157
*/
139-
public Builder statements(DbStatements statements) {
158+
public B statements(DbStatements statements) {
140159
this.statements = statements;
141-
return this;
160+
return identity();
142161
}
143162

144163
/**
@@ -147,9 +166,9 @@ public Builder statements(DbStatements statements) {
147166
* @param dbType database provider type
148167
* @return updated builder instance
149168
*/
150-
public Builder dbType(String dbType) {
169+
public B dbType(String dbType) {
151170
this.dbType = dbType;
152-
return this;
171+
return identity();
153172
}
154173
}
155174
}

dbclient/dbclient/src/main/java/io/helidon/dbclient/DbExecuteBase.java

+11
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ protected DbClientContext context() {
5656
return context;
5757
}
5858

59+
/**
60+
* Return database client context cast to it's extending class.
61+
*
62+
* @param cls {@link DbClientContext} extending class
63+
* @return extended client context
64+
* @param <C> client context extending type
65+
*/
66+
protected <C extends DbClientContext> C context(Class<C> cls) {
67+
return cls.cast(context);
68+
}
69+
5970
@Override
6071
public DbStatementQuery createNamedQuery(String statementName) {
6172
return createNamedQuery(statementName, statementText(statementName));

dbclient/dbclient/src/main/java/io/helidon/dbclient/DbExecuteContext.java

+42-12
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ public class DbExecuteContext implements DbContext {
2828
private final String statement;
2929
private final DbClientContext clientContext;
3030

31-
private DbExecuteContext(Builder builder) {
31+
/**
32+
* Creates an instance of execution context.
33+
*
34+
* @param builder Helidon database client context builder
35+
*/
36+
protected DbExecuteContext(
37+
BuilderBase<? extends BuilderBase<?, ? extends DbExecuteContext>, ? extends DbExecuteContext> builder) {
3238
this.statementName = builder.statementName;
3339
this.statement = builder.statement;
3440
this.clientContext = builder.clientContext;
@@ -77,6 +83,17 @@ public String dbType() {
7783
return clientContext.dbType();
7884
}
7985

86+
/**
87+
* Returns client context cast to it's extending class.
88+
*
89+
* @param cls {@link DbClientContext} extending class
90+
* @return extended client context
91+
* @param <C> client context extending type
92+
*/
93+
protected <C extends DbClientContext> C clientContext(Class<C> cls) {
94+
return cls.cast(clientContext);
95+
}
96+
8097
/**
8198
* Create a new execution context.
8299
*
@@ -102,10 +119,27 @@ public static Builder builder() {
102119
return new Builder();
103120
}
104121

122+
105123
/**
106124
* Builder for {@link DbExecuteContext}.
107125
*/
108-
public static class Builder implements io.helidon.common.Builder<Builder, DbExecuteContext> {
126+
public static final class Builder extends BuilderBase<Builder, DbExecuteContext> {
127+
128+
@Override
129+
public DbExecuteContext build() {
130+
return new DbExecuteContext(this);
131+
}
132+
133+
}
134+
135+
/**
136+
* Base builder for {@link DbExecuteContext}.
137+
*
138+
* @param <B> type of the builder
139+
* @param <T> type of the built instance
140+
*/
141+
public abstract static class BuilderBase<B extends BuilderBase<B, T>, T extends DbExecuteContext>
142+
implements io.helidon.common.Builder<B, T> {
109143

110144
private String statementName;
111145
private String statement;
@@ -117,9 +151,9 @@ public static class Builder implements io.helidon.common.Builder<Builder, DbExec
117151
* @param statement statement
118152
* @return updated builder instance
119153
*/
120-
public Builder statement(String statement) {
154+
public B statement(String statement) {
121155
this.statement = statement;
122-
return this;
156+
return identity();
123157
}
124158

125159
/**
@@ -128,9 +162,9 @@ public Builder statement(String statement) {
128162
* @param statementName statement name
129163
* @return updated builder instance
130164
*/
131-
public Builder statementName(String statementName) {
165+
public B statementName(String statementName) {
132166
this.statementName = statementName;
133-
return this;
167+
return identity();
134168
}
135169

136170
/**
@@ -139,14 +173,10 @@ public Builder statementName(String statementName) {
139173
* @param clientContext client context
140174
* @return updated builder instance
141175
*/
142-
public Builder clientContext(DbClientContext clientContext) {
176+
public B clientContext(DbClientContext clientContext) {
143177
this.clientContext = clientContext;
144-
return this;
178+
return identity();
145179
}
146180

147-
@Override
148-
public DbExecuteContext build() {
149-
return new DbExecuteContext(this);
150-
}
151181
}
152182
}

dbclient/dbclient/src/main/java/io/helidon/dbclient/DbStatementBase.java

+12
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ public DbExecuteContext context() {
5353
return context;
5454
}
5555

56+
/**
57+
* Returns execution context cast to it's extending class.
58+
*
59+
* @param cls {@link DbExecuteContext} extending class
60+
* @return extended execution context
61+
* @param <C> execution context extending type
62+
*/
63+
protected <C extends DbExecuteContext> C context(Class<C> cls) {
64+
return cls.cast(context);
65+
}
66+
5667
/**
5768
* Get the statement parameters.
5869
*
@@ -262,4 +273,5 @@ public S addParam(String name, byte[] parameter) {
262273
protected S identity() {
263274
return (S) this;
264275
}
276+
265277
}

dbclient/jdbc/pom.xml

+45
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,28 @@
4242
<groupId>io.helidon.common.features</groupId>
4343
<artifactId>helidon-common-features-api</artifactId>
4444
</dependency>
45+
<dependency>
46+
<groupId>io.helidon.builder</groupId>
47+
<artifactId>helidon-builder-api</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>io.helidon.config</groupId>
51+
<artifactId>helidon-config-metadata</artifactId>
52+
</dependency>
4553
<dependency>
4654
<groupId>com.zaxxer</groupId>
4755
<artifactId>HikariCP</artifactId>
4856
</dependency>
57+
<dependency>
58+
<groupId>io.helidon.config</groupId>
59+
<artifactId>helidon-config</artifactId>
60+
<scope>test</scope>
61+
</dependency>
62+
<dependency>
63+
<groupId>io.helidon.config</groupId>
64+
<artifactId>helidon-config-yaml</artifactId>
65+
<scope>test</scope>
66+
</dependency>
4967
<dependency>
5068
<groupId>org.junit.jupiter</groupId>
5169
<artifactId>junit-jupiter-api</artifactId>
@@ -75,8 +93,35 @@
7593
<artifactId>helidon-common-features-processor</artifactId>
7694
<version>${helidon.version}</version>
7795
</path>
96+
<path>
97+
<groupId>io.helidon.config</groupId>
98+
<artifactId>helidon-config-metadata-processor</artifactId>
99+
<version>${helidon.version}</version>
100+
</path>
101+
<path>
102+
<groupId>io.helidon.builder</groupId>
103+
<artifactId>helidon-builder-processor</artifactId>
104+
<version>${helidon.version}</version>
105+
</path>
78106
</annotationProcessorPaths>
79107
</configuration>
108+
<dependencies>
109+
<dependency>
110+
<groupId>io.helidon.builder</groupId>
111+
<artifactId>helidon-builder-processor</artifactId>
112+
<version>${helidon.version}</version>
113+
</dependency>
114+
<dependency>
115+
<groupId>io.helidon.config</groupId>
116+
<artifactId>helidon-config-metadata-processor</artifactId>
117+
<version>${helidon.version}</version>
118+
</dependency>
119+
<dependency>
120+
<groupId>io.helidon.inject.configdriven</groupId>
121+
<artifactId>helidon-inject-configdriven-processor</artifactId>
122+
<version>${helidon.version}</version>
123+
</dependency>
124+
</dependencies>
80125
</plugin>
81126
</plugins>
82127
</build>

dbclient/jdbc/src/main/java/io/helidon/dbclient/jdbc/JdbcClient.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import io.helidon.dbclient.DbClient;
2121
import io.helidon.dbclient.DbClientBase;
22-
import io.helidon.dbclient.DbClientContext;
2322

2423
/**
2524
* Helidon DB implementation for JDBC drivers.
@@ -34,12 +33,13 @@ class JdbcClient extends DbClientBase implements DbClient {
3433
* @param builder builder
3534
*/
3635
JdbcClient(JdbcClientBuilder builder) {
37-
super(DbClientContext.builder()
36+
super(JdbcClientContext.jdbcBuilder()
3837
.statements(builder.statements())
3938
.dbMapperManager(builder.dbMapperManager())
4039
.mapperManager(builder.mapperManager())
4140
.clientServices(builder.clientServices())
4241
.dbType(builder.connectionPool().dbType())
42+
.parametersSetter(builder.parametersConfig())
4343
.build());
4444
connectionPool = builder.connectionPool();
4545
}
@@ -59,6 +59,11 @@ public String dbType() {
5959
return connectionPool.dbType();
6060
}
6161

62+
@Override
63+
public JdbcClientContext context() {
64+
return (JdbcClientContext) super.context();
65+
}
66+
6267
@Override
6368
public <C> C unwrap(Class<C> cls) {
6469
if (Connection.class.isAssignableFrom(cls)) {
@@ -70,4 +75,5 @@ public <C> C unwrap(Class<C> cls) {
7075
throw new UnsupportedOperationException(String.format("Class %s is not supported for unwrap", cls.getName()));
7176
}
7277
}
78+
7379
}

0 commit comments

Comments
 (0)