From fab7b1cebe65e39820e5fec65fa9302fe28c660d Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Mon, 17 May 2021 16:12:13 +0200 Subject: [PATCH] Polish ScriptUtils internals in spring-r2dbc See gh-26947 --- .../r2dbc/connection/init/ScriptUtils.java | 41 ++++++++----------- .../connection/init/ScriptUtilsUnitTests.java | 40 +++++++----------- 2 files changed, 32 insertions(+), 49 deletions(-) diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java index f5fb828b6ef..304f6ec5580 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java @@ -106,8 +106,8 @@ public abstract class ScriptUtils { /** * Split an SQL script into separate statements delimited by the provided - * separator string. Each individual statement will be added to the provided - * {@code List}. + * separator string and return a {@code List} containing each individual + * statement. *

Within the script, the provided {@code commentPrefixes} will be honored: * any text beginning with one of the comment prefixes and extending to the * end of the line will be omitted from the output. Similarly, the provided @@ -125,12 +125,12 @@ public abstract class ScriptUtils { * never {@code null} or empty * @param blockCommentEndDelimiter the end block comment delimiter; * never {@code null} or empty - * @param statements the list that will contain the individual statements + * @return a list of statements * @throws ScriptException if an error occurred while splitting the SQL script */ - static void splitSqlScript(@Nullable EncodedResource resource, String script, + static List splitSqlScript(EncodedResource resource, String script, String separator, String[] commentPrefixes, String blockCommentStartDelimiter, - String blockCommentEndDelimiter, List statements) throws ScriptException { + String blockCommentEndDelimiter) throws ScriptException { Assert.hasText(script, "'script' must not be null or empty"); Assert.notNull(separator, "'separator' must not be null"); @@ -141,6 +141,7 @@ public abstract class ScriptUtils { Assert.hasText(blockCommentStartDelimiter, "'blockCommentStartDelimiter' must not be null or empty"); Assert.hasText(blockCommentEndDelimiter, "'blockCommentEndDelimiter' must not be null or empty"); + List statements = new ArrayList<>(); StringBuilder sb = new StringBuilder(); boolean inSingleQuote = false; boolean inDoubleQuote = false; @@ -215,26 +216,22 @@ public abstract class ScriptUtils { if (StringUtils.hasText(sb)) { statements.add(sb.toString()); } + + return statements; } /** - * Read a script from the provided resource, using the supplied comment prefixes - * and statement separator, and build a {@code String} containing the lines. - *

Lines beginning with one of the comment prefixes are excluded - * from the results; however, line comments anywhere else — for example, - * within a statement — will be included in the results. - * @param resource the {@code EncodedResource} containing the script - * to be processed + * Read a script from the provided resource, using the supplied statement + * separator, and build a {@code String} containing the lines. + * @param resource the {@code EncodedResource} containing the script to be + * processed * @param dataBufferFactory the factory to create data buffers with * @param separator the statement separator in the SQL script (typically ";") - * @param commentPrefixes the prefixes that identify comments in the SQL script - * (typically "--") - * @param blockCommentEndDelimiter the end block comment delimiter * @return a {@link Mono} of {@link String} containing the script lines that - * completes once the resource was loaded + * completes once the resource has been loaded */ static Mono readScript(EncodedResource resource, DataBufferFactory dataBufferFactory, - @Nullable String separator, @Nullable String[] commentPrefixes, @Nullable String blockCommentEndDelimiter) { + @Nullable String separator) { return DataBufferUtils.join(DataBufferUtils.read(resource.getResource(), dataBufferFactory, 8192)) .handle((it, sink) -> { @@ -322,7 +319,7 @@ public abstract class ScriptUtils { * (typically "*/") * @since 5.3.8 */ - static boolean containsStatementSeparator(@Nullable EncodedResource resource, String script, + static boolean containsStatementSeparator(EncodedResource resource, String script, String separator, String[] commentPrefixes, String blockCommentStartDelimiter, String blockCommentEndDelimiter) throws ScriptException { @@ -514,13 +511,12 @@ public abstract class ScriptUtils { long startTime = System.currentTimeMillis(); - Mono inputScript = readScript(resource, dataBufferFactory, separator, commentPrefixes, blockCommentEndDelimiter) + Mono inputScript = readScript(resource, dataBufferFactory, separator) .onErrorMap(IOException.class, ex -> new CannotReadScriptException(resource, ex)); AtomicInteger statementNumber = new AtomicInteger(); Flux executeScript = inputScript.flatMapIterable(script -> { - List statements = new ArrayList<>(); String separatorToUse = separator; if (separatorToUse == null) { separatorToUse = DEFAULT_STATEMENT_SEPARATOR; @@ -530,9 +526,8 @@ public abstract class ScriptUtils { blockCommentStartDelimiter, blockCommentEndDelimiter)) { separatorToUse = FALLBACK_STATEMENT_SEPARATOR; } - splitSqlScript(resource, script, separatorToUse, commentPrefixes, blockCommentStartDelimiter, - blockCommentEndDelimiter, statements); - return statements; + return splitSqlScript(resource, script, separatorToUse, commentPrefixes, + blockCommentStartDelimiter, blockCommentEndDelimiter); }).concatMap(statement -> { statementNumber.incrementAndGet(); return runStatement(statement, connection, resource, continueOnError, ignoreFailedDrops, statementNumber); diff --git a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java index bc9775ad9c9..8cf650bcb42 100644 --- a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java +++ b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java @@ -16,7 +16,6 @@ package org.springframework.r2dbc.connection.init; -import java.util.ArrayList; import java.util.List; import org.assertj.core.util.Strings; @@ -60,8 +59,7 @@ public class ScriptUtilsUnitTests { String delimiter = ";"; String script = Strings.join(rawStatement1, rawStatement2, rawStatement3).with(delimiter); - List statements = new ArrayList<>(); - splitSqlScript(script, delimiter, statements); + List statements = splitSqlScript(script, delimiter); assertThat(statements).containsExactly(cleanedStatement1, cleanedStatement2, cleanedStatement3); } @@ -75,8 +73,7 @@ public class ScriptUtilsUnitTests { String delimiter = "\n"; String script = Strings.join(statement1, statement2, statement3).with(delimiter); - List statements = new ArrayList<>(); - splitSqlScript(script, delimiter, statements); + List statements = splitSqlScript(script, delimiter); assertThat(statements).containsExactly(statement1, statement2, statement3); } @@ -88,9 +85,7 @@ public class ScriptUtilsUnitTests { String script = Strings.join(statement1, statement2).with("\n"); - List statements = new ArrayList<>(); - - splitSqlScript(script, DEFAULT_STATEMENT_SEPARATOR, statements); + List statements = splitSqlScript(script, DEFAULT_STATEMENT_SEPARATOR); assertThat(statements).as("stripped but not split statements").containsExactly(script.replace('\n', ' ')); } @@ -103,8 +98,7 @@ public class ScriptUtilsUnitTests { String delimiter = ";"; String script = Strings.join(statement1, statement2).with(delimiter); - List statements = new ArrayList<>(); - splitSqlScript(script, delimiter, statements); + List statements = splitSqlScript(script, delimiter); assertThat(statements).containsExactly(statement1, statement2); } @@ -112,8 +106,7 @@ public class ScriptUtilsUnitTests { @Test // SPR-11560 public void readAndSplitScriptWithMultipleNewlinesAsSeparator() throws Exception { String script = readScript("db-test-data-multi-newline.sql"); - List statements = new ArrayList<>(); - splitSqlScript(script, "\n\n", statements); + List statements = splitSqlScript(script, "\n\n"); String statement1 = "insert into T_TEST (NAME) values ('Keith')"; String statement2 = "insert into T_TEST (NAME) values ('Dave')"; @@ -140,9 +133,8 @@ public class ScriptUtilsUnitTests { } private void splitScriptContainingComments(String script, String... commentPrefixes) { - List statements = new ArrayList<>(); - ScriptUtils.splitSqlScript(null, script, ";", commentPrefixes, DEFAULT_BLOCK_COMMENT_START_DELIMITER, - DEFAULT_BLOCK_COMMENT_END_DELIMITER, statements); + List statements = ScriptUtils.splitSqlScript(null, script, ";", commentPrefixes, DEFAULT_BLOCK_COMMENT_START_DELIMITER, + DEFAULT_BLOCK_COMMENT_END_DELIMITER); String statement1 = "insert into customer (id, name) values (1, 'Rod; Johnson'), (2, 'Adrian Collier')"; String statement2 = "insert into orders(id, order_date, customer_id) values (1, '2008-01-02', 2)"; @@ -156,8 +148,7 @@ public class ScriptUtilsUnitTests { @Test // SPR-10330 public void readAndSplitScriptContainingCommentsWithLeadingTabs() throws Exception { String script = readScript("test-data-with-comments-and-leading-tabs.sql"); - List statements = new ArrayList<>(); - splitSqlScript(script, ";", statements); + List statements = splitSqlScript(script, ";"); String statement1 = "insert into customer (id, name) values (1, 'Sam Brannen')"; String statement2 = "insert into orders(id, order_date, customer_id) values (1, '2013-06-08', 1)"; @@ -169,8 +160,7 @@ public class ScriptUtilsUnitTests { @Test // SPR-9531 public void readAndSplitScriptContainingMultiLineComments() throws Exception { String script = readScript("test-data-with-multi-line-comments.sql"); - List statements = new ArrayList<>(); - splitSqlScript(script, ";", statements); + List statements = splitSqlScript(script, ";"); String statement1 = "INSERT INTO users(first_name, last_name) VALUES('Juergen', 'Hoeller')"; String statement2 = "INSERT INTO users(first_name, last_name) VALUES( 'Sam' , 'Brannen' )"; @@ -181,8 +171,7 @@ public class ScriptUtilsUnitTests { @Test public void readAndSplitScriptContainingMultiLineNestedComments() throws Exception { String script = readScript("test-data-with-multi-line-nested-comments.sql"); - List statements = new ArrayList<>(); - splitSqlScript(script, ";", statements); + List statements = splitSqlScript(script, ";"); String statement1 = "INSERT INTO users(first_name, last_name) VALUES('Juergen', 'Hoeller')"; String statement2 = "INSERT INTO users(first_name, last_name) VALUES( 'Sam' , 'Brannen' )"; @@ -231,13 +220,12 @@ public class ScriptUtilsUnitTests { private String readScript(String path) throws Exception { EncodedResource resource = new EncodedResource(new ClassPathResource(path, getClass())); - return ScriptUtils.readScript(resource, DefaultDataBufferFactory.sharedInstance, DEFAULT_STATEMENT_SEPARATOR, - DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_END_DELIMITER).block(); + return ScriptUtils.readScript(resource, DefaultDataBufferFactory.sharedInstance, DEFAULT_STATEMENT_SEPARATOR).block(); } - private static void splitSqlScript(String script, String separator, List statements) throws ScriptException { - ScriptUtils.splitSqlScript(null, script, separator, DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_START_DELIMITER, - DEFAULT_BLOCK_COMMENT_END_DELIMITER, statements); + private static List splitSqlScript(String script, String separator) throws ScriptException { + return ScriptUtils.splitSqlScript(null, script, separator, DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_START_DELIMITER, + DEFAULT_BLOCK_COMMENT_END_DELIMITER); } }