Skip to content

Commit 1b98926

Browse files
authored
Merge pull request #32925 from gastaldi/flyway_cleanup
Cleanup Flyway Config
2 parents a5d8660 + 6cf647c commit 1b98926

File tree

12 files changed

+206
-214
lines changed

12 files changed

+206
-214
lines changed

Diff for: extensions/flyway/deployment/src/main/java/io/quarkus/flyway/FlywayCallbacksLocator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public Map<String, Collection<Callback>> getCallbacks()
7676
*/
7777
private Collection<Callback> callbacksForDataSource(String dataSourceName)
7878
throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
79-
final Optional<List<String>> callbackConfig = flywayBuildConfig.getConfigForDataSourceName(dataSourceName).callbacks;
79+
final Optional<List<String>> callbackConfig = flywayBuildConfig.getConfigForDataSourceName(dataSourceName).callbacks();
8080
if (!callbackConfig.isPresent()) {
8181
return Collections.emptyList();
8282
}

Diff for: extensions/flyway/deployment/src/main/java/io/quarkus/flyway/FlywayProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ MigrationStateBuildItem build(BuildProducer<FeatureBuildItem> featureProducer,
9999
Map<String, Collection<String>> applicationMigrationsToDs = new HashMap<>();
100100
for (var i : dataSourceNames) {
101101
Collection<String> migrationLocations = discoverApplicationMigrations(
102-
flywayBuildConfig.getConfigForDataSourceName(i).locations);
102+
flywayBuildConfig.getConfigForDataSourceName(i).locations());
103103
applicationMigrationsToDs.put(i, migrationLocations);
104104
}
105105
Set<String> datasourcesWithMigrations = new HashSet<>();

Diff for: extensions/flyway/runtime/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@
5555
<artifactId>quarkus-junit5-internal</artifactId>
5656
<scope>test</scope>
5757
</dependency>
58+
<dependency>
59+
<groupId>io.quarkus</groupId>
60+
<artifactId>quarkus-junit5-mockito</artifactId>
61+
<scope>test</scope>
62+
</dependency>
5863
</dependencies>
5964

6065
<build>
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,40 @@
11
package io.quarkus.flyway.runtime;
22

3-
import java.util.Collections;
43
import java.util.Map;
54

65
import io.quarkus.datasource.common.runtime.DataSourceUtil;
7-
import io.quarkus.runtime.annotations.ConfigItem;
86
import io.quarkus.runtime.annotations.ConfigPhase;
97
import io.quarkus.runtime.annotations.ConfigRoot;
8+
import io.smallrye.config.ConfigMapping;
9+
import io.smallrye.config.WithParentName;
1010

