Skip to content

Commit 7c73a03

Browse files
committed
Improve backwards- and forwards-compatibility of Flyway auto-config
Closes gh-38164
1 parent 66ed4fe commit 7c73a03

File tree

2 files changed

+117
-50
lines changed

2 files changed

+117
-50
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java

Lines changed: 61 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -161,106 +161,117 @@ private void applyCommonBuilderProperties(FlywayProperties properties, DataSourc
161161
}
162162
}
163163

164+
/**
165+
* Configure the given {@code configuration} using the given {@code properties}.
166+
* <p>
167+
* To maximize forwards- and backwards-compatibility method references are not
168+
* used.
169+
* @param configuration the configuration
170+
* @param properties the properties
171+
*/
164172
private void configureProperties(FluentConfiguration configuration, FlywayProperties properties) {
165173
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
174+
configureFailOnMissingLocations(configuration, properties.isFailOnMissingLocations());
166175
String[] locations = new LocationResolver(configuration.getDataSource())
167176
.resolveLocations(properties.getLocations())
168177
.toArray(new String[0]);
169-
configureFailOnMissingLocations(configuration, properties.isFailOnMissingLocations());
170-
map.from(locations).to(configuration::locations);
171-
map.from(properties.getEncoding()).to(configuration::encoding);
172-
map.from(properties.getConnectRetries()).to(configuration::connectRetries);
173-
// No method reference for compatibility with Flyway < 7.15
178+
configuration.locations(locations);
179+
map.from(properties.getEncoding()).to((encoding) -> configuration.encoding(encoding));
180+
map.from(properties.getConnectRetries())
181+
.to((connectRetries) -> configuration.connectRetries(connectRetries));
174182
map.from(properties.getConnectRetriesInterval())
175183
.to((interval) -> configuration.connectRetriesInterval((int) interval.getSeconds()));
176-
// No method reference for compatibility with Flyway 6.x
177184
map.from(properties.getLockRetryCount())
178185
.to((lockRetryCount) -> configuration.lockRetryCount(lockRetryCount));
179-
// No method reference for compatibility with Flyway 5.x
180186
map.from(properties.getDefaultSchema()).to((schema) -> configuration.defaultSchema(schema));
181-
map.from(properties.getSchemas()).as(StringUtils::toStringArray).to(configuration::schemas);
187+
map.from(properties.getSchemas())
188+
.as(StringUtils::toStringArray)
189+
.to((schemas) -> configuration.schemas(schemas));
182190
configureCreateSchemas(configuration, properties.isCreateSchemas());
183-
map.from(properties.getTable()).to(configuration::table);
184-
// No method reference for compatibility with Flyway 5.x
191+
map.from(properties.getTable()).to((table) -> configuration.table(table));
185192
map.from(properties.getTablespace()).to((tablespace) -> configuration.tablespace(tablespace));
186-
map.from(properties.getBaselineDescription()).to(configuration::baselineDescription);
187-
map.from(properties.getBaselineVersion()).to(configuration::baselineVersion);
188-
map.from(properties.getInstalledBy()).to(configuration::installedBy);
189-
map.from(properties.getPlaceholders()).to(configuration::placeholders);
190-
map.from(properties.getPlaceholderPrefix()).to(configuration::placeholderPrefix);
191-
map.from(properties.getPlaceholderSuffix()).to(configuration::placeholderSuffix);
192-
// No method reference for compatibility with Flyway version < 8.0
193+
map.from(properties.getBaselineDescription())
194+
.to((baselineDescription) -> configuration.baselineDescription(baselineDescription));
195+
map.from(properties.getBaselineVersion())
196+
.to((baselineVersion) -> configuration.baselineVersion(baselineVersion));
197+
map.from(properties.getInstalledBy()).to((installedBy) -> configuration.installedBy(installedBy));
198+
map.from(properties.getPlaceholders()).to((placeholders) -> configuration.placeholders(placeholders));
199+
map.from(properties.getPlaceholderPrefix())
200+
.to((placeholderPrefix) -> configuration.placeholderPrefix(placeholderPrefix));
201+
map.from(properties.getPlaceholderSuffix())
202+
.to((placeholderSuffix) -> configuration.placeholderSuffix(placeholderSuffix));
193203
map.from(properties.getPlaceholderSeparator())
194204
.to((placeHolderSeparator) -> configuration.placeholderSeparator(placeHolderSeparator));
195-
map.from(properties.isPlaceholderReplacement()).to(configuration::placeholderReplacement);
196-
map.from(properties.getSqlMigrationPrefix()).to(configuration::sqlMigrationPrefix);
205+
map.from(properties.isPlaceholderReplacement())
206+
.to((placeholderReplacement) -> configuration.placeholderReplacement(placeholderReplacement));
207+
map.from(properties.getSqlMigrationPrefix())
208+
.to((sqlMigrationPrefix) -> configuration.sqlMigrationPrefix(sqlMigrationPrefix));
197209
map.from(properties.getSqlMigrationSuffixes())
198210
.as(StringUtils::toStringArray)
199-
.to(configuration::sqlMigrationSuffixes);
200-
map.from(properties.getSqlMigrationSeparator()).to(configuration::sqlMigrationSeparator);
201-
map.from(properties.getRepeatableSqlMigrationPrefix()).to(configuration::repeatableSqlMigrationPrefix);
202-
map.from(properties.getTarget()).to(configuration::target);
203-
map.from(properties.isBaselineOnMigrate()).to(configuration::baselineOnMigrate);
204-
map.from(properties.isCleanDisabled()).to(configuration::cleanDisabled);
205-
map.from(properties.isCleanOnValidationError()).to(configuration::cleanOnValidationError);
206-
map.from(properties.isGroup()).to(configuration::group);
211+
.to((sqlMigrationSuffixes) -> configuration.sqlMigrationSuffixes(sqlMigrationSuffixes));
212+
map.from(properties.getSqlMigrationSeparator())
213+
.to((sqlMigrationSeparator) -> configuration.sqlMigrationSeparator(sqlMigrationSeparator));
214+
map.from(properties.getRepeatableSqlMigrationPrefix())
215+
.to((repeatableSqlMigrationPrefix) -> configuration
216+
.repeatableSqlMigrationPrefix(repeatableSqlMigrationPrefix));
217+
map.from(properties.getTarget()).to((target) -> configuration.target(target));
218+
map.from(properties.isBaselineOnMigrate())
219+
.to((baselineOnMigrate) -> configuration.baselineOnMigrate(baselineOnMigrate));
220+
map.from(properties.isCleanDisabled()).to((cleanDisabled) -> configuration.cleanDisabled(cleanDisabled));
221+
map.from(properties.isCleanOnValidationError())
222+
.to((cleanOnValidationError) -> configuration.cleanOnValidationError(cleanOnValidationError));
223+
map.from(properties.isGroup()).to((group) -> configuration.group(group));
207224
configureIgnoredMigrations(configuration, properties, map);
208-
map.from(properties.isMixed()).to(configuration::mixed);
209-
map.from(properties.isOutOfOrder()).to(configuration::outOfOrder);
210-
map.from(properties.isSkipDefaultCallbacks()).to(configuration::skipDefaultCallbacks);
211-
map.from(properties.isSkipDefaultResolvers()).to(configuration::skipDefaultResolvers);
225+
map.from(properties.isMixed()).to((mixed) -> configuration.mixed(mixed));
226+
map.from(properties.isOutOfOrder()).to((outOfOrder) -> configuration.outOfOrder(outOfOrder));
227+
map.from(properties.isSkipDefaultCallbacks())
228+
.to((skipDefaultCallbacks) -> configuration.skipDefaultCallbacks(skipDefaultCallbacks));
229+
map.from(properties.isSkipDefaultResolvers())
230+
.to((skipDefaultResolvers) -> configuration.skipDefaultResolvers(skipDefaultResolvers));
212231
configureValidateMigrationNaming(configuration, properties.isValidateMigrationNaming());
213-
map.from(properties.isValidateOnMigrate()).to(configuration::validateOnMigrate);
232+
map.from(properties.isValidateOnMigrate())
233+
.to((validateOnMigrate) -> configuration.validateOnMigrate(validateOnMigrate));
214234
map.from(properties.getInitSqls())
215235
.whenNot(CollectionUtils::isEmpty)
216236
.as((initSqls) -> StringUtils.collectionToDelimitedString(initSqls, "\n"))
217-
.to(configuration::initSql);
237+
.to((initSql) -> configuration.initSql(initSql));
218238
map.from(properties.getScriptPlaceholderPrefix())
219239
.to((prefix) -> configuration.scriptPlaceholderPrefix(prefix));
220240
map.from(properties.getScriptPlaceholderSuffix())
221241
.to((suffix) -> configuration.scriptPlaceholderSuffix(suffix));
222242
// Pro properties
223-
map.from(properties.getBatch()).to(configuration::batch);
224-
map.from(properties.getDryRunOutput()).to(configuration::dryRunOutput);
225-
map.from(properties.getErrorOverrides()).to(configuration::errorOverrides);
226-
map.from(properties.getLicenseKey()).to(configuration::licenseKey);
227-
// No method reference for compatibility with Flyway 9.20+
243+
map.from(properties.getBatch()).to((batch) -> configuration.batch(batch));
244+
map.from(properties.getDryRunOutput()).to((dryRunOutput) -> configuration.dryRunOutput(dryRunOutput));
245+
map.from(properties.getErrorOverrides())
246+
.to((errorOverrides) -> configuration.errorOverrides(errorOverrides));
247+
map.from(properties.getLicenseKey()).to((licenseKey) -> configuration.licenseKey(licenseKey));
228248
map.from(properties.getOracleSqlplus()).to((oracleSqlplus) -> configuration.oracleSqlplus(oracleSqlplus));
229-
// No method reference for compatibility with Flyway 5.x
230249
map.from(properties.getOracleSqlplusWarn())
231250
.to((oracleSqlplusWarn) -> configuration.oracleSqlplusWarn(oracleSqlplusWarn));
232-
map.from(properties.getStream()).to(configuration::stream);
233-
map.from(properties.getUndoSqlMigrationPrefix()).to(configuration::undoSqlMigrationPrefix);
234-
// No method reference for compatibility with Flyway 6.x
251+
map.from(properties.getStream()).to((stream) -> configuration.stream(stream));
252+
map.from(properties.getUndoSqlMigrationPrefix())
253+
.to((undoSqlMigrationPrefix) -> configuration.undoSqlMigrationPrefix(undoSqlMigrationPrefix));
235254
map.from(properties.getCherryPick()).to((cherryPick) -> configuration.cherryPick(cherryPick));
236-
// No method reference for compatibility with Flyway 6.x
237255
map.from(properties.getJdbcProperties())
238256
.whenNot(Map::isEmpty)
239257
.to((jdbcProperties) -> configuration.jdbcProperties(jdbcProperties));
240-
// No method reference for compatibility with Flyway 6.x
241258
map.from(properties.getKerberosConfigFile())
242259
.to((configFile) -> configuration.kerberosConfigFile(configFile));
243-
// No method reference for compatibility with Flyway 6.x
244260
map.from(properties.getOracleKerberosCacheFile())
245261
.to((cacheFile) -> configuration.oracleKerberosCacheFile(cacheFile));
246-
// No method reference for compatibility with Flyway 6.x
247262
map.from(properties.getOutputQueryResults())
248263
.to((outputQueryResults) -> configuration.outputQueryResults(outputQueryResults));
249264
map.from(properties.getSqlServerKerberosLoginFile())
250265
.whenNonNull()
251266
.to(this::configureSqlServerKerberosLoginFile);
252-
// No method reference for compatibility with Flyway 6.x
253267
map.from(properties.getSkipExecutingMigrations())
254268
.to((skipExecutingMigrations) -> configuration.skipExecutingMigrations(skipExecutingMigrations));
255-
// No method reference for compatibility with Flyway < 7.8
256269
map.from(properties.getIgnoreMigrationPatterns())
257270
.whenNot(List::isEmpty)
258271
.to((ignoreMigrationPatterns) -> configuration
259272
.ignoreMigrationPatterns(ignoreMigrationPatterns.toArray(new String[0])));
260-
// No method reference for compatibility with Flyway version < 7.9
261273
map.from(properties.getDetectEncoding())
262274
.to((detectEncoding) -> configuration.detectEncoding(detectEncoding));
263-
// No method reference for compatibility with Flyway version < 8.0
264275
map.from(properties.getBaselineMigrationPrefix())
265276
.to((baselineMigrationPrefix) -> configuration.baselineMigrationPrefix(baselineMigrationPrefix));
266277
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2012-2023 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.autoconfigure.flyway;
18+
19+
import org.flywaydb.core.Flyway;
20+
import org.flywaydb.core.api.Location;
21+
import org.junit.jupiter.api.Test;
22+
import org.junit.jupiter.api.condition.EnabledForJreRange;
23+
import org.junit.jupiter.api.condition.JRE;
24+
25+
import org.springframework.boot.autoconfigure.AutoConfigurations;
26+
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
27+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
28+
import org.springframework.boot.testsupport.classpath.ClassPathOverrides;
29+
30+
import static org.assertj.core.api.Assertions.assertThat;
31+
32+
/**
33+
* Tests for {@link FlywayAutoConfiguration} with Flyway 10.x.
34+
*
35+
* @author Andy Wilkinson
36+
*/
37+
@ClassPathOverrides({ "org.flywaydb:flyway-core:10.0.0", "org.flywaydb:flyway-sqlserver:10.0.0",
38+
"com.h2database:h2:2.1.210" })
39+
@EnabledForJreRange(min = JRE.JAVA_17)
40+
class Flyway10xAutoConfigurationTests {
41+
42+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
43+
.withConfiguration(AutoConfigurations.of(FlywayAutoConfiguration.class))
44+
.withPropertyValues("spring.datasource.generate-unique-name=true");
45+
46+
@Test
47+
void defaultFlyway() {
48+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
49+
assertThat(context).hasSingleBean(Flyway.class);
50+
Flyway flyway = context.getBean(Flyway.class);
51+
assertThat(flyway.getConfiguration().getLocations())
52+
.containsExactly(new Location("classpath:db/migration"));
53+
});
54+
}
55+
56+
}

0 commit comments

Comments
 (0)