From 6f194ce95d816df70f51e88fb4e5d3a492727414 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 30 Apr 2020 23:19:08 +1200 Subject: [PATCH] #2001 - Add convenient alternative to set read-only url (on the main DataSourceConfig) --- pom.xml | 2 +- .../server/core/InitDataSource.java | 32 ++++++------ .../server/core/InitDataSourceTest.java | 51 +++++++++++++++++++ 3 files changed, 69 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index e26f44f9a..fc2ac19d2 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ io.ebean ebean-datasource - 4.7.3 + 4.9.1 diff --git a/src/main/java/io/ebeaninternal/server/core/InitDataSource.java b/src/main/java/io/ebeaninternal/server/core/InitDataSource.java index b1ceb6a76..70f280765 100644 --- a/src/main/java/io/ebeaninternal/server/core/InitDataSource.java +++ b/src/main/java/io/ebeaninternal/server/core/InitDataSource.java @@ -62,10 +62,7 @@ class InitDataSource { */ private DataSource initReadOnlyDataSource() { DataSourceConfig roConfig = readOnlyConfig(); - if (roConfig == null) { - return null; - } - return createFromConfig(roConfig, true); + return roConfig == null ? null : createFromConfig(roConfig, true); } DataSourceConfig readOnlyConfig() { @@ -74,20 +71,25 @@ class InitDataSource { // it has explicitly been set to null, not expected but ok return null; } - final String readOnlyUrl = roConfig.getUrl(); - if ("none".equalsIgnoreCase(readOnlyUrl) || notAutoReadOnly(readOnlyUrl)) { - // no read-only DataSource will be used + if (urlSet(roConfig.getUrl())) { + return roConfig; + } + // convenient alternate place to set the read-only url + final String readOnlyUrl = config.getDataSourceConfig().getReadOnlyUrl(); + if (urlSet(readOnlyUrl)) { + roConfig.setUrl(readOnlyUrl); + return roConfig; + } + if (config.isAutoReadOnlyDataSource()) { + roConfig.setUrl(null); // blank out in case it is "none" + return roConfig; + } else { return null; } - return roConfig; } - private boolean notAutoReadOnly(String readOnlyUrl) { - return isEmpty(readOnlyUrl) && !config.isAutoReadOnlyDataSource(); - } - - private boolean isEmpty(String url) { - return url == null || url.trim().isEmpty(); + private boolean urlSet(String url) { + return url != null && !"none".equalsIgnoreCase(url) && !url.trim().isEmpty(); } private DataSource createFromConfig(DataSourceConfig dsConfig, boolean readOnly) { @@ -107,7 +109,7 @@ class InitDataSource { if (readOnly) { // setup to use AutoCommit such that we skip explicit commit dsConfig.setAutoCommit(true); - //dsConfig.setReadOnly(true); + dsConfig.setReadOnly(true); dsConfig.setDefaults(config.getDataSourceConfig()); dsConfig.setIsolationLevel(config.getDataSourceConfig().getIsolationLevel()); } diff --git a/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java b/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java index 288833cd9..5065d17e5 100644 --- a/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java +++ b/src/test/java/io/ebeaninternal/server/core/InitDataSourceTest.java @@ -52,6 +52,15 @@ public class InitDataSourceTest { assertNotNull(new InitDataSource(config).readOnlyConfig()); } + @Test + public void readOnlyConfig_when_autoReadOnlyDataSource_expect_setToNull() { + ServerConfig config = newConfig("none"); + config.setAutoReadOnlyDataSource(true); + + final DataSourceConfig readOnlyConfig = new InitDataSource(config).readOnlyConfig(); + assertNull(readOnlyConfig.getUrl()); + } + @Test public void readOnlyConfig_when_urlSet() { ServerConfig config = newConfig("foo"); @@ -61,6 +70,48 @@ public class InitDataSourceTest { assertEquals("foo", roConfig.getUrl()); } + @Test + public void readOnlyConfig_when_readOnlyUrlSetOnMain() { + ServerConfig config = newConfig(null); + // alternate location to set read-only url for developer convenience + config.getDataSourceConfig().setReadOnlyUrl("bar"); + + final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + assertNotNull(roConfig); + assertEquals("bar", roConfig.getUrl()); + } + + @Test + public void readOnlyConfig_when_readOnlyUrlSetOnMain_withNone() { + ServerConfig config = newConfig("None"); + // alternate location to set read-only url for developer convenience + config.getDataSourceConfig().setReadOnlyUrl("bar"); + + final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + assertNotNull(roConfig); + assertEquals("bar", roConfig.getUrl()); + } + + @Test + public void readOnlyConfig_when_bothReadOnlyUrlsSet() { + ServerConfig config = newConfig("one"); + config.getDataSourceConfig().setReadOnlyUrl("two"); + + final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + assertNotNull(roConfig); + assertEquals("one", roConfig.getUrl()); + } + + @Test + public void readOnlyConfig_when_readOnlyUrlSetOnMain_withNoneNone() { + ServerConfig config = newConfig("none"); + // alternate location to set read-only url for developer convenience + config.getDataSourceConfig().setReadOnlyUrl("none"); + + final DataSourceConfig roConfig = new InitDataSource(config).readOnlyConfig(); + assertNull(roConfig); + } + @Test public void readOnlyConfig_when_urlSet_2() { ServerConfig config = new ServerConfig();