diff --git a/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java b/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java index f3350d8581..a9a856bedc 100644 --- a/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java +++ b/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java @@ -20,10 +20,16 @@ import javax.sql.DataSource; import java.time.Clock; import java.util.*; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; import java.util.function.Function; /** * Build a Database instance. + *
+ * Note that {@link #settings()} provides access to read the builder configuration + * (the getters). The DatabaseBuilder only has the methods to set builder configuration + * (the setters) so use {@link #settings()} to access to everything. * *
{@code * @@ -64,6 +70,23 @@ public interface DatabaseBuilder { */ Settings settings(); + /** + * Apply configuration to this builder using a lambda. + */ + DatabaseBuilder apply(ConsumerapplyConfiguration); + + /** + * Conditionally apply configuration to this builder via a lambda. + * + * @param predicate The condition to apply configuration when true. + * @param apply The configuration to apply to this builder. + */ + default DatabaseBuilder alsoIf(BooleanSupplier predicate, Consumer apply) { + if (predicate.getAsBoolean()) { + apply(apply); + } + return this; + } /** * Set the name of the Database. */ @@ -2598,7 +2621,7 @@ interface Settings extends DatabaseBuilder { * Return the configuration to build a DataSource using Ebean's own DataSource * implementation. */ - DataSourceBuilder getDataSourceConfig(); + DataSourceBuilder.Settings getDataSourceConfig(); /** * Return true if Ebean should create a DataSource for use with implicit read only transactions. @@ -2614,7 +2637,7 @@ interface Settings extends DatabaseBuilder { * set on this configuration. This means there is actually no need to set any configuration here and we only * set configuration for url, username and password etc if it is different from the main DataSource. */ - DataSourceBuilder getReadOnlyDataSourceConfig(); + DataSourceBuilder.Settings getReadOnlyDataSourceConfig(); /** * Return a value used to represent TRUE in the database. diff --git a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java index f7c6336814..30d72e55e5 100644 --- a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java @@ -27,6 +27,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -316,7 +317,7 @@ public class DatabaseConfig implements DatabaseBuilder.Settings { /** * The data source config. */ - private DataSourceBuilder dataSourceConfig = DataSourceBuilder.create(); + private DataSourceBuilder.Settings dataSourceConfig = DataSourceBuilder.create().settings(); /** * When true create a read only DataSource using readOnlyDataSourceConfig defaulting values from dataSourceConfig. @@ -329,7 +330,7 @@ public class DatabaseConfig implements DatabaseBuilder.Settings { /** * Optional configuration for a read only data source. */ - private DataSourceBuilder readOnlyDataSourceConfig = DataSourceBuilder.create(); + private DataSourceBuilder.Settings readOnlyDataSourceConfig = DataSourceBuilder.create().settings(); /** * Optional - the database schema that should be used to own the tables etc. @@ -560,6 +561,12 @@ public Settings settings() { return this; } + @Override + public DatabaseBuilder apply(Consumer applyConfiguration) { + applyConfiguration.accept(this); + return this; + } + @Override public Clock getClock() { return clock; @@ -1359,13 +1366,13 @@ public DatabaseConfig setReadOnlyDataSource(DataSource readOnlyDataSource) { } @Override - public DataSourceBuilder getDataSourceConfig() { + public DataSourceBuilder.Settings getDataSourceConfig() { return dataSourceConfig; } @Override public DatabaseConfig setDataSourceConfig(DataSourceBuilder dataSourceConfig) { - this.dataSourceConfig = dataSourceConfig; + this.dataSourceConfig = dataSourceConfig.settings(); return this; } @@ -1381,13 +1388,13 @@ public DatabaseConfig setAutoReadOnlyDataSource(boolean autoReadOnlyDataSource) } @Override - public DataSourceBuilder getReadOnlyDataSourceConfig() { + public DataSourceBuilder.Settings getReadOnlyDataSourceConfig() { return readOnlyDataSourceConfig; } @Override - public DatabaseConfig setReadOnlyDataSourceConfig(DataSourceBuilder readOnlyDataSourceConfig) { - this.readOnlyDataSourceConfig = readOnlyDataSourceConfig; + public DatabaseConfig setReadOnlyDataSourceConfig(DataSourceBuilder readOnly) { + this.readOnlyDataSourceConfig = readOnly == null ? null : readOnly.settings(); return this; } @@ -2098,7 +2105,7 @@ protected void loadSettings(PropertiesWrapper p) { loadAutoTuneSettings(p); if (dataSourceConfig == null) { - dataSourceConfig = DataSourceBuilder.create(); + dataSourceConfig = DataSourceBuilder.create().settings(); } loadDataSourceSettings(p); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java index 20a693e6e8..d0b0d17759 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -48,7 +48,7 @@ public DatabasePlatform create(DatabaseBuilder.Settings config) { // choose based on dbName return byDatabaseName(config.getDatabasePlatformName()); } - if (config.getDataSourceConfig().settings().isOffline()) { + if (config.getDataSourceConfig().isOffline()) { throw new PersistenceException("DatabasePlatformName must be specified with offline mode"); } // guess using meta data from driver diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index 70cb3ce52a..30817020ad 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -243,7 +243,7 @@ private boolean checkDataSource(DatabaseBuilder.Settings config) { return false; } if (config.getDataSource() == null) { - if (config.getDataSourceConfig().settings().isOffline()) { + if (config.getDataSourceConfig().isOffline()) { // this is ok - offline DDL generation etc return false; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java index b40b740e9b..c5fead0da8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InitDataSource.java @@ -49,18 +49,17 @@ private DataSource initReadOnlyDataSource() { return roConfig == null ? null : createFromConfig(roConfig, true); } - DataSourceBuilder readOnlyConfig() { + DataSourceBuilder.Settings readOnlyConfig() { var roConfig = config.getReadOnlyDataSourceConfig(); if (roConfig == null) { // it has explicitly been set to null, not expected but ok return null; } - var roSettings = roConfig.settings(); - if (urlSet(roSettings.getUrl())) { + if (urlSet(roConfig.getUrl())) { return roConfig; } // convenient alternate place to set the read-only url - final String readOnlyUrl = config.getDataSourceConfig().settings().getReadOnlyUrl(); + final String readOnlyUrl = config.getDataSourceConfig().getReadOnlyUrl(); if (urlSet(readOnlyUrl)) { roConfig.url(readOnlyUrl); return roConfig; @@ -77,23 +76,22 @@ private boolean urlSet(String url) { return url != null && !"none".equalsIgnoreCase(url) && !url.trim().isEmpty(); } - private DataSource createFromConfig(DataSourceBuilder dsConfig, boolean readOnly) { + private DataSource createFromConfig(DataSourceBuilder.Settings dsConfig, boolean readOnly) { if (dsConfig == null) { throw new PersistenceException("No DataSourceBuilder defined for " + config.getName()); } - var dsSettings = dsConfig.settings(); - if (dsSettings.isOffline()) { + if (dsConfig.isOffline()) { if (config.getDatabasePlatformName() == null) { throw new PersistenceException("You MUST specify a DatabasePlatformName on DatabaseConfig when offline"); } } - attachAlert(dsSettings); - attachListener(dsSettings); + attachAlert(dsConfig); + attachListener(dsConfig); if (readOnly) { // setup to use AutoCommit such that we skip explicit commit - var mainSettings = config.getDataSourceConfig().settings(); + var mainSettings = config.getDataSourceConfig(); dsConfig.autoCommit(true); dsConfig.readOnly(true); dsConfig.setDefaults(mainSettings); diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java index 824477d43b..3d77ca813d 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java @@ -127,7 +127,7 @@ public void readOnlyConfig_when_readOnlyUrlSetOnMain_withNoneNone() { @Test public void readOnlyConfig_when_urlSet_2() { DatabaseConfig config = new DatabaseConfig(); - config.settings().getReadOnlyDataSourceConfig().url("foo"); + config.getReadOnlyDataSourceConfig().url("foo"); final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); diff --git a/ebean-test/src/main/java/io/ebean/test/config/AutoConfigureForTesting.java b/ebean-test/src/main/java/io/ebean/test/config/AutoConfigureForTesting.java index 668eb86bfa..be41a5e222 100644 --- a/ebean-test/src/main/java/io/ebean/test/config/AutoConfigureForTesting.java +++ b/ebean-test/src/main/java/io/ebean/test/config/AutoConfigureForTesting.java @@ -71,11 +71,11 @@ public void postConfigure(DatabaseBuilder builder) { } } - private void makeV1Compatible(DataSourceBuilder ds) { + private void makeV1Compatible(DataSourceBuilder.Settings ds) { if (ds == null) { return; } - String url = ds.settings().getUrl(); + String url = ds.getUrl(); if (url == null || !url.startsWith("jdbc:h2:")) { return; } diff --git a/pom.xml b/pom.xml index 3ecc6faf3d..acf5f046ba 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ 1.2 13.11.1 7.1 -8.8 +8.9 13.24.0 13.24.0 false