Skip to content

Commit 455b187

Browse files
committed
Introduce a shared abstraction for database initialization
Currently used by Spring Batch, Spring Integration, Spring Session and Quartz. Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent c98ffeb commit 455b187

File tree

10 files changed

+249
-354
lines changed

10 files changed

+249
-354
lines changed

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

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,10 @@
1616

1717
package org.springframework.boot.batch.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;
25-
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
26-
import org.springframework.util.StringUtils;
22+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2723

2824
/**
2925
* {@link DataSourceScriptDatabaseInitializer} for the Spring Batch database. May be
@@ -33,54 +29,19 @@
3329
* @author Vedran Pavic
3430
* @author Andy Wilkinson
3531
* @author Phillip Webb
32+
* @author Yanming Zhou
3633
* @since 4.0.0
3734
*/
38-
public class BatchDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
35+
public class BatchDataSourceScriptDatabaseInitializer
36+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<BatchProperties.Jdbc> {
3937

4038
/**
4139
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
4240
* @param dataSource the Spring Batch data source
4341
* @param properties the Spring Batch JDBC properties
44-
* @see #getSettings
4542
*/
4643
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, BatchProperties.Jdbc 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 BatchProperties.Jdbc Spring Batch JDBC properties} to
62-
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
63-
* placeholders.
64-
* @param dataSource the Spring Batch data source
65-
* @param properties batch JDBC properties
66-
* @return a new {@link DatabaseInitializationSettings} instance
67-
* @see #BatchDataSourceScriptDatabaseInitializer(DataSource,
68-
* DatabaseInitializationSettings)
69-
*/
70-
public static DatabaseInitializationSettings getSettings(DataSource dataSource, BatchProperties.Jdbc 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, BatchProperties.Jdbc properties) {
79-
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
80-
if (StringUtils.hasText(properties.getPlatform())) {
81-
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
82-
}
83-
return platformResolver.resolveAll(dataSource, properties.getSchema());
44+
super(dataSource, properties);
8445
}
8546

8647
}

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

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
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
/**
@@ -65,7 +65,7 @@ public void setName(String name) {
6565

6666
}
6767

68-
public static class Jdbc {
68+
public static class Jdbc extends DatabaseInitializationProperties {
6969

7070
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
7171
+ "batch/core/schema-@@platform@@.sql";
@@ -80,27 +80,11 @@ public static class Jdbc {
8080
*/
8181
private @Nullable Isolation isolationLevelForCreate;
8282

83-
/**
84-
* Path to the SQL file to use to initialize the database schema.
85-
*/
86-
private String schema = DEFAULT_SCHEMA_LOCATION;
87-
88-
/**
89-
* Platform to use in initialization scripts if the @@platform@@ placeholder is
90-
* used. Auto-detected by default.
91-
*/
92-
private @Nullable String platform;
93-
9483
/**
9584
* Table prefix for all the batch meta-data tables.
9685
*/
9786
private @Nullable String tablePrefix;
9887

99-
/**
100-
* Database schema initialization mode.
101-
*/
102-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
103-
10488
public boolean isValidateTransactionState() {
10589
return this.validateTransactionState;
10690
}
@@ -117,22 +101,6 @@ public void setIsolationLevelForCreate(@Nullable Isolation isolationLevelForCrea
117101
this.isolationLevelForCreate = isolationLevelForCreate;
118102
}
119103

120-
public String getSchema() {
121-
return this.schema;
122-
}
123-
124-
public void setSchema(String schema) {
125-
this.schema = schema;
126-
}
127-
128-
public @Nullable String getPlatform() {
129-
return this.platform;
130-
}
131-
132-
public void setPlatform(@Nullable String platform) {
133-
this.platform = platform;
134-
}
135-
136104
public @Nullable String getTablePrefix() {
137105
return this.tablePrefix;
138106
}
@@ -141,12 +109,9 @@ public void setTablePrefix(@Nullable String tablePrefix) {
141109
this.tablePrefix = tablePrefix;
142110
}
143111

144-
public DatabaseInitializationMode getInitializeSchema() {
145-
return this.initializeSchema;
146-
}
147-
148-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
149-
this.initializeSchema = initializeSchema;
112+
@Override
113+
public String getDefaultSchemaLocation() {
114+
return DEFAULT_SCHEMA_LOCATION;
150115
}
151116

152117
}

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

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@
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;
26-
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
27-
import org.springframework.util.StringUtils;
25+
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;
2826

2927
/**
3028
* {@link DataSourceScriptDatabaseInitializer} for the Spring Integration database. May be
3129
* registered as a bean to override auto-configuration.
3230
*
3331
* @author Vedran Pavic
3432
* @author Andy Wilkinson
33+
* @author Yanming Zhou
3534
* @since 4.0.0
3635
*/
37-
public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
36+
public class IntegrationDataSourceScriptDatabaseInitializer
37+
extends PropertiesBasedDataSourceScriptDatabaseInitializer<IntegrationJdbcProperties> {
3838

3939
/**
4040
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
@@ -43,45 +43,7 @@ public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceSc
4343
* @see #getSettings
4444
*/
4545
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource, IntegrationJdbcProperties properties) {
46-
this(dataSource, getSettings(dataSource, properties));
47-
}
48-
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());
46+
super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql"));
8547
}
8648

8749
}

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
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright 2012-present 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.jdbc.init;
18+
19+
import org.jspecify.annotations.Nullable;
20+
21+
import org.springframework.boot.context.properties.ConfigurationPropertiesSource;
22+
import org.springframework.boot.sql.init.DatabaseInitializationMode;
23+
24+
/**
25+
* Base configuration properties class for performing SQL database initialization.
26+
*
27+
* @author Yanming Zhou
28+
* @since 4.0.0
29+
*/
30+
@ConfigurationPropertiesSource
31+
public abstract class DatabaseInitializationProperties {
32+
33+
/**
34+
* Path to the SQL file to use to initialize the database schema.
35+
*/
36+
private String schema = getDefaultSchemaLocation();
37+
38+
/**
39+
* Platform to use in initialization scripts if the @@platform@@ placeholder is used.
40+
* Auto-detected by default.
41+
*/
42+
private @Nullable String platform;
43+
44+
/**
45+
* Database schema initialization mode.
46+
*/
47+
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
48+
49+
/**
50+
* Whether initialization should continue when an error occurs when applying a schema
51+
* script.
52+
*/
53+
private boolean continueOnError = true;
54+
55+
public String getSchema() {
56+
return this.schema;
57+
}
58+
59+
public void setSchema(String schema) {
60+
this.schema = schema;
61+
}
62+
63+
public @Nullable String getPlatform() {
64+
return this.platform;
65+
}
66+
67+
public void setPlatform(String platform) {
68+
this.platform = platform;
69+
}
70+
71+
public DatabaseInitializationMode getInitializeSchema() {
72+
return this.initializeSchema;
73+
}
74+
75+
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
76+
this.initializeSchema = initializeSchema;
77+
}
78+
79+
public boolean isContinueOnError() {
80+
return this.continueOnError;
81+
}
82+
83+
public void setContinueOnError(boolean continueOnError) {
84+
this.continueOnError = continueOnError;
85+
}
86+
87+
public abstract String getDefaultSchemaLocation();
88+
89+
}

0 commit comments

Comments
 (0)