Skip to content

Introduce a shared abstraction for database initialization #45379

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,10 @@

package org.springframework.boot.autoconfigure.batch;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
import org.springframework.util.StringUtils;
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;

/**
* {@link DataSourceScriptDatabaseInitializer} for the Spring Batch database. May be
Expand All @@ -33,54 +29,19 @@
* @author Vedran Pavic
* @author Andy Wilkinson
* @author Phillip Webb
* @author Yanming Zhou
* @since 2.6.0
*/
public class BatchDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
public class BatchDataSourceScriptDatabaseInitializer
extends PropertiesBasedDataSourceScriptDatabaseInitializer<BatchProperties.Jdbc> {

/**
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
* @param dataSource the Spring Batch data source
* @param properties the Spring Batch JDBC properties
* @see #getSettings
*/
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, BatchProperties.Jdbc properties) {
this(dataSource, getSettings(dataSource, properties));
}

/**
* Create a new {@link BatchDataSourceScriptDatabaseInitializer} instance.
* @param dataSource the Spring Batch data source
* @param settings the database initialization settings
* @see #getSettings
*/
public BatchDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings) {
super(dataSource, settings);
}

/**
* Adapts {@link BatchProperties.Jdbc Spring Batch JDBC properties} to
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
* placeholders.
* @param dataSource the Spring Batch data source
* @param properties batch JDBC properties
* @return a new {@link DatabaseInitializationSettings} instance
* @see #BatchDataSourceScriptDatabaseInitializer(DataSource,
* DatabaseInitializationSettings)
*/
public static DatabaseInitializationSettings getSettings(DataSource dataSource, BatchProperties.Jdbc properties) {
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
settings.setMode(properties.getInitializeSchema());
settings.setContinueOnError(true);
return settings;
}

