diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java index 3e5c4d6f8b..6bf4c04bda 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java @@ -16,9 +16,6 @@ package org.springframework.boot.autoconfigure.sql.init; -import java.nio.charset.Charset; -import java.util.List; - import javax.sql.DataSource; import io.r2dbc.spi.ConnectionFactory; @@ -39,7 +36,6 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.Resource; import org.springframework.jdbc.datasource.init.DatabasePopulator; import static org.assertj.core.api.Assertions.assertThat; @@ -162,8 +158,7 @@ class SqlInitializationAutoConfigurationTests { return new SqlDataSourceScriptDatabaseInitializer(null, new DatabaseInitializationSettings()) { @Override - protected void runScripts(List resources, boolean continueOnError, String separator, - Charset encoding) { + protected void runScripts(Scripts scripts) { // No-op } @@ -185,8 +180,7 @@ class SqlInitializationAutoConfigurationTests { return new DataSourceScriptDatabaseInitializer(null, new DatabaseInitializationSettings()) { @Override - protected void runScripts(List resources, boolean continueOnError, String separator, - Charset encoding) { + protected void runScripts(Scripts scripts) { // No-op } 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 4ca160c470..d37916cd88 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,9 +16,6 @@ package org.springframework.boot.jdbc.init; -import java.nio.charset.Charset; -import java.util.List; - import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -76,14 +73,14 @@ public class DataSourceScriptDatabaseInitializer extends AbstractScriptDatabaseI } @Override - protected void runScripts(List resources, boolean continueOnError, String separator, Charset encoding) { + protected void runScripts(Scripts scripts) { ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); - populator.setContinueOnError(continueOnError); - populator.setSeparator(separator); - if (encoding != null) { - populator.setSqlScriptEncoding(encoding.name()); + populator.setContinueOnError(scripts.isContinueOnError()); + populator.setSeparator(scripts.getSeparator()); + if (scripts.getEncoding() != null) { + populator.setSqlScriptEncoding(scripts.getEncoding().name()); } - for (Resource resource : resources) { + for (Resource resource : scripts) { populator.addScript(resource); } customize(populator); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializer.java index 2a0de59324..e7bf48aa70 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -16,9 +16,6 @@ package org.springframework.boot.r2dbc.init; -import java.nio.charset.Charset; -import java.util.List; - import io.r2dbc.spi.ConnectionFactory; import org.springframework.beans.factory.InitializingBean; @@ -58,12 +55,12 @@ public class R2dbcScriptDatabaseInitializer extends AbstractScriptDatabaseInitia } @Override - protected void runScripts(List scripts, boolean continueOnError, String separator, Charset encoding) { + protected void runScripts(Scripts scripts) { ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); - populator.setContinueOnError(continueOnError); - populator.setSeparator(separator); - if (encoding != null) { - populator.setSqlScriptEncoding(encoding.name()); + populator.setContinueOnError(scripts.isContinueOnError()); + populator.setSeparator(scripts.getSeparator()); + if (scripts.getEncoding() != null) { + populator.setSqlScriptEncoding(scripts.getEncoding().name()); } for (Resource script : scripts) { populator.addScript(script); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java index 4ab0661905..d35fb21fa7 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 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. @@ -21,6 +21,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; import org.springframework.beans.factory.InitializingBean; @@ -142,12 +143,16 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade } private void runScripts(List resources) { - runScripts(resources, this.settings.isContinueOnError(), this.settings.getSeparator(), - this.settings.getEncoding()); + runScripts(new Scripts(resources).continueOnError(this.settings.isContinueOnError()) + .separator(this.settings.getSeparator()).encoding(this.settings.getEncoding())); } - protected abstract void runScripts(List resources, boolean continueOnError, String separator, - Charset encoding); + /** + * Initialize the database by running the given {@code scripts}. + * @param scripts the scripts to run + * @since 3.0.0 + */ + protected abstract void runScripts(Scripts scripts); private static class ScriptLocationResolver { @@ -173,4 +178,57 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade } + /** + * Scripts to be used to initialize the database. + * + * @since 3.0.0 + */ + public static class Scripts implements Iterable { + + private final List resources; + + private boolean continueOnError = false; + + private String separator = ";"; + + private Charset encoding; + + public Scripts(List resources) { + this.resources = resources; + } + + @Override + public Iterator iterator() { + return this.resources.iterator(); + } + + public Scripts continueOnError(boolean continueOnError) { + this.continueOnError = continueOnError; + return this; + } + + public boolean isContinueOnError() { + return this.continueOnError; + } + + public Scripts separator(String separator) { + this.separator = separator; + return this; + } + + public String getSeparator() { + return this.separator; + } + + public Scripts encoding(Charset encoding) { + this.encoding = encoding; + return this; + } + + public Charset getEncoding() { + return this.encoding; + } + + } + }