Skip to content

Commit 54e7d7f

Browse files
snicollwilkinsona
authored andcommitted
Promote ConnectionFactoryBuilder to the "spring-boot" module
Closes gh-25492
1 parent 9ba2cd3 commit 54e7d7f

File tree

13 files changed

+632
-136
lines changed

13 files changed

+632
-136
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryBeanCreationFailureAnalyzer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,9 +16,10 @@
1616

1717
package org.springframework.boot.autoconfigure.r2dbc;
1818

19-
import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBuilder.ConnectionFactoryBeanCreationException;
19+
import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsInitializer.ConnectionFactoryBeanCreationException;
2020
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
2121
import org.springframework.boot.diagnostics.FailureAnalysis;
22+
import org.springframework.boot.r2dbc.EmbeddedDatabaseConnection;
2223
import org.springframework.context.EnvironmentAware;
2324
import org.springframework.core.env.Environment;
2425
import org.springframework.util.ObjectUtils;
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,17 +17,12 @@
1717
package org.springframework.boot.autoconfigure.r2dbc;
1818

1919
import java.util.function.Consumer;
20-
import java.util.function.Predicate;
2120
import java.util.function.Supplier;
2221

2322
import io.r2dbc.spi.ConnectionFactories;
2423
import io.r2dbc.spi.ConnectionFactory;
2524
import io.r2dbc.spi.ConnectionFactoryOptions;
2625
import io.r2dbc.spi.ConnectionFactoryOptions.Builder;
27-
import io.r2dbc.spi.Option;
28-
29-
import org.springframework.beans.factory.BeanCreationException;
30-
import org.springframework.util.StringUtils;
3126