private static List<String> resolveSchemaLocations(DataSource dataSource, BatchProperties.Jdbc properties) {
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
if (StringUtils.hasText(properties.getPlatform())) {
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
}
return platformResolver.resolveAll(dataSource, properties.getSchema());
super(dataSource, properties);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package org.springframework.boot.autoconfigure.batch;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.sql.init.DatabaseInitializationMode;
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;
import org.springframework.transaction.annotation.Isolation;

/**
Expand Down Expand Up @@ -63,7 +63,7 @@ public void setName(String name) {

}

public static class Jdbc {
public static class Jdbc extends DatabaseInitializationProperties {

private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
+ "batch/core/schema-@@platform@@.sql";
Expand All @@ -78,27 +78,11 @@ public static class Jdbc {
*/
private Isolation isolationLevelForCreate;

/**
* Path to the SQL file to use to initialize the database schema.
*/
private String schema = DEFAULT_SCHEMA_LOCATION;

/**
* Platform to use in initialization scripts if the @@platform@@ placeholder is
* used. Auto-detected by default.
*/
private String platform;

/**
* Table prefix for all the batch meta-data tables.
*/
private String tablePrefix;

/**
* Database schema initialization mode.
*/
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;

public boolean isValidateTransactionState() {
return this.validateTransactionState;
}
Expand All @@ -115,22 +99,6 @@ public void setIsolationLevelForCreate(Isolation isolationLevelForCreate) {
this.isolationLevelForCreate = isolationLevelForCreate;
}

public String getSchema() {
return this.schema;
}

public void setSchema(String schema) {
this.schema = schema;
}

public String getPlatform() {
return this.platform;
}

public void setPlatform(String platform) {
this.platform = platform;
}

public String getTablePrefix() {
return this.tablePrefix;
}
Expand All @@ -139,12 +107,9 @@ public void setTablePrefix(String tablePrefix) {
this.tablePrefix = tablePrefix;
}

public DatabaseInitializationMode getInitializeSchema() {
return this.initializeSchema;
}

public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
this.initializeSchema = initializeSchema;
@Override
public String getDefaultSchemaLocation() {
return DEFAULT_SCHEMA_LOCATION;
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2022 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -16,25 +16,25 @@

package org.springframework.boot.autoconfigure.integration;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver;
import org.springframework.boot.sql.init.DatabaseInitializationSettings;
import org.springframework.util.StringUtils;
import org.springframework.boot.jdbc.init.PropertiesBasedDataSourceScriptDatabaseInitializer;

/**
* {@link DataSourceScriptDatabaseInitializer} for the Spring Integration database. May be
* registered as a bean to override auto-configuration.
*
* @author Vedran Pavic
* @author Andy Wilkinson
* @author Yanming Zhou
* @since 2.6.0
*/
public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer {
public class IntegrationDataSourceScriptDatabaseInitializer
extends PropertiesBasedDataSourceScriptDatabaseInitializer<IntegrationProperties.Jdbc> {

/**
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
Expand All @@ -44,45 +44,7 @@ public class IntegrationDataSourceScriptDatabaseInitializer extends DataSourceSc
*/
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource,
IntegrationProperties.Jdbc properties) {
this(dataSource, getSettings(dataSource, properties));
}

/**
* Create a new {@link IntegrationDataSourceScriptDatabaseInitializer} instance.
* @param dataSource the Spring Integration data source
* @param settings the database initialization settings
* @see #getSettings
*/
public IntegrationDataSourceScriptDatabaseInitializer(DataSource dataSource,
DatabaseInitializationSettings settings) {
super(dataSource, settings);
}

/**
* Adapts {@link IntegrationProperties.Jdbc Spring Integration JDBC properties} to
* {@link DatabaseInitializationSettings} replacing any {@literal @@platform@@}
* placeholders.
* @param dataSource the Spring Integration data source
* @param properties the Spring Integration JDBC properties
* @return a new {@link DatabaseInitializationSettings} instance
* @see #IntegrationDataSourceScriptDatabaseInitializer(DataSource,
* DatabaseInitializationSettings)
*/
static DatabaseInitializationSettings getSettings(DataSource dataSource, IntegrationProperties.Jdbc properties) {
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
settings.setMode(properties.getInitializeSchema());
settings.setContinueOnError(true);
return settings;
}

private static List<String> resolveSchemaLocations(DataSource dataSource, IntegrationProperties.Jdbc properties) {
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
platformResolver = platformResolver.withDriverPlatform(DatabaseDriver.MARIADB, "mysql");
if (StringUtils.hasText(properties.getPlatform())) {
return platformResolver.resolveAll(properties.getPlatform(), properties.getSchema());
}
return platformResolver.resolveAll(dataSource, properties.getSchema());
super(dataSource, properties, Map.of(DatabaseDriver.MARIADB, "mysql"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@
import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.sql.init.DatabaseInitializationMode;
import org.springframework.boot.jdbc.init.DatabaseInitializationProperties;

/**
* Configuration properties for Spring Integration.
*
* @author Vedran Pavic
* @author Stephane Nicoll
* @author Artem Bilan
* @author Yanming Zhou
* @since 2.0.0
*/
@ConfigurationProperties("spring.integration")
Expand Down Expand Up @@ -212,49 +213,14 @@ public void setIgnoreFailures(boolean ignoreFailures) {

}

public static class Jdbc {
public static class Jdbc extends DatabaseInitializationProperties {

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

/**
* Path to the SQL file to use to initialize the database schema.
*/
private String schema = DEFAULT_SCHEMA_LOCATION;

/**
* Platform to use in initialization scripts if the @@platform@@ placeholder is
* used. Auto-detected by default.
*/
private String platform;

/**
* Database schema initialization mode.
*/
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;

public String getSchema() {
return this.schema;
}

public void setSchema(String schema) {
this.schema = schema;
}

public String getPlatform() {
return this.platform;
}

public void setPlatform(String platform) {
this.platform = platform;
}

public DatabaseInitializationMode getInitializeSchema() {
return this.initializeSchema;
}

public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
this.initializeSchema = initializeSchema;
@Override
public String getDefaultSchemaLocation() {
return DEFAULT_SCHEMA_LOCATION;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
*
* @author Vedran Pavic
* @author Stephane Nicoll
* @author Yanming Zhou
* @since 2.0.0
*/
@AutoConfiguration(after = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
Expand Down Expand Up @@ -138,7 +139,7 @@ public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseI
DataSource dataSource, @QuartzDataSource ObjectProvider<DataSource> quartzDataSource,
QuartzProperties properties) {
DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource);
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties);
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties.getJdbc());
}

static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
Expand Down
Loading
Loading