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 6b3840abf..cee280992 100644 --- a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java @@ -9,7 +9,7 @@ import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.config.dbplatform.DbEncrypt; import io.ebean.config.dbplatform.DbType; import io.ebean.config.dbplatform.IdType; -import io.ebean.datasource.DataSourceConfig; +import io.ebean.datasource.DataSourceBuilder; import io.ebean.event.*; import io.ebean.event.changelog.ChangeLogListener; import io.ebean.event.changelog.ChangeLogPrepare; @@ -314,7 +314,7 @@ public class DatabaseConfig { /** * The data source config. */ - private DataSourceConfig dataSourceConfig = new DataSourceConfig(); + private DataSourceBuilder dataSourceConfig = DataSourceBuilder.create(); /** * When true create a read only DataSource using readOnlyDataSourceConfig defaulting values from dataSourceConfig. @@ -327,7 +327,7 @@ public class DatabaseConfig { /** * Optional configuration for a read only data source. */ - private DataSourceConfig readOnlyDataSourceConfig = new DataSourceConfig(); + private DataSourceBuilder readOnlyDataSourceConfig = DataSourceBuilder.create(); /** * Optional - the database schema that should be used to own the tables etc. @@ -1707,7 +1707,7 @@ public class DatabaseConfig { * Return the configuration to build a DataSource using Ebean's own DataSource * implementation. */ - public DataSourceConfig getDataSourceConfig() { + public DataSourceBuilder getDataSourceConfig() { return dataSourceConfig; } @@ -1715,7 +1715,7 @@ public class DatabaseConfig { * Set the configuration required to build a DataSource using Ebean's own * DataSource implementation. */ - public void setDataSourceConfig(DataSourceConfig dataSourceConfig) { + public void setDataSourceConfig(DataSourceBuilder dataSourceConfig) { this.dataSourceConfig = dataSourceConfig; } @@ -1742,14 +1742,14 @@ public class DatabaseConfig { * 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. */ - public DataSourceConfig getReadOnlyDataSourceConfig() { + public DataSourceBuilder getReadOnlyDataSourceConfig() { return readOnlyDataSourceConfig; } /** * Set the configuration for the read only DataSource. */ - public void setReadOnlyDataSourceConfig(DataSourceConfig readOnlyDataSourceConfig) { + public void setReadOnlyDataSourceConfig(DataSourceBuilder readOnlyDataSourceConfig) { this.readOnlyDataSourceConfig = readOnlyDataSourceConfig; } @@ -2843,7 +2843,7 @@ public class DatabaseConfig { loadAutoTuneSettings(p); if (dataSourceConfig == null) { - dataSourceConfig = new DataSourceConfig(); + dataSourceConfig = DataSourceBuilder.create(); } 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 a0e56dd12..c12ea58cc 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 class DatabasePlatformFactory { // choose based on dbName return byDatabaseName(config.getDatabasePlatformName()); } - if (config.getDataSourceConfig().isOffline()) { + if (config.getDataSourceConfig().settings().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 61ea94bf7..103d7b8fc 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 @@ -240,7 +240,7 @@ public final class DefaultContainer implements SpiContainer { return false; } if (config.getDataSource() == null) { - if (config.getDataSourceConfig().isOffline()) { + if (config.getDataSourceConfig().settings().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 9d788dfec..1c8837919 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 @@ -2,10 +2,7 @@ package io.ebeaninternal.server.core; import io.ebean.annotation.Platform; import io.ebean.config.DatabaseConfig; -import io.ebean.datasource.DataSourceAlertFactory; -import io.ebean.datasource.DataSourceConfig; -import io.ebean.datasource.DataSourceFactory; -import io.ebean.datasource.DataSourcePoolListener; +import io.ebean.datasource.*; import jakarta.persistence.PersistenceException; import javax.sql.DataSource; @@ -48,27 +45,28 @@ final class InitDataSource { * Initialise the "read only" DataSource from configuration. */ private DataSource initReadOnlyDataSource() { - DataSourceConfig roConfig = readOnlyConfig(); + var roConfig = readOnlyConfig(); return roConfig == null ? null : createFromConfig(roConfig, true); } - DataSourceConfig readOnlyConfig() { - DataSourceConfig roConfig = config.getReadOnlyDataSourceConfig(); + DataSourceBuilder readOnlyConfig() { + var roConfig = config.getReadOnlyDataSourceConfig(); if (roConfig == null) { // it has explicitly been set to null, not expected but ok return null; } - if (urlSet(roConfig.getUrl())) { + var roSettings = roConfig.settings(); + if (urlSet(roSettings.getUrl())) { return roConfig; } // convenient alternate place to set the read-only url - final String readOnlyUrl = config.getDataSourceConfig().getReadOnlyUrl(); + final String readOnlyUrl = config.getDataSourceConfig().settings().getReadOnlyUrl(); if (urlSet(readOnlyUrl)) { - roConfig.setUrl(readOnlyUrl); + roConfig.url(readOnlyUrl); return roConfig; } if (config.isAutoReadOnlyDataSource()) { - roConfig.setUrl(null); // blank out in case it is "none" + roConfig.url(null); // blank out in case it is "none" return roConfig; } else { return null; @@ -79,25 +77,27 @@ final class InitDataSource { return url != null && !"none".equalsIgnoreCase(url) && !url.trim().isEmpty(); } - private DataSource createFromConfig(DataSourceConfig dsConfig, boolean readOnly) { + private DataSource createFromConfig(DataSourceBuilder dsConfig, boolean readOnly) { if (dsConfig == null) { - throw new PersistenceException("No DataSourceConfig defined for " + config.getName()); + throw new PersistenceException("No DataSourceBuilder defined for " + config.getName()); } - if (dsConfig.isOffline()) { + var dsSettings = dsConfig.settings(); + if (dsSettings.isOffline()) { if (config.getDatabasePlatformName() == null) { throw new PersistenceException("You MUST specify a DatabasePlatformName on DatabaseConfig when offline"); } } - attachAlert(dsConfig); - attachListener(dsConfig); + attachAlert(dsSettings); + attachListener(dsSettings); if (readOnly) { // setup to use AutoCommit such that we skip explicit commit - dsConfig.setAutoCommit(true); - dsConfig.setReadOnly(true); - dsConfig.setDefaults(config.getDataSourceConfig()); - dsConfig.setIsolationLevel(config.getDataSourceConfig().getIsolationLevel()); + var mainSettings = config.getDataSourceConfig().settings(); + dsConfig.autoCommit(true); + dsConfig.readOnly(true); + dsConfig.setDefaults(mainSettings); + dsConfig.isolationLevel(mainSettings.getIsolationLevel()); } else if (isPostgresAllQuotedIdentifiers()) { dsConfig.addProperty("quoteReturningIdentifiers", false); } @@ -108,32 +108,32 @@ final class InitDataSource { return config.isAllQuotedIdentifiers() && Platform.POSTGRES == config.getDatabasePlatform().platform().base(); } - private DataSource create(DataSourceConfig dsConfig, boolean readOnly) { + private DataSource create(DataSourceBuilder dsConfig, boolean readOnly) { String poolName = config.getName() + (readOnly ? "-ro" : ""); - return DataSourceFactory.create(poolName, dsConfig); + return dsConfig.name(poolName).build(); } /** * Attach DataSourceAlert via service loader if present. */ - private void attachAlert(DataSourceConfig dsConfig) { + private void attachAlert(DataSourceBuilder.Settings dsConfig) { DataSourceAlertFactory alertFactory = config.getServiceObject(DataSourceAlertFactory.class); if (alertFactory == null) { alertFactory = ServiceUtil.service(DataSourceAlertFactory.class); } if (alertFactory != null) { - dsConfig.setAlert(alertFactory.createAlert()); + dsConfig.alert(alertFactory.createAlert()); } } /** * Create and attach a DataSourcePoolListener if it has been specified via properties and there is not one already attached. */ - private void attachListener(DataSourceConfig dsConfig) { + private void attachListener(DataSourceBuilder.Settings dsConfig) { if (dsConfig.getListener() == null) { String poolListener = dsConfig.getPoolListener(); if (poolListener != null) { - dsConfig.setListener((DataSourcePoolListener) config.getClassLoadConfig().newInstance(poolListener)); + dsConfig.listener((DataSourcePoolListener) config.getClassLoadConfig().newInstance(poolListener)); } } } 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 c6cc19d37..3bf3f6c50 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 @@ -2,6 +2,7 @@ package io.ebeaninternal.server.core; import io.ebean.config.DatabaseConfig; import io.ebean.datasource.DataSourceAlert; +import io.ebean.datasource.DataSourceBuilder; import io.ebean.datasource.DataSourceConfig; import io.ebean.datasource.DataSourcePool; import io.ebean.platform.h2.H2Platform; @@ -66,69 +67,70 @@ public class InitDataSourceTest { DatabaseConfig config = newConfig("none"); config.setAutoReadOnlyDataSource(true); - final DataSourceConfig readOnlyConfig = new InitDataSource(config).readOnlyConfig(); - assertNull(readOnlyConfig.getUrl()); + final DataSourceBuilder readOnlyConfig = new InitDataSource(config).readOnlyConfig(); + assertThat(readOnlyConfig).isNotNull(); + assertNull(readOnlyConfig.settings().getUrl()); } @Test public void readOnlyConfig_when_urlSet() { DatabaseConfig config = newConfig("foo"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); - assertEquals("foo", roConfig.getUrl()); + assertEquals("foo", roConfig.settings().getUrl()); } @Test public void readOnlyConfig_when_readOnlyUrlSetOnMain() { DatabaseConfig config = newConfig(null); // alternate location to set read-only url for developer convenience - config.getDataSourceConfig().setReadOnlyUrl("bar"); + config.getDataSourceConfig().readOnlyUrl("bar"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); - assertEquals("bar", roConfig.getUrl()); + assertEquals("bar", roConfig.settings().getUrl()); } @Test public void readOnlyConfig_when_readOnlyUrlSetOnMain_withNone() { DatabaseConfig config = newConfig("None"); // alternate location to set read-only url for developer convenience - config.getDataSourceConfig().setReadOnlyUrl("bar"); + config.getDataSourceConfig().readOnlyUrl("bar"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); - assertEquals("bar", roConfig.getUrl()); + assertEquals("bar", roConfig.settings().getUrl()); } @Test public void readOnlyConfig_when_bothReadOnlyUrlsSet() { DatabaseConfig config = newConfig("one"); - config.getDataSourceConfig().setReadOnlyUrl("two"); + config.getDataSourceConfig().readOnlyUrl("two"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); - assertEquals("one", roConfig.getUrl()); + assertEquals("one", roConfig.settings().getUrl()); } @Test public void readOnlyConfig_when_readOnlyUrlSetOnMain_withNoneNone() { DatabaseConfig config = newConfig("none"); // alternate location to set read-only url for developer convenience - config.getDataSourceConfig().setReadOnlyUrl("none"); + config.getDataSourceConfig().readOnlyUrl("none"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNull(roConfig); } @Test public void readOnlyConfig_when_urlSet_2() { DatabaseConfig config = new DatabaseConfig(); - config.getReadOnlyDataSourceConfig().setUrl("foo"); + config.getReadOnlyDataSourceConfig().url("foo"); - final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + final DataSourceBuilder roConfig = new InitDataSource(config).readOnlyConfig(); assertNotNull(roConfig); - assertEquals("foo", roConfig.getUrl()); + assertEquals("foo", roConfig.settings().getUrl()); } @Test @@ -170,10 +172,10 @@ public class InitDataSourceTest { @Test public void online() { DatabaseConfig config = new DatabaseConfig(); - config.getDataSourceConfig().setUsername("sa"); - config.getDataSourceConfig().setPassword(""); - config.getDataSourceConfig().setUrl("jdbc:h2:mem:dsTestOnline"); - config.getDataSourceConfig().setDriver("org.h2.Driver"); + config.getDataSourceConfig().username("sa"); + config.getDataSourceConfig().password(""); + config.getDataSourceConfig().url("jdbc:h2:mem:dsTestOnline"); + config.getDataSourceConfig().driver("org.h2.Driver"); InitDataSource.init(config); DataSourcePool pool = (DataSourcePool) config.getDataSource(); assertThat(pool.isDataSourceUp()).isTrue(); @@ -202,14 +204,15 @@ public class InitDataSourceTest { @Test public void offline() throws SQLException { DatabaseConfig config = new DatabaseConfig(); - config.getDataSourceConfig().setUsername("sa"); - config.getDataSourceConfig().setPassword(""); - config.getDataSourceConfig().setUrl("jdbc:h2:mem:dsTestOffline"); - config.getDataSourceConfig().setDriver("org.h2.Driver"); - config.getDataSourceConfig().setOffline(true); - config.getDataSourceConfig().setFailOnStart(false); + DataSourceBuilder dsConfig = config.getDataSourceConfig(); + dsConfig.username("sa"); + dsConfig.password(""); + dsConfig.url("jdbc:h2:mem:dsTestOffline"); + dsConfig.driver("org.h2.Driver"); + dsConfig.offline(true); + dsConfig.failOnStart(false); MyAlert alert = new MyAlert(); - config.getDataSourceConfig().setAlert(alert); + dsConfig.alert(alert); config.setDatabasePlatformName("h2"); InitDataSource.init(config); DataSourcePool pool = (DataSourcePool) config.getDataSource(); 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 f9a82cd91..400dd921b 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 @@ -3,7 +3,7 @@ package io.ebean.test.config; import io.avaje.applog.AppLog; import io.ebean.config.AutoConfigure; import io.ebean.config.DatabaseConfig; -import io.ebean.datasource.DataSourceConfig; +import io.ebean.datasource.DataSourceBuilder; import io.ebean.test.config.platform.PlatformAutoConfig; import io.ebean.test.config.provider.ProviderAutoConfig; import io.ebean.test.containers.DockerHost; @@ -69,11 +69,11 @@ public class AutoConfigureForTesting implements AutoConfigure { } } - private void makeV1Compatible(DataSourceConfig ds) { + private void makeV1Compatible(DataSourceBuilder ds) { if (ds == null) { return; } - String url = ds.getUrl(); + String url = ds.settings().getUrl(); if (url == null || !url.startsWith("jdbc:h2:")) { return; } @@ -81,7 +81,7 @@ public class AutoConfigureForTesting implements AutoConfigure { url = url.replace(";MODE=LEGACY", ""); url = url.replace(";NON_KEYWORDS=KEY,VALUE", ""); url = url.replace(";NON_KEYWORDS=KEY", ""); - ds.setUrl(url); + ds.url(url); } /** @@ -100,8 +100,8 @@ public class AutoConfigureForTesting implements AutoConfigure { * Setup the DataSource on the extra database if necessary. */ private void setupExtraDataSourceIfNecessary(DatabaseConfig config) { - DataSourceConfig dataSourceConfig = config.getDataSourceConfig(); - if (dataSourceConfig == null || dataSourceConfig.getUsername() == null) { + DataSourceBuilder dataSourceConfig = config.getDataSourceConfig(); + if (dataSourceConfig == null || dataSourceConfig.settings().getUsername() == null) { new PlatformAutoConfig(environmentDb, config) .configExtraDataSource(); } diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java index 8321f0825..a986771ad 100644 --- a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java +++ b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java @@ -62,7 +62,7 @@ public class PlatformAutoConfig { Config config = new Config(db, platform, databaseName, this.config); platformSetup.setupExtraDbDataSource(config); - log.log(DEBUG, "configured dataSource for extraDb name:{0} url:{1}", db, this.config.getDataSourceConfig().getUrl()); + log.log(DEBUG, "configured dataSource for extraDb name:{0} url:{1}", db, this.config.getDataSourceConfig().settings().getUrl()); } } diff --git a/ebean-test/src/test/java/io/ebean/test/config/platform/ConfigTest.java b/ebean-test/src/test/java/io/ebean/test/config/platform/ConfigTest.java index 3537954ed..2f0439c4a 100644 --- a/ebean-test/src/test/java/io/ebean/test/config/platform/ConfigTest.java +++ b/ebean-test/src/test/java/io/ebean/test/config/platform/ConfigTest.java @@ -2,7 +2,7 @@ package io.ebean.test.config.platform; import io.ebean.annotation.Platform; import io.ebean.config.DatabaseConfig; -import io.ebean.datasource.DataSourceConfig; +import io.ebean.datasource.DataSourceBuilder; import io.ebeaninternal.api.DbOffline; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -85,8 +85,8 @@ class ConfigTest { PostgresSetup postgresSetup = new PostgresSetup(); postgresSetup.setupExtraDbDataSource(config); - DataSourceConfig ds = serverConfig.getDataSourceConfig(); - assertThat(ds.getUsername()).isEqualTo("other"); + DataSourceBuilder ds = serverConfig.getDataSourceConfig(); + assertThat(ds.settings().getUsername()).isEqualTo("other"); p = serverConfig.getProperties(); assertThat(p.getProperty("datasource.other.username")).isEqualTo("other"); @@ -107,8 +107,8 @@ class ConfigTest { PostgresSetup postgresSetup = new PostgresSetup(); postgresSetup.setupExtraDbDataSource(config); - DataSourceConfig ds = serverConfig.getDataSourceConfig(); - assertThat(ds.getUsername()).isEqualTo("other"); + DataSourceBuilder ds = serverConfig.getDataSourceConfig(); + assertThat(ds.settings().getUsername()).isEqualTo("other"); p = serverConfig.getProperties(); assertThat(p.getProperty("datasource.other.username")).isEqualTo("other"); @@ -135,8 +135,8 @@ class ConfigTest { postgresSetup.setupExtraDbDataSource(config); - DataSourceConfig ds = serverConfig.getDataSourceConfig(); - assertThat(ds.getUsername()).isEqualTo("other_user"); + DataSourceBuilder ds = serverConfig.getDataSourceConfig(); + assertThat(ds.settings().getUsername()).isEqualTo("other_user"); p = serverConfig.getProperties(); assertThat(p.getProperty("datasource.other_db_name.username")).isEqualTo("other_user"); diff --git a/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java b/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java index 56d0a3347..890ac4c7f 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java +++ b/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java @@ -1,10 +1,10 @@ package io.ebean.xtest.internal.server.rawsql; import io.ebean.*; +import io.ebean.datasource.DataSourceBuilder; import io.ebean.xtest.BaseTestCase; import io.ebean.xtest.ForPlatform; import io.ebean.annotation.Platform; -import io.ebean.datasource.DataSourceConfig; import io.ebeaninternal.server.core.DefaultServer; import io.ebeaninternal.server.rawsql.SpiRawSql; import io.ebeaninternal.server.rawsql.SpiRawSql.Sql; @@ -280,7 +280,8 @@ public class TestRawSqlBuilder extends BaseTestCase { final String sql = "select description from ebasic_clob where id = ?"; List rows = new ArrayList<>(); - final DataSourceConfig config = ((DefaultServer) DB.getDefault()).config().getDataSourceConfig(); + final DataSourceBuilder builder = ((DefaultServer) DB.getDefault()).config().getDataSourceConfig(); + DataSourceBuilder.Settings config = builder.settings(); try (Connection connection = DriverManager.getConnection(config.getUrl(), config.getUsername(), config.getPassword()); PreparedStatement stmt = connection.prepareStatement(sql)) { @@ -305,8 +306,8 @@ public class TestRawSqlBuilder extends BaseTestCase { DB.save(pfc); List rows = new ArrayList<>(); - final DataSourceConfig config = ((DefaultServer) DB.getDefault()).config().getDataSourceConfig(); - + final DataSourceBuilder builder = ((DefaultServer) DB.getDefault()).config().getDataSourceConfig(); + DataSourceBuilder.Settings config = builder.settings(); final String sql = "select content from persistent_file_content where id = ?"; try (Connection connection = DriverManager.getConnection(config.getUrl(), config.getUsername(), config.getPassword()); PreparedStatement stmt = connection.prepareStatement(sql)) { diff --git a/pom.xml b/pom.xml index 634a3bb35..8bc213b90 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ 1.2 13.9.0 7.1 - 8.7 + 8.8 13.23.2 13.23.2 false