11-
@ConfigRoot(name = "flyway", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
12-
public final class FlywayBuildTimeConfig {
11+
@ConfigMapping(prefix = "quarkus.flyway")
12+
@ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
13+
public interface FlywayBuildTimeConfig {
1314

1415
/**
1516
* Gets the {@link FlywayDataSourceBuildTimeConfig} for the given datasource name.
1617
*/
17-
public FlywayDataSourceBuildTimeConfig getConfigForDataSourceName(String dataSourceName) {
18+
default FlywayDataSourceBuildTimeConfig getConfigForDataSourceName(String dataSourceName) {
1819
if (DataSourceUtil.isDefault(dataSourceName)) {
19-
return defaultDataSource;
20+
return defaultDataSource();
2021
}
21-
return namedDataSources.getOrDefault(dataSourceName, FlywayDataSourceBuildTimeConfig.defaultConfig());
22+
FlywayDataSourceBuildTimeConfig config = namedDataSources().get(dataSourceName);
23+
if (config == null) {
24+
config = defaultDataSource();
25+
}
26+
return config;
2227
}
2328

2429
/**
2530
* Flyway configuration for the default datasource.
2631
*/
27-
@ConfigItem(name = ConfigItem.PARENT)
28-
public FlywayDataSourceBuildTimeConfig defaultDataSource;
32+
@WithParentName
33+
FlywayDataSourceBuildTimeConfig defaultDataSource();
2934

3035
/**
3136
* Flyway configurations for named datasources.
3237
*/
33-
@ConfigItem(name = ConfigItem.PARENT)
34-
public Map<String, FlywayDataSourceBuildTimeConfig> namedDataSources = Collections.emptyMap();
35-
}
38+
@WithParentName
39+
Map<String, FlywayDataSourceBuildTimeConfig> namedDataSources();
40+
}

Diff for: extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayContainerProducer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ public FlywayContainer createFlyway(DataSource dataSource, String dataSourceName
5151
final Flyway flyway = new FlywayCreator(matchingRuntimeConfig, matchingBuildTimeConfig, matchingConfigCustomizers(
5252
configCustomizerInstances, dataSourceName)).withCallbacks(callbacks)
5353
.createFlyway(dataSource);
54-
return new FlywayContainer(flyway, matchingRuntimeConfig.cleanAtStart, matchingRuntimeConfig.migrateAtStart,
55-
matchingRuntimeConfig.repairAtStart, matchingRuntimeConfig.validateAtStart,
54+
return new FlywayContainer(flyway, matchingRuntimeConfig.cleanAtStart(), matchingRuntimeConfig.migrateAtStart(),
55+
matchingRuntimeConfig.repairAtStart(), matchingRuntimeConfig.validateAtStart(),
5656
dataSourceName, hasMigrations,
5757
createPossible);
5858
}

Diff for: extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayCreator.java

+42-42
Original file line numberDiff line numberDiff line change
@@ -49,85 +49,85 @@ public FlywayCreator withCallbacks(Collection<Callback> callbacks) {
4949
public Flyway createFlyway(DataSource dataSource) {
5050
FluentConfiguration configure = Flyway.configure();
5151

52-
if (flywayRuntimeConfig.jdbcUrl.isPresent()) {
53-
if (flywayRuntimeConfig.username.isPresent() && flywayRuntimeConfig.password.isPresent()) {
54-
configure.dataSource(flywayRuntimeConfig.jdbcUrl.get(), flywayRuntimeConfig.username.get(),
55-
flywayRuntimeConfig.password.get());
52+
if (flywayRuntimeConfig.jdbcUrl().isPresent()) {
53+
if (flywayRuntimeConfig.username().isPresent() && flywayRuntimeConfig.password().isPresent()) {
54+
configure.dataSource(flywayRuntimeConfig.jdbcUrl().get(), flywayRuntimeConfig.username().get(),
55+
flywayRuntimeConfig.password().get());
5656
} else {
5757
throw new ConfigurationException(
5858
"Username and password must be defined when a JDBC URL is provided in the Flyway configuration");
5959
}
6060
} else {
61-
if (flywayRuntimeConfig.username.isPresent() && flywayRuntimeConfig.password.isPresent()) {
61+
if (flywayRuntimeConfig.username().isPresent() && flywayRuntimeConfig.password().isPresent()) {
6262
AgroalDataSource agroalDataSource = (AgroalDataSource) dataSource;
6363
String jdbcUrl = agroalDataSource.getConfiguration().connectionPoolConfiguration()
6464
.connectionFactoryConfiguration().jdbcUrl();
6565

66-
configure.dataSource(jdbcUrl, flywayRuntimeConfig.username.get(),
67-
flywayRuntimeConfig.password.get());
66+
configure.dataSource(jdbcUrl, flywayRuntimeConfig.username().get(),
67+
flywayRuntimeConfig.password().get());
6868
} else {
6969

7070
configure.dataSource(dataSource);
7171
}
7272
}
73-
if (flywayRuntimeConfig.initSql.isPresent()) {
74-
configure.initSql(flywayRuntimeConfig.initSql.get());
73+
if (flywayRuntimeConfig.initSql().isPresent()) {
74+
configure.initSql(flywayRuntimeConfig.initSql().get());
7575
}
76-
if (flywayRuntimeConfig.connectRetries.isPresent()) {
77-
configure.connectRetries(flywayRuntimeConfig.connectRetries.getAsInt());
76+
if (flywayRuntimeConfig.connectRetries().isPresent()) {
77+
configure.connectRetries(flywayRuntimeConfig.connectRetries().getAsInt());
7878
}
79-
if (flywayRuntimeConfig.defaultSchema.isPresent()) {
80-
configure.defaultSchema(flywayRuntimeConfig.defaultSchema.get());
79+
if (flywayRuntimeConfig.defaultSchema().isPresent()) {
80+
configure.defaultSchema(flywayRuntimeConfig.defaultSchema().get());
8181
}
82-
if (flywayRuntimeConfig.schemas.isPresent()) {
83-
configure.schemas(flywayRuntimeConfig.schemas.get().toArray(EMPTY_ARRAY));
82+
if (flywayRuntimeConfig.schemas().isPresent()) {
83+
configure.schemas(flywayRuntimeConfig.schemas().get().toArray(EMPTY_ARRAY));
8484
}
85-
if (flywayRuntimeConfig.table.isPresent()) {
86-
configure.table(flywayRuntimeConfig.table.get());
85+
if (flywayRuntimeConfig.table().isPresent()) {
86+
configure.table(flywayRuntimeConfig.table().get());
8787
}
88-
configure.locations(flywayBuildTimeConfig.locations.toArray(EMPTY_ARRAY));
89-
if (flywayRuntimeConfig.sqlMigrationPrefix.isPresent()) {
90-
configure.sqlMigrationPrefix(flywayRuntimeConfig.sqlMigrationPrefix.get());
88+
configure.locations(flywayBuildTimeConfig.locations().toArray(EMPTY_ARRAY));
89+
if (flywayRuntimeConfig.sqlMigrationPrefix().isPresent()) {
90+
configure.sqlMigrationPrefix(flywayRuntimeConfig.sqlMigrationPrefix().get());
9191
}
92-
if (flywayRuntimeConfig.repeatableSqlMigrationPrefix.isPresent()) {
93-
configure.repeatableSqlMigrationPrefix(flywayRuntimeConfig.repeatableSqlMigrationPrefix.get());
92+
if (flywayRuntimeConfig.repeatableSqlMigrationPrefix().isPresent()) {
93+
configure.repeatableSqlMigrationPrefix(flywayRuntimeConfig.repeatableSqlMigrationPrefix().get());
9494
}
95-
configure.cleanDisabled(flywayRuntimeConfig.cleanDisabled);
96-
configure.baselineOnMigrate(flywayRuntimeConfig.baselineOnMigrate);
97-
configure.validateOnMigrate(flywayRuntimeConfig.validateOnMigrate);
98-
configure.validateMigrationNaming(flywayRuntimeConfig.validateMigrationNaming);
95+
configure.cleanDisabled(flywayRuntimeConfig.cleanDisabled());
96+
configure.baselineOnMigrate(flywayRuntimeConfig.baselineOnMigrate());
97+
configure.validateOnMigrate(flywayRuntimeConfig.validateOnMigrate());
98+
configure.validateMigrationNaming(flywayRuntimeConfig.validateMigrationNaming());
9999

100100
final String[] ignoreMigrationPatterns;
101-
if (flywayRuntimeConfig.ignoreMigrationPatterns.isPresent()) {
102-
ignoreMigrationPatterns = flywayRuntimeConfig.ignoreMigrationPatterns.get();
101+
if (flywayRuntimeConfig.ignoreMigrationPatterns().isPresent()) {
102+
ignoreMigrationPatterns = flywayRuntimeConfig.ignoreMigrationPatterns().get();
103103
} else {
104104
List<String> patterns = new ArrayList<>(2);
105-
if (flywayRuntimeConfig.ignoreMissingMigrations) {
105+
if (flywayRuntimeConfig.ignoreMissingMigrations()) {
106106
patterns.add("*:Missing");
107107
}
108-
if (flywayRuntimeConfig.ignoreFutureMigrations) {
108+
if (flywayRuntimeConfig.ignoreFutureMigrations()) {
109109
patterns.add("*:Future");
110110
}
111111
// Default is *:Future
112112
ignoreMigrationPatterns = patterns.toArray(new String[0]);
113113
}
114114

115115
configure.ignoreMigrationPatterns(ignoreMigrationPatterns);
116-
configure.cleanOnValidationError(flywayRuntimeConfig.cleanOnValidationError);
117-
configure.outOfOrder(flywayRuntimeConfig.outOfOrder);
118-
if (flywayRuntimeConfig.baselineVersion.isPresent()) {
119-
configure.baselineVersion(flywayRuntimeConfig.baselineVersion.get());
116+
configure.cleanOnValidationError(flywayRuntimeConfig.cleanOnValidationError());
117+
configure.outOfOrder(flywayRuntimeConfig.outOfOrder());
118+
if (flywayRuntimeConfig.baselineVersion().isPresent()) {
119+
configure.baselineVersion(flywayRuntimeConfig.baselineVersion().get());
120120
}
121-
if (flywayRuntimeConfig.baselineDescription.isPresent()) {
122-
configure.baselineDescription(flywayRuntimeConfig.baselineDescription.get());
121+
if (flywayRuntimeConfig.baselineDescription().isPresent()) {
122+
configure.baselineDescription(flywayRuntimeConfig.baselineDescription().get());
123123
}
124-
configure.placeholders(flywayRuntimeConfig.placeholders);
125-
configure.createSchemas(flywayRuntimeConfig.createSchemas);
126-
if (flywayRuntimeConfig.placeholderPrefix.isPresent()) {
127-
configure.placeholderPrefix(flywayRuntimeConfig.placeholderPrefix.get());
124+
configure.placeholders(flywayRuntimeConfig.placeholders());
125+
configure.createSchemas(flywayRuntimeConfig.createSchemas());
126+
if (flywayRuntimeConfig.placeholderPrefix().isPresent()) {
127+
configure.placeholderPrefix(flywayRuntimeConfig.placeholderPrefix().get());
128128
}
129-
if (flywayRuntimeConfig.placeholderSuffix.isPresent()) {
130-
configure.placeholderSuffix(flywayRuntimeConfig.placeholderSuffix.get());
129+
if (flywayRuntimeConfig.placeholderSuffix().isPresent()) {
130+
configure.placeholderSuffix(flywayRuntimeConfig.placeholderSuffix().get());
131131
}
132132
if (!callbacks.isEmpty()) {
133133
configure.callbacks(callbacks.toArray(new Callback[0]));
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package io.quarkus.flyway.runtime;
22

3-
import java.util.Collections;
43
import java.util.List;
54
import java.util.Optional;
65

76
import io.quarkus.runtime.annotations.ConfigGroup;
8-
import io.quarkus.runtime.annotations.ConfigItem;
9-
import io.quarkus.runtime.annotations.ConvertWith;
107
import io.quarkus.runtime.configuration.TrimmedStringConverter;
8+
import io.smallrye.config.WithConverter;
9+
import io.smallrye.config.WithDefault;
1110

1211
@ConfigGroup
13-
public final class FlywayDataSourceBuildTimeConfig {
12+
public interface FlywayDataSourceBuildTimeConfig {
1413

15-
private static final String DEFAULT_LOCATION = "db/migration";
14+
String DEFAULT_LOCATION = "db/migration";
1615

1716
/**
1817
* Comma-separated list of locations to scan recursively for migrations. The location type is determined by its prefix.
@@ -23,27 +22,15 @@ public final class FlywayDataSourceBuildTimeConfig {
2322
* Locations starting with filesystem: point to a directory on the filesystem, may only contain SQL migrations and are only
2423
* scanned recursively down non-hidden directories.
2524
*/
26-
@ConfigItem(defaultValue = DEFAULT_LOCATION)
27-
@ConvertWith(TrimmedStringConverter.class)
28-
public List<String> locations;
25+
@WithDefault(DEFAULT_LOCATION)
26+
@WithConverter(TrimmedStringConverter.class)
27+
List<String> locations();
2928

3029
/**
3130
* Comma-separated list of fully qualified class names of Callback implementations
3231
* to use to hook into the Flyway lifecycle.
3332
* The {@link org.flywaydb.core.api.callback.Callback} subclass must have a no-args constructor and must not be abstract.
3433
* These classes must also not have any fields that hold state (unless that state is initialized in the constructor).
3534
*/
36-
@ConfigItem
37-
public Optional<List<String>> callbacks = Optional.empty();
38-
39-
/**
40-
* Creates a {@link FlywayDataSourceBuildTimeConfig} with default settings.
41-
*
42-
* @return {@link FlywayDataSourceBuildTimeConfig}
43-
*/
44-
public static FlywayDataSourceBuildTimeConfig defaultConfig() {
45-
FlywayDataSourceBuildTimeConfig defaultConfig = new FlywayDataSourceBuildTimeConfig();
46-
defaultConfig.locations = Collections.singletonList(DEFAULT_LOCATION);
47-
return defaultConfig;
48-
}
35+
Optional<List<String>> callbacks();
4936
}

0 commit comments

Comments
 (0)