From 653fdbd0a49f7afd3b8036835e4da211d2745278 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 20 Dec 2021 17:47:50 +0100 Subject: [PATCH] Configure comment prefixes Closes gh-29095 --- ...tzDataSourceScriptDatabaseInitializer.java | 19 +++++++++++++++++- ...aSourceScriptDatabaseInitializerTests.java | 16 +++++++++++++++ .../DataSourceScriptDatabaseInitializer.java | 10 ++++++++++ ...aSourceScriptDatabaseInitializerTests.java | 20 +++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializer.java index 8fca4af47573..23f46d677c1f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializer.java @@ -24,6 +24,8 @@ import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; import org.springframework.boot.jdbc.init.PlatformPlaceholderDatabaseDriverResolver; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** @@ -37,6 +39,8 @@ */ public class QuartzDataSourceScriptDatabaseInitializer extends DataSourceScriptDatabaseInitializer { + private final List commentPrefixes; + /** * Create a new {@link QuartzDataSourceScriptDatabaseInitializer} instance. * @param dataSource the Quartz Scheduler data source @@ -44,7 +48,7 @@ public class QuartzDataSourceScriptDatabaseInitializer extends DataSourceScriptD * @see #getSettings */ public QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, QuartzProperties properties) { - this(dataSource, getSettings(dataSource, properties)); + this(dataSource, getSettings(dataSource, properties), properties.getJdbc().getCommentPrefix()); } /** @@ -54,7 +58,20 @@ public QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, QuartzPr * @see #getSettings */ public QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings) { + this(dataSource, settings, null); + } + + private QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, DatabaseInitializationSettings settings, + List commentPrefixes) { super(dataSource, settings); + this.commentPrefixes = commentPrefixes; + } + + @Override + protected void customize(ResourceDatabasePopulator populator) { + if (!ObjectUtils.isEmpty(this.commentPrefixes)) { + populator.setCommentPrefixes(this.commentPrefixes.toArray(new String[0])); + } } /** diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializerTests.java index 16b2d56ff902..dcfc5db18ee6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializerTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/quartz/QuartzDataSourceScriptDatabaseInitializerTests.java @@ -16,14 +16,18 @@ package org.springframework.boot.autoconfigure.quartz; +import java.util.Arrays; + import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; /** @@ -45,4 +49,16 @@ void getSettingsWithPlatformDoesNotTouchDataSource() { verifyNoInteractions(dataSource); } + @Test + void customizeSetCommentPrefixes() { + QuartzProperties properties = new QuartzProperties(); + properties.getJdbc().setPlatform("test"); + properties.getJdbc().setCommentPrefix(Arrays.asList("##", "--")); + QuartzDataSourceScriptDatabaseInitializer initializer = new QuartzDataSourceScriptDatabaseInitializer( + mock(DataSource.class), properties); + ResourceDatabasePopulator populator = mock(ResourceDatabasePopulator.class); + initializer.customize(populator); + verify(populator).setCommentPrefixes("##", "--"); + } + } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializer.java index 043bae257544..4ca160c47020 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializer.java @@ -86,7 +86,17 @@ protected void runScripts(List resources, boolean continueOnError, Str for (Resource resource : resources) { populator.addScript(resource); } + customize(populator); DatabasePopulatorUtils.execute(populator, this.dataSource); } + /** + * Customize the {@link ResourceDatabasePopulator}. + * @param populator the configured database populator + * @since 2.6.2 + */ + protected void customize(ResourceDatabasePopulator populator) { + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java index 38b8f3694ce8..475a846b1dec 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.jdbc.init; +import java.util.Collections; import java.util.UUID; import javax.sql.DataSource; @@ -29,8 +30,11 @@ import org.springframework.boot.sql.init.DatabaseInitializationSettings; import org.springframework.boot.testsupport.BuildOutput; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.springframework.jdbc.datasource.init.ScriptStatementFailedException; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Tests for {@link DataSourceScriptDatabaseInitializer}. @@ -61,6 +65,22 @@ void whenDatabaseIsInaccessibleThenItIsAssumedNotToBeEmbedded() { assertThat(initializer.isEmbeddedDatabase()).isFalse(); } + @Test + void whenCustomizeIsOverriddenThenDatabasePopulatorIsConfiguredAccordingly() { + DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); + settings.setContinueOnError(true); + settings.setDataLocations(Collections.singletonList("data.sql")); + DataSourceScriptDatabaseInitializer initializer = new DataSourceScriptDatabaseInitializer( + this.embeddedDataSource, settings) { + @Override + protected void customize(ResourceDatabasePopulator populator) { + assertThat(populator).hasFieldOrPropertyWithValue("continueOnError", true); + populator.setContinueOnError(false); + } + }; + assertThatThrownBy(initializer::initializeDatabase).isInstanceOf(ScriptStatementFailedException.class); + } + @Override protected DataSourceScriptDatabaseInitializer createEmbeddedDatabaseInitializer( DatabaseInitializationSettings settings) {