Skip to content

Commit caf4e9b

Browse files
committed
Merge pull request #46213 from quaff
* pr/46213: Polish 'Introduce a shared abstraction for database initialization' Introduce a shared abstraction for database initialization Closes gh-46213
2 parents cb976ba + 84274a2 commit caf4e9b

File tree

15 files changed

+269
-351
lines changed

15 files changed

+269
-351
lines changed

module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializer.java

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@
1616

1717
package org.springframework.boot.batch.jdbc.autoconfigure;
1818

19-
import java.util.List;
20-
2119
import javax.sql.DataSource;
2220

2321
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
24-
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
22+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2523
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
26-
import org.springframework.util.StringUtils;
2724

2825
/**
2926
* {@link DataSourceScriptDatabaseInitializer} for the Spring Batch database. May be
@@ -33,53 +30,24 @@
3330
* @author Vedran Pavic
3431
* @author Andy Wilkinson
3532
* @author Phillip Webb
33+
* @author Yanming Zhou
3634
* @since 4.0.0
3735
*/
38-
public class BatchDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
36+
public class BatchDataSourceScriptDatabaseInitializer
37+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<BatchJdbcProperties> {
3938

4039
/**
4140
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
4241
* @param dataSource the Spring Batch data source
4342
* @param properties the Spring Batch JDBC properties
44-
* @see #getSettings
4543
*/
4644
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, BatchJdbcProperties properties) {
47-
this(dataSource, getSettings(dataSource, properties));
48-
}
49-
50-
/**
51-
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
52-
* @param dataSource the Spring Batch data source
53-
* @param settings the database initialization settings
54-
* @see #getSettings
55-
*/
56-
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings) {
57-
super(dataSource, settings);
58-
}
59-
60-
/**
61-
* Adapts {@link BatchJdbcProperties} to {@link DatabaseInitializationSettings}
62-
* replacing any {@literal @@platform@@} placeholders.
63-
* @param dataSource the Spring Batch data source
64-
* @param properties batch JDBC properties
65-
* @return a new {@link DatabaseInitializationSettings} instance
66-
* @see #BatchDataSourceScriptDatabaseInitializer(DataSource,
67-
* DatabaseInitializationSettings)
68-
*/
69-
public static DatabaseInitializationSettings getSettings(DataSource dataSource, BatchJdbcProperties properties) {
70-
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
71-
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
72-
settings.setMode(properties.getInitializeSchema());
73-
settings.setContinueOnError(true);
74-
return settings;
45+
super(dataSource, properties);
7546
}
7647

77-
private static List<String> resolveSchemaLocations(DataSource dataSource, BatchJdbcProperties properties) {
78-
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
79-
if (StringUtils.hasText(properties.getPlatform())) {
80-
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
81-
}
82-
return platformResolver.resolveAll(dataSource, properties.getSchema());
48+
@Override
49+
protected DatabaseInitializationSettings getSettings() {
50+
return super.getSettings();
8351
}
8452

8553
}

module/spring-boot-batch-jdbc/src/main/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchJdbcProperties.java

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@
1919
import org.jspecify.annotations.Nullable;
2020

2121
import org.springframework.boot.context.properties.ConfigurationProperties;
22-
import org.springframework.boot.sql.init.DatabaseInitializationMode;
22+
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;
2323
import org.springframework.transaction.annotation.Isolation;
2424

