@@ -91,7 +91,7 @@
io.ebean
ebean-migration
- 12.12.1
+ 12.13.0
test
@@ -226,7 +226,7 @@
ch.qos.logback
logback-classic
- 1.2.3
+ 1.2.9
test
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/ClickHouseSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/ClickHouseSetup.java
index 4dcb472b4..a2a6ca0e0 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/ClickHouseSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/ClickHouseSetup.java
@@ -11,7 +11,7 @@ class ClickHouseSetup implements PlatformSetup {
config.setDefaultPort(8123);
config.setUsername("default");
config.setPassword("");
- config.setUrl("jdbc:clickhouse://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:clickhouse://${host}:${port}/${databaseName}");
config.setDriver("ru.yandex.clickhouse.ClickHouseDriver");
config.datasourceDefaults();
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/CockroachSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/CockroachSetup.java
index 879f895ee..b68ca912e 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/CockroachSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/CockroachSetup.java
@@ -11,7 +11,7 @@ class CockroachSetup implements PlatformSetup {
config.setDefaultPort(26257);
config.setUsername("root");
config.setPassword("");
- config.setUrl("jdbc:postgresql://localhost:${port}/${databaseName}?sslmode=disable");
+ config.setUrl("jdbc:postgresql://${host}:${port}/${databaseName}?sslmode=disable");
config.setDriver("org.postgresql.Driver");
config.datasourceDefaults();
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/Config.java b/ebean-test/src/main/java/io/ebean/test/config/platform/Config.java
index cefae4ce4..117c04a18 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/Config.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/Config.java
@@ -4,8 +4,8 @@ import io.ebean.config.DatabaseConfig;
import io.ebean.datasource.DataSourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import java.io.File;
+import java.util.Locale;
import java.util.Properties;
/**
@@ -26,11 +26,9 @@ class Config {
private final String db;
private final String platform;
private String dockerPlatform;
-
private String databaseName;
private final Properties properties;
-
private int port;
private String url;
@@ -38,12 +36,10 @@ class Config {
private String schema;
private String username;
private String password;
-
private final DatabaseConfig config;
-
private boolean containerDropCreate;
-
private final Properties dockerProperties = new Properties();
+ private final DockerHost dockerHost = new DockerHost();
Config(String db, String platform, String databaseName, DatabaseConfig config) {
this.db = db;
@@ -231,11 +227,17 @@ class Config {
void setUrl(String urlPattern) {
String val = getPlatformKey("url", urlPattern);
+ val = val.replace("${host}", host());
val = val.replace("${port}", String.valueOf(port));
val = val.replace("${databaseName}", databaseName);
this.url = val;
}
+ String host() {
+ String explicitDockerHost = getKey("dockerHost", null);
+ return getKey("host", dockerHost.dockerHost(explicitDockerHost));
+ }
+
/**
* Append to the connection URL.
*/
@@ -322,7 +324,6 @@ class Config {
void setDockerVersion(String version) {
String val = getPlatformKey("version", version);
dockerProperties.setProperty(dockerKey("version"), val);
-
if (containerDropCreate) {
dockerProperties.setProperty(dockerKey("startMode"), "dropCreate");
}
@@ -369,7 +370,10 @@ class Config {
}
private void initDockerProperties() {
-
+ if (dockerHost.runningInDocker()) {
+ // tell ebean-docker-test we are not using localhost (for jdbc DB setup commands)
+ dockerProperties.setProperty(dockerKey("host"), dockerHost.dockerHost());
+ }
dockerProperties.setProperty(dockerKey("port"), String.valueOf(port));
dockerProperties.setProperty(dockerKey("dbName"), databaseName);
if (schema != null) {
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/Db2Setup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/Db2Setup.java
index fd65472ef..70fa4fc2c 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/Db2Setup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/Db2Setup.java
@@ -11,7 +11,7 @@ class Db2Setup implements PlatformSetup {
config.setDefaultPort(50000);
config.setUsernameDefault();
config.setPasswordDefault();
- config.setUrl("jdbc:db2://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:db2://${host}:${port}/${databaseName}");
config.setDriver("com.ibm.db2.jcc.DB2Driver");
config.datasourceDefaults();
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/DockerHost.java b/ebean-test/src/main/java/io/ebean/test/config/platform/DockerHost.java
new file mode 100644
index 000000000..5e3f0ce94
--- /dev/null
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/DockerHost.java
@@ -0,0 +1,55 @@
+package io.ebean.test.config.platform;
+
+import java.io.File;
+import java.util.Locale;
+
+/**
+ * Helper to detect if running inside docker and determine host name for that case.
+ */
+class DockerHost {
+
+ private final boolean runningInDocker;
+ private String dockerHost;
+
+ DockerHost() {
+ runningInDocker = initInDocker();
+ }
+
+ boolean runningInDocker() {
+ return runningInDocker;
+ }
+
+ String dockerHost() {
+ return dockerHost;
+ }
+
+ String dockerHost(String explicitHost) {
+ if (!runningInDocker) {
+ return "localhost";
+ }
+ dockerHost = explicitHost != null ? explicitHost : defaultDockerHost();
+ return dockerHost;
+ }
+
+ /**
+ * Return true if running inside a docker container (we are using docker in docker).
+ */
+ boolean initInDocker() {
+ return new File("/.dockerenv").exists();
+ }
+
+ /**
+ * Return the default host name to use when running in docker.
+ *
+ * Can instead be explicitly specified via ebean.test.dockerHost.
+ */
+ String defaultDockerHost() {
+ String os = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
+ if (os.contains("mac") || os.contains("darwin") || os.contains("win")) {
+ return "host.docker.internal";
+ } else {
+ return "172.17.0.1";
+ }
+ }
+
+}
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/HanaSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/HanaSetup.java
index 8ad014b70..a5137686f 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/HanaSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/HanaSetup.java
@@ -20,7 +20,7 @@ class HanaSetup implements PlatformSetup {
config.setUsername("SYSTEM");
config.setPassword("HXEHana1");
config.setDatabaseName("HXE");
- config.setUrl("jdbc:sap://localhost:${port}/?databaseName=${databaseName}");
+ config.setUrl("jdbc:sap://${host}:${port}/?databaseName=${databaseName}");
String schema = config.getSchema();
if (schema != null && !schema.equals(config.getUsername())) {
config.urlAppend("¤tSchema=" + schema);
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/MariaDBSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/MariaDBSetup.java
index 4e242d4b0..f2ff22cc4 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/MariaDBSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/MariaDBSetup.java
@@ -13,7 +13,7 @@ class MariaDBSetup implements PlatformSetup {
config.setDefaultPort(defaultPort);
config.setUsernameDefault();
config.setPasswordDefault();
- config.setUrl("jdbc:mariadb://localhost:${port}/${databaseName}?useLegacyDatetimeCode=false");
+ config.setUrl("jdbc:mariadb://${host}:${port}/${databaseName}?useLegacyDatetimeCode=false");
config.datasourceDefaults();
return dockerProperties(config);
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/MySqlSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/MySqlSetup.java
index 3939ffbec..c865c41b7 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/MySqlSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/MySqlSetup.java
@@ -13,7 +13,7 @@ class MySqlSetup implements PlatformSetup {
config.setDefaultPort(defaultPort);
config.setUsernameDefault();
config.setPasswordDefault();
- config.setUrl("jdbc:mysql://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:mysql://${host}:${port}/${databaseName}");
config.setDriver(defaultDriver());
config.datasourceDefaults();
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/PostgisSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/PostgisSetup.java
index 8180dc425..bd5a38387 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/PostgisSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/PostgisSetup.java
@@ -20,7 +20,7 @@ class PostgisSetup implements PlatformSetup {
config.setUsernameDefault();
config.setPasswordDefault();
config.setDriver("org.postgis.DriverWrapperLW");
- config.setUrl("jdbc:postgresql_lwgis://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:postgresql_lwgis://${host}:${port}/${databaseName}");
String schema = config.getSchema();
if (schema != null && !schema.equals(config.getUsername())) {
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/PostgresSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/PostgresSetup.java
index 8e9045408..e5d1206f7 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/PostgresSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/PostgresSetup.java
@@ -13,7 +13,7 @@ class PostgresSetup implements PlatformSetup {
config.setDefaultPort(defaultPort);
config.setUsernameDefault();
config.setPasswordDefault();
- config.setUrl("jdbc:postgresql://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:postgresql://${host}:${port}/${databaseName}");
String schema = config.getSchema();
if (schema != null && !schema.equals(config.getUsername())) {
@@ -44,7 +44,7 @@ class PostgresSetup implements PlatformSetup {
config.setDefaultPort(defaultPort);
config.setExtraUsernameDefault();
config.setExtraDbPasswordDefault();
- config.setUrl("jdbc:postgresql://localhost:${port}/${databaseName}");
+ config.setUrl("jdbc:postgresql://${host}:${port}/${databaseName}");
config.setDriver("org.postgresql.Driver");
config.extraDatasourceDefaults();
}
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/RedisSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/RedisSetup.java
index 70580bd81..c8fc01671 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/RedisSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/RedisSetup.java
@@ -8,10 +8,14 @@ import java.util.Properties;
class RedisSetup {
static void run(Properties properties) {
-
String version = properties.getProperty("ebean.test.redis");
version = properties.getProperty("ebean.test.redis.version", version);
if (version != null) {
+ DockerHost dockerHost = new DockerHost();
+ if (dockerHost.runningInDocker()) {
+ String host = dockerHost.dockerHost(properties.getProperty("ebean.test.dockerHost"));
+ properties.setProperty("redis.host", host);
+ }
RedisConfig redisConfig = new RedisConfig(version, properties);
RedisContainer container = new RedisContainer(redisConfig);
container.start();
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java
index 2dc68b5d7..3428fb43e 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java
@@ -13,7 +13,7 @@ class SqlServerSetup implements PlatformSetup {
config.setDefaultPort(1433);
config.setUsernameDefault();
config.setPassword("SqlS3rv#r");
- config.setUrl("jdbc:sqlserver://localhost:${port};databaseName=${databaseName}");
+ config.setUrl("jdbc:sqlserver://${host}:${port};databaseName=${databaseName};sendTimeAsDateTime=false");
config.setDriver("com.microsoft.sqlserver.jdbc.SQLServerDriver");
config.datasourceDefaults();
diff --git a/ebean-test/src/test/java/io/ebean/config/DatabaseConfigTest.java b/ebean-test/src/test/java/io/ebean/config/DatabaseConfigTest.java
index 143e3b19e..7ef7cc0f7 100644
--- a/ebean-test/src/test/java/io/ebean/config/DatabaseConfigTest.java
+++ b/ebean-test/src/test/java/io/ebean/config/DatabaseConfigTest.java
@@ -27,16 +27,17 @@ public class DatabaseConfigTest {
@Test
public void evalPropertiesInput() {
- String home = System.getenv("HOME");
+ String home = System.getProperty("user.home");
+ String fileSeparator = System.getProperty("file.separator");
Properties props = new Properties();
- props.setProperty("ddl.initSql", "${HOME}/initSql");
+ props.setProperty("ddl.initSql", "${user.home}" + fileSeparator + "initSql");
DatabaseConfig config = new DatabaseConfig();
config.loadFromProperties(props);
String ddlInitSql = config.getDdlInitSql();
- assertThat(ddlInitSql).isEqualTo(home+"/initSql");
+ assertThat(ddlInitSql).isEqualTo(home + fileSeparator + "initSql");
}
@Test
diff --git a/ebean-test/src/test/java/io/ebean/config/PropertiesWrapperTest.java b/ebean-test/src/test/java/io/ebean/config/PropertiesWrapperTest.java
index 98a64ad0b..5301d0173 100644
--- a/ebean-test/src/test/java/io/ebean/config/PropertiesWrapperTest.java
+++ b/ebean-test/src/test/java/io/ebean/config/PropertiesWrapperTest.java
@@ -50,30 +50,31 @@ public class PropertiesWrapperTest {
@Test
public void testGetProperties() {
- String home = System.getenv("HOME");
+ String home = System.getProperty("user.home");
String tmpDir = System.getProperty("java.io.tmpdir");
+ String fileSeparator = System.getProperty("file.separator");
Properties properties = new Properties();
properties.put("someBasic", "hello");
properties.put("someInt", "42");
properties.put("someDouble", "5.5");
- properties.put("somePath", "${HOME}/hello");
- properties.put("someSystemProp", "/aaa/${java.io.tmpdir}/bbb");
+ properties.put("somePath", "${user.home}" + fileSeparator + "hello");
+ properties.put("someSystemProp", fileSeparator + "aaa" + fileSeparator + "${java.io.tmpdir}" + fileSeparator + "bbb");
Properties evalCopy = Config.asConfiguration().eval(properties);
PropertiesWrapper pw = new PropertiesWrapper("pref", "myserver", evalCopy, null);
assertEquals(42, pw.getInt("someInt", 99));
assertEquals(Double.valueOf(5.5D), (Double.valueOf(pw.getDouble("someDouble", 99.9D))));
- assertEquals(home + "/hello", pw.get("somePath", null));
- assertEquals("/aaa/" + tmpDir + "/bbb", pw.get("someSystemProp"));
+ assertEquals(home + fileSeparator + "hello", pw.get("somePath", null));
+ assertEquals(fileSeparator + "aaa" + fileSeparator + tmpDir + fileSeparator + "bbb", pw.get("someSystemProp"));
pw = new PropertiesWrapper(evalCopy, null);
assertEquals(42, pw.getInt("someInt", 99));
assertEquals(Double.valueOf(5.5D), (Double.valueOf(pw.getDouble("someDouble", 99.9D))));
- assertEquals(home + "/hello", pw.get("somePath", null));
- assertEquals("/aaa/" + tmpDir + "/bbb", pw.get("someSystemProp"));
+ assertEquals(home + fileSeparator + "hello", pw.get("somePath", null));
+ assertEquals(fileSeparator + "aaa" + fileSeparator + tmpDir + fileSeparator + "bbb", pw.get("someSystemProp"));
}
}
diff --git a/ebean-test/src/test/java/io/ebean/config/dbplatform/OraclePlatformTest.java b/ebean-test/src/test/java/io/ebean/config/dbplatform/OraclePlatformTest.java
index cf6b513ee..47d8fa0dd 100644
--- a/ebean-test/src/test/java/io/ebean/config/dbplatform/OraclePlatformTest.java
+++ b/ebean-test/src/test/java/io/ebean/config/dbplatform/OraclePlatformTest.java
@@ -2,28 +2,34 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.oracle.Oracle11Platform;
+import io.ebean.config.dbplatform.oracle.Oracle12Platform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
-public class OraclePlatformTest {
+class OraclePlatformTest {
@Test
- public void columnAliasPrefix_Oracle11Platform() {
+ void columnAliasPrefix_Oracle11Platform() {
Oracle11Platform platform11 = new Oracle11Platform();
assertThat(platform11.columnAliasPrefix).isEqualTo("c");
}
@Test
- public void columnAliasPrefix_OraclePlatform() {
- OraclePlatform platform = new OraclePlatform();
- assertThat(platform.columnAliasPrefix).isEqualTo("c");
+ void columnAliasPrefix_Oracle12Platform() {
+ Oracle12Platform platform12 = new Oracle12Platform();
+ assertThat(platform12.columnAliasPrefix).isEqualTo("c");
}
@Test
- public void uuid_default() {
+ void columnAliasPrefix_OraclePlatform() {
+ OraclePlatform platform = new OraclePlatform();
+ assertThat(platform.columnAliasPrefix).isNull();
+ }
+ @Test
+ void uuid_default() {
OraclePlatform platform = new OraclePlatform();
platform.configure(new PlatformConfig(), false);
DbPlatformType dbType = platform.getDbTypeMap().get(DbPlatformType.UUID);
@@ -31,8 +37,7 @@ public class OraclePlatformTest {
}
@Test
- public void uuid_as_binary() {
-
+ void uuid_as_binary() {
OraclePlatform platform = new OraclePlatform();
PlatformConfig config = new PlatformConfig();
config.setDbUuid(PlatformConfig.DbUuid.AUTO_BINARY);
diff --git a/ebean-test/src/test/java/io/ebean/json/EJsonTests.java b/ebean-test/src/test/java/io/ebean/json/EJsonTests.java
index 929c6582c..1063e4d36 100644
--- a/ebean-test/src/test/java/io/ebean/json/EJsonTests.java
+++ b/ebean-test/src/test/java/io/ebean/json/EJsonTests.java
@@ -4,24 +4,22 @@ import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import io.ebean.ModifyAwareType;
import io.ebean.text.json.EJson;
+import io.ebean.util.IOUtils;
import io.ebeaninternal.json.ModifyAwareMap;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
+import java.io.Writer;
import java.nio.file.Files;
import java.util.*;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
public class EJsonTests {
- private static final Logger log = LoggerFactory.getLogger(EJsonTests.class);
-
@Test
public void test_map_simple() throws IOException {
@@ -46,15 +44,13 @@ public class EJsonTests {
public void write_withWriter_expect_writerNotClosed() throws IOException {
File temp = Files.createTempFile("some", ".json").toFile();
- FileWriter writer = new FileWriter(temp);
- Map map = new LinkedHashMap<>();
- map.put("foo", "bar");
- EJson.write(map, writer);
- writer.write("The end.");
- writer.flush();
- writer.close();
-
- log.info("write to file {}", temp.getAbsolutePath());
+ try (Writer writer = IOUtils.newWriter(temp)) {
+ Map map = new LinkedHashMap<>();
+ map.put("foo", "bar");
+ EJson.write(map, writer);
+ writer.write("The end.");
+ }
+ assertThat(temp).hasContent("{\"foo\":\"bar\"}The end.");
}
@Test
diff --git a/ebean-test/src/test/java/io/ebean/test/config/platform/DockerHostTest.java b/ebean-test/src/test/java/io/ebean/test/config/platform/DockerHostTest.java
new file mode 100644
index 000000000..0be8a5d43
--- /dev/null
+++ b/ebean-test/src/test/java/io/ebean/test/config/platform/DockerHostTest.java
@@ -0,0 +1,87 @@
+package io.ebean.test.config.platform;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class DockerHostTest {
+
+ @Test
+ void runningInDocker_when_false_alwaysUseLocalhost() {
+ DockerHost dockerHost = new DockerHost();
+ assertFalse(dockerHost.runningInDocker());
+ assertEquals("localhost", dockerHost.dockerHost("foo"));
+ }
+
+ @Test
+ void runningInDocker_when_true_useExplicit() {
+ TDDockerHost dockerHost = new TDDockerHost();
+ assertTrue(dockerHost.runningInDocker());
+
+ assertEquals("my-host", dockerHost.dockerHost("my-host"));
+ }
+
+ @Disabled
+ @Test
+ void runningInDocker_when_trueAndLinux_useDefault() {
+ TDDockerHost dockerHost = new TDDockerHost();
+ assertTrue(dockerHost.runningInDocker());
+
+ assertEquals("172.17.0.1", dockerHost.dockerHost(null));
+ }
+
+ @Test
+ void runningInDocker_when_windowsDefault() {
+ TDDockerHost dockerHost = new TDDockerHost();
+ assertTrue(dockerHost.runningInDocker());
+
+ String origName = System.getProperty("os.name");
+ System.setProperty("os.name", "win");
+ try {
+ assertEquals("host.docker.internal",dockerHost.defaultDockerHost());
+ assertEquals("host.docker.internal", dockerHost.dockerHost(null));
+ } finally {
+ System.setProperty("os.name", origName);
+ }
+ }
+
+ @Test
+ void runningInDocker_when_macDefault() {
+ TDDockerHost dockerHost = new TDDockerHost();
+ assertTrue(dockerHost.runningInDocker());
+
+ String origName = System.getProperty("os.name");
+ System.setProperty("os.name", "mac");
+ try {
+ assertEquals("host.docker.internal",dockerHost.defaultDockerHost());
+ assertEquals("host.docker.internal", dockerHost.dockerHost(null));
+ } finally {
+ System.setProperty("os.name", origName);
+ }
+ }
+
+
+ @Test
+ void runningInDocker_when_linuxDefault() {
+ TDDockerHost dockerHost = new TDDockerHost();
+ assertTrue(dockerHost.runningInDocker());
+
+ String origName = System.getProperty("os.name");
+ System.setProperty("os.name", "linux");
+ try {
+ assertEquals("172.17.0.1",dockerHost.defaultDockerHost());
+ assertEquals("172.17.0.1", dockerHost.dockerHost(null));
+ } finally {
+ System.setProperty("os.name", origName);
+ }
+ }
+
+ static class TDDockerHost extends DockerHost {
+
+ @Override
+ boolean initInDocker() {
+ return true;
+ }
+ }
+}
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataSerializeTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataSerializeTest.java
index 53bf0c21d..08988cfce 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataSerializeTest.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/cache/CachedBeanDataSerializeTest.java
@@ -11,6 +11,7 @@ import org.tests.model.basic.ResetBasicData;
import org.tests.model.basic.TBytesOnly;
import java.io.*;
+import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
@@ -94,7 +95,7 @@ public class CachedBeanDataSerializeTest extends BaseTestCase {
TBytesOnly bean = new TBytesOnly();
bean.setId(42);
- bean.setContent(stringContent.getBytes("UTF-8"));
+ bean.setContent(stringContent.getBytes(StandardCharsets.UTF_8));
BeanDescriptor desc = getBeanDescriptor(TBytesOnly.class);
CachedBeanData extract = CachedBeanDataFromBean.extract(desc, (EntityBean) bean);
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/type/TestSimpleEncryptor.java b/ebean-test/src/test/java/io/ebeaninternal/server/type/TestSimpleEncryptor.java
index 7ea6d2b3c..74c4fcd7a 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/type/TestSimpleEncryptor.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/type/TestSimpleEncryptor.java
@@ -5,6 +5,7 @@ import io.ebean.config.EncryptKey;
import org.junit.jupiter.api.Test;
import org.tests.basic.encrypt.BasicEncryptKey;
+import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import static org.assertj.core.api.Assertions.assertThat;
@@ -19,7 +20,7 @@ public class TestSimpleEncryptor extends BaseTestCase {
EncryptKey key = new BasicEncryptKey("hello");
- byte[] data = "test123".getBytes();
+ byte[] data = "test123".getBytes(StandardCharsets.UTF_8);
byte[] ecData = e.encrypt(data, key);
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java b/ebean-test/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java
index c28da92a7..383671363 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/type/TestTypeManager.java
@@ -15,6 +15,8 @@ import org.tests.model.ivo.converter.MoneyTypeConverter;
import javax.persistence.EnumType;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
@@ -29,7 +31,6 @@ public class TestTypeManager extends BaseTestCase {
DefaultTypeManager typeManager = createTypeManager();
ScalarType> type = typeManager.createEnumScalarType(MyEnum.class, null);
- typeManager.addEnumType(type, MyEnum.class);
Object val = type.read(new DummyDataReader("A"));
assertThat(val).isEqualTo(MyEnum.Aval);
@@ -131,6 +132,13 @@ public class TestTypeManager extends BaseTestCase {
return new DefaultTypeManager(config, bootupClasses);
}
+ @Test
+ public void testCalendar() throws SQLException {
+
+ DefaultTypeManager typeManager = createTypeManager();
+ ScalarType> typeB = typeManager.getScalarType(GregorianCalendar.class);
+ assertThat(typeB).isInstanceOf(ScalarTypeCalendar.class);
+ }
/**
* Test double DataReader implementation.
*/
diff --git a/ebean-test/src/test/java/org/tests/basic/TestDeleteImportedPartial.java b/ebean-test/src/test/java/org/tests/basic/TestDeleteImportedPartial.java
index 16ba29c32..4729929c9 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestDeleteImportedPartial.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestDeleteImportedPartial.java
@@ -8,12 +8,14 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
+import java.nio.charset.StandardCharsets;
+
public class TestDeleteImportedPartial extends BaseTestCase {
@Test
public void test() {
- PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
+ PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
Integer id = persistentFile.getId();
diff --git a/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOne.java b/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOne.java
index dfe431246..98b837db2 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOne.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOne.java
@@ -8,13 +8,15 @@ import org.tests.model.basic.PersistentFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
+import java.nio.charset.StandardCharsets;
+
public class TestDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt", new PersistentFileContent(
- "test".getBytes()));
+ "test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
Integer id = persistentFile.getId();
diff --git a/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOneMultiple.java b/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOneMultiple.java
index 433fb270c..af51fdec5 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOneMultiple.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestDeleteOneToOneMultiple.java
@@ -8,16 +8,18 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNull;
+import java.nio.charset.StandardCharsets;
+
public class TestDeleteOneToOneMultiple extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
- PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
+ PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
// PFile persistentFile = new PFile();
// persistentFile.setName("test.txt");
// PFileContent content = new PFileContent();
-// content.setContent("test".getBytes());
+// content.setContent("test".getBytes(StandardCharsets.UTF_8));
// persistentFile.setFileContent(content);
DB.save(persistentFile);
diff --git a/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOne.java b/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOne.java
index 75208a534..f17c9862a 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOne.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOne.java
@@ -8,12 +8,14 @@ import org.tests.model.basic.PersistentFileContent;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import java.nio.charset.StandardCharsets;
+
public class TestSaveDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt",
- new PersistentFileContent("test".getBytes()));
+ new PersistentFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
DB.delete(persistentFile);
@@ -22,7 +24,7 @@ public class TestSaveDeleteOneToOne extends BaseTestCase {
@Test
public void testCreateLoadDeletePersistentFile() {
PersistentFile persistentFile = new PersistentFile("test.txt",
- new PersistentFileContent("test".getBytes()));
+ new PersistentFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
diff --git a/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOneMultiple.java b/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOneMultiple.java
index e7e23283d..b357445e5 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOneMultiple.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestSaveDeleteOneToOneMultiple.java
@@ -8,11 +8,13 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import java.nio.charset.StandardCharsets;
+
public class TestSaveDeleteOneToOneMultiple extends BaseTestCase {
// public void testCreateDeletePFile() {
// PFile persistentFile = new PFile("test.txt",
-// new PFileContent("test".getBytes()));
+// new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
//
// DB.save(persistentFile);
// DB.delete(persistentFile);
@@ -21,7 +23,7 @@ public class TestSaveDeleteOneToOneMultiple extends BaseTestCase {
@Test
public void testCreateLoadDeletePFile() {
PFile persistentFile = new PFile("test.txt",
- new PFileContent("test".getBytes()));
+ new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
DB.save(persistentFile);
diff --git a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
index c67e63c4a..8b86b1f87 100644
--- a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
+++ b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
@@ -6,6 +6,7 @@ import io.ebean.DB;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.TWithPreInsert;
import org.tests.model.basic.TWithPreInsertChild;
+import org.tests.model.basic.event.TWithPreInsertPersistAdapter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -27,6 +28,7 @@ class TestPreInsertValidation extends BaseTestCase {
assertThat(e.requestCascadeState()).isEqualTo(2);
TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId());
+ assert e1 != null;
e1.setTitle("Missus");
DB.save(e1);
@@ -54,11 +56,21 @@ class TestPreInsertValidation extends BaseTestCase {
assert e1 != null;
e1.setTitle("ParentCascading-changed");
- e1.children().get(0).setName("Child0-changed");
+ TWithPreInsertChild childBean = e1.children().get(0);
+ childBean.setName("Child0-changed");
DB.save(e1);
assertThat(e1.requestCascadeState()).isEqualTo(12);
- assertThat(e1.children().get(0).requestCascadeState()).isEqualTo(11);
+ assertThat(childBean.requestCascadeState()).isEqualTo(11);
+
+ DB.delete(e1);
+
+ assertThat(e1.requestCascadeState()).isEqualTo(22);
+
+ // assert that isCascade() was true for the child bean
+ assertThat(TWithPreInsertPersistAdapter.cascadeDelete).hasSize(1);
+ String deleteCascade = TWithPreInsertPersistAdapter.cascadeDelete.get(0);
+ assertThat(deleteCascade).isEqualTo("class org.tests.model.basic.TWithPreInsertChild:1");
}
@Test
diff --git a/ebean-test/src/test/java/org/tests/defaultvalues/TestDefaults.java b/ebean-test/src/test/java/org/tests/defaultvalues/TestDefaults.java
index 828fc2b35..170584d5b 100644
--- a/ebean-test/src/test/java/org/tests/defaultvalues/TestDefaults.java
+++ b/ebean-test/src/test/java/org/tests/defaultvalues/TestDefaults.java
@@ -26,7 +26,7 @@ public class TestDefaults extends BaseTestCase {
final List current = LoggedSql.collect();
assertThat(current).isNotEmpty();
- if (isMySql() || isMariaDB()) {
+ if (isMySql() || isMariaDB() || isOracle()) {
assertThat(current.get(0)).contains("insert into defaults_model_draft values (default);");
} else if (isSqlServer()) {
assertThat(current.get(0)).contains("insert into defaults_model_draft (id) values (?)");
diff --git a/ebean-test/src/test/java/org/tests/enhancement/TestConstructorPutfieldReplacement.java b/ebean-test/src/test/java/org/tests/enhancement/TestConstructorPutfieldReplacement.java
index 3a945c8e7..0b82b7c33 100644
--- a/ebean-test/src/test/java/org/tests/enhancement/TestConstructorPutfieldReplacement.java
+++ b/ebean-test/src/test/java/org/tests/enhancement/TestConstructorPutfieldReplacement.java
@@ -9,12 +9,14 @@ import org.tests.model.basic.PFileContent;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.nio.charset.StandardCharsets;
+
public class TestConstructorPutfieldReplacement extends BaseTestCase {
@Test
public void test() {
- PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
+ PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes(StandardCharsets.UTF_8)));
EntityBean eb = (EntityBean) persistentFile;
EntityBeanIntercept ebi = eb._ebean_getIntercept();
diff --git a/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java b/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java
index 56245930c..8f57569a0 100644
--- a/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java
+++ b/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java
@@ -14,6 +14,8 @@ import org.tests.idkeys.db.GenKeySeqB;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@@ -24,6 +26,7 @@ public class TestGeneratedKeys extends BaseTestCase {
@ForPlatform(Platform.H2) // readSequenceValue is H2 specific
public void testGenKeySeqA() throws SQLException {
assumeTrue(idType() == IdType.SEQUENCE);
+
SpiEbeanServer server = spiEbeanServer();
try (Transaction tx = server.beginTransaction()) {
@@ -69,20 +72,34 @@ public class TestGeneratedKeys extends BaseTestCase {
}
private long readSequenceValue(Transaction tx, String sequence) throws SQLException {
- Statement stm = null;
- try {
- stm = tx.connection().createStatement();
- ResultSet rs = stm.executeQuery("select currval('" + sequence + "')");
- rs.next();
+ String sql;
+ switch (spiEbeanServer().databasePlatform().getPlatform().base()) {
+ case H2 :
+ sql = "select currval('" + sequence + "')";
+ break;
+ case DB2 :
+ sql = "values previous value for " + sequence;
+
+ break;
+ case SQLSERVER :
+ sql = "select current_value from sys.sequences where name = '" + sequence + "'";
+ break;
+
+ case MARIADB :
+ throw new UnsupportedOperationException("reading sequence value outside of the current connection is not supported. "
+ + "See https://mariadb.com/kb/en/previous-value-for-sequence_name/#description");
+
+ default :
+ throw new UnsupportedOperationException("reading sequence value from "
+ + spiEbeanServer().databasePlatform().getPlatform()
+ + " is not supported.");
+
+ }
+ try (Statement stm = tx.connection().createStatement()) {
+ ResultSet rs = stm.executeQuery(sql);
+ rs.next();
return rs.getLong(1);
- } finally {
- if (stm != null) {
- try {
- stm.close();
- } catch (SQLException e) {
- }
- }
}
}
@@ -109,5 +126,25 @@ public class TestGeneratedKeys extends BaseTestCase {
assertNotNull(al.getId());
}
}
+
+ @Test
+ @ForPlatform({Platform.H2, Platform.MARIADB, Platform.SQLSERVER, Platform.DB2})
+ public void testGeneratedKeys() throws SQLException {
+ assumeTrue(idType() == IdType.SEQUENCE);
+
+ SpiEbeanServer server = spiEbeanServer();
+ List idList = new ArrayList<>(52);
+
+ try (Transaction tx = server.beginTransaction()) {
+ // bigger than increment
+ for (int i = 1; i < 52; i++) {
+ GenKeySeqA gks = new GenKeySeqA();
+ gks.setDescription("my description " + i);
+ server.save(gks);
+ assertFalse(idList.contains(gks.getId()));
+ idList.add(gks.getId());
+ }
+ }
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
index 21398bc7a..acfffce20 100644
--- a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
+++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
@@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
-import static javax.persistence.CascadeType.PERSIST;
+import static javax.persistence.CascadeType.ALL;
@Entity
public class TWithPreInsert implements TWithPreInsertCommon {
@@ -20,7 +20,7 @@ public class TWithPreInsert implements TWithPreInsertCommon {
private String title;
- @OneToMany(cascade = PERSIST)
+ @OneToMany(cascade = ALL)
private List children = new ArrayList<>();
/**
diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java
index dc61e28ba..632c7ade9 100644
--- a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java
+++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java
@@ -2,6 +2,8 @@ package org.tests.model.basic;
public interface TWithPreInsertCommon {
+ Integer getId();
+
String getName();
void setName(String name);
diff --git a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
index 03143d385..ffc87e00a 100644
--- a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
+++ b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
@@ -4,8 +4,13 @@ import io.ebean.event.BeanPersistAdapter;
import io.ebean.event.BeanPersistRequest;
import org.tests.model.basic.TWithPreInsertCommon;
+import java.util.ArrayList;
+import java.util.List;
+
public class TWithPreInsertPersistAdapter extends BeanPersistAdapter {
+ public static List cascadeDelete = new ArrayList<>();
+
@Override
public boolean isRegisterFor(Class> cls) {
return TWithPreInsertCommon.class.isAssignableFrom(cls);
@@ -32,4 +37,14 @@ public class TWithPreInsertPersistAdapter extends BeanPersistAdapter {
return super.preUpdate(request);
}
+ @Override
+ public boolean preDelete(BeanPersistRequest> request) {
+ TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean();
+ if (request.isCascade()) {
+ cascadeDelete.add(bean.getClass() + ":" + bean.getId());
+ } else {
+ bean.requestCascadeState(22);
+ }
+ return true;
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/model/elementcollection/EcblPerson2.java b/ebean-test/src/test/java/org/tests/model/elementcollection/EcblPerson2.java
new file mode 100644
index 000000000..7ce82c393
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/elementcollection/EcblPerson2.java
@@ -0,0 +1,61 @@
+package org.tests.model.elementcollection;
+
+import io.ebean.annotation.Cache;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Cache
+@Entity
+public class EcblPerson2 {
+
+ @Id
+ long id;
+
+ String name;
+
+ @ElementCollection
+ @CollectionTable(joinColumns = @JoinColumn(name = "person_id"))
+ List phoneNumbers = new ArrayList<>();
+
+ @Version
+ long version;
+
+ @Override
+ public String toString() {
+ return "person id:" + id + " name:" + name + " phs:" + phoneNumbers;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(List phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+ public long getVersion() {
+ return version;
+ }
+
+ public void setVersion(long version) {
+ this.version = version;
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
index f3ec4b24b..80e2d9bd1 100644
--- a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
+++ b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache.java
@@ -9,10 +9,10 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
-public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
+class TestElementCollectionEmbeddedListCache extends BaseTestCase {
@Test
- public void test() {
+ void test() {
EcblPerson person = new EcblPerson("CacheL");
person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
@@ -86,12 +86,10 @@ public class TestElementCollectionEmbeddedListCache extends BaseTestCase {
assertThat(four.getPhoneNumbers().toString()).contains("61-07-11");
assertThat(four.getPhoneNumbers()).hasSize(1);
-
DB.delete(four);
sql = LoggedSql.collect();
assertThat(sql).hasSize(2);
-
LoggedSql.stop();
}
}
diff --git a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache2.java b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache2.java
new file mode 100644
index 000000000..1a361c33b
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionEmbeddedListCache2.java
@@ -0,0 +1,99 @@
+package org.tests.model.elementcollection;
+
+import io.ebean.BaseTestCase;
+import io.ebean.DB;
+import io.ebean.test.LoggedSql;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TestElementCollectionEmbeddedListCache2 extends BaseTestCase {
+
+ @Test
+ void test() {
+
+ EcblPerson2 person = new EcblPerson2();
+ person.setName("CacheL");
+ person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
+ person.getPhoneNumbers().add(new EcPhone("64","021","4321"));
+ DB.save(person);
+
+ EcblPerson2 one = DB.find(EcblPerson2.class)
+ .setId(person.getId())
+ .fetch("phoneNumbers")
+ .findOne();
+
+ LoggedSql.start();
+
+ one.getPhoneNumbers().size();
+
+ List sql = LoggedSql.collect();
+ assertThat(sql).isEmpty();
+
+ EcblPerson2 two = DB.find(EcblPerson2.class )
+ .setId(person.getId())
+ .findOne();
+
+ two.getPhoneNumbers().size();
+ assertThat(two.getPhoneNumbers().toString()).contains("64-021-1234", "64-021-4321");
+
+ sql = LoggedSql.collect();
+ assertThat(sql).isEmpty(); // cache hit
+
+ two.getPhoneNumbers().add(new EcPhone("61", "07", "11"));
+ two.getPhoneNumbers().remove(1);
+
+ DB.save(two);
+
+ sql = LoggedSql.collect();
+ if (isPersistBatchOnCascade()) {
+ assertThat(sql).hasSize(5); // update of collection only
+ assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
+ assertSqlBind(sql.get(1));
+ assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
+ assertSqlBind(sql, 3, 4);
+ } else {
+ assertThat(sql).hasSize(3); // update of collection only
+ assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
+ assertSql(sql.get(1)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
+ assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
+ }
+
+ EcblPerson2 three = DB.find(EcblPerson2.class )
+ .setId(person.getId())
+ .findOne();
+
+ assertThat(three.getPhoneNumbers().toString()).contains("61-07-11", "64-021-1234");
+ assertThat(three.getPhoneNumbers()).hasSize(2);
+
+ sql = LoggedSql.collect();
+ assertThat(sql).isEmpty(); // cache hit
+
+
+ three.setName("mod-3");
+ three.getPhoneNumbers().remove(0);
+
+ DB.save(three);
+
+ sql = LoggedSql.collect();
+ assertThat(sql).hasSize(5);
+
+ EcblPerson2 four = DB.find(EcblPerson2.class )
+ .setId(person.getId())
+ .findOne();
+
+ assertThat(four.getPhoneNumbers().toString()).contains("61-07-11");
+ assertThat(four.getPhoneNumbers()).hasSize(1);
+
+
+ DB.delete(four);
+ sql = LoggedSql.collect();
+ assertThat(sql).hasSize(2);
+
+
+ LoggedSql.stop();
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/embedded/EmbArrayMaster.java b/ebean-test/src/test/java/org/tests/model/embedded/EmbArrayMaster.java
new file mode 100644
index 000000000..09ff8312f
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/embedded/EmbArrayMaster.java
@@ -0,0 +1,31 @@
+package org.tests.model.embedded;
+
+import io.ebean.annotation.DbArray;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+public class EmbArrayMaster {
+
+ @Embeddable
+ public static class EmbArrayDetail {
+ @DbArray
+ List vals;
+
+ public EmbArrayDetail(List vals) {
+ this.vals = vals;
+ }
+ }
+
+ @Id
+ int id;
+
+ @ElementCollection
+ @CollectionTable(name = "test_array_detail", joinColumns = {@JoinColumn(name = "master_id")})
+ List details;
+
+ public EmbArrayMaster(List details) {
+ this.details = details;
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/embedded/TestEmbeddedDbArray.java b/ebean-test/src/test/java/org/tests/model/embedded/TestEmbeddedDbArray.java
new file mode 100644
index 000000000..6bf121032
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/embedded/TestEmbeddedDbArray.java
@@ -0,0 +1,21 @@
+package org.tests.model.embedded;
+
+import io.ebean.DB;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+
+class TestEmbeddedDbArray {
+
+ /**
+ * Failing test case for #2477
+ */
+ @Disabled
+ @Test
+ void testArrayInsert() {
+ EmbArrayMaster t = new EmbArrayMaster(singletonList(new EmbArrayMaster.EmbArrayDetail(emptyList())));
+ DB.insert(t);
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/m2m/MnyNode.java b/ebean-test/src/test/java/org/tests/model/m2m/MnyNode.java
index edbd87cc0..fabb58040 100644
--- a/ebean-test/src/test/java/org/tests/model/m2m/MnyNode.java
+++ b/ebean-test/src/test/java/org/tests/model/m2m/MnyNode.java
@@ -33,7 +33,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 1 != 0")
- @Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = Platform.H2)
+ @Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = {Platform.H2, Platform.ORACLE})
List bit1Relations;
@ManyToMany
@@ -41,7 +41,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 1 != 0")
- @Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = Platform.H2)
+ @Where(clause = "BITAND(${mta}.flags, 1) != 0", platforms = {Platform.H2, Platform.ORACLE})
List bit1ReverseRelations;
@ManyToMany
@@ -49,7 +49,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 2 != 0")
- @Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = Platform.H2)
+ @Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = {Platform.H2, Platform.ORACLE})
List bit2Relations;
@ManyToMany
@@ -57,7 +57,7 @@ public class MnyNode {
joinColumns = @JoinColumn(name = "to_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "from_id", referencedColumnName = "id"))
@Where(clause = "${mta}.flags & 2 != 0")
- @Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = Platform.H2)
+ @Where(clause = "BITAND(${mta}.flags, 2) != 0", platforms = {Platform.H2, Platform.ORACLE})
List bit2ReverseRelations;
@ManyToMany
diff --git a/ebean-test/src/test/java/org/tests/model/types/SomeNewTypesBean.java b/ebean-test/src/test/java/org/tests/model/types/SomeNewTypesBean.java
index 2596dbcba..1a0fee0bf 100644
--- a/ebean-test/src/test/java/org/tests/model/types/SomeNewTypesBean.java
+++ b/ebean-test/src/test/java/org/tests/model/types/SomeNewTypesBean.java
@@ -7,6 +7,7 @@ import javax.persistence.Version;
import java.nio.file.Path;
import java.sql.Date;
import java.time.*;
+import java.util.Calendar;
@Entity
public class SomeNewTypesBean {
@@ -58,6 +59,8 @@ public class SomeNewTypesBean {
Duration duration;
+ Calendar calendar;
+
public Long getId() {
return id;
}
@@ -217,4 +220,12 @@ public class SomeNewTypesBean {
public void setDuration(Duration duration) {
this.duration = duration;
}
+
+ public Calendar getCalendar() {
+ return calendar;
+ }
+
+ public void setCalendar(final Calendar calendar) {
+ this.calendar = calendar;
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/rawsql/inherit/ParentQueryTest.java b/ebean-test/src/test/java/org/tests/rawsql/inherit/ParentQueryTest.java
index b3e879e71..5e45b8130 100644
--- a/ebean-test/src/test/java/org/tests/rawsql/inherit/ParentQueryTest.java
+++ b/ebean-test/src/test/java/org/tests/rawsql/inherit/ParentQueryTest.java
@@ -12,14 +12,12 @@ import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-public class ParentQueryTest extends BaseTestCase {
+class ParentQueryTest extends BaseTestCase {
@Test
- public void QueryParentCollectionFetch() {
-
+ void queryParentCollectionFetch() {
List exampleData = new ArrayList<>();
exampleData.add(new Data(0));
exampleData.add(new Data(1));
@@ -40,7 +38,7 @@ public class ParentQueryTest extends BaseTestCase {
List partial = DB.find(Parent.class).where().ge("val", 1001).findList();
assertNotNull(partial.get(0).getData());
assertThat(partial.get(0).getMore()).startsWith("PQT-");
- assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0);
+ assertThat(partial.get(0).getData()).hasSize(3);
}
}
diff --git a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java
index 313f5017c..e8cb48160 100644
--- a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java
+++ b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java
@@ -3,26 +3,25 @@ package org.tests.text.csv;
import io.ebean.DB;
import io.ebean.TransactionalTestCase;
import io.ebean.text.csv.CsvReader;
+import io.ebean.util.IOUtils;
+
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
-import java.io.File;
-import java.io.FileReader;
+import java.io.Reader;
import java.net.URL;
+import java.util.Locale;
public class TestCsvReader extends TransactionalTestCase {
@Test
- public void test() {
+ public void test() throws Exception {
ResetBasicData.reset();
- try {
- URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
- File f = new File(resource.getFile());
-
- FileReader reader = new FileReader(f);
+ URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
+ try (Reader reader = IOUtils.newReader(resource.openStream())){
CsvReader csvReader = DB.getDefault().createCsvReader(Customer.class);
@@ -32,15 +31,13 @@ public class TestCsvReader extends TransactionalTestCase {
// csvReader.addProperty("id");
csvReader.addProperty("status");
csvReader.addProperty("name");
- csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
+ csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH);
csvReader.addProperty("billingAddress.line1");
csvReader.addProperty("billingAddress.city");
csvReader.addProperty("billingAddress.country.code");
csvReader.process(reader);
-
- } catch (Exception e) {
- throw new RuntimeException(e);
+
}
}
diff --git a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java
index ef6bfd8c7..efa424d07 100644
--- a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java
+++ b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java
@@ -4,12 +4,14 @@ import io.ebean.DB;
import io.ebean.TransactionalTestCase;
import io.ebean.text.csv.CsvReader;
import io.ebean.text.csv.DefaultCsvCallback;
+import io.ebean.util.IOUtils;
+
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Customer;
-import java.io.File;
-import java.io.FileReader;
+import java.io.Reader;
import java.net.URL;
+import java.util.Locale;
import static org.assertj.core.api.Assertions.assertThat;
@@ -19,41 +21,40 @@ public class TestCsvReaderWithCallback extends TransactionalTestCase {
public void test() throws Throwable {
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
- File f = new File(resource.getFile());
+ try (Reader reader = IOUtils.newReader(resource.openStream())) {
- FileReader reader = new FileReader(f);
+ CsvReader csvReader = DB.getDefault().createCsvReader(Customer.class);
- CsvReader csvReader = DB.getDefault().createCsvReader(Customer.class);
+ csvReader.setPersistBatchSize(2);
+ csvReader.setLogInfoFrequency(3);
- csvReader.setPersistBatchSize(2);
- csvReader.setLogInfoFrequency(3);
+ csvReader.addIgnore();
+ // csvReader.addProperty("id");
+ csvReader.addProperty("status");
+ csvReader.addProperty("name");
+ csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH);
+ csvReader.addProperty("billingAddress.line1");
+ csvReader.addProperty("billingAddress.city");
+ // processor.addReference("billingAddress.country.code");
+ csvReader.addProperty("billingAddress.country.code");
- csvReader.addIgnore();
- // csvReader.addProperty("id");
- csvReader.addProperty("status");
- csvReader.addProperty("name");
- csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
- csvReader.addProperty("billingAddress.line1");
- csvReader.addProperty("billingAddress.city");
- // processor.addReference("billingAddress.country.code");
- csvReader.addProperty("billingAddress.country.code");
+ int before = DB.find(Customer.class).findCount();
- int before = DB.find(Customer.class).findCount();
+ csvReader.process(reader, new DefaultCsvCallback() {
- csvReader.process(reader, new DefaultCsvCallback() {
+ @Override
+ public void processBean(int row, String[] lineContent, Customer cust) {
- @Override
- public void processBean(int row, String[] lineContent, Customer cust) {
+ server.save(cust.getBillingAddress(), transaction);
+ server.save(cust, transaction);
- server.save(cust.getBillingAddress(), transaction);
- server.save(cust, transaction);
+ }
- }
+ });
- });
-
- int after = DB.find(Customer.class).findCount();
- assertThat(after).isEqualTo(before + 9);
+ int after = DB.find(Customer.class).findCount();
+ assertThat(after).isEqualTo(before + 9);
+ }
}
}
diff --git a/ebean-test/src/test/java/org/tests/text/json/TestJsonSimple.java b/ebean-test/src/test/java/org/tests/text/json/TestJsonSimple.java
index f635d926b..c462a80cc 100644
--- a/ebean-test/src/test/java/org/tests/text/json/TestJsonSimple.java
+++ b/ebean-test/src/test/java/org/tests/text/json/TestJsonSimple.java
@@ -4,9 +4,12 @@ import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.text.json.EJson;
import io.ebean.text.json.JsonContext;
+import io.ebean.util.IOUtils;
+
import org.junit.jupiter.api.Test;
import java.io.*;
+import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -20,19 +23,20 @@ public class TestJsonSimple extends BaseTestCase {
public void test() throws IOException {
InputStream is = this.getClass().getResourceAsStream("/example1.json");
+ String jsonText;
+ try (final Reader reader = IOUtils.newReader(is)) {
+ LineNumberReader lineReader = new LineNumberReader(reader);
- final Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
- LineNumberReader lineReader = new LineNumberReader(reader);
+ String readLine;
- String readLine;
+ StringBuilder sb = new StringBuilder();
+ while ((readLine = lineReader.readLine()) != null) {
+ sb.append(readLine);
+ }
- StringBuilder sb = new StringBuilder();
- while ((readLine = lineReader.readLine()) != null) {
- sb.append(readLine);
+ jsonText = sb.toString();
}
- String jsonText = sb.toString();
-
Object el = EJson.parse(jsonText);
assertThat(el).isNotNull();
diff --git a/ebean-test/src/test/java/org/tests/types/TestNewTypes.java b/ebean-test/src/test/java/org/tests/types/TestNewTypes.java
index 35732801e..90ffd842a 100644
--- a/ebean-test/src/test/java/org/tests/types/TestNewTypes.java
+++ b/ebean-test/src/test/java/org/tests/types/TestNewTypes.java
@@ -10,6 +10,7 @@ import org.tests.model.types.SomeNewTypesBean;
import java.io.File;
import java.nio.file.Paths;
import java.time.*;
+import java.util.Calendar;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -44,6 +45,7 @@ public class TestNewTypes extends BaseTestCase {
bean.setPath(Paths.get(TEMP_PATH));
bean.setPeriod(Period.of(4,3,2));
bean.setDuration(Duration.ofMinutes(5));
+ bean.setCalendar(Calendar.getInstance());
DB.save(bean);
@@ -104,6 +106,10 @@ public class TestNewTypes extends BaseTestCase {
list = DB.find(SomeNewTypesBean.class).where().eq("duration", Duration.ofMinutes(5)).findList();
assertThat(list).isNotEmpty();
+ // Calendar.getInstance() returns an implementation, which then has to be remapped to ScalarTypeCalendar
+ list = DB.find(SomeNewTypesBean.class).where().le("calendar", Calendar.getInstance()).findList();
+ assertThat(list).isNotEmpty();
+
SomeNewTypesBean fetched = DB.find(SomeNewTypesBean.class, bean.getId());
assertEquals(bean.getZoneId(), fetched.getZoneId());
@@ -122,6 +128,7 @@ public class TestNewTypes extends BaseTestCase {
assertEquals(bean.getPath(), fetched.getPath());
assertEquals(bean.getPeriod(), fetched.getPeriod());
assertEquals(bean.getDuration(), fetched.getDuration());
+ assertEquals(bean.getCalendar(), fetched.getCalendar());
String asJson = DB.json().toJson(fetched);
@@ -139,10 +146,10 @@ public class TestNewTypes extends BaseTestCase {
assertThat(toBean.getOffsetDateTime()).isEqualToIgnoringNanos(bean.getOffsetDateTime());
assertEquals(bean.getLocalTime().toSecondOfDay(), toBean.getLocalTime().toSecondOfDay());
assertEquals(bean.getInstant().toEpochMilli() / 1000, toBean.getInstant().toEpochMilli() / 1000);
- // FIXME: This test fails on Windows with: expected:<\tmp> but was:
assertEquals(bean.getPath(), toBean.getPath());
assertEquals(bean.getPeriod(), toBean.getPeriod());
assertEquals(bean.getDuration(), toBean.getDuration());
+ assertEquals(bean.getCalendar(), toBean.getCalendar());
}
diff --git a/ebean/pom.xml b/ebean/pom.xml
index 2c3dacdf5..e399daa25 100644
--- a/ebean/pom.xml
+++ b/ebean/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
ebean composite
@@ -22,20 +22,20 @@
io.ebean
ebean-api
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
io.ebean
ebean-core
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
io.ebean
ebean-querybean
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
diff --git a/kotlin-querybean-generator/pom.xml b/kotlin-querybean-generator/pom.xml
index e897804e2..cb1fcce36 100644
--- a/kotlin-querybean-generator/pom.xml
+++ b/kotlin-querybean-generator/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
kotlin querybean generator
@@ -29,7 +29,7 @@
io.ebean
ebean-querybean
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
@@ -43,7 +43,7 @@
io.ebean
ebean-core
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
@@ -64,7 +64,7 @@
io.ebean
ebean-ddl-generator
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
@@ -106,7 +106,7 @@
io.ebean
kotlin-querybean-generator
- 12.8.2
+ 12.13.0
diff --git a/pom.xml b/pom.xml
index e7de38588..49c958dde 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
io.ebean
ebean-parent
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
pom
ebean parent
@@ -42,11 +42,11 @@
2.12.1
1.2
1.1
- 12.12.1
+ 12.13.1
4.2
7.3
- 12.13.0
- 12.13.0
+ 12.14.1
+ 12.14.1
@@ -61,7 +61,7 @@
ch.qos.logback
logback-classic
- 1.2.8
+ 1.2.9
test
diff --git a/querybean-generator/pom.xml b/querybean-generator/pom.xml
index ef25adaa8..98d196530 100644
--- a/querybean-generator/pom.xml
+++ b/querybean-generator/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.3-SNAPSHOT
+ 12.14.2-SNAPSHOT
querybean generator
diff --git a/tests/test-java16/pom.xml b/tests/test-java16/pom.xml
index 0f4927da5..7ac83574a 100644
--- a/tests/test-java16/pom.xml
+++ b/tests/test-java16/pom.xml
@@ -20,19 +20,19 @@
io.ebean
ebean
- 12.13.2-SNAPSHOT
+ 12.14.2-SNAPSHOT
ch.qos.logback
logback-classic
- 1.2.3
+ 1.2.9
io.ebean
ebean-test
- 12.13.2-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
@@ -58,7 +58,7 @@
io.ebean
querybean-generator
- 12.13.2-SNAPSHOT
+ 12.14.2-SNAPSHOT
diff --git a/tests/test-kotlin/pom.xml b/tests/test-kotlin/pom.xml
index 3ab10cdf5..ab8706f74 100644
--- a/tests/test-kotlin/pom.xml
+++ b/tests/test-kotlin/pom.xml
@@ -36,21 +36,21 @@
io.ebean
ebean-test
- 12.13.2-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
io.ebean
ebean-core
- 12.13.2-SNAPSHOT
+ 12.14.2-SNAPSHOT
test
ch.qos.logback
logback-classic
- 1.2.3
+ 1.2.9
test