3227
/**
3328
* Builder for {@link ConnectionFactory}.
@@ -36,7 +31,10 @@
3631
* @author Tadaya Tsuyukubo
3732
* @author Stephane Nicoll
3833
* @since 2.3.0
34+
* @deprecated since 2.5.0 in favor of
35+
* {@link org.springframework.boot.r2dbc.ConnectionFactoryBuilder}
3936
*/
37+
@Deprecated
4038
public final class ConnectionFactoryBuilder {
4139

4240
private final ConnectionFactoryOptions.Builder optionsBuilder;
@@ -59,7 +57,7 @@ private ConnectionFactoryBuilder(ConnectionFactoryOptions.Builder optionsBuilder
5957
public static ConnectionFactoryBuilder of(R2dbcProperties properties,
6058
Supplier<EmbeddedDatabaseConnection> embeddedDatabaseConnection) {
6159
return new ConnectionFactoryBuilder(
62-
new ConnectionFactoryOptionsInitializer().initializeOptions(properties, embeddedDatabaseConnection));
60+
new ConnectionFactoryOptionsInitializer().initialize(properties, adapt(embeddedDatabaseConnection)));
6361
}
6462

6563
/**
@@ -133,127 +131,13 @@ public ConnectionFactoryOptions buildOptions() {
133131
return this.optionsBuilder.build();
134132
}
135133

136-
static class ConnectionFactoryOptionsInitializer {
137-
138-
/**
139-
* Initialize a {@link io.r2dbc.spi.ConnectionFactoryOptions.Builder
140-
* ConnectionFactoryOptions.Builder} using the specified properties.
141-
* @param properties the properties to use to initialize the builder
142-
* @param embeddedDatabaseConnection the embedded connection to use as a fallback
143-
* @return an initialized builder
144-
* @throws ConnectionFactoryBeanCreationException if no suitable connection could
145-
* be determined
146-
*/
147-
ConnectionFactoryOptions.Builder initializeOptions(R2dbcProperties properties,
148-
Supplier<EmbeddedDatabaseConnection> embeddedDatabaseConnection) {
149-
if (StringUtils.hasText(properties.getUrl())) {
150-
return initializeRegularOptions(properties);
151-
}
152-
EmbeddedDatabaseConnection embeddedConnection = embeddedDatabaseConnection.get();
153-
if (embeddedConnection != EmbeddedDatabaseConnection.NONE) {
154-
return initializeEmbeddedOptions(properties, embeddedConnection);
155-
}
156-
throw connectionFactoryBeanCreationException("Failed to determine a suitable R2DBC Connection URL",
157-
properties, embeddedConnection);
158-
}
159-
160-
private ConnectionFactoryOptions.Builder initializeRegularOptions(R2dbcProperties properties) {
161-
ConnectionFactoryOptions urlOptions = ConnectionFactoryOptions.parse(properties.getUrl());
162-
Builder optionsBuilder = urlOptions.mutate();
163-
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.USER, properties::getUsername,
164-
StringUtils::hasText);
165-
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.PASSWORD, properties::getPassword,
166-
StringUtils::hasText);
167-
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.DATABASE,
168-
() -> determineDatabaseName(properties), StringUtils::hasText);
169-
if (properties.getProperties() != null) {
170-
properties.getProperties().forEach((key, value) -> optionsBuilder.option(Option.valueOf(key), value));
171-
}
172-
return optionsBuilder;
173-
}
174-
175-
private ConnectionFactoryOptions.Builder initializeEmbeddedOptions(R2dbcProperties properties,
176-
EmbeddedDatabaseConnection embeddedDatabaseConnection) {
177-
String url = embeddedDatabaseConnection.getUrl(determineEmbeddedDatabaseName(properties));
178-
if (url == null) {
179-
throw connectionFactoryBeanCreationException("Failed to determine a suitable R2DBC Connection URL",
180-
properties, embeddedDatabaseConnection);
181-
}
182-
Builder builder = ConnectionFactoryOptions.parse(url).mutate();
183-
String username = determineEmbeddedUsername(properties);
184-
if (StringUtils.hasText(username)) {
185-
builder.option(ConnectionFactoryOptions.USER, username);
186-
}
187-
if (StringUtils.hasText(properties.getPassword())) {
188-
builder.option(ConnectionFactoryOptions.PASSWORD, properties.getPassword());
189-
}
190-
return builder;
191-
}
192-
193-
private String determineDatabaseName(R2dbcProperties properties) {
194-
if (properties.isGenerateUniqueName()) {
195-
return properties.determineUniqueName();
196-
}
197-
if (StringUtils.hasLength(properties.getName())) {
198-
return properties.getName();
199-
}
200-
return null;
201-
}
202-
203-
private String determineEmbeddedDatabaseName(R2dbcProperties properties) {
204-
String databaseName = determineDatabaseName(properties);
205-
return (databaseName != null) ? databaseName : "testdb";
206-
}
207-
208-
private String determineEmbeddedUsername(R2dbcProperties properties) {
209-
String username = ifHasText(properties.getUsername());
210-
return (username != null) ? username : "sa";
211-
}
212-
213-
private <T extends CharSequence> void configureIf(Builder optionsBuilder,
214-
ConnectionFactoryOptions originalOptions, Option<T> option, Supplier<T> valueSupplier,
215-
Predicate<T> setIf) {
216-
if (originalOptions.hasOption(option)) {
217-
return;
218-
}
219-
T value = valueSupplier.get();
220-
if (setIf.test(value)) {
221-
optionsBuilder.option(option, value);
222-
}
223-
}
224-
225-
private ConnectionFactoryBeanCreationException connectionFactoryBeanCreationException(String message,
226-
R2dbcProperties properties, EmbeddedDatabaseConnection embeddedDatabaseConnection) {
227-
return new ConnectionFactoryBeanCreationException(message, properties, embeddedDatabaseConnection);
228-
}
229-
230-
private String ifHasText(String candidate) {
231-
return (StringUtils.hasText(candidate)) ? candidate : null;
232-
}
233-
234-
}
235-
236-
static class ConnectionFactoryBeanCreationException extends BeanCreationException {
237-
238-
private final R2dbcProperties properties;
239-
240-
private final EmbeddedDatabaseConnection embeddedDatabaseConnection;
241-
242-
ConnectionFactoryBeanCreationException(String message, R2dbcProperties properties,
243-
EmbeddedDatabaseConnection embeddedDatabaseConnection) {
244-
super(message);
245-
this.properties = properties;
246-
this.embeddedDatabaseConnection = embeddedDatabaseConnection;
247-
}
248-
249-
EmbeddedDatabaseConnection getEmbeddedDatabaseConnection() {
250-
return this.embeddedDatabaseConnection;
251-
}
252-
253-
R2dbcProperties getProperties() {
254-
return this.properties;
255-
}
256-
134+
private static Supplier<org.springframework.boot.r2dbc.EmbeddedDatabaseConnection> adapt(
135+
Supplier<EmbeddedDatabaseConnection> embeddedDatabaseConnection) {
136+
return () -> {
137+
EmbeddedDatabaseConnection connection = embeddedDatabaseConnection.get();
138+
return (connection != null)
139+
? org.springframework.boot.r2dbc.EmbeddedDatabaseConnection.valueOf(connection.name()) : null;
140+
};
257141
}
258142

259143
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/ConnectionFactoryConfigurations.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3131
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
3232
import org.springframework.boot.context.properties.PropertyMapper;
33+
import org.springframework.boot.r2dbc.EmbeddedDatabaseConnection;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Condition;
3536
import org.springframework.context.annotation.ConditionContext;
@@ -50,7 +51,9 @@ abstract class ConnectionFactoryConfigurations {
5051

5152
protected static ConnectionFactory createConnectionFactory(R2dbcProperties properties, ClassLoader classLoader,
5253
List<ConnectionFactoryOptionsBuilderCustomizer> optionsCustomizers) {
53-
return ConnectionFactoryBuilder.of(properties, () -> EmbeddedDatabaseConnection.get(classLoader))
54+
return org.springframework.boot.r2dbc.ConnectionFactoryBuilder
55+
.withOptions(new ConnectionFactoryOptionsInitializer().initialize(properties,
56+
() -> EmbeddedDatabaseConnection.get(classLoader)))
5457
.configure((options) -> {
5558
for (ConnectionFactoryOptionsBuilderCustomizer optionsCustomizer : optionsCustomizers) {
5659
optionsCustomizer.customize(options);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
/*
2+
* Copyright 2012-2021 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.r2dbc;
18+
19+
import java.util.function.Predicate;
20+
import java.util.function.Supplier;
21+
22+
import io.r2dbc.spi.ConnectionFactoryOptions;
23+
import io.r2dbc.spi.ConnectionFactoryOptions.Builder;
24+
import io.r2dbc.spi.Option;
25+
26+
import org.springframework.beans.factory.BeanCreationException;
27+
import org.springframework.boot.r2dbc.EmbeddedDatabaseConnection;
28+
import org.springframework.util.StringUtils;
29+
30+
/**
31+
* Initialize a {@link ConnectionFactoryOptions.Builder} based on {@link R2dbcProperties}.
32+
*
33+
* @author Stephane Nicoll
34+
*/
35+
class ConnectionFactoryOptionsInitializer {
36+
37+
/**
38+
* Initialize a {@link io.r2dbc.spi.ConnectionFactoryOptions.Builder
39+
* ConnectionFactoryOptions.Builder} using the specified properties.
40+
* @param properties the properties to use to initialize the builder
41+
* @param embeddedDatabaseConnection the embedded connection to use as a fallback
42+
* @return an initialized builder
43+
* @throws ConnectionFactoryBeanCreationException if no suitable connection could be
44+
* determined
45+
*/
46+
ConnectionFactoryOptions.Builder initialize(R2dbcProperties properties,
47+
Supplier<EmbeddedDatabaseConnection> embeddedDatabaseConnection) {
48+
if (StringUtils.hasText(properties.getUrl())) {
49+
return initializeRegularOptions(properties);
50+
}
51+
EmbeddedDatabaseConnection embeddedConnection = embeddedDatabaseConnection.get();
52+
if (embeddedConnection != EmbeddedDatabaseConnection.NONE) {
53+
return initializeEmbeddedOptions(properties, embeddedConnection);
54+
}
55+
throw connectionFactoryBeanCreationException("Failed to determine a suitable R2DBC Connection URL", properties,
56+
embeddedConnection);
57+
}
58+
59+
private ConnectionFactoryOptions.Builder initializeRegularOptions(R2dbcProperties properties) {
60+
ConnectionFactoryOptions urlOptions = ConnectionFactoryOptions.parse(properties.getUrl());
61+
Builder optionsBuilder = urlOptions.mutate();
62+
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.USER, properties::getUsername,
63+
StringUtils::hasText);
64+
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.PASSWORD, properties::getPassword,
65+
StringUtils::hasText);
66+
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.DATABASE,
67+
() -> determineDatabaseName(properties), StringUtils::hasText);
68+
if (properties.getProperties() != null) {
69+
properties.getProperties().forEach((key, value) -> optionsBuilder.option(Option.valueOf(key), value));
70+
}
71+
return optionsBuilder;
72+
}
73+
74+
private Builder initializeEmbeddedOptions(R2dbcProperties properties,
75+
EmbeddedDatabaseConnection embeddedDatabaseConnection) {
76+
String url = embeddedDatabaseConnection.getUrl(determineEmbeddedDatabaseName(properties));
77+
if (url == null) {
78+
throw connectionFactoryBeanCreationException("Failed to determine a suitable R2DBC Connection URL",
79+
properties, embeddedDatabaseConnection);
80+
}
81+
Builder builder = ConnectionFactoryOptions.parse(url).mutate();
82+
String username = determineEmbeddedUsername(properties);
83+
if (StringUtils.hasText(username)) {
84+
builder.option(ConnectionFactoryOptions.USER, username);
85+
}
86+
if (StringUtils.hasText(properties.getPassword())) {
87+
builder.option(ConnectionFactoryOptions.PASSWORD, properties.getPassword());
88+
}
89+
return builder;
90+
}
91+
92+
private String determineDatabaseName(R2dbcProperties properties) {
93+
if (properties.isGenerateUniqueName()) {
94+
return properties.determineUniqueName();
95+
}
96+
if (StringUtils.hasLength(properties.getName())) {
97+
return properties.getName();
98+
}
99+
return null;
100+
}
101+
102+
private String determineEmbeddedDatabaseName(R2dbcProperties properties) {
103+
String databaseName = determineDatabaseName(properties);
104+
return (databaseName != null) ? databaseName : "testdb";
105+
}
106+
107+
private String determineEmbeddedUsername(R2dbcProperties properties) {
108+
String username = ifHasText(properties.getUsername());
109+
return (username != null) ? username : "sa";
110+
}
111+
112+
private <T extends CharSequence> void configureIf(Builder optionsBuilder, ConnectionFactoryOptions originalOptions,
113+
Option<T> option, Supplier<T> valueSupplier, Predicate<T> setIf) {
114+
if (originalOptions.hasOption(option)) {
115+
return;
116+
}
117+
T value = valueSupplier.get();
118+
if (setIf.test(value)) {
119+
optionsBuilder.option(option, value);
120+
}
121+
}
122+
123+
private ConnectionFactoryBeanCreationException connectionFactoryBeanCreationException(String message,
124+
R2dbcProperties properties, EmbeddedDatabaseConnection embeddedDatabaseConnection) {
125+
return new ConnectionFactoryBeanCreationException(message, properties, embeddedDatabaseConnection);
126+
}
127+
128+
private String ifHasText(String candidate) {
129+
return (StringUtils.hasText(candidate)) ? candidate : null;
130+
}
131+
132+
static class ConnectionFactoryBeanCreationException extends BeanCreationException {
133+
134+
private final R2dbcProperties properties;
135+
136+
private final EmbeddedDatabaseConnection embeddedDatabaseConnection;
137+
138+
ConnectionFactoryBeanCreationException(String message, R2dbcProperties properties,
139+
EmbeddedDatabaseConnection embeddedDatabaseConnection) {
140+
super(message);
141+
this.properties = properties;
142+
this.embeddedDatabaseConnection = embeddedDatabaseConnection;
143+
}
144+
145+
EmbeddedDatabaseConnection getEmbeddedDatabaseConnection() {
146+
return this.embeddedDatabaseConnection;
147+
}
148+
149+
R2dbcProperties getProperties() {
150+
return this.properties;
151+
}
152+
153+
}
154+
155+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/r2dbc/EmbeddedDatabaseConnection.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
* @author Mark Paluch
2626
* @author Stephane Nicoll
2727
* @since 2.3.0
28+
* @deprecated since 2.5.0 in favor of
29+
* {@link org.springframework.boot.r2dbc.EmbeddedDatabaseConnection}
2830
*/
31+
@Deprecated
2932
public enum EmbeddedDatabaseConnection {
3033

3134
/**

0 commit comments

Comments
 (0)