2525
/**
2626
* Configuration properties for Spring Batch using a JDBC store.
2727
*
2828
* @author Stephane Nicoll
29+
* @author Yanming Zhou
2930
* @since 4.0.0
3031
*/
3132
@ConfigurationProperties("spring.batch.jdbc")
32-
public class BatchJdbcProperties {
33+
public class BatchJdbcProperties extends DatabaseInitializationProperties {
3334

3435
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
3536
+ "batch/core/schema-@@platform@@.sql";
@@ -44,27 +45,11 @@ public class BatchJdbcProperties {
4445
*/
4546
private @Nullable Isolation isolationLevelForCreate;
4647

47-
/**
48-
* Path to the SQL file to use to initialize the database schema.
49-
*/
50-
private String schema = DEFAULT_SCHEMA_LOCATION;
51-
52-
/**
53-
* Platform to use in initialization scripts if the @@platform@@ placeholder is used.
54-
* Auto-detected by default.
55-
*/
56-
private @Nullable String platform;
57-
5848
/**
5949
* Table prefix for all the batch meta-data tables.
6050
*/
6151
private @Nullable String tablePrefix;
6252

63-
/**
64-
* Database schema initialization mode.
65-
*/
66-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
67-
6853
public boolean isValidateTransactionState() {
6954
return this.validateTransactionState;
7055
}
@@ -81,22 +66,6 @@ public void setIsolationLevelForCreate(@Nullable Isolation isolationLevelForCrea
8166
this.isolationLevelForCreate = isolationLevelForCreate;
8267
}
8368

84-
public String getSchema() {
85-
return this.schema;
86-
}
87-
88-
public void setSchema(String schema) {
89-
this.schema = schema;
90-
}
91-
92-
public @Nullable String getPlatform() {
93-
return this.platform;
94-
}
95-
96-
public void setPlatform(@Nullable String platform) {
97-
this.platform = platform;
98-
}
99-
10069
public @Nullable String getTablePrefix() {
10170
return this.tablePrefix;
10271
}
@@ -105,12 +74,9 @@ public void setTablePrefix(@Nullable String tablePrefix) {
10574
this.tablePrefix = tablePrefix;
10675
}
10776

108-
public DatabaseInitializationMode getInitializeSchema() {
109-
return this.initializeSchema;
110-
}
111-
112-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
113-
this.initializeSchema = initializeSchema;
77+
@Override
78+
public String getDefaultSchemaLocation() {
79+
return DEFAULT_SCHEMA_LOCATION;
11480
}
11581

11682
}

module/spring-boot-batch-jdbc/src/test/java/org/springframework/boot/batch/jdbc/autoconfigure/BatchDataSourceScriptDatabaseInitializerTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ void getSettingsWithPlatformDoesNotTouchDataSource() {
5454
DataSource dataSource = mock(DataSource.class);
5555
BatchJdbcProperties properties = new BatchJdbcProperties();
5656
properties.setPlatform("test");
57-
DatabaseInitializationSettings settings = BatchDataSourceScriptDatabaseInitializer.getSettings(dataSource,
58-
properties);
57+
DatabaseInitializationSettings settings = new BatchDataSourceScriptDatabaseInitializer(dataSource, properties)
58+
.getSettings();
5959
assertThat(settings.getSchemaLocations())
6060
.containsOnly("classpath:org/springframework/batch/core/schema-test.sql");
6161
then(dataSource).shouldHaveNoInteractions();
@@ -74,8 +74,8 @@ void batchSchemaCanBeLocated(DatabaseDriver driver) throws SQLException {
7474
given(connection.getMetaData()).willReturn(metadata);
7575
String productName = (String) ReflectionTestUtils.getField(driver, "productName");
7676
given(metadata.getDatabaseProductName()).willReturn(productName);
77-
DatabaseInitializationSettings settings = BatchDataSourceScriptDatabaseInitializer.getSettings(dataSource,
78-
properties);
77+
DatabaseInitializationSettings settings = new BatchDataSourceScriptDatabaseInitializer(dataSource, properties)
78+
.getSettings();
7979
List<String> schemaLocations = settings.getSchemaLocations();
8080
assertThat(schemaLocations).isNotEmpty()
8181
.allSatisfy((location) -> assertThat(resourceLoader.getResource(location).exists()).isTrue());

module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializer.java

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,26 @@
1616

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

19-
import java.util.List;
19+
import java.util.Map;
2020

2121
import javax.sql.DataSource;
2222

2323
import org.springframework.boot.jdbc.DatabaseDriver;
2424
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
25-
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
25+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2626
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
27-
import org.springframework.util.StringUtils;
2827

2928
/**
3029
* {@link DataSourceScriptDatabaseInitializer} for the Spring Integration database. May be
3130
* registered as a bean to override auto-configuration.
3231
*
3332
* @author Vedran Pavic
3433
* @author Andy Wilkinson
34+
* @author Yanming Zhou
3535
* @since 4.0.0
3636
*/
37-
public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
37+
public class IntegrationDataSourceScriptDatabaseInitializer
38+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<IntegrationJdbcProperties> {
3839

3940
/**
4041
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
@@ -43,45 +44,12 @@ public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceSc
4344
* @see #getSettings
4445
*/
4546
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource, IntegrationJdbcProperties properties) {
46-
this(dataSource, getSettings(dataSource, properties));
47+
super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql"));
4748
}
4849

49-
/**
50-
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
51-
* @param dataSource the Spring Integration data source
52-
* @param settings the database initialization settings
53-
* @see #getSettings
54-
*/
55-
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource,
56-
DatabaseInitializationSettings settings) {
57-
super(dataSource, settings);
58-
}
59-
60-
/**
61-
* Adapts {@link IntegrationJdbcProperties Spring Integration JDBC properties} to
62-
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
63-
* placeholders.
64-
* @param dataSource the Spring Integration data source
65-
* @param properties the Spring Integration JDBC properties
66-
* @return a new {@link DatabaseInitializationSettings} instance
67-
* @see #IntegrationDataSourceScriptDatabaseInitializer(DataSource,
68-
* DatabaseInitializationSettings)
69-
*/
70-
static DatabaseInitializationSettings getSettings(DataSource dataSource, IntegrationJdbcProperties properties) {
71-
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
72-
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
73-
settings.setMode(properties.getInitializeSchema());
74-
settings.setContinueOnError(true);
75-
return settings;
76-
}
77-
78-
private static List<String> resolveSchemaLocations(DataSource dataSource, IntegrationJdbcProperties properties) {
79-
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
80-
platformResolver = platformResolver.withDriverPlatform(DatabaseDriver.MARIADB, "mysql");
81-
if (StringUtils.hasText(properties.getPlatform())) {
82-
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
83-
}
84-
return platformResolver.resolveAll(dataSource, properties.getSchema());
50+
@Override
51+
protected DatabaseInitializationSettings getSettings() {
52+
return super.getSettings();
8553
}
8654

8755
}

module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationJdbcProperties.java

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,63 +16,27 @@
1616

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

19-
import org.jspecify.annotations.Nullable;
20-
2119
import org.springframework.boot.context.properties.ConfigurationProperties;
22-
import org.springframework.boot.sql.init.DatabaseInitializationMode;
20+
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;
2321

2422
/**
2523
* Configuration properties for Spring Integration JDBC.
2624
*
2725
* @author Vedran Pavic
2826
* @author Stephane Nicoll
2927
* @author Artem Bilan
28+
* @author Yanming Zhou
3029
* @since 4.0.0
3130
*/
3231
@ConfigurationProperties("spring.integration.jdbc")
33-
public class IntegrationJdbcProperties {
32+
public class IntegrationJdbcProperties extends DatabaseInitializationProperties {
3433

3534
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
3635
+ "integration/jdbc/schema-@@platform@@.sql";
3736

38-
/**
39-
* Path to the SQL file to use to initialize the database schema.
40-
*/
41-
private String schema = DEFAULT_SCHEMA_LOCATION;
42-
43-
/**
44-
* Platform to use in initialization scripts if the @@platform@@ placeholder is used.
45-
* Auto-detected by default.
46-
*/
47-
private @Nullable String platform;
48-
49-
/**
50-
* Database schema initialization mode.
51-
*/
52-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
53-
54-
public String getSchema() {
55-
return this.schema;
56-
}
57-
58-
public void setSchema(String schema) {
59-
this.schema = schema;
60-
}
61-
62-
public @Nullable String getPlatform() {
63-
return this.platform;
64-
}
65-
66-
public void setPlatform(@Nullable String platform) {
67-
this.platform = platform;
68-
}
69-
70-
public DatabaseInitializationMode getInitializeSchema() {
71-
return this.initializeSchema;
72-
}
73-
74-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
75-
this.initializeSchema = initializeSchema;
37+
@Override
38+
public String getDefaultSchemaLocation() {
39+
return DEFAULT_SCHEMA_LOCATION;
7640
}
7741

7842
}

module/spring-boot-integration/src/test/java/org/springframework/boot/integration/autoconfigure/IntegrationDataSourceScriptDatabaseInitializerTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ void getSettingsWithPlatformDoesNotTouchDataSource() {
3838
DataSource dataSource = mock(DataSource.class);
3939
IntegrationJdbcProperties properties = new IntegrationJdbcProperties();
4040
properties.setPlatform("test");
41-
DatabaseInitializationSettings settings = IntegrationDataSourceScriptDatabaseInitializer.getSettings(dataSource,
42-
properties);
41+
DatabaseInitializationSettings settings = new IntegrationDataSourceScriptDatabaseInitializer(dataSource,
42+
properties)
43+
.getSettings();
4344
assertThat(settings.getSchemaLocations())
4445
.containsOnly("classpath:org/springframework/integration/jdbc/schema-test.sql");
4546
then(dataSource).shouldHaveNoInteractions();

0 commit comments

Comments
 (0)